自接触pc 以来,对Windows系统内部运行机制了解甚少.前几日在Net上Down下<<Windows核心编程>>.这几日陆续品尝.今日理解:内核对象.
那么,什么是内核对象怩?
我看到资料,结出的结果是:内核对象是由某种特定的数据结构组成,通过调用Windows函数创建.并在内核中分配一特定内存块的对象.
注:Net上的其他资料肯定比这要容易理解 并全面,需要说明的是,此稿写下的所有知识点理解,均是本人之理解.如有理解之误,请指正.
理解内核对象,以下几点需要关注:
1.使用计数: 看的时候,有点不理解,为什么内核对象还要用使用计数?用这个做什么? 读过之后,给我的感觉是:内核对象的使用计数,就好比上学时玩的垒球,沾上白色的石灰粉,抛投落地.留下痕迹..以证明这个点被击中过.同理.任何进程使用某一内核对象,都被内核记下.说:“你用了一次".下次调用的时候,自动增1..在整个“计数”过程当中,进程扮演了非常重要的角色.必须记住的是:内核对象的存在时间,比创建该对象的时间要长很多.!
2.安全性 : 内核对象能够得到安全描述符的保护! 什么是安全描述符?安全描述符用来规定谁创建了内核对象,谁该访问它、谁无权访问?这让我想起那些依仗权势,作威作福的"小人".不过,在Windows中,这个"小人"确是大大的"好人".一定要注意的是:安全描述符只能在服务器段的应用程序中使用.客户端是可以忽略的
3.进程的内核对象句柄表 : 当进程被初始化的时候,系统会自动为其分配句柄表,句柄表只是用于内核对象?那么,这个表是干什么的呢?还是先让我们看看这表是个什么样子:
索 引 内核对象内存块的指针 访问屏蔽(Dword) 标志(Dword) | |||
1 0x???????????? 0x?????????? 0x???????? | |||
2 0x??????????? 0x?????????? 0x???????? | |||
3 ........................... .................... ................. |
为什么有那么多"?“呢?当进程初始化的时候.这个表是空的.但,如果进程中的线程,(注意:是线程)调用创建内核对象的函数时.这个时候,内核要做两件事情:1.给该对象分配内存块.2.对结构表进行扫描.找出索引项为空的结构,进行初始化操作.呵呵,是不是有点“晕"了?ok.用实例谈一下创建内核对象的函数
HANDLE CreateThread
( PSECURITY_ATTRIBUTES psa,
DWORD dwStackSize ,
LPTHREAD_START_ROUTIME pfnStartAddr,
PVOID pvParam,
DWORD dwCreationFlags,
PDWORD pdThreadID )...........................
一定要记住:用于创建内核对象的所有函数,都返回与进程相关的句柄,这个句柄值,实际上,就是进程句柄表中的索引!它标示的是内核对象信息的存放位置!
4.关闭内核对象 : 不管你用什么方法创建内核对象,在不需要它时,都要调用HANDLE CloseHandle(HANDLE hobj)函数,告诉系统要关闭该内核对象.过程如下:
4.1 函数检查调用进程的句柄表,以检查传递给它的索引.
4.2 如果索引有效:则根据索引,获得内核对象数据结构的地址,确定结构中使用计数的数据成员.如果计数为0.则撤销内核对象.如果索引无效:将会出现两种情况.一、如果该进程正在运行.CloseHandle返回False.在返回之前,将清除掉所有句柄表中的项目.如果进程正在排除错误.系统将告诉调试程序,排除错误 .假如你忘记调用了CloseHandle函数。ok.恭喜你.可能导致内存泄露.