对象句柄的继承性有一个非常奇怪的特征,那就是当使用它时,子进程不知道它已经继承
了任何句柄。只有在另一个进程生成子进程时记录了这样一个情况,即它希望被赋予对内核对
象的访问权时,才能使用内核对象句柄的继承权。通常,父应用程序和子应用程序都是由同一
个公司编写的,但是,如果另一个公司记录了子应用程序期望的对象,那么该公司也能够编写
子应用程序。

解决方案 »

  1.   

    下面这段话对对象句柄的继承性做了详细说明:
    1.内核对象句柄的继承性当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄。父进程可以使用一个或多个内核对象句柄,并且该父进程可以决定生成一个子进程,为子进程赋予对父进程的内核对象的访问权。 注意啦:虽然内枋对象句柄具有继承性,但是内核对象本身不具有继承性. 2.创建能继承的句柄父进程只要指定SECURITY_ATTRIBUTES 结构中的bInheritHandle为真, 然后将该结构的地址传递给特定的Create函数(创建内核对象的函数) 在内核对象句柄表中的标志,它就是用来指明该句柄是否具有继承性的。如果bInheritHandle为1,那么标志位就置为1,否则为0; 注意:对象句柄的继承性只有在生成子进程的时候才能使用,如果父进程准备创建带有可继承句柄的新内核对象,那么已经在运行的子进程将无法继承这些新句柄。 3.如何生成子进程用CreateProcess(….)其中参数bInheritHandles设为TRUE, 那么子进程就可以继承父进程的可继承句柄值了。此时系统为子进程创建一个新的和空的句柄表,因为设定了bInheritHandle为TRUE,那么它要遍历父进程的句柄表,对于它找到的包含有效的可继承句柄的每个项目,系统会将该项目copy到子进程的句柄表。该项目copy到子进程的句柄表中的位置将与父进程的句柄平中的位置完全相同。也就是说父进程与子进程中,标识内核对象所使用的句柄值是相同的.另外,系统还要递增内核对象的使用计数,注意:CreateProcess函数返回后,父进程可以立即关闭对象的句柄,而不影响子进程对该对象进行操作的能力。从上可以看出:
    1、内核对象句柄的继承权只有在创建子进程的时候才能发生作用(通过指定可继承的参数),这样可以解释:只有在另一个进程生成子进程时记录了这样一个情况,即它希望被赋予对内核对象的访问权时,才能使用内核对象句柄的继承权。
    2、一个子进程在创建时,可以指定是否需要继承父进程的对象句柄,由于创建进程的不是进程本身,必须是另一个进程,所以子进程是无法确认自己是否得到了对象句柄的继承权(需要父进程指定继承参数),所以也没办法知道已经继承了句柄,这样可以解释:对象句柄的继承性有一个非常奇怪的特征,那就是当使用它时,子进程不知道它已经继承了任何句柄。
    3、那我们怎么使用对象句柄的继承性呢?只有让子进程代码的作者知道明确知道创建的父进程会给予自己对象句柄的继承权,也就是说不管是不是一个公司,只要子进程程序的作者有办法知道创建自己的父进程会给自己那些句柄继承,就可以使用继承的句柄,这样能解释:
    通常,父应用程序和子应用程序都是由同一个公司编写的,但是,如果另一个公司记录了子应用程序期望的对象,那么该公司也能够编写子应用程序。
      

  2.   

    这种问题还是多看书的好,多看几遍书就好了。《windows核心编程》对这个问题描述的很清楚,我就不copy了