创建子进程控制句柄继承能力

#include "windows.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    //win32创建新进程的时候使用此结构的成员,一般清0使用默认值,将cb成员设置为结构体的长度
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    //针对B进程主线程设置不同安全描述,因为创建的进程内核对象,线程内核对象的均属于内核对象
    //所以给出安全描述
    SECURITY_ATTRIBUTES saPB, saTB;

    //取回进程B和进程C的创建的进程主线程内核对象的句柄,以便父进程操纵之,两个进程会返回四个内核对象的句柄
    PROCESS_INFORMATION piPB, piPC;
   
    //进程B的内核对象句柄可继承的
    saPB.bInheritHandle = TRUE;
    saPB.lpSecurityDescriptor = NULL;
    saPB.nLength = sizeof(saPB);

    //B主线程内核对象的句柄不可继承
    saTB.bInheritHandle = FALSE;
    saTB.lpSecurityDescriptor = NULL;
    saTB.nLength = sizeof(saTB);

    //创建进程B
     CreateProcess(NULL, "ProcessB", &saPB, &saTB,
                   FALSE,    //设置成不继承任何父进程的句柄
                   0, NULL, NULL, &si,
                   &piPB    //这里反B进程内核对象句柄和B主线程内核对象句柄
                   );

     //创建进程C
     CreateProcess(NULL, "ProcessC",
                   NULL,    //默认句柄值为不可继承
                   NULL,    //同上述
                   TRUE,    //可继承进程A的任何可继承的句柄,这里
                   0,
                   NULL,
                   NULL,
                   &si,        //由此可知,&si是一个传入参数,创建进程使用,
                            //非传出参数,所以进程B使用之后未改变其值,进程C可继续使用
                   &piPC
                   );

     return 0;
}


/*
进程句柄表的布局:
    对于进程A:
               (1)pA的句柄    pA:A进程
               (2)mTA的句柄    mTA:A进程的主线程
               (3)pB的句柄
               (4)mTB的句柄
               (5)pC的句柄
               (6)mTC的句柄
    对于进程B:
               (1)pB的句柄
               (2)mTB的句柄
    对于进程C:
               (1)pC的句柄
               (2)mTC的句柄
               (3)从pA继承来的所有可继承的句柄
*/

你可能感兴趣的:(创建子进程控制句柄继承能力)