RtlInitUnicodeString使用注意事项

本文探讨了RtlInitUnicodeString函数在使用过程中可能出现的问题,包括释放问题和初始化问题。当SourceString为NULL时,直接释放Buffer会导致蓝屏。另外,未正确设置MaximumLength可能导致后续操作失败。解决方案包括理解Buffer指向常量区的特性以及使用RtlInitEmptyUnicodeString进行安全初始化。
摘要由CSDN通过智能技术生成

1、释放问题

关于这个函数,wdk文档中有下面这段话

The Buffer member of DestinationString is initialized to point to SourceString. The length and maximum length for DestinationString are initialized to the length of SourceString. If SourceString is NULL, the length is zero.

如果不注意,释放的时候可能会造成蓝屏。

例如:

UNICODE_STRING ustrName;

ustrName.Buffer=ExAllocatePool(PagedPool,128);

RtlInitUnicodeString(&ustrName,L"zhangsan");

这时候如果调用ExFreePool(ustrName.Buffer)就会触发蓝屏,因为ustrName.Buffer已经指向常量区


上面的初始化过程等同于下面的语句:

ustrName=RTL_CONSTANT_STRING(L"zhangsan");


在ntdef.h头文件中可以看到RTL_CONSTANT_STRING定义如下:

#define RTL_CONSTANT_STRING(s) \
{ \
    sizeof( s ) - sizeof( (s)[0] ), \
    sizeof( s ) / sizeof(_RTL_CONSTANT_STRING_type_check(s)), \
    _RTL_CONSTANT_STRING_remove_const_macro(s) \
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值