2017-07-24 17 views
-2

我正在使用masm彙編程序,並且我正在使用kernel32.lib創建堆內存,但是在HeapCreate過程的Windows API頁面上,它並不告訴我它存儲了返回值的位置。 (即堆的句柄) 我會假設它存儲在EAX?因爲大多數程序將其返回值設置爲EAX。我打電話HeapCreate後,我打電話HealAlloc在我的堆分配一些內存:HeapCreate是否將堆句柄返回給EAX?

INCLUDE \masm32\include\kernel32.inc 
INCLUDELIB \masm32\lib\kernel32.lib 
.CODE 

PUSH DWORD PTR 00h ;max size 
PUSH DWORD PTR 00h ;initial size 
PUSH DWORD PTR 04h ;flOption 
CALL HeapCreate 

PUSH DWORD PTR 04h ;dwBytes (the size in bytes) 
PUSH DWORD PTR 04h ;dwFlag 
PUSH EAX ;I am not sure if the heap handle is stored in EAX or not? 
CALL HeapAlloc 

END 

從本質上講,我不知道是存儲返回值HeapCreate哪裏。如果有人可以澄清在哪裏,我將不勝感激。

感謝

+3

您應該熟悉stdcall調用約定,該約定是用於Windows API調用的默認值。請參閱[這裏](https://msdn.microsoft.com/en-us/library/984x0h58.aspx)和[這裏](https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) 。 –

回答

5

MSDN page for HeapCreate給出了以下原型的功能:

HANDLE WINAPI HeapCreate(
    _In_ DWORD flOptions, 
    _In_ SIZE_T dwInitialSize, 
    _In_ SIZE_T dwMaximumSize 
); 

所有x86調用約定離開返回值R/EAX,所以造成HANDLE將在EAX(在32或者被發現位構建)或RAX(64位構建)。

3

這取決於您是在編譯32位還是64位。

HeapCreate()聲明如下:

HANDLE WINAPI HeapCreate(
    _In_ DWORD flOptions, 
    _In_ SIZE_T dwInitialSize, 
    _In_ SIZE_T dwMaximumSize 
); 

WINAPI是預處理宏解析爲__stdcall調用約定,這是有意義的,只是在32位和64位被忽略。

在32位中,__stdcallEAX中存儲返回值高達32位,而在EAX:EDX中存儲返回值較大。

在64位中,x64調用約定存儲返回值RAX(其前32位是EAX)。

HANDLE是一個指針類型,所以它在32位編譯時大小爲32位,在64位編譯時大小爲64位。然而,MSDN states:的Windows

64位版本使用32位處理的互操作性。在32位和64位應用程序之間共享句柄時,只有較低的32位是有意義的,因此可以安全地截斷句柄(將它從64位傳遞到32位時)或簽名擴展句柄(當它從32位傳遞到64位)。可以共享的句柄包括用戶對象(如窗口(HWND))的句柄,GDI對象(例如筆和畫筆(HBRUSHHPEN))的句柄,以及指向對象(例如互斥鎖,信號量和文件句柄)的句柄。

正因爲如此,使用單獨EAX可以有效期爲通過HeapCreate()在32位和64位彙編返回HANDLE值。但是,HeapCreate()返回的HANDLE通常不會跨越進程邊界共享,因此它可能會佔用32位以上的位數。

最好不要冒這樣或那樣的機會。 32位使用EAX,64位使用RAX,因爲這是各自的調用約定所規定的。

相關問題