RtlInitUnicodeString使用注意事项

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) \
}

2、初始化问题

WCHAR wcPath[MAX_PATH]={0};

UNICODE_STRING ustrName;

RtlInitUnicodeString(&ustrName,wcPath);

ustrName.MaximumLength=sizeof(WCHAR)*MAX_PATH;

如果没有加上最后一行,ustrName.MaximumLength=2

后面如果继续使用RtlCopyUnicodeString等函数很可能会失败,只能复制第一个字符。


上面这个初始化过程可以使用RtlInitEmptyUnicodeString 这个函数,

RtlInitEmptyUnicodeString(&ustrName, wcPath, sizeof(wcPath));

你可能感兴趣的:(RtlInitUnicodeString使用注意事项)