第三章 内核对象
一个内核对象就是一个由内核分配的内存块,该内存块是一种数据结构,只能由该内核访问。它的成员负责维护该对象的各种信息,有些数据成员是所有对象类型中相同的,但大多数数据成员属于特定的对象类型。比如存取符号对象、事件对象、文件对象、文件映射对象、I/O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。这些都是一个内核对象。
由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容,只能通过Windows提供的一组函数来对待这些结构进行操作。
内核对象的使用计数
内核对象由内核所拥有,而不是由进程所拥有。换句话说,内核对象不一定因创建它的进程的终止而撤消。内核对象的存在时间可以可以比创建该对象的进程长。
内核通过每个对象类型常用的数据成员--使用计数,来确认有多少个进程正在使用某个内核对象。对象刚创建时,该对象的使用计数被置为1,随后就随着进程的访问递增,随着进程的终止递减。如果内核对象的使用计数降为0,内核就撤消该对象,以确保在没有进程引用该对象时系统中不保留任何内核对象。
安全性
内核对象能够得到安全描述符的保护。安全描述符用于描述谁创建了该对象,谁能够访问或使用该对象,谁无权访问该对象。安全描述符通常在编写服务器应用程序时使用,如果你编写客户机端的应用程序,那么可以忽略内核对象的这个特性。
用于创建内核对象的函数几乎都有一个指向SECURITY_ATTRIBUTES结构的指针作为其参数。大多数应用程序只是为该参数传递NULL,这样就可以创建带有默认安全性的内核对象。默认安全性意味着对象的管理小组的任何成员和对象的创建者都拥有对该对象的全部访问权,而其他所有人均无权访问该对象。但是,可以指定一个S ECURITY_ ATTRIBUTES结构,对它进行初始化,并为该参数传递该结构的地址。SECU RITY_ATTRIBUTES结构类似下面的样子:
typedef struct_SECURITY_ATTRIBUTES{
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
}SECURITY_ATTRIBUTES;
该结构中包含的与安全性有关的成员实际上只有一个,即lpSecurityDescriptor。