winapi – 当你可以使用RET时,为什么在Win32下需要ExitProcess?
我注意到许多使用直接Win32调用构建的汇编语言示例(没有C运行时依赖性)说明了使用显式调用ExitProcess()来在入口点代码结束时结束程序.我不是在谈论使用ExitProcess()在程序中的某个嵌套位置退出.令人惊讶的是,入口点代码只是通过RET指令退出的示例较少.想到的一个例子是着名的
TinyPE,其中程序变量以RET指令退出,因为RET指令是单字节.使用ExitProcess()或RET似乎都可以完成这项工作.
来自可执行文件入口点的RET将EAX的值返回给KERNEL32中的Windows加载程序,最终将退出代码传播回NtTerminateProcess(),至少在Windows 7上.在Windows XP上,我想我记得看过ExitProcess ()甚至直接在线程清理链的末尾调用. 由于汇编语言中有很多受人尊敬的优化,纯粹是在生成较小的代码时选择的,我想知道为什么更多的代码浮动更喜欢显式调用ExitProcess()而不是RET.这个习惯还是有其他原因吗? 从最纯粹的意义上讲,RET指令不会优于直接调用ExitProcess()吗?直接调用ExitProcess()似乎类似于通过从任务管理器中删除它来退出程序,因为这会使返回到Windows加载程序称为入口点的正常流程短路,从而跳过各种线程清理操作? 我似乎找不到任何特定于这个问题的信息,所以我希望有人可以对这个话题有所了解. 解决方法
如果从C运行时库调用主函数,则退出将导致调用ExitProcess(),并且进程将退出.
如果您的主函数是由Windows直接调用的,那么汇编代码就是这种情况,那么退出只会导致线程退出.当且仅当没有其他线程时,该进程将退出.这就是现在的问题,因为即使您没有创建任何线程,Windows也可能代表您创建了一个或多个线程. 据我所知,这种行为没有正确记录,但在Raymond Chen的博客文章“If you return from the main thread,does the process exit?”中有所描述. (我自己也在Windows 7和Windows 10上对此进行了测试,并确认他们的行为与Raymond描述的一样.) 附录:在最新版本的Windows 10中,进程加载器本身是多线程的,因此在进程首次启动时总会有其他线程存在. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-phone-7 – 如何在windows phone 8 app中为httpweb
- Windows上的Vim设置文件
- windows – Inno设置用户主页路径
- winapi – Windows:鼠标在窗口装饰上
- windows-installer – Techsmith Snagit的Windows安装程序的
- windows-server-2008 – Windows Server 2008上缺少内存
- ArcGis Classic COM Add-Ins插件.dll的安装与卸载
- WSUS部署Win10大版本功能更新 先决条件
- 可以多次运行Windows服务(使用不同的设置)吗?
- windows-server-2008 – SQL Server 2008是否只能在Server
- Vagrant – 如何检测Windows主机RAM和CPU
- Exchange中的会议室日历(Office 365)
- 如何浏览ActiveX DLL的类和方法?
- 遗传算法 – 带有Time Windows的TSP的交叉运算符
- 在Windows / Active Directory环境中的服务器上配
- batch-file – 在IF语句WinXP Batch Script中使用
- 使用WIndows PowerShell 1.0或2.0来评估可执行文
- mosquitto(windows)作为broker,paho作为client
- 在第7方应用程序中托管的WPF子窗口在Windows 7 A
- xaml – 如何绑定到图像列表