申请内存
PVOID ExAllocatePoolWithTag(
__drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
SIZE_T NumberOfBytes,
ULONG Tag
);
参数1 :PoolType
常用值为:
NonPagedPool(非分页内存)
PagedPool (分页内存)
参数2:NumberOfBytes
需要申请内存的大小
参数3: Tag
为将要被分配的空间指定标志。赋给该参数的内容是一个字符串常量,最多可以包含四个字母,该字符串应该放到单引号当中(比如:‘tag1’‘tag2’)。另外,这个字符串常常是逆序的,如,‘1gaT’。输入到这个参数中的每一个字符的ASCII值都必须在0-127之间。每次的申请空间的时候都最好应该使用一个独一无二的标识,这样可以帮助调试器和检查器辨认和分析。
系统会在分配给你的返回值前面额外分配4字节存储这个标签
注意:申请的内存是没有被初始化的,需要自己进行初始化。(必须)
返回值:
该函数成功返回分配地址的指针,失败返回NULL
给指定内存赋值
void RtlFillMemory(
Destination,
Length,
Fill
);
参数1 :Destination
需要填充的地址(指针类型)
参数2 :Length
需要填充的长度
参数3 :Fill
填充的值
移动内存
VOID RtlMoveMemory(
_Out_ VOID UNALIGNED *Destination,
_In_ const VOID UNALIGNED *Source,
_In_ SIZE_T Length
);
参数1 :Destination
目标地址
参数2 :Source
来源地址
参数3 :Length
要移动的长度
复制内存
RtlCopyMemory
参数与移动内存一样,移动内存时目标地址和来源地址可以有重叠,而复制内存不可以
内存比较
NTSYSAPI SIZE_T RtlCompareMemory(
const VOID *Source1,
const VOID *Source2,
SIZE_T Length
);
返回值:如果比较的内存完全相等,则返回Length ,可以判断返回值和Length参数是否相等,从而判断两个内存是否相等。
释放内存
void ExFreePoolWithTag(
PVOID P,
ULONG Tag
);
参数1:
释放的地址
参数2:
调用ExAllocatePoolWithTag指定的tag