一、跨进程边界共享内核对象
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、复制对象句柄
这是一个边界共享内核对象的另一种方式
本文探讨了跨进程共享内核对象的方法,包括句柄继承、句柄标志更改、对象命名及句柄复制等技术。重点讲解了如何利用句柄实现父子进程间的对象继承,并讨论了通过命名和复制句柄实现不同进程间共享的具体步骤。
347

被折叠的 条评论
为什么被折叠?



