转载的:http://www.51testing.com/html/51/n-821751.html
Windows内核对象是什么我这里就不介绍了,任何一本关于windows编程的书都会介绍,我这里就把我找到的关于跨越进程边界共享内核对象的方法和大家分享了。
在windows系统中想要跨越进程边界共享内核有3种方法,当然不排除以后还有更多方法,或是一些变种的方法。
● 继承对象句柄
看到继承大家肯定不陌生,了解一点面向对象知识的好青年都知道这是个什么意思。简单来说就是你爸爸生你,你继承你爸爸的一点特性罢了。当两个进程具有父子关系时,就可以使用这种对象句柄的继承方法来跨越进程边界,共享进程内核对象。父进程在创建子进程时可以为子进程赋予父进程拥有的内核对象的访问权限。不过想要这么做就些前提条件。
首先,当父进程在创建内核对象时必须向系统指明,它希望这个内核对象的句柄是个可继承的句柄。这里不是说内核对象可以继承,而仅仅是句柄可以继承。怎么实现这个设定呢?父进程只需要指定一个SECURITY_ATTRIBUTES结构,并将这个结构的bInheritHandle属性设置为TRUE就行了,然后在创建内核对象时把这个结构体传递给创建函数,那么返回的句柄就是一个可继承的句柄。像下面这样:
|
然后在创建子进程时将入参bInheritHandles设置为TRUE就行了,像下面这样:
|
当把bInheritHandles设置为TRUE时,系统创建这个子进程后会把父进程中能够继承的所有句柄项拷贝到子进程的句柄表中,这样子进程就可以控制父进程所拥有的内核对象了,当然这个过程不是实时的,也就是说在创建了子进程后,如果父进程再创建了一个可继承的内核对象时,这个在子进程生成后创建的可继承内核对象是不会被这个子进程继承的。真绕口。。。简单点就是时过境迁,物是人非,过了这村就没这店了。
● 使用命名对象
这个方法是个人都能想到,当你想找一个人的时候,首先想到的是他的名字(也可能是他的长相,好吧,就当我YY吧!),我们在创建内核对象时为他们命名就可以在其他进程需要使用这个内核对象时调用它的名字就行了。比如我上面那个创建互斥内核对象的函数CreateMutex(),它的原型其实是下面这样的:
|
第三种方式:
句柄复制