Windows API提供CreateProcess创建进程。事实上,最简单的Hello World程序并不需要此API显式创建进程,只有main函数即可。
事实上,它存在于kernel32.dll, 再细分一下,它调用ntdll.dll(对于新版Kernel, 存在中间层KernelBase.dll), 最终通过系统调用进入Kernel, 通过NtCreateProcess函数完成进程创建。
hello.c
#include <stdio.h>
int main()
{
printf("Hello!\n");
return 0;
}
- WinDbg Launch hello.exe:
注意,默认WinDbg在进程创建和结束时会break, 并不是程序Bug.
- printf此行加断点
![](https://i-blog.csdnimg.cn/blog_migrate/caa98b45605580fec6dcfb4d0d0eeed8.png)
注意堆栈最下面:
[0x6] ntdll!RtlUserThreadStart + 0x21
我们的代码里面没有call RtlUserThreadStart, kernel32.dll和ntdll.dll也不会主动调用。这是在启动hello进程后,Kernel创建完进程和线程后,主动把线程EIP设置到此函数,相当于回调回用户空间。
_KiThreadStartup汇编实现是创建用户线程返回用户空间执行的start routine.
Q: 上面是执行到了线程main函数,进程是何时创建的?
A: 进程在此之前就已完成创建,可参考: Windows内核--CreateProcess的内核实现 (3)