DYF
我思故我在!
 

进程的内核对象与句柄表

当进程初始化时系统为他分配一张句柄表,该句柄表只能用于内核对象而不能用于用户和GDI对象。

  1. 创建内核对象

当进程首次初始化时句柄表还是空的,当进程中的某一线程调用了创建内核对象的函数时,内核就为该对象分配一块内存,并且初始化它。然后内核扫描进程句柄表,寻找一个空白项,进行初始化。

所有创建内核对象的函数都返回一个与进程相关的句柄,它能被所有运行在该进程中的线程正确的使用。

当调用接受核心对象句柄作为参数的WIN32函数时,要传递由某个Create *函数返回的值。在内部函数将查找进程句柄表来得到想要操作的内核对象的地址,然后用定义良好的方式来操作该对象的数据结构。

句柄值是进程相关的,不能被别的进程正确的使用。如果创建内核对象的函数失败了,则返回的句柄值通常时0NULL),也有返回-1INVALID_HANDLE_VALUECreate File 没能打开文件时返回-1。只有在调用Create File时才能把返回值同INVALID_HANDLE_VALUE比较

  1. 关闭内核对象

不管内核对象时如何创建的,都是通过Close Handle来告诉系统已经完成了对对象的操作。

BOOL Close HandleHANDLE hobj

该函数首先检查调用进程的句柄表,来确认进程是否对传递的句柄所指的对象有访问权,

A:如果传递的是无效句柄函数返回FALSEGet Last Error 返回 ERROR INVALID_HANDLE

B:如果索引时有效的,系统将得到内核对象的数据结构的地址,把结构中的使用计数成员减1;如果计数变为0,内核将从内存中释放该内核对象。计数还未减到0则不会释放。

Close Handle返回之前,它清除了在进程句柄表中所占的表项(该句柄无效不能再访问它,无论内核对象释放与否都要进行清除)。如果忘记调用Close Handle函数,可能会发生资源泄露。进程终结时OS确保其使用的所有资源都被释放。

posted on 2008-11-16 17:30  o(∩_∩)o...  阅读(160)  评论(0编辑  收藏  举报