2014-12-07 5 views
-1

MS x64 호출 규칙에서 Win64 API를 호출하면 호출자가 그림자 공간을 만들어야한다는 것을 읽고 있습니다. MS x64 호출 규칙에서 WinAPI 호출에 대한 섀도우 공간 필요성을 생성합니까?

그러나 나는 이것을 분해하는 것은 내가 무엇을보고하는 간단한 C++ 프로그램을 작성 메시지 박스에 통화를하고 후 :.

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; 
    } 
+0

일부 APi 호출은 전달 된 인수, 특히 문자열 버퍼를 수정합니다. 이러한 값을 유지하려면 해당 함수를 호출하기 전에 해당 값의 복사본을 만들어야합니다. _explicitly_ 복사본을 만든 경우가 아니라면 디스 어셈블리에서 복사본을 볼 수 없습니다. 왜 컴파일러가 당신을 위해 그것을 할 것이라고 생각합니까? –

+0

아마도 전체 기능을 보여줄 수 있습니까? –

+0

질문이 같지 않다고 생각합니다. 나는 문서가 그렇게 말하고 있지만, 컴파일러는 다른 방법으로 코드를 생성했다. 그리고 이것이 합법적인지 알아 내려고 노력했습니다. –

답변

0

사실은 그림자 공간을 생성한다. 그러나 호출의 맨 처음에 (스택 위에 표시되지 않음) 콜이 발생하기 직전에 그림자 공간이 생길 것이라고 생각했습니다. 그래서 나는이 질문을 닫고보다 적절한 질문을 할 것이다.