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
相关推荐
wow_DG19 分钟前
【C++✨】多种 C++ 解法固定宽度右对齐输出(每个数占 8 列)
开发语言·c++·算法
Epiphany.55628 分钟前
c++最长上升子序列长度
c++·算法·图论
Cx330❀1 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
意疏1 小时前
【C语言篇】srand函数的详细用法解析
c语言·开发语言
艾莉丝努力练剑2 小时前
【C语言16天强化训练】从基础入门到进阶:Day 1
c语言·开发语言·数据结构·学习
颖川守一2 小时前
C++c6-类和对象-封装-设计案例2-点和圆的关系
开发语言·c++
AI+程序员在路上2 小时前
单片机驱动LCD显示模块LM6029BCW
c语言·单片机·嵌入式硬件
·白小白2 小时前
力扣(LeetCode) ——100. 相同的树(C语言)
c语言·算法·leetcode
charlee442 小时前
将std容器的正向迭代器转换成反向迭代器
c++
arbboter3 小时前
【C++20】新特性探秘:提升现代C++开发效率的利器
c++·c++20·新特性·span·结构化绑定·初始化变量·模板参数推导