内核对象(2)

本文探讨了跨进程共享内核对象的方法,包括句柄继承、句柄标志更改、对象命名及句柄复制等技术。重点讲解了如何利用句柄实现父子进程间的对象继承,并讨论了通过命名和复制句柄实现不同进程间共享的具体步骤。

一、跨进程边界共享内核对象

1、使用对象句柄实现继承

 1)前面我们有提及到共享利用对象句柄继承,不错。在句柄表中的第3项正是与此相关,当然首先要创建SECURITY_ATTRIBUTES结构。在创建CreateProcess时,将bInheritHandle设置为TRUE,会将其完整的复制到子进程的句柄表中。复制项的位置与它在父进程中的位置是一样的,这就是意味这一个内核对象进行标识的句柄值是完全一样的。

Closehandle后,如果父进程关闭了,但是子进程依旧可以操作这个对象。内核对象的内容被保存在内核地址空间中-系统上运行的所有的进程都共享这个空间。正如后面将提及的

2)利用名字共享。

有一种情况是,父进程在生成子进程之后又创建了新的内核对象,并设置其为可继承的句柄,这个时候,子进程是不能够继承这个新的内核对象的。

实在子进程并不知道自己继承了什么句柄,那么我们怎样的让其知道呢,

1)一种方式是在将句柄值作为命令行参数传给子进程。

2)或者利用消息机制,传递消息。淡然了可以利用父进程在环境块中添加一个环境变量。环境变量是子进程知道的一个名称。这里本人也有疑问:子进程是通过怎样方式知道的呢????查看相关资料之后发现,应该在父进程中定义一个环境变量,然后定义一个子进程,查看父进程中的自定义的变量。在父进程中使用export variable(变量名),然后重新打开子进程,在子进程内实现该变量的variable.

 2、改变句柄的标志

1)使用SetHandleInformation控制哪些子进程可以继承内核对象句柄。SetHandleInformation(hObj,HANDLE_FLAG_INHERIT,HANDLE_FLAG_INHERIT)打开一个内核对象句柄的继承标志。HANDLE_FLAG_PROTECT_FROM_CLOSE告诉系统不允许关闭句柄。但是很可能出现的是在孙进程与父进程之间出现断节。因为在子进程中关闭了句柄。

3为对象命名

1使用DuplicateHandle来实现进程见的对象共享,通过对象命名来实现共享,是否可以继承并非一个必要的条件。

2在系统中没用机制保证没有同名的,所以在创建对象的时候,若是已经存在同类型的,先进行安全访问权限的验证。若是可以的,那么则在句柄表中查找一个空白记录项。将其初始化指向现有的内核对象,如果对象类型不匹配,则调用者被拒绝访问,若没有进行创建。

这个时候使用计数会增加,这个时候两个进程中的句柄值是不一样的,很可能的,但是它们可以用自己的句柄值来进行访问,他们指向的是内存中同一个内存块就OK

备注;GUID:全球唯一标识符。可以作为俄自己的对象名称使用。

现在我们要做的是怎么避免使用同一个名字,现在有如C#中的命名空间,当然在C++中也是存在的。客户端能访问的饿内核对象都放在全局命名空间中,客户端会话有一个自己的命名空间。如此避免会话之间的干扰。

4、复制对象句柄

这是一个边界共享内核对象的另一种方式

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值