对SOCKET句柄做的一些实验

2009-3-24 Nie.Meining Debug

我一直怀疑Socket和其它类别的HANDLE不一样。(或者说究竟是不是一个句柄?)    
WinSock.h中对SOCKET的定义是:   typedef UINT_PTR SOCKET;     
而WinNT.h中对HANDLE的定义是:   typedef void *HANDLE;    

SOCKET不仅定义上同HANDLE不一样,而且打开方式也不一样。Windows的内核对象的句柄在打开时,一般都会要求一个安全描述符参数LPSECURITY_ATTRIBUTES lpEventAttributes,但是Socket不需要。   

SOCKET到底是不是句柄,有没有一个对应的内核对象?各种资料上的说法都不一样。我写了个用SOCKET监听端口的程序,在虚拟机里运行,然后用Windbg调试了一下,发现Socket的句柄值对应的是一个File类型的可继承的内核对象: 

005c: Object: 86251778 GrantedAccess: 001f01ff (Inherit) Entry: e10950b8

Object: 86251778 Type: (863e7ad0) File  

    ObjectHeader: 86251760 (old version)  

    HandleCount: 1 PointerCount: 1  

    Directory Object: 00000000 Name: \Endpoint {Afd}  

 

Socket句柄和它对应的File内核对象的关系就和其它类型的句柄没什么区别了,同样可以通过句柄值在EPROCESS +0x0c4的HANDLE_TABLE中索引到File内核对象的地址。   

 也许没有专门的叫Socket的内核对象,Socket只是一个Ring3下的数据结构,它的种种功能是通过其它内核对象的配合来实现的。这只是我的猜测,还须进一步研究……    

发表评论:

Powered by emlog