驱动中的字符串一般使用一个结构来容纳,而不是直接使用字符串的指针.
typedef struct _UNICODE_STRING{
USHORT Length; //存储在缓冲区中的字符串的长度,以字节为单位
USHORT MaximumLength; //缓冲区的长度,以字节为单位
PWSTR Buffer; //包含宽字符串的缓冲区的指针
} UNICODE_STRING *PUNICODE_STRING;
字符串是宽字符的,双字节.
UNICODE_STRING 结构是用来传递Unicode字符串的,使用 RtlUnicodeStringInit 或者 RtlUnicodeStringInitEx 来初始化结构
如果字符串长度为空,长度不包括结尾空字符
MaximumLength 声明缓冲区的最大长度,通过 RtlAnsiStringToUnicodeString 转换返回的长度将不超过这个长度.
列子:
UNICODE_STRING str = RTL_CONSTANT_STRING(L"misaka: hello world");
DbgPrint("%wZ",&str);
上面例子中的形式设置完成后不能在修改,可以使用以下方法(形如定义一个静态的串 WCHAR wcsBuffer[1024] = {0})
UNICODE_STRING str;
WCHAR wcsBuffer[1024] = {0};
RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));
实例:
WCAHR temp[] = L"Hello World!";//定义宽字符串
UNICODE_STRING str;
str.Buffer = temp;//字符串的指针地址
str.Length = wcslen(temp)*sizeof(WCHAR);//这个长度为UNICODE字符串所占用的字节数,即字符的个数乘以每个字符所占的字节数.通常为:字符个数*2
str.MaximumLength = str.Length;//缓冲区的长度就是字符串的长度
或者动态申请空间(形如定义一个WCHAR* pwcsBuffer = new WCHAR[1024];)
UNICODE_STRING str;
str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, '1234');
str.Length = 0;
str.MaximumLength = 1024;
使用完之后,使用 ExFreePool 或者 ExFreePoolWithTag 释放内存