内核对象
-
什么是内核对象?
-
内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改。
-
-
如何操作内核对象?
-
创建一个内核对象:CreateXXX(对象)
-
打开一个内核对象使用: OpenXXX(对象名)
-
通常来讲,每一个内核对象都有自己的标识,可能是 id ,也可能名字,通过名称或者 id 就可以打开一个已经被创建的内核对象了。
-
-
操作内核对象:使用的是与对象关联的一些函数
-
关闭一个内核对象:大多数使用 CloseHandle()
-
-
内核对象的几个特性
-
全局性:内核对象是归操作系统所有,在不同应用程序中能够操作同一个内核对象。
-
引用计数:每一个内核对象都有一个引用计数,当创建或者打开一个内核对象的时候,引用计数会+1,当关闭一个内核对象的时候,引用计数会 -1,当引用计数为 0 的时候,内核对象会被销毁。
-
当一个应用程序退出的时候,该程序打开的所有内核对象都会被主动担当 CloseHandle
-
-
安全描述符:大多数内核对象在创建的时候都需要提供一个安全描述符,通常使用 NULL
-
句柄表:操作内核对象必须通过内核对象句柄,而内核对象句柄实际上是句柄表的索引,句柄表描述了当前内核对象所在内核中的位置和访问权限。句柄表是进程相关的,同一个内核对象在不同的进程中可能存在不同的值。
应用程序一 行为 CreateFile() 创建一个文件 test1.txt 产生了对应的句柄 4 (test1) OpenFile() 打开一个文件 test2.txt 产生了对应的句柄 8 (test2) 应用程序二 行为 CreateFile() 创建一个文件 test2.txt 产生了对应的句柄 4 (test2) OpenFile() 打开一个文件 test1.txt 产生了对应的句柄 8 (test1)
-
-
内核对象的跨进程访问
-
在父进程创建子进程的时候,可以选择子进程是否拥有父类的句柄
-
大多数的内核对象都有一个名字或者id,通过id可以访问到其他进程创建的内核对象
-
使用 DuplicateHandle 从一个进程中拷贝内核对象句柄到另一个进程
-
-
在句柄表中添加内核对象的途径