现在的位置: 首页 > 综合 > 正文

Windows内核对象句柄的继承小总结

2012年10月07日 ⁄ 综合 ⁄ 共 1089字 ⁄ 字号 评论关闭

对象句柄的继承

 

跨进程边界共享内核对象有三种常用的机制:为对象命名、复制对象句柄,还有就是使用对象句柄继承。

 

Windows支持“对象句柄的继承”,而不是支持对象的继承。(这里顺带总结一下,内核对象本质上是一个内存块,是操作系统内核分配,并只能由操作系统内核访问。而句柄标识了所创建的内核对象,与进程相关。句柄的值大概可以认为是进程句柄表的一个索引值,标识内核对象在进程句柄表中的位置。进程句柄表,可以想像成一个由数据结构组成的数组。)

为了使用对象句柄的继承,需要做两步工作。

第一步:创建一个可继承的句柄,父进程必须分配并初始化一个SECURITY_ATTRIBUTES结构,并将并结构的一个成员bInheritHandle赋值为TRUE,并将该结构的地址传给具体的Create函数。(将结构成员的bInheritHandle设为TRUE仅表示,该内核对象是可以继承的,子进程可不可以继承,还有看第二步的CreateProcess的调用参数)

 

第二步:由父进程生成子进程,这是通过调用CreateProcess函数,并往bInheritHandles参数传TRUE。该值向系统表明,子进程可以继承父进程句柄表中“可继承的句柄”。(“可继承的句柄”指的是,第一步中将成员bInheritHandle设为TRUE的对象。)

 

综上所述就是:SECURITY_ATTRIBUTES结构的成员bInheritHandle仅决定自身在父进程创建子进程的可继承性,其最终的是否会被继承,还参照父进程在CreateProcess调用中bInheritHandles。因为这一个参数决定,子进程是否有继承父进程“资产”的资格。如果连资格的木有的话,那些可以被他继承的资产就木有什么意义了。哈,写到这里,我突然想到一个比较重口味的比喻:A的老爸死了,正常来说,A可以继承他老爸的财产(可继承的对象的句柄),但是他老爸的老婆,他是不可以继承的(不可继承的对象的句柄)。现在来考虑另外一种情况,那就是A的老爸在死之前写了遗嘱,让A不能继承他的任何东西(CreateProcess中的bInheritHandles为FALSE),那么A不能从他的老爸那里得到任何东西。

 

如果想更加好地理解这两个bInheritHandle的作用,可以参考《Windows核心编程 5th》P88的程序,那里就很好的说明的这一种机制。而且还详细说明了CreateProcess调用中psaProcess、psaThread的作用。

 

PS:上面大部分取自书中原话,小部分自己总结,一家之言,若有错漏,请前辈朋友们指出,谢谢。

 

抱歉!评论已关闭.