驱动开发:内存管理,防止内存泄漏

本文探讨了Windows驱动开发中防止内存泄漏的关键措施,包括动态内存申请后的指针管理,避免重复释放和蓝屏问题,正确使用Rtl*函数进行字符串处理,以及在存在break或return时确保内存正确释放。同时,对于函数内部申请内存并作为返回值的情况,提出了通过改变参数传递或修改函数设计来避免内存泄漏的建议。

动态申请和释放

  1. ExFree**后,需要对指针置NULL,这样再释放之前可以判断是否为NULL来防止重复释放,否则重复释放会蓝屏

  2. 若调用了RtlAnsiStringToUnicodeString,需要使用RtlFreeUnicodeString释放

  3. 若为一段指针动态申请了一段内存,不要再直接让它指向常量,而应该使用RtlStringCbCopy类函数进行复制。否则后期对常量指针释放会导致蓝屏。

  4. 特别注意在申请和释放之间,若存在break或return需要特别注意是不是会跳过释放语句。若会跳过,则应增加释放语句。如

do{
UNICODE_STRING uni_string;
ExAllocatePoolWithTag(&uni_string,1024,TAG);/*申请内存*/
if(**)
{
//若进入这个语句,则会跳出循环而未内存释放,因此应在这里加入
//ExFreePoolWithTag(&uni_string,TAG);
break;
}
if(**)
{
//若进入这个语句,则会结束函数调用而未内存释放,因此应在这里加入
//ExFreePoolWithTag(&uni_string,TAG);
return;
}
ExFreePoolWithTag(&uni_string,TAG);/*释放内存*/
}while(true);
  1. 若在函数内部申请了内存,而对应的变量需要作为返回值从而无法在函数内部释放,则可以将返回值改为参数传入改变。
PUNICODE_STRING example()
{
UNICODE_STRING uni_string;
ExAllocateWithTag(&uni_string,1024,TAG);
...
xx(&uni_string,..);//对uni_string进行操作
...
retun &uni_string;
}
NTSTATUS DriverEntry()
{
PUNICODE_STRING String;
ExAllocatePoolWithTag(String,1024,TAG);
String=example;
ExFreePoolWithTag(String,TAG);
...
}

这个时候就会存在原来的指针指向的地址丢失而内存泄漏。
当然,仅对上面这个例子来说,可以尝试不对外面的指针申请内存,而直接调用example函数,再释放内存。
若怕这种方法容易混乱、遗忘释放内存或者存在没办法不申请内存直接调用的情况。可以考虑修改example函数,改完传参调用。

void example(PUNICODE_STRING uni_string)
{
...
xx(uni_string,..);//无须定义,内存申请,直接对uni_string进行操作
...
retun;
}
NTSTATUS DriverEntry()
{
PUNICODE_STRING String;
ExAllocatePoolWithTag(String,1024,TAG);
example(String);
ExFreePoolWithTag(String,TAG);
...
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值