Windows内核函数 - ASCII字符串和宽字符串

本章介绍了Windows内核中字符串处理函数、文件读写函数、注册表读写函数。这些函数是DDK提供的运行时函数,他们比标准C语言的运行时函数功能更丰富。普通的C语言运行时库是不能在内核模式下使用的,必须使用DDK提供的运行时函数。

和应用程序一样,驱动程序需要经常和字符串打交道。其中包括ASCII字符串、宽字符串,还有DDK定义的ANSI_STRING数据结构和UNICODE_STRING数据结构。

在应用程序中,往往使用两种字符:一种是char型的字符串,负责记录ANSI字符集,它是指向一个char数组的指针,每个char型变量的大小为一个字节,字符串是以0标志字符串结束。还有一种是wchar_t型的字符串,负责描述unicode字符集的字符串。它是指向一个wchar_t数组的指针,wchar_t字符大小为两个字节,字符串以0标志字符串结束。ANSI字符的构造如下:

char* str1 = "abc";

str1指针指向的内容是 61 626 300。

UNICODE字符的构造如下:

wchar_t *str2 = L"abc";

str2指针指向的内容是6100 620 063 000 000 。在构造字符串的时候使用一个关键字"L"。编译器会自动生成所需要的宽字符。

在驱动程序开发中,DDK将char和wchar_t类别,替换成CHAR和WCHAR类别。对于这两类的字符串,DDK提供了相应的字符串操作函数,例如,strcpy、sprintf、strcat、strlen等。但DDK的帮助文档中,不会查到这些函数的使用方法。微软公司不鼓励直接使用这些函数,取而代之的使用同样功能的宏。我们可以用Depends工具查看NTOSKRSL.EXE导出的函数。如下图所示:

图1.1 Depends查看NTOSKRSL.EXE导出表

驱动程序可以用KdPrint打印ASCII字符串和宽字符串。KdPrint类似于C语言的printf函数。例如,打印一个ASCII字符串:

cpp 复制代码
CHAR *str1 = "Hello";
KdPrint(("%s\n", str1)); // 注意是小写%s

打印一段宽字符时需要:

cpp 复制代码
WCHAR *str2 = L"Hello";
KdPrint(("%S\n", str2)); // 注意是大写%S
相关推荐
感哥3 小时前
C++ STL 常用算法
c++
saltymilk14 小时前
C++ 模板参数推导问题小记(模板类的模板构造函数)
c++·模板元编程
感哥14 小时前
C++ lambda 匿名函数
c++
沐怡旸20 小时前
【底层机制】std::unique_ptr 解决的痛点?是什么?如何实现?怎么正确使用?
c++·面试
感哥21 小时前
C++ 内存管理
c++
博笙困了1 天前
AcWing学习——双指针算法
c++·算法
感哥1 天前
C++ 指针和引用
c++
感哥2 天前
C++ 多态
c++
沐怡旸2 天前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
River4162 天前
Javer 学 c++(十三):引用篇
c++·后端