您的位置:首页 > 其它

Windows句柄的理解

2015-10-12 23:44 218 查看
在Windows中,内核对象的数据结构只能由操作系统访问,应用程序不能在内存中定位这些数据结构并更改其内容。因为这个限制,Windows提供了一组接口函数以恰当的方式来访问这些内核对象的数据结构,句柄的概念由此产生。

当调用了一个会创建内核对象的函数后,函数会返回一个句柄,标识所创建的对象,这个句柄可供进程里面的所有线程使用。在进程初始化的时候,系统会为它分配一个句柄表,句柄表里面的结构通常包含一个内核对象的指针、一个访问掩码和一些标志,而句柄的用处就是在句柄表里面找到对应的内核对象的数据结构。系统用索引的方式来表示内核对象的信息保存在进程句柄表中的具体位置,而这个索引值index=句柄值/4;所以一般都会发现句柄值是4的倍数。当获得了索引值之后,就可以从句柄表里面找到对应的指向内核对象的指针,Windows就是通过这样会让应用程序可以访问到内核对象的。

当说到这里的时候,很多关于句柄的疑问就可以解释的通了。通常来说CreateProcess和OpenProcess来以相同的条件打开同个应用程序,所 获得的句柄值是不一样的,但是他们都是在访问同一个内核对象,因为索引得到的句柄表项里面的内核对象的指针指向的对象是一样的。因此在使用closehandle(handle)来释放句柄的时候,其实是在句柄表里面删除相关索引项,该内核对象的引用计数-1。因此句柄的赋值拷贝并不影响内核对象的引用计数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: