进程的内核对象与句柄表
当进程初始化时系统为他分配一张句柄表,该句柄表只能用于内核对象而不能用于用户和GDI对象。
- 创建内核对象
当进程首次初始化时句柄表还是空的,当进程中的某一线程调用了创建内核对象的函数时,内核就为该对象分配一块内存,并且初始化它。然后内核扫描进程句柄表,寻找一个空白项,进行初始化。
所有创建内核对象的函数都返回一个与进程相关的句柄,它能被所有运行在该进程中的线程正确的使用。
当调用接受核心对象句柄作为参数的WIN32函数时,要传递由某个Create *函数返回的值。在内部函数将查找进程句柄表来得到想要操作的内核对象的地址,然后用定义良好的方式来操作该对象的数据结构。
句柄值是进程相关的,不能被别的进程正确的使用。如果创建内核对象的函数失败了,则返回的句柄值通常时0(NULL),也有返回-1(INVALID_HANDLE_VALUE)Create File 没能打开文件时返回-1。只有在调用Create File时才能把返回值同INVALID_HANDLE_VALUE比较
- 关闭内核对象
不管内核对象时如何创建的,都是通过Close Handle来告诉系统已经完成了对对象的操作。
BOOL Close Handle(HANDLE hobj)
该函数首先检查调用进程的句柄表,来确认进程是否对传递的句柄所指的对象有访问权,
A:如果传递的是无效句柄函数返回FALSE和Get Last Error 返回 ERROR INVALID_HANDLE。
B:如果索引时有效的,系统将得到内核对象的数据结构的地址,把结构中的使用计数成员减1;如果计数变为0,内核将从内存中释放该内核对象。计数还未减到0则不会释放。
在Close Handle返回之前,它清除了在进程句柄表中所占的表项(该句柄无效不能再访问它,无论内核对象释放与否都要进行清除)。如果忘记调用Close Handle函数,可能会发生资源泄露。进程终结时OS确保其使用的所有资源都被释放。