Winapi HeapCreate是否将堆句柄返回到EAX中?
我正在使用masm汇编程序,我正在使用kernel32.lib创建堆内存,但是在HeapCreate过程的windows API页面上,它没有告诉我它的返回值存储在哪里。(即堆的句柄) 我假设它存储在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
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调用的默认约定。见和。