将哪些参数传递给PE(可移植可执行文件)文件的入口点?

use*_*913 5 x86 assembly winapi portable-executable

如果你组装一个PE(.exe,Win32的可移植可执行文件)文件,它有一个你可以调用的入口点_start,_main或者你喜欢的任何东西.

问题是 - 这个入口点是否带有一些args?如果是这样,它们是否可以在堆栈中访问?如果是这样,这个入口点函数是否需要清除堆栈?我在哪里可以找到关于此的一些文档?

typ*_*232 6

没有进程在入口点没有关于它的堆栈参数的任何信息.您必须GetCommandLine通过RTL_USER_PROCESS_PARAMETERS调用或访问PEB中的信息,但这不是一个稳定的API.

每个语言支持库(如CRT)也必须这样做.

  • @ user2214913:原始入口点签名是`DWORD CALLBACK RawEntryPoint(void)`.我相信我看到了MSDN中记录的内容,但再也找不到了.您可以在[WinMain只是Win32进程入口点的常规名称](http://blogs.msdn.com/b/oldnewthing/archive/2011/05/25/10168020.aspx)中找到可靠的信息. (3认同)
  • 有趣的。它显然与 [Linux x86-64 ABI](http://www.x86-64.org/documentation/abi.pdf) 有很大不同,其中命令行参数和环境变量由参数指向进入“_start”时的堆栈。有趣的是,即使在 ABI 级别,cmdline 参数也是二等公民。您必须要求操作系统将它们提供给您,而不是默认将它们提供给您。同样在 Linux 中,您无法从 `_start` 返回。(您使用“exit()”系统调用)。动态库 ABI 与内核进程 exec ABI 是分开的,因此没有 kernel32.dll 等效项。 (2认同)
  • @PeterCordes:你错了,几乎就是你所说的一切.命令行参数通过[PEB](https://msdn.microsoft.com/en-us/library/windows/desktop/aa813706.aspx)传递给新创建的进程.进程不需要查询操作系统.虽然您可以从本机Windows可执行文件的入口点返回,但这不会终止该过程.您还必须在Windows上调用[ExitProcess](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682658.aspx).*kernel32.dll*不是内核模块.我很困惑你想要做什么. (2认同)