其它内存管理函数

1.填充和移动内存

mov esi,offset szSource
mov edi,offset szDest
mov ecx,dwSize
cld
rep movsb

以上代码实现从szSource开始的dwSize大小的内存块移动到szDest处

xor eax,eax
mov edi,offset szDest
mov ecx,dwSize
cld
rep stosb

以上代码实现szDest处开始的dwSize字节填充为0,如果把xor eax,eax换成mov al,xx 那上边的代码将实现将内存块填充为xx

以上功能对应的API如下:

invoke RtlMoveMemory,offset szDest,offset szSource,dwSize ;移动内存
invoke RtlFillMemory,offset szDest,dwSize,dbFill ;以dbFill填充内存块
invoke RtlZeroMemory,offset szDest,dwSize ;以0填充内存块

2.内存状态测试

invoke IsBadCodePtr,lpMemory
invoke IsBadReadPtr,lpMemory,dwSize
invoke IsBadWritePtr,lpMemory,dwSize
invoke IsBadStringPtr,lpMemory,dwSize

IsBadCodePtr:函数测试指针指向的单个字节是否可读,如果可读返回0,否则返回非0值
IsBadReadPtr:测试某段内存是否可读,如果这段内存的所有字节全可读则返回0,否则返回非0值
IsBadWritePtr:测试某段内存是否可写,如果内存段全都可写则返回0,否则返回非0值
IsBadStringPtr:测试一个指向以0结尾的字符串是否可读,dwSize为字符串最大长度,如果字符串包含结尾的0全是可读的,返回0,否则返回非0值,缓冲区中剩余的字节则不予测试

发表回复

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