内核对象的数据结构只能有操作系统内核访问,应用程序只能通过一些函数进
行访问和操作。
创建内核对象:在32为windows进程中句柄是一个32位值,在64位进程中
则是64位值。
句柄值是与进程相关的,如果将句柄值传给另一个进程的线程将有可能失败
不过或许程序会根据我们传的句柄引用一个完全不同的内核对象。
使用计数:
初次创建内核对象时,内核对象计数为1,如果另一个进程使用该对象时计数
将递增,同时也会随着使用进程的终止而递减,直到所有的引用停止,计数变为
0内核对象才会销毁。
内核对象安全性:
不同于用户对象GDI。。。内核对象的创建基本都会伴随着安全参数,
SECURITY_ATTRIBUTES结构体包含了对象的继承性和安全性有关成员。不过
如果我们不关心其安全性,也可以传入NULL。
不关心对象的安全性。
进程内核对象句柄表:
一个进程初始化时就被系统分配了一个句柄表,这是一个结构体数组其中每个
结构体都包含了指向一个内核对象的指针,一个访问掩码,和一些标志。
当我们创建内核对象时,指针成员将被设置成内核对象的数据结构的内部内存地
址,访问掩码将被设置成拥有完全访问权限。而其标志信息将取决于句柄是否可
以被继承,也就是通过设置安全属性的继承信息。
在我们将安全信息SECURITY_ATTRIBUTES传入空时将导致返回句柄不可继
承,其句柄标志也将为0,当我们将这个结构体变量传入并且在bInheritHandle
设定为true时标志将为1;此外还可以通过其他api来设定标志。
索引:
句柄是通过索引来存储在系统的一个进程句柄表中的,这个索引值就是句柄的实
际值除以4,因为最后两位是供操作系统内部使用。
无效句柄:
往往我们会根据返回值来获取错误信息。但是并不是每次返回失败时都会返回空
或者返回INVALID_HANDLE_VALUE,这要看创建内核对象的函数!