【问题标题】:In MS x64 Calling convention, is creating a shadow space necessity for WinAPI calls? [duplicate]在 MS x64 调用约定中,是否需要为 WinAPI 调用创建影子空间? [复制]
【发布时间】:2014-12-07 16:36:03
【问题描述】:

在 MS x64 调用约定中,如果我们调用 Win64 API,调用者应该创建一个影子空间。

但是,我创建了一个简单的 C++ 程序并调用 MessageBox,反汇编后就是我看到的:

00007FF614FC2AD9  mov         r9d,136h  
00007FF614FC2ADF  lea         r8,[__xt_z+150h (07FF614FD5BF0h)]  
00007FF614FC2AE6  lea         rdx,[__xt_z+170h (07FF614FD5C10h)]  
00007FF614FC2AED  xor         ecx,ecx  
00007FF614FC2AEF  call        qword ptr [__imp_MessageBoxW (07FF614FDF6C0h)]  
00007FF614FC2AF5  mov         dword ptr [msgboxID],eax  

我没有看到任何影子空间预留。(甚至在前面未显示的说明中也没有)我错过了什么?

编辑:这是上面的 C++ 代码:

  #include <Windows.h>


   int main()
   {
        int msgboxID = MessageBox(
        NULL,
        (LPCWSTR) L"Resource not available\nDo you want to try again?",
        (LPCWSTR) L"Account Details",
        MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
        );
     return 0;
   }

【问题讨论】:

  • 一些 APi 调用会修改传递给它们的参数,尤其是字符串缓冲区。如果要保留这些值,则需要在调用这些函数之前对其进行复制。除非您明确创建了一个副本,否则您不会在反汇编中看到它。为什么你认为编译器会为你这样做?
  • 也许显示整个功能?
  • 我认为问题不一样。我只是指出文档是这样说的,但是编译器生成的代码却不然。并试图弄清楚这是否合法。

标签: c++ assembly 64-bit win64


【解决方案1】:

实际上它确实会产生阴影空间。但是在调用的一开始。(堆栈上方未显示)我认为它会在调用之前创建阴影空间,显然情况并非如此。 所以我将关闭这个问题并打开一个更合适的问题。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2022-01-17
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多