我们再看看这个UNICODE_STRING结构。
typedef struct _UNICODE_STRING { USHORT Length; //---字符串的长度(字节数) USHORT MaximumLength; //---字符串缓冲区的长度(字节数) PWSTR Buffer; //---字符串缓冲区。 }ANSI_STRING, *PANSI_STRING; UNICODE_STRING str;读者应该注意到,这个结构中并不含有字符串缓冲的空间,这是一个初学者常见的出问题的来源,以下代码是完全错误的,内核会立刻崩溃:
UNICODE_STRING str; wcspy(str.Buffer, L("my first string")); str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);以上的代码定义了一个字符串并试图初始化它的值,但是非常遗憾,这样做不是对的,因为str.Buffer 只是一个未初始化的指针,它并没有指向有意义的空间,相反,以下的方法是正确的:
UNICODE_STRING str; str.Buffer = L"my first string"; str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);实际上明显的初始化写法如下:
UNICODE_STRING str = { sizeof(L"my first string") - sizeof((L"my first string")[0]), sizeof(L"my first string"), L"my first string" };但是这样定义一个字符串实在太繁琐了,但是在头文件 ntdef.h 中有一个宏方便这种定义。使用这个宏之后,我们就可以简单的定义一个常数字符串。如下:
#include <ntdef.h> UNICODE_STRING str = RTL_CONSTANT_STRING(L"my first string");
UNICODE_STRING str = RtlInitUnicodeString(&str, L"my first string");用本节的方法初始化字符串,不用担心内存释放方面的问题。因为没有分配任何内存。
-------摘自《[天书夜读-从汇编到Windows内核编程]》
---------------------------------------------------------------------------------------------------------
与原文可能有出入,有些自己的理解。
-----------------------------------------------------------------------------------------------------------------