windows内核编程基础篇之字符串的初始化

末蓝、 2022-08-04 11:50 273阅读 0赞

我们再看看这个UNICODE_STRING结构。

  1. typedef struct _UNICODE_STRING
  2. {
  3. USHORT Length; //---字符串的长度(字节数)
  4. USHORT MaximumLength; //---字符串缓冲区的长度(字节数)
  5. PWSTR Buffer; //---字符串缓冲区。
  6. }ANSI_STRING, *PANSI_STRING;
  7. UNICODE_STRING str;

读者应该注意到,这个结构中并不含有字符串缓冲的空间,这是一个初学者常见的出问题的来源,以下代码是完全错误的,内核会立刻崩溃:

  1. UNICODE_STRING str;
  2. wcspy(str.Buffer, L("my first string"));
  3. str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);

以上的代码定义了一个字符串并试图初始化它的值,但是非常遗憾,这样做不是对的,因为str.Buffer 只是一个未初始化的指针,它并没有指向有意义的空间,相反,以下的方法是正确的:

  1. UNICODE_STRING str;
  2. str.Buffer = L"my first string";
  3. str.Length = str.MaximumLength = wcslen(L"my first string") * sizeof(WCHAR);

实际上明显的初始化写法如下:

  1. UNICODE_STRING str =
  2. {
  3. sizeof(L"my first string") - sizeof((L"my first string")[0]),
  4. sizeof(L"my first string"),
  5. L"my first string"
  6. };

但是这样定义一个字符串实在太繁琐了,但是在头文件 ntdef.h 中有一个宏方便这种定义。使用这个宏之后,我们就可以简单的定义一个常数字符串。如下:

  1. #include <ntdef.h>
  2. UNICODE_STRING str = RTL_CONSTANT_STRING(L"my first string");

这只能在定义这个字符串的时候使用,为了随时初始化一个字符串,可以使用 RtInitUnicodeString。示例如下:

  1. UNICODE_STRING str = RtlInitUnicodeString(&str, L"my first string");

用本节的方法初始化字符串,不用担心内存释放方面的问题。因为没有分配任何内存。

-———摘自《[天书夜读-从汇编到Windows内核编程]》
-————————————————————————————————————————————————————

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

-————————————————————————————————————————————————————————

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读