windows内核编程基础篇之字符串的初始化
我们再看看这个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");
这只能在定义这个字符串的时候使用,为了随时初始化一个字符串,可以使用 RtInitUnicodeString。示例如下:
UNICODE_STRING str = RtlInitUnicodeString(&str, L"my first string");
用本节的方法初始化字符串,不用担心内存释放方面的问题。因为没有分配任何内存。
-———摘自《[天书夜读-从汇编到Windows内核编程]》
-————————————————————————————————————————————————————
与原文可能有出入,有些自己的理解。
-————————————————————————————————————————————————————————
还没有评论,来说两句吧...