Windows 加载PE文件并启动它,如何捕获退出/返回代码

Windows 加载PE文件并启动它,如何捕获退出/返回代码,windows,winapi,portable-executable,Windows,Winapi,Portable Executable,我正在手动(即在代码中)加载windows PE文件,并通过调用其入口点(如结构“IMAGE\u NT\u HEADERS32”中定义的)成功执行该文件。但是,由于该值是一个void返回函数,我们如何“读取”它提供的退出/返回代码 i、 e.当我调用此函数时(这是PE文件的入口点) 它在哪里放置/放置其“int main(…)”或“int winmain(…)”调用的退出代码 提前谢谢 编辑:澄清(见下面的评论)。我的应用程序使用VirtualAllocEx直接将exe加载到内存中,而不是任何N

我正在手动(即在代码中)加载windows PE文件,并通过调用其入口点(如结构“IMAGE\u NT\u HEADERS32”中定义的)成功执行该文件。但是,由于该值是一个void返回函数,我们如何“读取”它提供的退出/返回代码

i、 e.当我调用此函数时(这是PE文件的入口点)

它在哪里放置/放置其“int main(…)”或“int winmain(…)”调用的退出代码

提前谢谢

编辑:澄清(见下面的评论)。我的应用程序使用VirtualAllocEx直接将exe加载到内存中,而不是任何NtCreateProcess方法。

多亏了上面的“Eryk Sun”,他的解决方案是正确的,这段代码实际上是有效的

// call the entry point :: here we assume that everything is ok.
((void(*)(void))EntryAddr)();

DWORD exit;
GetExitCodeProcess(GetModuleHandle(NULL), &exit);
多亏了上面的“Eryk Sun”,他的解决方案是正确的,而且这段代码确实有效

// call the entry point :: here we assume that everything is ok.
((void(*)(void))EntryAddr)();

DWORD exit;
GetExitCodeProcess(GetModuleHandle(NULL), &exit);

C运行时仅使用
main
中的返回值进行调用。如果映像使用C运行时(很可能),并且当前进程是一个托管应用程序(即
\uuuuuSCRT\u是\uManaged\uApp
返回true),则
\uSCRT\uCommon\uMain\uSEH
将只返回而不是调用
ExitProcess
@DavidHeffernan,据我所知,Tim正在现有进程中加载图像并调用入口点——原因不明。如果映像使用C运行时,那么在大多数情况下,据我所知(我实际上还没有尝试过这个实验),公共入口点
\uuuu scrt\u common\u main\u seh
应该调用
ExitProcess
,使问题没有意义,除非它加载到托管进程中,并对照当前进程的映像进行检查(即
GetModuleHandleW(空)
)通过为
IMAGE\u DIRECTORY\u entry\u COM\u DESCRIPTOR
IMAGE data DIRECTORY.@DavidHeffernan,我认为这是一个相当大的飞跃。Tim没有提到通过
NtCreateProcess
NtAllocateVirtualMemory
NtCreateThread
,或通过创建暂停进程并重写/替换映像和线程上下文的内存。如果您能够有意地做到这一切,我希望您知道如何调用
GetExitCodeProcess
。C运行时只调用
main
的返回值。如果映像使用C运行时(很可能)并且当前进程是一个托管应用程序(即
\uuuu scrt\u是\u托管应用程序
返回true),然后
\uu scrt\u common\u main\u seh
将返回,而不是调用
ExitProcess
@DavidHeffernan,据我所知,Tim正在现有进程中加载映像并调用入口点——原因不明。如果映像使用C运行时,那么在大多数情况下,据我所知(我实际上还没有尝试过这个实验),公共入口点
\uu scrt\u common\u main\u seh
应该调用
ExitProcess
,使问题变得毫无意义,除非它加载到一个托管进程中,并对照当前进程的映像进行检查(即
GetModuleHandleW(NULL)
)通过为
IMAGE\u DIRECTORY\u entry\u COM\u DESCRIPTOR
IMAGE data DIRECTORY.@DavidHeffernan,我认为这是一个相当大的飞跃。Tim没有提到通过
NtCreateProcess
NtAllocateVirtualMemory
NtCreateThread
,或通过创建暂停进程并重写/替换映像和线程上下文的内存。如果您能够有意地完成所有这些,我希望您知道如何调用
GetExitCodeProcess