HeapCreate return 是否将堆句柄放入 EAX?

Does HeapCreate return the heap handle into EAX?

我正在使用 masm 汇编程序,我正在使用 kernel32.lib 创建堆内存,但是在 HeapCreate 过程的 windows API 页面上它没有告诉我它的 return 值存储在哪里。 (即堆的句柄) 我假设它存储在 EAX 中?因为大多数过程将它们的 return 值放在 EAX 中。在我调用 HeapCreate 之后,我调用 HealAlloc 在我的堆中分配一些内存:

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 的 return 值存储在哪里。如果有人能说清楚在哪里,我将不胜感激。

谢谢

MSDN page for HeapCreate 给出了以下函数原型:

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

所有 x86 调用约定在 R/EAX 中保留 return 值,因此结果 HANDLE 将在 EAX(在 32 位构建中)或RAX(在 64 位版本中)。

这取决于你是为 32 位还是 64 位编译。

HeapCreate()的声明如下:

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

WINAPI 是解析为 __stdcall 调用约定的预处理器宏,仅在 32 位中有意义,在 64 位中被忽略。

在 32 位中,__stdcallEAX 中存储最多 32 位的 return 值,在 EAX:EDX 中存储更大的 return 值。

在 64 位中,x64 调用约定将 return 值存储在 RAX 中(前 32 位是 EAX)。

HANDLE 是指针类型,所以在 32 位编译时它的大小是 32 位,在 64 位编译时它的大小是 64 位。但是,MSDN states:

64-bit versions of Windows use 32-bit handles for interoperability. When sharing a handle between 32-bit and 64-bit applications, only the lower 32 bits are significant, so it is safe to truncate the handle (when passing it from 64-bit to 32-bit) or sign-extend the handle (when passing it from 32-bit to 64-bit). Handles that can be shared include handles to user objects such as windows (HWND), handles to GDI objects such as pens and brushes (HBRUSH and HPEN), and handles to named objects such as mutexes, semaphores, and file handles.

因此,单独使用 EAX 可能 HANDLE 值 return 在两者中都有效 return 32 位和 64 位编译。但是,HeapCreate() 编辑的 HANDLE return 通常不会跨进程边界共享,因此它 可能 占用超过 32 位。

最好不要冒险。在 32 位中使用 EAX,在 64 位中使用 RAX,因为这是各自的调用约定规定的。