windows 内核对象理解

一、内核对象概念
1.是操作系统分配的一个内存块(只有操作系统内核才有资格直接操作),这个内存块是一个数据结构,维护着与对象相关的信息(如计数器)。

二、进程如何操作内核对象
1.应用程序通过句柄访问内核对象,多进程需要共享内存对象才能进行跨进程调用句柄。

三、内核对象何时销毁
1.操作系统内核通过计数器知道有多少进程在使用这个内核对象.(因为进程终止后,内核对象不一定销毁,只有当计数器归0 时,操作系统内核才会销毁内核对象)

四、内核对象安全性
1.所有创建内核对象的函数都指向一个SECURITY_ATTRIBUTES结构作为参数。

五、理解进程内核对象句柄表
1.进程在初始化时,系统会为它分配一个句柄表,此句柄表仅供内核对象使用,像用户对象和GUI对象都无法使用,句柄表的结构是由一个数据结构组成的数组,这个数据结构包含指向内核对象的指针、一个访问掩码和一些标志


六、如何创建内核对象
1.一个进程在初始化的时候,句柄表是空的,当进程里面的一个线程调用一个创建内核对象的函数时,操作系统内核就会为这个内核对象分配一个内存块,并且扫描进程的句柄表,找到一个空的记录项,对其进行初始化。这个记录项的指针指针成员将会被设置成内核对象的数据结构的内部内存地址。
2.任何创建内核对象的函数都会返回一个句柄,这个句柄可以由这个进程内的所有线程使用。句柄的值除以4(右移两位),就是内核对象的信息保存在这个进程句柄表中的具体位置,实际是一个索引。
3.因为句柄值实际是一个索引,它需要右移4位才是实际索引值,所以句柄值可能会出现4、8之类的值。如果创建内核对象函数调用失败,那么返回的句柄值是0(NULL)。注意:有几个函数在调用失败后会返回句柄值-1(INVALID_HANDLE _VALUE),所以需要仔细检查创建内存对象函数的返回值是-1还是0。

七、函数如何操作句柄
1.调用一个函数,如果函数的传入参数是句柄,那么这个函数将会根据句柄查找进程的句柄表,通过句柄表的成员指针,获得内存对象的地址,再进行操纵内存对象。
2.如果作为传入参数的句柄是无效的,GetLastError会返回6(ERROR_INVALID_HANDLE)。

八、为什么句柄不能跨进程调用
1.这个句柄的值是作为进程句柄表中的索引来使用的,所以这个句柄是与当前进程相关的,其他进程无法使用。
2.如果跨进程调用句柄,那么实际引用到的只是这个进程句柄表中的位于同一个索引项的内核对象———只是索引值相同而已

九、创建内存对象函数调用失败的原因
1.系统内存不足。
2.遇到一个安全问题


十、关闭内核对象
1.无论是什么方式创建内核对象的,都需要用CloseHandle向系统表明我们已经结束使用对象。
2.在这个CloseHandle 函数内部,首先检查主调进程的句柄表,验证“传给CloseHandle函数的句柄值 ”标识的是“主调进程确实有权访问的一个对象”。如果这个句柄是有效的,那么操作系统内核将根据进程的句柄表获得内核对象的数据结构的地址,并将结构中的“使用计数”成员递减,如果计数为0,内核对象将被销毁名并且从内存中去除。
3.如果传给CloseHandle 函数的是一个无效句柄,(1)如果进程是正常运行的,CloseHandle将会返回FLASE,而GetLastError返回ERROR_INVALID_HANDLE。(2)如果进程正在被调试,那么系统将会抛出0xC0000008异常(“指定了无效句柄”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值