Windows 加载PE文件并启动它,如何捕获退出/返回代码
我正在手动(即在代码中)加载windows PE文件,并通过调用其入口点(如结构“IMAGE\u NT\u HEADERS32”中定义的)成功执行该文件。但是,由于该值是一个void返回函数,我们如何“读取”它提供的退出/返回代码 i、 e.当我调用此函数时(这是PE文件的入口点) 它在哪里放置/放置其“int main(…)”或“int winmain(…)”调用的退出代码 提前谢谢 编辑:澄清(见下面的评论)。我的应用程序使用VirtualAllocEx直接将exe加载到内存中,而不是任何NtCreateProcess方法。多亏了上面的“Eryk Sun”,他的解决方案是正确的,这段代码实际上是有效的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
// 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
。