Windows程序进程中内核对象句柄表

来源:互联网 发布:四叠半神话大系 知乎 编辑:程序博客网 时间:2024/05/29 19:33

转自:点击打开链接


个进程在初始化时,系统将为它分配一个句柄表。这个句柄表仅供内核对象使用,不适用于用户对象或GDI对象


创建


一个进程首次初始化的时候,其句柄表为空。当进程内的一个线程调用一个会创建内核对象的函数时,内核将为这个对象分配并初始化一个内存块。然后,内核扫描进程的句柄表,查找一个空白的记录项,并对其进行初始化。具体就是指针成员会被设置成内核对象的数据结构的内部内存地址,访问掩码会被设置成拥有完全访问权限,标志也会设置。

用于创建内核对象的任何函数都会返回一个与进程相关的句柄,这个句柄可由同一个进程中运行的所有线程使用。系统用索引来表示内核对象的信息保存在进程句柄表中的具体位置,要得到实际的索引值,句柄值应该右移两位

调用一个函数时,如果它接受一个内核对象句柄作为参数,就必须把Create*函数返回的值传给它。在内部,这个函数会查找进程的句柄表,获得目标内核对象的地址,然后以一种恰当的方式来操纵对象的数据结构。

关闭


无论以什么方式创建内核对象,我们都要调用CloseHandle向系统表明我们已经结束使用对象,如下所示:
BOOL CloseHandle(HANDLE hobject);
这样会让内核对象的使用计数-1。一旦调用CloseHandle,我们的进程句柄表中对应的记录项就会被清除,即使这个内核对象还没有被销毁,我们也不能再访问那个内核对象了。

如果忘记调用CloseHandle,不一定会发生对象泄漏。在进程运行期间,进程可能发生资源泄漏的情况,但是当进程终止时,操作系统会确保此进程所使用的所有资源都被释放,因为进程终止时,系统自动扫描该进程的句柄表。这适用于所有的内核对象、资源(包括GDI对象在内)以及内存块。

原创粉丝点击