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
相关推荐
mmoyula21 分钟前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
qianbo_insist23 分钟前
c++ python 共享内存
开发语言·c++·python
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
稳兽龙1 小时前
P1098 [NOIP 2007 提高组] 字符串的展开
c++·算法·模拟
墨小傲1 小时前
基于Linux下的vscode c/c++开发环境搭建详细教程
linux·c语言·vscode
算法练习生2 小时前
Qt核心类QWidget及其派生类详解
开发语言·c++·qt
oioihoii2 小时前
C++11标准库算法:深入理解std::none_of
java·c++·算法
阿捏利2 小时前
【加解密与C】非对称加解密(二)ELGamel
c语言·加解密·elgamel
1024小神2 小时前
tauri项目在windows上的c盘没有权限写入文件
c语言·开发语言·windows