目录
函数描述
BOOL CreateProcess(
PCTSTR psApplicationName, //可执行文件的名字
PTSTR pszCommandLine, //命令行字符串
PSECURITY_ATTRIBUTES psaProcess, //进程对象的安全性
PSECURITY_ATTRIBUTES psaThread, //线程对象的安全性
BOOL bInheritHandles, //句柄可继承性
DWORD fdwCreate, //标识符(优先级)
PVOID pvEnvironment, //指向环境字符串
PCTSTR pszCurDir, //子进程当前目录
PSTARTUPINFO psiStartInfo,
PPROCESS_INFORMATION ppiProcInfo); //进程线程句柄及ID
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数为1。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。该内核对象数据结构就是对该进程的一个统计信息描述。进程被完全初始化之前,CreateProcess返回TRUE,如果一个DLL无法找到,或则未能正确初始化,该进程就会终止运行,由于CreateProcess返回TRUE,因此父进程不知道出现的任何初始化问题。
psApplicationName
用于设定新进程将要使用的可执行文件的名字,必须设定文件的扩展名,系统将不会自动假设文件名有一 个.exe扩展名,假设该文件位于当前目录中,除非文件名前面有一个路径。如果在当前目录中找不到该文件,CreateProcess将不会在任何其他目录中查找该文件,便会创建进程运行失败。
pszCommandLine
psApplicationName在为NULL时,用于设定传递给新进程的命令行字符串,当CreateProcess分析pszCommandLine字符串时,它将查看字符串中的第一个标记,并假 设该标记是想运行的可执行文件的名字。如果可执行文件的文件名没有扩展名,便假设它的扩 展名为.exe。CreateProcess也按下面的顺序搜索该可执行文件:
- 包含调用进程的.exe文件的目录
- 调用进程的当前目录
- windows的系统目录
- windows目录
- PAT H环境变量中列出的目录
psaProcess、psaThread、binheritHandles
若要创建一个新进程,系统必须创建一个进程内核对象和一个线程内核对象(用于进程的 主线程),由于这些都是内核对象,因此父进程可以得到机会将安全属性与这两个对象关联起 来。可以使用psaProcess和psaThread参数分别设定进程对象和线程对象需要的安全性。可以为 这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。也可以指定两 个SECURITY_ ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对象。binheritHandles用于设置该进程的SECURITY_ ATTRIBUTES安全结构是否能被子进程继承。
fdwCreate
该参数用于标识标志,以便用于规定如何来创建新进程,或则用于设定优先级类
pvEnvironment
用于指向包含新进程将要使用的环境字符串的内存块。在大多数情况 下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。还可以使用GetEnvironmentStrings函数调用进程正在使用的环境字符串数据块的地址。
psCurDir
该参数允许父进程设置子进程的当前驱动器和目录。如果本参数是 NULL,则新进 程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么psCurDir必须指向包含需要的工作驱动器和工作目录的以 0结尾的字符串。注意,必须设定路径中的驱动器名。
psiStartInfo
用于指向一个 STARTUPINFO 结构
typedef struct _STARTUPINFOA {
DWORD cb;
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
ppiProcInfo
指向一个PROCESS_INFORMATION结构,CreatProcess在返回前需要对该结构成员进行初始化。
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
终止进程的运行
主线程的进入点函数返回
始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止 运行。这是保证所有线程资源能够得到正确清除的唯一办法。 让主线程的进入点函数返回,可以确保下列操作的实现:
- 该线程创建的任何C + +对象将能使用它们的析构函数正确地撤消。
- 操作系统将能正确地释放该线程的堆栈使用的内存。
- 系统将进程的退出代码(在进程的内核对象中维护)设置为进入点函数的返回值。
- 系统将进程内核对象的返回值递减1。
ExitProcess函数返回
该函数用于终止进程的运行,并将进程的退出代码设置为fuExitCode。ExitProcess函数并 不返回任何值,因为进程已经终止运行。如果在调用ExitProcess之后又增加了什么代码,那么 该代码将永远不会运行。
TerminateProcess函数返回
该函数与ExitProcess有一个很大的差别,那就是任何线程都可以调用TerminateProcess来终 止另一个进程或它自己的进程的运行。
进程枚举
可以使用PSAPI.dll(Process Status)