在 MS x64 调用约定中,正在为 WinAPI 调用创建影子空间必要性

In MS x64 Calling convention, is creating a shadow space necessity for WinAPI calls?

本文关键字:调用 必要性 WinAPI 创建 影子 空间 MS x64 约定      更新时间:2023-10-16

在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 availablenDo you want to try again?",
        (LPCWSTR) L"Account Details",
        MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
        );
     return 0;
   }

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