发布时间:2025-12-10 11:43:19 浏览次数:21
这几天被微软的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,所以父进程不会注意到任何初始化问题。