Windows内核函数 - ANSI_STRING字符串与UNICODE_STRING字符串

2024-05-15 19:28

本文主要是介绍Windows内核函数 - ANSI_STRING字符串与UNICODE_STRING字符串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        DDK不鼓励程序员使用C语言的字符串,主要是因为:标准C的字符串处理函数容易导致缓冲区溢出等错误。如果程序员不对字符串的长度进行检查,很容易导致这个错误,从而导致整个操作系统的崩溃。DDK鼓励程序员使用DDK自定义的字符串,这种数据格式的定义如下:

typedef struct _STRING32 {USHORT   Length;USHORT   MaximumLength;ULONG  Buffer;
} STRING32;
typedef STRING32 *PSTRING32;typedef STRING32 UNICODE_STRING32;
typedef UNICODE_STRING32 *PUNICODE_STRING32;typedef STRING32 ANSI_STRING32;
typedef ANSI_STRING32 *PANSI_STRING32;// 这个数据结构对ASCII字符串进行了封装。
// length: 字符的长度
// MaximumLength: 整个字符串缓冲区的最大长度
// Buffer: 缓冲区的指针

        注意: 和标准的字符串不同,STRING字符串不是以0标志字符的结束。字符长度依靠Length字段。在标准C中的字符串中,如果缓冲区长度是N,那么只能容纳N-1个字符的字符串,这是因为要留一个字节存储NULL。而在STRING字符串中,缓冲区的大小MaximumLength,最大的字符串长度可以是MaximumLength,而不是MaximumLength-1。

        与ANSI_STRING相对应,DDK将宽字符串封装成UNICODE_STRING数据结构。

typedef struct _UNICODE_STRING {USHORT Length;USHORT MaximumLength;PWCH   Buffer;
} UNICODE_STRING;// Length: 字符的长度,单位是字节。如果是N个字符,那么Length等于N的2倍。
// MaximumLength: 整个字符串缓冲区的最大长度,单位也是字节。
// Buffer: 缓冲区的指针


        和ANSI_STRING不同,UNICODE_STRING的缓冲区是记录宽字符的缓冲区。每个元素是宽字符。和ANSI_STRING一样,字符串的结束不是以NULL为标志,而是依靠字段Length.

        关于ANSI_STRING和UNICODE_STRING字符串,KdPrint同样提供了打印log的方法。

ANSI_STRING ansiString;
// 省去对ansiString的初始化
KdPrint(("%Z\n", &ansiString));  // 注意是%Z

而当打印一段宽字符的时候,需要进行以下操作。

UNICODE_STRING uniString;
// 省去对ansiString的初始化
KdPrint(("%wZ\n", &uniString));  // 注意是%wZ

这篇关于Windows内核函数 - ANSI_STRING字符串与UNICODE_STRING字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992705

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

新特性抢先看! Ubuntu 25.04 Beta 发布:Linux 6.14 内核

《新特性抢先看!Ubuntu25.04Beta发布:Linux6.14内核》Canonical公司近日发布了Ubuntu25.04Beta版,这一版本被赋予了一个活泼的代号——“Plu... Canonical 昨日(3 月 27 日)放出了 Beta 版 Ubuntu 25.04 系统镜像,代号“Pluc

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

java String.join()的使用小结

《javaString.join()的使用小结》String.join()是Java8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了javaString.join... 目录1. 方法定义2. 基本用法2.1 拼接多个字符串2.2 拼接集合中的字符串3. 使用场景和示例3