您的位置:首页 > 其它

windows内核对象学习

2014-09-23 21:51 531 查看
何为内核对象和句柄:

Windows程序开发,需要创建和操作内核对象。内核对象的本质是一个内存块,由操作系统的内核进行分配,并且只可以由操作系统内核来访问。这个内存块存放一个特定的数据结构,结构成员维护与对象相关的信息。我们的应用程序无法直接访问这个数据结构,需要调用特定的函数,这些特定的函数将操作这些数据结构。在创建内核对象的函数返回时,都会得到一个handle(句柄),句柄标示一个内核对象,在线程间共享。我们通过将这个句柄传给不同的WINDOWS的API来操作指定的内核对象。句柄与进程相关的,句柄值是与当前进程的句柄表相关的。

内核对象何时被销毁:

当进程创建一个内核对象后,该进程终止运行,这个内核对象不一定被销毁,因为当有别的进程使用它时,内核对象不会被销毁,只有在没有进程使用这个内核对象后,操作系统才会销毁内核对象。这是由于内核对象中包含一个使用计数,被使用会递增,反之递减,变成0时才会销毁。

创建内核对象时指定安全属性:

涉及的主要结构体:SECURITY——ATTRIBUTES结构。该结构包含与安全性有关的成员。在创建内核对象的函数中,通常指定默认的安全属性,参数设为NULL。但是如果想要对创建的内核对象加以访问限制,需要分配一个结构体并且进行初始化再传入参数中去。

进程内核对象句柄表:

句柄表中的每项记录中包含一个指向内核对象的指针,一个访问掩码,和一些标志。

内核对象的创建过程:

在初始化进程时,句柄表为空。在进程中的线程创建一个内核对象后,操作系统的内核会为这个内核对象分配一个内存块,用于存放数据结构。随后,内核扫描进程句柄表,查找空白记录项,对其进程初始化,完成指针设置,掩码设置和标志设置。

句柄值与句柄表的关系:

句柄值实际上时作为进程句柄表的索引来使用,这就解释了句柄是与进程相关的,无法供其他进程使用,因为存在对应关系。在调用一个函数时,通常,函数接收句柄作为参数,根据这个索引查找当前进程的句柄表,然后根据索引项中的指向内核对象的指针来访问,具体访问则是有window决定,使用一种最恰当的方式,哈哈,书上是这么说的。

注意创建内核对象函数的返回值:

调用失败,通常返回0(NULL),也有部分函数返回-1,即INVALID——HANDLE——VALUE,需要具体的分析。

关闭一个内核对象:

使用BOOL CloseHandle(HANDLE hobject)函数。

内部实现过程:首先验证句柄是否有效,即根据句柄值查找主调进程的句柄表,是否存在这样一个有权访问的对象。若有效,系统获得该对象记录项中的内核对象地址,并将使用计数递减。当这个使用计数减为0时,内核对象会被操作系统的内核自动销毁。

若无效,当进程是处于正常运行状态,返回FALSE。如果正在调试,抛出异常。

调用CloseHandle后注意:

该句柄对于当前进程无效,无法再使用,无论内核对象是否被销毁。如果没有调用closehandle,在进程运行结束时,操作系统会回收全部的资源。在程序运行时,没有关闭句柄可能会造成内存的泄漏,但这种情况在进程终止后就会将内核对象销毁。操作系统会通过扫描句柄表,如果没有有效的记录项,立即销毁对象,如果还有进程在使用,则会等待使用计数为0.我觉得操作系统这种执行方式确实很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: