Windows内核--代码只有main函数, 进程怎么创建的? (2.1)

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此行加断点

          

标题

        注意堆栈最下面:

                [0x6]   ntdll!RtlUserThreadStart + 0x21   

        我们的代码里面没有call RtlUserThreadStart, kernel32.dll和ntdll.dll也不会主动调用。这是在启动hello进程后,Kernel创建完进程和线程后,主动把线程EIP设置到此函数,相当于回调回用户空间。

        _KiThreadStartup汇编实现是创建用户线程返回用户空间执行的start routine.

                

Q: 上面是执行到了线程main函数,进程是何时创建的?

A: 进程在此之前就已完成创建,可参考: Windows内核--CreateProcess的内核实现 (3)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值