Windows 进程之四 CreateProcess函数

Windows 进程之四 CreateProcess函数

  • 一、CreateProcess 函数
    • 1.1、pszImageName 和pszCmdLine 参数

一、CreateProcess 函数

这几天被微软的sfc.exe 这个工具整蒙了,用匿名管道和进程来重定向sfc.exe 没有任何输出,最后实在老同学的帮助下解决了这个问题。本篇只是对《Windows核心编程》的学习,加深印象。

本篇共有7个小节,从CreateProcess定义开始:

BOOL CreateProcess(
  LPCWSTR pszImageName,
  LPCWSTR pszCmdLine,
  LPSECURITY_ATTRIBUTES psaProcess,
  LPSECURITY_ATTRIBUTES psaThread,
  BOOL fInheritHandles,
  DWORD fdwCreate,
  LPVOID pvEnvironment,
  LPWSTR pszCurDir,
  LPSTARTUPINFOW psiStartInfo,
  LPPROCESS_INFORMATION pProcInfo
);

一个线程调用CreateProcess时,系统将创建一个进程内核对象,初始计数为1。进程内核对象不是进程本身,而是操作系统用来管理这个进程的一个小型数据结构。可以把进程内核对象想象成进程统计信息构成的一个小型数据结构。然后系统为新进程创建一个虚拟地址空间,并将可执行文件和所有必须的DLL的代码及数据加载到进程的地址空间。

创建完进程后,系统为新进程的主线程创建一个线程内核对象,初始计数为1。和进程内核对象一样,线程内核对象也是一个小型数据结构,操作系统用它来管理这个线程。这个主线程一开始就会执行C/C++运行时的启动程序,链接器设置它为程序的启动入口,最终会调用应用程序WinMain,wWinMain,main或者wmain函数。

如果系统成功创建了新进程和主线程,CreateProcess将返回TRUE。

说明 CreateProcess 在进程完全初始化好之前就返回TRUE。这意味着操作系统加载程序(loader)尝试定位所有必要的DLL。如果一个DLL找不到或者不能正确初始化,进程就会终止。因为CreateProcess返回TRUE,所以父进程不会注意到任何初始化问题。

1.1、pszImageName 和pszCmdLine 参数

你可能感兴趣的:(Windows核心编程,操作系统)