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
相关推荐
2301_776508722 分钟前
C++中的职责链模式实战
开发语言·c++·算法
sqyno1sky4 分钟前
C++中的空对象模式
开发语言·c++·算法
星轨初途4 分钟前
C++ 类和对象(下):初始化列表、static 成员与编译器优化深度剖析
android·开发语言·c++·经验分享·笔记
量子炒饭大师5 分钟前
【C++ 入门】Cyber动态义体——【vector容器】vector底层原理是什么?该怎么使用他?一文带你搞定所有问题!!!
开发语言·c++·vector·dubbo
学嵌入式的小杨同学7 分钟前
STM32 进阶封神之路(二十三):低功耗深度解析 —— 从睡眠模式到停机模式(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
yunyun3212310 分钟前
动态库热加载技术
开发语言·c++·算法
dapeng287011 分钟前
C++中的享元模式实战
开发语言·c++·算法
李李李li18 分钟前
cudnn下载链接
人工智能·windows
仟濹18 分钟前
【算法打卡day30(2026-03-23 周一)】BFSDFS孤岛题型-复习 & 第15届蓝桥杯省赛B组C++
c++·算法·蓝桥杯
不染尘.19 分钟前
拓扑排序算法
开发语言·数据结构·c++·算法·排序算法·广度优先·深度优先遍历