CreateProcess函数的原型如下:
BOOL CreateProcess (
PCTSTR pszApplicationName,
PTSTR pszCommandLine,
PSECURITY_ATTRIBUTES psaProcess,
PSECURITY_ATTRIBUTES psaThread,
BOOL bInheritHandles,
DWORD fdwCreate,
PVOID pvEnvironment,
PCTSTR pszCurDir,
PSTARTUPINFO psiStartInfo,
PROCESS_INFORMATION ppiProcInfo
);
pszApplicationName和pszCommandLine分别指定新进程要使用的可执行文件的名称,以及要传给新进程的命令行字符串,一般情况
下pszApplicationName参数都会传入NULL。
psaProcess和psaThread是调用进程为子进程的进程内核对象和线程内核对象指定安全性,bInheritHandles主调进程的可继承的句柄
能否被新进程继承。
VOID ProcessInherit( VOID )
{
STARTUPINFO si = { sizeof(si) };
SECURITY_ATTRIBUTES saProcess, saThread;
PROCESS_INFORMATION piThreadB, piThreadC;
TCHAR szPath[MAX_PATH];
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = TRUE;
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = FALSE;
//Spawn Process B
_tcscpy_s(szPath, _countof(szPath), _T("ProcessB"));
CreateProcess(NULL, szPath, &saProcess, &saThread, FALSE, 0, NULL, NULL, &si, &piThreadB);
_tcscpy_s(szPath, _countof(szPath), _T("ProcessC"));
CreateProcess(NULL, szPath, NULL, NULL, TRUE, 0, NULL, NULL, &si, &piThreadC);
CloseHandle(piThreadB.hThread);
CloseHandle(piThreadB.hProcess);
CloseHandle(piThreadC.hThread);
CloseHandle(piThreadC.hProcess);
}
fdwCreate参数标识了新进程创建方式的标志。
pvEnvironment参数指向新进程要使用的环境字符串,通常传入NULL,那么子进程继承父进程的一组环境字符串。
pszCurDir允许父进程设置子进程的当前驱动器和目录。
psiStartInfo参数是指向STARTINFO结构,通常使用默认值,需要初始化为0.如下所示:
STARTINFO si = {sizeof(si)};
ppiProcInfo指向一个PROCESS_INFORMATION,该结构体包含新创建的进程和线程内核对象的句柄以及id.
终止进程的方式, fuExitCode是进程退出码, hProcess指定了要终止的进程句柄。
VOID ExitProcess( UINT fuExitCode )
BOOL TerminateProcess( HANDLE hProcess, UINT fuExitCode);
当一个进程终止时,系统会依次执行以下操作:
1、终止进程中遗留的任何线程;
2、释放进程分配的所有用户对象和GDI对象,关闭所有内核对象;
3、进程的退出码从STILL_ACTIVE变为传给ExitProcess和TerminateProcess函数的代码;
4、进程的内核对象变为已触发状态;
5、进程内核对象的使用计数递减1.