我正在使用NASM编写一个程序,不想将其与CRT进行链接,因此我会指定入口点(这将是Win32入口点)。以下是程序源代码:
global _myEntryPoint
section .text
_myEntryPoint:
mov eax, 12345
现在我对Win32入口点的了解是(如果我错了,请纠正我):
- Win32入口点不像普通函数一样返回一个值(为了退出Win32入口点,我必须调用
ExitProcess()
)。 - Win32入口点不接受任何参数。
现在我不知道的是:
- Win32入口点是否需要保留任何寄存器的值(被调用者保存的寄存器)?我认为答案是不需要,因为当Win32入口点退出时,它会终止进程而不是将执行返回给期望保留某些寄存器值的函数。
ExitProcess
,无论是否保存寄存器都没有关系。如果我们返回,则需要像任何常规函数一样保存/恢复寄存器 - 在 x86 中为 ebx、ebp、edi、esi、esp,在 amd64 中为 rbx、rbp、rdi、rsi、rsp、r12-r15。 - RbMmLdrInitializeThunk
开始,它传递了一个线程上下文以在初始化后恢复。上下文具有可执行文件的入口点和初始线程参数,以及初始线程的PEB指针。上下文在RtlUserThreadStart
处恢复,对于Windows应用程序,它调用BaseThreadInitThunk
,然后调用指定的入口点。PEB指针参数通常被忽略。在RtlExitUserProcess
中,加载器重新获得控制权以关闭进程,然后进程被终止。 - Eryk Sun