跨进程边界共享内核对象
在很多情况下,我们需要跨进程边界共享内核对象。实现的方法有三种,继承对象句柄,给对象命名,复制对象句柄。
1.继承对象句柄
只有当进程具有父子关系时,才可以使用对象句柄的继承性。想要父进程生成一个子进程,并且赋予子进程对父进程内核对象的访问权,父进程必须完成以下几个操作:
当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄,也就是 SECURITY_ATTRIBUTES的 bInheritHandle 置为 TRUE。并且创建子进程时,bInheritHandles参数同样只置为TRUE。这样,子进程在创建出来的时候,也会由一张空的句柄表,系统会遍历父进程的句柄表,将可继承的项拷贝进子进程句柄表的相同位置。这样同一个句柄值在父进程和子进程中就可以代表同一个内核对象了。
(这个操作满足上述内核对象的所有特性,相应的计数器会加1)。需要注意的是,继承的是句柄而不是对象。 若要改变内核对象句柄的继承标志,可以调用SetHandleInformation函数。
2.给对象命名
许多(虽然不是全部)内核对象都是可以命名的。名字的长度最多可以达到MAX_ PATH(定义为2 6 0)个字符。
起名字要带有特点,因为Windows下的内核对象没有命名的指导原则,也就是可能创建了一个内核对象的名字与已经存在的其他类型内核对象重复,这样就会出错。(名字与同一类型内核对象重复是可以的,这也是共享内核对象的方法)。
举个例子来说明,