1. 内核对象的所有者是操作系统内核,而非进程。进程终止后,在进程中所创建的内核对象不一定都销毁了。内核对象存在的时间可以比创建该对象的进程长。
2. 每个内核对象都包含一个使用计数,一旦对象的使用计数变成0,操作系统内核就会销毁该对象。
3. 内核对象可以用一个安全描述符来保护。安全描述符描述了谁(通常是创建者)拥有对象,哪些组和用户被允许访问或使用此对象,哪些组和用户被拒绝访问此对象。安全描述符通常在编写服务器应用程序的时候使用。
4. 要想判断一个对象是不是内核对象,最简单的方式是查看创建这个对象的函数。几乎所有创建内核对象的函数都有一个允许我们指定安全属性信息的参数。
5. 一个进程在初始化时,系统将为它分配一个句柄表,这个句柄表仅供内核对象使用。
6. 每个句柄表对应一条记录,包括:句柄索引,指向内核对象内存块的指针,访问掩码,标志。标志里包含有句柄是否可以继承的标志位。
7. 进程首次初始化的时候,其句柄表为空。当某个线程创建内核对象时,内核将为这个对象分配并初始化一个内存块。然后将内该内核对象的信息填入到句柄表的某一条记录中。
8. 创建内核对象的函数返回值都是一个与进程相关的句柄,如果创建失败,返回值大部分是NULL, 也有少部分是INVALID_HANDLE_VALUE,在编程时应当仔细查看。
9. 内核对象不再使用时,应该调用函数CloseHandle()关闭内核对象。
10. 创建一个内核对象时,我们会将相应的句柄保存在一个变量中。当我们关闭内核对象后,应该将该变量传递NULL值,以防止之后再使用这个变量时出错。
11. 进程终止时,操作系统会确保此进程所使用的所有资源都被释放。若句柄表中有任何有效的记录项,操作系统会为我们关闭这些对象句柄。
12. 只有在进程之间有一个父子关系时,才可以使用对象句柄继承。为了创建一个可以继承的句柄,父进程必须初始化一个SECRITY_ATTRIBUTES结构。