Windows核心机制探究:内核对象

自接触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.恭喜你.可能导致内存泄露.

 

posted @ 2008-06-23 22:57  jason wei  阅读(493)  评论(0编辑  收藏  举报