内核对象基本概念
内核对象(kernel object)是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。在Windows中常常出现内核对象的概念
每个内核对象都是一个内存块,由操作系统进行内存分配,并且只能由操作系统的内核进行访问,这些内存块是以数据结构的形式存在的。应用程序是无法调用和修改这些内核对象的,所以在使用过程中,可以使用Windows提供的一些API来使用这些对象
使用计数
使用计数的所有者是操作系统。操作系统知道当前有多少个进程正在使用一个特定的内核对象,因为每个对象都包含一个使用计数,使用计数在该对象初次创建时设为1,如果有另一进程获得对现有内核对象的访问后,使用计数就会递增,进程终止运行时,操作系统内核就会自动递减使用计数,当使用计数为0时,操作系统内核就会销毁该对象,这样就可以保证系统中不存在没有被任何进程应用的内核对象。
某函数如下所示:
该函数的第二个参数就是一个安全特性LPSECURITY_ATTRIBUTES,如果一个windows函数有该参数。则说明该函数可以用于创建内核对象
而有的函数没有这个参数,如下图,创建的是用户对象(GDI对象)而非内核对象
同时在使用内核对象时,也要注意所要获取的权限。
进程对象句柄表
进程在初始化时,系统会给这个进程分配一个句柄表,这个句柄表仅供内核对象使用由于具体结构没有参考文档,大概的句柄表结构包含索引,指向内核对象内存块的指针,访问掩码(包含标志位的一个DWORD(4字节))以及标志。
创建与关闭内核对象
列出部分用创建内核对象的函数:
一个进程首次初始化的时候,其句柄表为空