Windows内核对象

内核对象(kernel object)是一个内存块,由操作系统分配,并只能有操作系统内核访问。这个内存块是一个数据结构,其成员维护者与对象相关的信息。

内核对象的数据结构成员:使用计数(usage count)和安全描述符(security descriptor,SD),这两个成员为所有内核对象共通的,其他大多数成员都是不同类型的内核对象所特有。

内核对象的数据结构只能由操作系统内核访问,应用程序不能再内存中定位这些数据结构并直接改变其内容。

内核对象的所有者是操作系统内核,而非进程。换言之,进程调用一个函数来创建了一个内核对象,然后终止运行,则内核对象并不一定销毁。大多数情况下,这个内核对象是会被销毁的,但假如另一个进程正在使用我们的进程创建的内核对象,那么在其他进程停止使用它之前,他是不会销毁的。

内核对象可以通过函数来创建。初次创建内核对象时,其使用计数设为1,另一个进程获得对现有内核对象的访问后,使用计数就会递增。调用一个会创建的内核对象的函数后,函数会返回一个句柄(handle),它标志了所创建的内核对象。在32位Windows操作系统进程中,句柄是一个32位值;在64位Windows进程中,则是一个64位值。为了增强操作系统的可靠性,句柄值是与进程相关的。这个句柄值可由同一个进程内中运行的所有线程使用。

一个进程在初始化时,系统将为它分配一个句柄表(handle table)。这个句柄表仅供内核对象使用,不适用于用户对象和GDI对象。当进程内的线程创建一个内核对象时,内核扫描进程的句柄表,查找一个空白的记录项,并对其初始化。

由于句柄值实际是作为进程句柄句柄表的索引来使用的,索引这些句柄是与当前这个进程相关的,无法供其他进程使用。

总之,关闭内核对象句柄和销毁内核对象是不同的概念。当进程终止运行时,操作系统会确保此进程所使用的所有资源都被释放(内核对象句柄被关闭);而只有当内核对象中的使用计数递减至0时,内核对象才被销毁。

内核对象往往并不是内核对象本身。比如:线程程内核对象不是进程本身,而是操作系统用来管理这个线程程的一个小型数据结构。而内核对象句柄是用来标记内核对象的,应用程序可以通过与内核对象关联的句柄来操纵内核对象。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值