c - rcx 是否总是指向进程入口点的 PEB?

标签 c windows winapi assembly x86-64

64 位 Windows 似乎使用 rcx = r8 = &PEB 调用 exe 的入口点和 rdx = r9 = &entrypoint好像入口点被声明 entrypoint(PEB *peb, void *entry) .

这些细节是在任何地方指定的,还是没有记录在案且不值得依赖?

最佳答案

从 vista windows 调用 exe 入口点开始,带有一个参数 - PEB 的地址
所以exe入口点的签名必须是下一个

ULONG __stdcall ep(PEB* ); 

因为在 x64 中,第一个参数是通过 rcx 寄存器传递的 - 您可以在此处查看 PEB 的地址。另一个寄存器中的值是随机的。但我怎么说 - 这不仅仅与 64 位有关。在所有 Windows 版本中,第一个参数中将是 PEB 的地址。

这没有记录,但我确信非常可靠并且不会在新的 Windows 版本中改变。

在 wdk 中存在 nt.lib。这是静态(非导入)库 - 它为只能使用 ntdll.dll 导入(主启动执行应用程序,如 autochk.exe)的应用程序实现了微小的 crt 这个库实现了 exe 的入口点(NtProcessStartup[W]),它调用了你的[w]main与通常的参数。和 NtProcessStartup[W]当前实现使用指向 PEB 的指针从第一个(和单个)agrument。假设我们链接到当前的 nt.lib 实现。因为这是静态库 - 代码 NtProcessStartup[W]将在您的 exe 中并且尚未更改。如果 Windows 不再在第一个参数中传递 PEB 的地址 - 所有与当前 nt.lib 链接的 exe 将在启动时崩溃。所以我认为这已经没有改变

关于c - rcx 是否总是指向进程入口点的 PEB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61684051/

相关文章:

c# - 通过 C# 使用 winapi 从 "net use"获取状态列

C ncurses WINDOW 作为 extern

c - 格式化打印到循环缓冲区

c - Windows 控制台 API

windows - 如何映射 HKEY_USERS 子键和 Windows 用户名?

c++ - 如何让 Windows 10 Game Bar 出现在游戏中?

c++ - 如何禁用 win32 'interface' 宏?

c++ - Richedit 控件的奇怪行为,文本像古日语一样水平书写

c - printf() 的 %d 正在输出大整数。

可以将输出文本的颜色调整为文本文件吗?