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内核编程]》
---------------------------------------------------------------------------------------------------------

与原文可能有出入,有些自己的理解。

-----------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(windows内核编程基础篇之字符串的初始化)