如有转载,请注明出处:http://blog.csdn.net/embedded_sky
Windows环境下调用CreateProcess创建一个进程,操作系统会执行以下操作:
1.一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1.进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构——可以把进程内核对象想象成由进程统计信息构成的一个小型数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件(和所有必要的DLL)的代码及数据加载到进程的地址空间。
2.系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。和进程内核对象一样,线程内核对象也是一个小型数据结构,操作系统用它来管理这个线程。这个主线程一开始就会执行C/C++运行时的启动例程,它是由链接器设为应用程序入口的,最终会调用应用程序WinMain,wWinMain、main或wmain函数。如果系统成功创建了新进程和主线程,CreateProcess将返回TRUE。
CreateProcess函数原型如下:
BOOL WINAPI CreateProcess(
_In_opt_ LPCTSTR lpApplicationName,
_Inout_opt_ LPTSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
参数
-
lpApplicationName:指定新进程要使用的可执行文件的名称(带全路径的exe文件名)。
-
lpCommandLine:指定要传给新进程的命令行字符串,lpCommandLine是一个非“常量字符串”的地址。在内部,CreateProcess实际上会修改我们传给它的命令行字符串。但在CreateProcess返回之前,它会将这个字符串还原为原来的样子;鉴于此,若命令行字符包含在文件映像的只读部分,就会引起访问违例。CreateProcess会检查字符串中的第一个标记,并假定此标记是我们想运行的可执行文件的名称。