3.2.内存的分配和释放

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 不能释放栈控件的指针

你可能感兴趣的:(3.2.内存的分配和释放)