#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继承来的所有可继承的句柄
*/