news 2026/6/22 9:20:57

驱动开发之字符串操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
驱动开发之字符串操作

前言:为什么字符串在驱动里是“危险操作”

在用户态,操作字符串随便乱写基本不会让程序直接崩溃;
但在内核态:写错直接蓝屏!

字符串初始化

typedefstruct_UNICODE_STRING{USHORT Length;// 当前使用的字节数(注意是字节,不是字符)USHORT MaximumLength;// Buffer 最大可使用的字节数PWSTR Buffer;// 指向 wchar_t 字符数组(UTF-16)}UNICODE_STRING,*PUNICODE_STRING;typedefstruct_ANSI_STRING{USHORT Length;USHORT MaximumLength;PCHAR Buffer;}ANSI_STRING,*PANSI_STRING;
// ===========================// UNICODE_STRING 示例// ===========================// RtlInitUnicodeString 只是初始化结构,不会分配内存或拷贝字符串UNICODE_STRING uStr1;RtlInitUnicodeString(&uStr1,L"unicode_string!");// 注意:Length 单位是“字节”,不是字符个数DbgPrint("(mydriver) Unicode.Length = %d, Buffer = %wZ\n",uStr1.Length,&uStr1);// ===========================// ANSI_STRING 示例// ===========================// 同理,RtlInitAnsiString 也不会分配内存ANSI_STRING aStr1;RtlInitAnsiString(&aStr1,"ansi_string!");// %Z 打印 ANSI_STRING,%wZ 打印 UNICODE_STRINGDbgPrint("(mydriver) Ansi.Length = %d, Buffer = %Z\n",aStr1.Length,&aStr1);

拷贝字符串

// =============================================// 示例:Unicode 与 ANSI 字符串拷贝// =============================================// 1. 定义源字符串UNICODE_STRING uStrSrc;ANSI_STRING aStrSrc;RtlInitUnicodeString(&uStrSrc,L"unicode_string_test");RtlInitAnsiString(&aStrSrc,"ansi_string_test");// 2. 定义目标字符串缓冲区(必须自己提供内存)WCHAR uniBuffer[64];// 64 WCHAR = 128 字节CHAR ansiBuffer[64];// 64 CHARUNICODE_STRING uStrDst;ANSI_STRING aStrDst;// 3. 初始化“空字符串结构体”// 这一步会:// - Length = 0// - MaximumLength = sizeof(buffer)// - Buffer = buffer 指针RtlInitEmptyUnicodeString(&uStrDst,uniBuffer,sizeof(uniBuffer));RtlInitEmptyAnsiString(&aStrDst,ansiBuffer,sizeof(ansiBuffer));// 4. 执行字符串拷贝// 注意:这两个函数不做边界检查,如果源字符串比目标大 → 蓝屏RtlCopyUnicodeString(&uStrDst,&uStrSrc);RtlCopyString(&aStrDst,&aStrSrc);// 输出结果DbgPrint("(mydriver) ------- 字符串拷贝示例 -------\n");DbgPrint("(mydriver) Unicode Length = %d, MaximumLength = %d, Buffer = %wZ\n",uStrDst.Length,uStrDst.MaximumLength,&uStrDst);DbgPrint("(mydriver) ANSI Length = %d, MaximumLength = %d, Buffer = %Z\n",aStrDst.Length,aStrDst.MaximumLength,&aStrDst);

字符串比较

// =============================================// 示例:Unicode 与 ANSI 字符串比较// =============================================// 1. 初始化 Unicode 字符串UNICODE_STRING uStr1;UNICODE_STRING uStr2;// RtlInitUnicodeString 仅初始化结构体,不分配内存RtlInitUnicodeString(&uStr1,L"Unicode_Test");RtlInitUnicodeString(&uStr2,L"unicode_test");// 2. 初始化 ANSI 字符串ANSI_STRING aStr1;ANSI_STRING aStr2;RtlInitAnsiString(&aStr1,"Ansi_Test");RtlInitAnsiString(&aStr2,"ansi_test");// ---------------------------------------------// Unicode 字符串比较// ---------------------------------------------if(RtlCompareUnicodeString(&uStr1,&uStr2,TRUE// 第三个参数:// TRUE = 大小写不敏感比较(忽略大小写)// FALSE = 大小写敏感比较)==0// 返回值 == 0 表示两个字符串完全相等){DbgPrint("(mydriver) uStr1 == uStr2 (Unicode比较)\n");}else{DbgPrint("(mydriver) uStr1 != uStr2 (Unicode比较)\n");}// ---------------------------------------------// ANSI 字符串比较// ---------------------------------------------if(RtlCompareString(&aStr1,&aStr2,TRUE// 第三个参数:// TRUE = 大小写不敏感比较// FALSE = 大小写敏感比较)==0// 返回值 == 0 表示两个字符串完全相等){DbgPrint("(mydriver) aStr1 == aStr2 (ANSI比较)\n");}else{DbgPrint("(mydriver) aStr1 != aStr2 (ANSI比较)\n");}

Unicode ↔ ANSI,相互转换

// =============================================// 示例:UNICODE_STRING 与 ANSI_STRING 相互转换// =============================================// 1. 准备源字符串UNICODE_STRING uStrSrc;ANSI_STRING aStrSrc;RtlInitUnicodeString(&uStrSrc,L"Unicode_String_Test");RtlInitAnsiString(&aStrSrc,"Ansi_String_Test");// 2. 定义目标字符串(注意:此时不需要自己分配 Buffer)UNICODE_STRING uStrDst;ANSI_STRING aStrDst;// ---------------------------------------------// Unicode → ANSI// ---------------------------------------------//// 第三个参数说明:// TRUE :由系统分配目标字符串的 Buffer// 转换成功后,必须调用 RtlFreeAnsiString 释放// FALSE :调用者自己提供 Buffer(必须提前初始化 ANSI_STRING)//RtlUnicodeStringToAnsiString(&aStrDst,&uStrSrc,TRUE// 由系统分配内存);// ---------------------------------------------// ANSI → Unicode// ---------------------------------------------RtlAnsiStringToUnicodeString(&uStrDst,&aStrSrc,TRUE// 由系统分配内存);// 输出转换结果DbgPrint("(mydriver) -------- 字符串转换 --------\n");DbgPrint("(mydriver) Unicode Length = %hu, Buffer = %wZ\n",uStrDst.Length,&uStrDst);DbgPrint("(mydriver) ANSI Length = %hu, Buffer = %Z\n",aStrDst.Length,&aStrDst);// 3. 释放由系统分配的字符串 BufferRtlFreeUnicodeString(&uStrDst);RtlFreeAnsiString(&aStrDst);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 22:15:30

fcitx5 vs ibus:中文输入法性能深度对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个输入法性能测试工具,功能包括:1. 测量输入法启动时间 2. 记录输入响应延迟 3. 统计内存和CPU占用 4. 测试词库加载速度 5. 生成可视化对比报告。要求…

作者头像 李华
网站建设 2026/6/22 3:33:00

智能简历解析终极指南:如何用AI技术精准提取关键信息

智能简历解析终极指南:如何用AI技术精准提取关键信息 【免费下载链接】Resume-Matcher Resume Matcher is an open source, free tool to improve your resume. It works by using language models to compare and rank resumes with job descriptions. 项目地址…

作者头像 李华
网站建设 2026/6/21 11:47:41

springAI学习 一

一、Spring AI 概述 什么是Spring AI? Spring生态的AI集成框架 统一API访问不同AI服务(OpenAI、Azure OpenAI、Anthropic等) 支持多种AI功能:聊天、文生图、嵌入、向量存储等 Spring AI 是一个用于 AI 工程的应用框架。 其目标…

作者头像 李华
网站建设 2026/6/21 11:05:00

串口助手唐老鸭版:解决你串口调试痛点的终极方案

串口助手唐老鸭版:解决你串口调试痛点的终极方案 【免费下载链接】串口助手唐老鸭版使用说明 串口助手(唐老鸭版)是一款功能强大且易于使用的串口调试工具,专为开发者设计。其界面友好,操作简单,能够满足各种串口调试需求。无论是…

作者头像 李华
网站建设 2026/6/21 15:37:22

30秒创建一个智能解压工具:快马平台体验

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个简单的图形界面解压工具原型,功能包括:1)文件选择对话框 2)解压目标路径选择 3)显示压缩包内容预览 4)进度条显示 5)解压完成通知。使用Pythontkint…

作者头像 李华
网站建设 2026/6/15 22:30:06

每日一题Day08-数组的第K大元素

题面首先看我第一眼看到这道题的解法代码class Solution {public int findKthLargest(int[] nums, int k) {int n nums.length;Arrays.sort(nums);return nums[n - k];} }这样解好像也可以,但好像又在耍流氓,所以我就去看题解了最后看到一道一下用自己的…

作者头像 李华