Windows句柄的理解
2015-10-12 23:44
218 查看
在Windows中,内核对象的数据结构只能由操作系统访问,应用程序不能在内存中定位这些数据结构并更改其内容。因为这个限制,Windows提供了一组接口函数以恰当的方式来访问这些内核对象的数据结构,句柄的概念由此产生。
当调用了一个会创建内核对象的函数后,函数会返回一个句柄,标识所创建的对象,这个句柄可供进程里面的所有线程使用。在进程初始化的时候,系统会为它分配一个句柄表,句柄表里面的结构通常包含一个内核对象的指针、一个访问掩码和一些标志,而句柄的用处就是在句柄表里面找到对应的内核对象的数据结构。系统用索引的方式来表示内核对象的信息保存在进程句柄表中的具体位置,而这个索引值index=句柄值/4;所以一般都会发现句柄值是4的倍数。当获得了索引值之后,就可以从句柄表里面找到对应的指向内核对象的指针,Windows就是通过这样会让应用程序可以访问到内核对象的。
当说到这里的时候,很多关于句柄的疑问就可以解释的通了。通常来说CreateProcess和OpenProcess来以相同的条件打开同个应用程序,所 获得的句柄值是不一样的,但是他们都是在访问同一个内核对象,因为索引得到的句柄表项里面的内核对象的指针指向的对象是一样的。因此在使用closehandle(handle)来释放句柄的时候,其实是在句柄表里面删除相关索引项,该内核对象的引用计数-1。因此句柄的赋值拷贝并不影响内核对象的引用计数。
当调用了一个会创建内核对象的函数后,函数会返回一个句柄,标识所创建的对象,这个句柄可供进程里面的所有线程使用。在进程初始化的时候,系统会为它分配一个句柄表,句柄表里面的结构通常包含一个内核对象的指针、一个访问掩码和一些标志,而句柄的用处就是在句柄表里面找到对应的内核对象的数据结构。系统用索引的方式来表示内核对象的信息保存在进程句柄表中的具体位置,而这个索引值index=句柄值/4;所以一般都会发现句柄值是4的倍数。当获得了索引值之后,就可以从句柄表里面找到对应的指向内核对象的指针,Windows就是通过这样会让应用程序可以访问到内核对象的。
当说到这里的时候,很多关于句柄的疑问就可以解释的通了。通常来说CreateProcess和OpenProcess来以相同的条件打开同个应用程序,所 获得的句柄值是不一样的,但是他们都是在访问同一个内核对象,因为索引得到的句柄表项里面的内核对象的指针指向的对象是一样的。因此在使用closehandle(handle)来释放句柄的时候,其实是在句柄表里面删除相关索引项,该内核对象的引用计数-1。因此句柄的赋值拷贝并不影响内核对象的引用计数。
相关文章推荐
- 随机输出验证码
- 直接选择排序与反转排序
- 网络红人李涛
- 【SSH快速进阶】——探索Hibernate对象的三种状态:Transient、Persistent、Detached
- fragment不重复创建实例
- 个人博客实现Archives查询小记
- Cocos2d-x 的3D开发功能介绍
- Swift中的问号?和感叹号!
- Dijkstra算法的java实现
- Filter的使用及处理特殊请求
- LeetCode:Delete Node in a Linked List
- 电信 光纤猫 贝尔E8-C-EPON 破解超级管理员密码 实现PPPoE自动拨号和无线路由功能
- SQL 查询中not in 与 not exists 的区别
- 工作流总结(三)JBPM 六个流程服务接口
- MySQL利用正则匹配函数实现多个条件查询
- MarkDown常用语言规则
- Android 从外部网页拉起跳转到App
- 温故知新: JavaScript知识点
- U盘安装centos 6
- 51nod 1276:岛屿的数量 很好玩的题目