堆管理函数

堆管理函数
1.私有堆的创建和释放
私有堆的创建

invoke HeapCreate,flOptions,dwInitialSize,dwMaximumSize
.if eax && (eax<0c0000000h)
mov hHeap,eax
.endif

flOptions指定堆属性,有两个值
HEAP_NO_SERIALIZE:标志私有堆不进行独占检测
HEAP_GENERATE_EXCEPTIONS:指定函数失败的返回值,不指定失败返回NULL
dwInitialSize指定创建堆时分配的物理内存
dwMaximumSize为堆自动扩展的最大值.为0则没有最大限制,非0时在堆中申请的内存块不能大于7FFF8h(524K)

私有堆的释放

invoke HeapDestroy,hHeap

将释放堆中所有的内存块.成功运行返回TRUE,当进程终止时系统也会自动调用此函数

2.堆中分配和释放内存块
堆中分配内存块

invoke HeapAlloc,hHeap,dwFlags,dwBytes
.if eax && (eax<0c0000000h)
mov lpMemory,eax
.endif

hHeap:是创建堆时的句柄
dwFlags有三个值
HEAP_NO_SERIALIZE:不进行独占检测,如果创建堆时用了,这里就可以省了
HEAP_GENERATE_EXCEPTIONS:失败返回出错原因,而不仅是一个NULL,创建堆时用了,这里也可以省了
HEAP_ZERO_MEMORY:将分配内存用0初始化
dwBytes:是要分配的内存块的字节数
分配成功返回值是指向内存块第一个字节的指针,失败返回错误代码或NULL,要看dwFlags
STATUS_NO_MEMORY:取值为0c0000017h表示内存不够
STATUS_ACCESS_VIOLATION:取值为0c0000005h表示参数不正确或堆被破坏
在堆中分配内存块只能是固定地址的内存块.

堆中释放内存块

invoke HeapFree,hHeap,dwFlags,lpMemory

hHeap:堆句柄
dwFlags:可以使用HEAP_NO_SERIALIZE
lpMemory:是HeapAlloc函数返回的内存块指针
成功返回非0值,失败返回0

堆中调整内存块大小

invoke HeapReAlloc,hHeap,dwFlags,lpMemory,dwBytes
.if eax && (eax<0c0000000h)
mov lpMemory,eax
.endif

hHeap:堆句柄
dwFlags四个值
HEAP_GENERATE_EXCEPTIONS:返回值
HEAP_NO_SERIALIZE:独占检测
HEAP_ZERO_MEMORY:初始化为0
HEAP_REALLOC_IN_PLACE_ONLY:分配内存时不可移动内存块,使用此标志,指针必定和原来相同
lpMemory:为堆中内存块的指针
dwBytes:要改变的内存块的大小的字节数

3.其它堆管理函数
HeapLock,HeapUnlock,GetProcessHeaps,GetProcessHeap,HeapCompact,HeapSize,
HeapValidate,HeapWalk.

invoke GetProcessHeaps,NumberOfHeaps,lpHeaps

NumberOfHeaps:指定了缓冲区可以存放句柄的数量
lpHeaps:是一个指针,指向用来接收堆句柄的缓冲区,缓冲区长度应该等于NumberOfHeaps*4
执行后函数返回进程中所有堆的句柄到缓冲区中,也包括默认堆的句柄

.repeat
invoke HeapWalk,hHeap,lpEntry
push eax
pop eax
.until !eax

hHeap:是堆的句柄
lpEntry:指向一个句含有PROCESS_HEAP_ENTRY结构的缓冲区
每次执行返回一个PROCESS_HEAP_ENTRY的结构块信息,如果还有其他的内存块,函数返回TRUE,程序一直循环调用直到返回FALSE为止,在多线程的程序中使用,必须先使用HeapLock函数,否则会调用失败.

invoke HeapValidate,hHeap,dwFlags,lpMemory

验证堆的完整性或堆中某个内存块的完整性
lpMemory为NULL函数顺序验证堆中所有的内存块,如果lpMemory指定了一个内存块,则只验证这个内存块
dwFlags:可以指定HEAP_NO_SERIALIZE,独占标志
如果所有内存块都完好无损,返回非0值,否则返回0

invoke HeapLock,hHeap
invoke HeapUnlock,hHeap

销定和解销堆,主要用于线程同步,成功返回非0值,否则返回0,在程序中一般用HEAP_NO_SERIALIZE来控制

invoke HeapCompact,hHeap,dwFlags

合并堆中的空闲内存块并释放不在使用中的内存页面

invoke HeapSize,hHeap,dwFlags,lpMemory

返回堆中某个内存块大小lpMemory指定了需要返回大小的内存块,成功返回内存块大小,失败返回-1

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注