一、什么是内核对象

  • 内核对象呢的本质是一个结构体,但是这个结构体只能由操作系统内核部分进行访问,并且也只能由操作系统进行创建。如果我们想要操作一个内核对象,就必须通过已知的内核对象句柄,找到内核对象,并使用供应的一组API进行操作。
  • 内核对象的通用操作形式:创建内核对象使用的函数通常是 CreateXXX,打开内核对象使用的函数是OpenXXX,关闭内核对象通常使用的函数是 CloseHandle。

    二、内核对象的特性

    1.全局性:内核对象是跨进程的,通过打开或创建内核对象我们可以在不同的应用程序中访问到同一个对象,通常需要使用已知的 id 或名称找到(标识)一个内核对象。
    2.引用计数:每一个内核对象都必然拥有一个引用计数,说明当前有多少个地方操作到了内核对象。当用户创建或打开了一个内核对象,引用计数会+1,当使用类似于 CloseHandle 的函数关闭内核对象的时候,引用计数就会-1,当引用计数为0的时候,内核对象会在合适的时候被销毁掉。
    3.安全性:大多数的内核对象(除了完成端口内核对象)在创建的时候,都需要提供一个叫做安全属性的参数,安全属性描述了什么用户和什么组能否访问当前对象,大多数时候,我们可以传递 NULL ,表示使用默认值。
    4.句柄表:每一个应用程序都维护了一个句柄表。相同的内核对象在不同的应用程序中,可能存在不同的句柄表值,通常句柄的值是句柄表的索引4,句柄表描述了内核对象位于内核中的结构体对应的位置,当前拥有的一组权限,以及其他的一些标志。*当一个应用程序被关闭的时候,会主动的将句柄表中的所有内核对象引用计数-1。

    三、内核对象的跨进程访问方式

  • 由父进程继承给子进程(在创建进程的时候指定一个参数为 TRUE)

  • 使用名称或者 ID 作为标识,打开一个内核对象