Windows内核对象

3.1.何为内核对象?

内核对象是由操作系统管理的一块内存块,不同的内核对象有不同的数据成员。操作系统通过计数器来对内核对象管理。由于内核对象有不同的安全性管理,所以我们可以通过函数的参数是否有安全性这个属性来判断要操作的对象是否是内核对象。

用户通过windows提供的函数创建内核对象后,获得一个句柄,这样用户就可以通过句柄去使用这块内存块了。

3.2.什么是进程内核对象句柄表

进程内核对象句柄表其实就是在创建进程时这个进程可以使用的句柄的列表,这样在进程结束的时候,系统可以通过句柄表来对内核对象的计数器减1.

3.2.1.创建内核对象

创建内核对象的失败的返回值有些函数是NULL,有时却是INVALID_HANDLE_VALUE,这个需要注意

3.2.2.关闭句柄

由于系统是通过计数器来判断是否销毁内核对象的,所以需要在不使用句柄的时候,CloseHandle(),如果不调就会发生在该进程的生命期内对象泄漏,由于进程退出的时候,会自动去检查句柄表,
没有关闭的话会去关闭,所以不会发生系统生命期内对象泄漏。

同时要注意一点是,CloseHandle()的时候,会去检查句柄表,判断这个句柄是否是该进程拥有的,不是的话,返回false

3.3跨进程边界共享内核对象

由于句柄是进程级别的,所以进程间共享内核对象并不容易

常用的跨进程边界共享内核对象的方法有:

a)使用对象句柄继承

1.可以在父进程创建CreateProcess子进程的时候bInHeritHandle设置为true,一般都是设置为false的,但是需要注意的是,只有在CreateProcess前的句柄才会被继承
2.如果希望某个句柄被有些子进程继承有些子进程不继承,可以通过SetHandleInformation设置,这个函数同时也可以设置这个句柄不可以被关闭,这样就会有机会让孙进程也继承这个句柄.
因为孙进程要继承父进程的句柄,也就是父和孙要通过句柄通信,必须这个句柄被子进程继承,并且没有在孙进程创建之前关闭.
3.句柄继承除了通过创建进程时继承外,更通常的做法是,通过参数传递给子进程句柄值或者通过环境变量传递值

b)为对象命名

创建对象的时候可以直接为对象命名,这样其他进程可以通过同样的创建函数去获取这个对象,如果有这个名字的对象并且有权限访问,则获取句柄,没有这个对象,或没有权限则返回null
由于系统没有办法区分同样名字的不同对象,所以同名字的不同对象会获取失败.
当然也可以通过open来获取这个对象
应用:可以通过create一个命名对象,通过getlasterror,来判断这个对象是否存在,如果存在则说明这个应用程序已经有一个实例了.

c)复制对象句柄

将源进程S的句柄1复制到目标进程T的句柄1的位置,需要有一个第三方进程C,调用DuplicateHandle(S进程内核对象,复制句柄,T进程内核对象,复制到C句柄表hobjc中T的新句柄的索引.....);
由第4个参数可以看出,因为复制句柄,T进程不知道自己的进程表被更新,所以C必须将自己hobjc句柄的值通知给T,因为hobjc是T新句柄的索引.















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值