简介
内核对象是一个内存块,由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员有些事所有内核对象都有的,比如安全描述符和使用计数,有些是独有的。
利用Windows提供的一组函数可以进行对应的操作。
类型
核心对象 |
产生方法 |
事件对象 |
HANDLE CreateEvent(); |
文件对象 |
HANDLE CreateFile(); |
文件映射对象 |
HANDLE CreateFileMapping(); |
I/O完成对象 |
HANDLE CreateIoCompletionPort(); |
作业对象 |
HANDLE CreateJobObject(); |
信箱对象 |
HANDLE CreateMailslot(); |
互斥对象 |
HANDLE CreateMutex(); |
管道对象 |
BOOL CreatePipe(); |
进程对象 |
BOOL CreateProcess(); |
信号量对象 |
HANDLE CreateSemaphore(); |
线程对象 |
HANDLE CreateThread(); |
等待计时器对象 |
HANDLE CreateWaitableTimer(); |
使用计数
内核对象的所有者是系统内核,而不是进程。所以进程结束后,内核对象不一定会销毁。内核对象的销毁是根据使用计数来进行的,当对象的使用计数为0时,操作系统内核才会销毁该对象。
安全描述符
安全描述符作为内核对象的一个成员,用来描述谁可以使用此对象,谁又不能使用此对象。一般来说,此参数传NULL,表示具有默认安全性。至于具体默认安全性包括哪些,取决于当前进程的安全令牌。
当然,你也可以分配一个 SECURITY_ATTRIBUTES 给它,进行安全控制。
创建内核对象
具体创建方法可以参照上表。
创建内核对象时会返回一个句柄,这个句柄可以由同一进程中所有线程使用。由于句柄值是作为进程句柄表的索引来使用的,所以这些句柄只与当前进程相关,无法供其他进程使用。否则使用的只是其他进程中只是索引值相同的对象而已,至于类型不确定。
关闭内核对象
CloseHandle 用于关闭内核对象,此时我们的进程不能再访问此对象。但是此对象不一定会销毁,因为使用计数不一定为0。
因此忘记调用CloseHandle不一定会对象泄漏,只有程序运行继续运行时才可能会泄漏内核对象。可以使用Windows任务管理器中进程选项卡中的句柄数来查看是否泄漏。如果发生泄漏,可以使用Process Explorer工具定位泄漏位置。
跨进程共享内核对象
由于内容较多,下一节具体分析。
---------------------------------------------------------------------------------------------------------------------------------------------
参考资料:
Windows核心编程(第五版)