Windows内核编程
上QQ阅读APP看书,第一时间看更新

3.5 字符串

内核API在很多需要的地方用到了字符串。某些地方用到的就是简单的Unicode指针(wchar_t *或者它的typedef类型的指针,比如WCHAR),但大多数用到字符串的函数期望一个类型为UNICODE_STRING的结构。

本书中提到的术语Unicode大致等于UTF-16,每个字符两个字节。这是内核组件内部字符串的存储形式。

UNICODE_STRING结构用字符串的长度和已知的最大长度来表示这个字符串。这里是一个结构简化之后的定义:

000

Length字段包含了按字节计算(而不是按字符计算)的字符串长度,并且如果存在结尾的Unicode-NULL终结字符(不是必需的),Length并不包含它。MaximumLength字段包含了字符串在不重新分配内存的情况下,能够增长到的最大的字节数。

通常我们会使用一组用于字符串的Rtl函数来操作UNICODE_STRING结构。表3-3列出了Rtl函数族中一些常见的用于字符串操作的函数。

表3-3 常用的UNICODE_STRING函数

000

除了上述函数之外,还有一些函数是用于C字符串指针的。此外,为了方便起见,一些众所周知的C运行时库字符串函数也在内核里实现了:wcscpywcscatwcslenwcscpy_swcschrstrcpystrcpy_s等。

000

wcs前缀用于C的Unicode字符串,而str前缀用于C的Ansi字符串。有些函数中的后缀_s指明了这是一个安全的函数,这样的函数多一个必须提供的附加参数,用来指明字符串的最大长度,这样函数就不会传递多于这个最大长度的数据。