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