NTSTATUS status;//定义一个内存分配标记
//目标字符串
#define MEM_TAG "misaka" //不能用单引号
UNICODE_STRING src = RTL_CONSTANT_STRING(L"hello misaka!");
UNICODE_STRING dst = {0};
//内存分配,并将指针返回给buffer,参数1NonPagedPool=分配的内存是锁定内存,永远存在于物理内存上,参数2=长度,参数3=内存分配标识
dst.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonPagedPool,src.Length,MEM_TAG);
if(dst.Buffer == NULL){
//错误
status = STATUS_INSUFFICIENT_RESOURCES;
}
dst.Length = dst.MaximumLength = src.Length;
//8-15行的结果就是对 UNICODE_STRING 分配了一个内存,最后一行函数执行复制字符串操作
RtlCopyUnicodeString(&dst,&src);
内存分配标识用于检测内存泄露,当标识所指定的内存越来越大时,大概就是这部分内存泄露了.
使用 ExAllocatePoolWithTag 分配的内存必须使用 ExFreePool 释放,否则内存将永远泄露,只有重启计算机!
ExFreePool(dst.Buffer);
dst.Buffer = NULL;
dst.Length = dst.MaximumLength = 0;
ExFreePool 不能释放栈控件的指针