Winapi HeapCreate是否将堆句柄返回到EAX中?

Winapi HeapCreate是否将堆句柄返回到EAX中?,winapi,assembly,x86,heap-memory,masm,Winapi,Assembly,X86,Heap Memory,Masm,我正在使用masm汇编程序,我正在使用kernel32.lib创建堆内存,但是在HeapCreate过程的windows API页面上,它没有告诉我它的返回值存储在哪里。(即堆的句柄) 我假设它存储在EAX?因为大多数过程将其返回值放在EAX中。调用HeapCreate后,我调用HealAlloc在堆中分配一些内存: INCLUDE \masm32\include\kernel32.inc INCLUDELIB \masm32\lib\kernel32.lib .CODE PUSH DWORD

我正在使用masm汇编程序,我正在使用kernel32.lib创建堆内存,但是在HeapCreate过程的windows API页面上,它没有告诉我它的返回值存储在哪里。(即堆的句柄) 我假设它存储在
EAX
?因为大多数过程将其返回值放在
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
的返回值存储在哪里。如果有人能澄清在哪里,我将不胜感激

谢谢

为该功能提供了以下原型:

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

所有x86调用约定都将返回值保留在
R/EAX
中,因此生成的
句柄将在
EAX
(32位版本)或
RAX
(64位版本)中找到。

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

HeapCreate()
的声明如下:

HANDLE WINAPI HeapCreate(
  _In_ DWORD  flOptions,
  _In_ SIZE_T dwInitialSize,
  _In_ SIZE_T dwMaximumSize
);
WINAPI
是一个预处理器宏,解析为
\uu stdcall
调用约定,该约定仅在32位中有意义,在64位中被忽略

在32位中,
\uu stdcall
EAX
中存储最多32位的返回值,在
EAX:EDX
中存储更大的返回值

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

HANDLE
是指针类型,因此在32位编译中它的大小为32位,在64位编译中它的大小为64位。然而:

64位版本的Windows使用32位句柄实现互操作性。在32位和64位应用程序之间共享句柄时,只有较低的32位是有效的,因此可以安全地截断句柄(从64位传递到32位时)或对句柄进行符号扩展(从32位传递到64位时)。可以共享的句柄包括用户对象(如windows)的句柄(
HWND
),GDI对象(如笔和画笔)的句柄(
HBRUSH
HPEN
),以及命名对象(如互斥体、信号量和文件句柄)的句柄

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


最好不要以这种或那种方式冒险。使用32位的
EAX
和64位的
RAX
,因为这是各自的调用约定所规定的。

您应该熟悉stdcall调用约定,这是用于Windows API调用的默认约定。见和。