20、Windows内核函数(1)-Windows驱动开发详解笔记,字符串

简介: 1、字符串 1)两种字符串,一种是char型,记录ansi字符集。每个字符一个字节。以0标志结束。在KdPrint中用%s输出。 宽字符型,wchar_t,描述unicode字符集的字符串,每个字符两个字节,以0标志结束。

1、字符串<?xml:namespace prefix = o />

1)两种字符串,一种是char型,记录ansi字符集。每个字符一个字节。以0标志结束。在KdPrint中用%s输出。

宽字符型,wchar_t,描述unicode字符集的字符串,每个字符两个字节,以0标志结束。通过L来体现。在KdPrint中用%S输出。

CHAR *string = "Hello";

WCHAR *string2 = L"hello";

KdPrint("%s\n", string);

KdPrint("%S\n", string2);

2)ANSI_STRING字符串和UNICODE_STRING字符串

DDK不鼓励用1)中所示的C语言字符串,因为C的字符串处理函数易导致缓冲区溢出等错误(如忘记对长度进行检查)。而鼓励用DDK自己定义的字符串。

typedef struct _STRING {

  USHORT  Length;

  USHORT  MaximumLength;

  PCHAR  Buffer;

} ANSI_STRING *PANSI_STRING;

注意STRING不是以0结束的。

typedef struct _UNICODE_STRING {

  USHORT  Length;

  USHORT  MaximumLength;

  PWSTR  Buffer;

} UNICODE_STRING *PUNICODE_STRING;

%Z输出 ANSI_STRING字符串,用%wZ输出 UNICODE_STRING

UNICODE_STRING uniString;

KdPrint("%wZ", &uniString);

3)字符串常见操作

1)初始化

方法一:使用DDK提供的函数

RtlInitUnicodeString 

RtlInitAnsiString 

UNICODE_STRING uniString;

CHAR *string1 = "Hello";

RtlInitAnsiString(&uniString, string1);

不过有一个问题,修改string1,uniString也会变化。

方法二:自己申请内存,使用完后回收内存

#define BUFFER_SIZE 1024

UNICODE_STRING UnicodeString1 = {0};

//设置缓冲区大小

UnicodeString1.MaximumLength = BUFFER_SIZE;

//分配内存

UnicodeString1.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);

WCHAR* wideString = L"hello";

//设置字符长度,因为是宽字符,所以是字符长度的2

UnicodeString1.Length = 2*wcslen(wideString);

//保证缓冲区足够大,否则程序终止

ASSERT(UnicodeString1.MaximumLength>=UnicodeString1.Length);

//内存拷贝,

RtlCopyMemory(UnicodeString1.Buffer,wideString,UnicodeString1.Length);

//设置字符长度

UnicodeString1.Length = 2*wcslen(wideString);

KdPrint(("UnicodeString:%wZ\n",&UnicodeString1));

//清理内存

ExFreePool(UnicodeString1.Buffer);

UnicodeString1.Buffer = NULL;

UnicodeString1.Length = UnicodeString1.MaximumLength = 0;

最后一步清理内存,可以使用DDK函数简化:

RtlFreeAnsiString 

RtlFreeUnicodeString 

2)复制

RtlCopyString 

RtlCopyUnicodeString 

//初始化UnicodeString1

UNICODE_STRING UnicodeString1;

RtlInitUnicodeString(&UnicodeString1,L"Hello World");

//初始化UnicodeString2

UNICODE_STRING UnicodeString2={0};

UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);

UnicodeString2.MaximumLength = BUFFER_SIZE;

//将初始化UnicodeString2拷贝到UnicodeString1

RtlCopyUnicodeString(&UnicodeString2,&UnicodeString1);

//分别显示UnicodeString1UnicodeString2

KdPrint(("UnicodeString1:%wZ\n",&UnicodeString1));

KdPrint(("UnicodeString2:%wZ\n",&UnicodeString2));

//销毁UnicodeString2

//注意!!UnicodeString1不用销毁

RtlFreeUnicodeString(&UnicodeString2);

3)比较

RtlCompareString 

RtlCompareUnicodeString 

RtlEqualString 

RtlEqualUnicodeString 

4)字符串转换成大字

RtlUpperString 

注意,没有提供转化成小写的函数。

5)字符串与整形数字相互转换

RtlUnicodeStringToInteger 

RtlIntegerToUnicodeString 

6ANSI_STRINGUNICODE_STRING相互转换

RtlUnicodeStringToAnsiString 

RtlAnsiStringToUnicodeString 

另外注意返回值的处理方法:

if ( NT_SUCCESS(nStatus))

{

KdPrint(("Conver to integer succussfully!\n"));

KdPrint(("Result:%d\n",lNumber));

}else

{

KdPrint(("Conver to integer unsuccessfully!\n"));

}

参考:

1Windows驱动开发详解

2MSDN

目录
相关文章
|
9天前
|
监控 Ubuntu Linux
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
这篇文章介绍了如何在Ubuntu和Windows系统中通过设置相同的时区并使用ntp服务来解决时间同步问题。
25 4
视频监控笔记(五):Ubuntu和windows时区同步问题-your clock is behind
|
5天前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
12 0
|
15天前
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
28 0
|
29天前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
2月前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
145 0
|
2月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
124 0
|
3月前
|
Linux Apache C++
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
该文介绍了如何在Windows环境下为FFmpeg集成SRT协议支持库libsrt。首先,需要安装Perl和Nasm,然后编译OpenSSL。接着,下载libsrt源码并使用CMake配置,生成VS工程并编译生成srt.dll和srt.lib。最后,将编译出的库文件和头文件按照特定目录结构放置,并更新环境变量,重新配置启用libsrt的FFmpeg并进行编译安装。该过程有助于优化直播推流的性能,减少卡顿问题。
97 2
FFmpeg开发笔记(三十五)Windows环境给FFmpeg集成libsrt
|
2月前
|
Windows
Windows 映射网络驱动器及删除-此网格连接不存在
Windows 映射网络驱动器及删除-此网格连接不存在
242 0
|
3月前
|
存储 安全 数据安全/隐私保护
Windows 32 汇编笔记(一):基础知识
Windows 32 汇编笔记(一):基础知识
|
2月前
|
存储 编译器 Linux
Windows 32 汇编笔记(二):使用 MASM
Windows 32 汇编笔记(二):使用 MASM