【驱动学习】6-内核字符串
概述:内核开发字符串使用
内核字符串
内核编程中主要使用的字符串有两种格式:
-
UNICODE_STRING
1
2
3
4
5
6
7
8
9
10
11typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
#ifdef MIDL_PASS
[size_is(MaximumLength / 2), length_is((Length) / 2) ] USHORT * Buffer;
#else // MIDL_PASS
_Field_size_bytes_part_opt_(MaximumLength, Length) PWCH Buffer;
#endif // MIDL_PASS
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef const UNICODE_STRING *PCUNICODE_STRING; -
ANSI_STRING
1
2
3
4
5
6
7
8
9
10typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
#ifdef MIDL_PASS
[size_is(MaximumLength), length_is(Length) ]
#endif // MIDL_PASS
_Field_size_bytes_part_opt_(MaximumLength, Length) PCHAR Buffer;
} STRING;
typedef STRING *PSTRING;
typedef STRING ANSI_STRING;
在 Windows 内核中,字符串的处理十分重要。稍有不慎就会造成系统蓝屏。因此,对于字符串的处理必须遵循严格的安全规则,以确保不会引发各种安全漏洞。
内核字符串初始化
内核开发模式下提供了多个 API 可以用于字符串初始化操作,常见的主要是:
RtlInitUnicodeString
RtlInitAnsiString
字符串转换
针对 ANSI 和 UNICODE 两种编码格式之间进行转换操作,主要的 API 是:
RtlUnicodeStringToAnsiString
RtlAnsiStringToUnicodeString
另外的就是可以使用 CHAR*
、WCHAR*
来保存和操作字符串。
Demo
需要注意的是,参考的教程直接修改内存的方式会崩溃蓝屏。修改常量区内存需要先修改内存属性才可以。这里我是在网上随便找了一个方式。
1 |
|
输出:
1 |
|
字符串和数字之间的转换
Demo
1 |
|
输出:
1 |
|
字符串拷贝和比较
UNICODE_STRING
和 ANSI_STRING
都是结构体,因此在使用上可以直接通过申请内存的方式来指定字符串的大小。
RtlInitEmptyUnicodeString
RtlCopyUnicodeString
RtlAppendUnicodeToString
RtlEqualUnicodeString
Demo
1 |
|
输出:
1 |
|
大小写操作
相关API:
RtlUpcaseUnicodeString
RtlUpcaseUnicodeChar
【驱动学习】6-内核字符串
https://hodlyounger.github.io/2025/01/24/A_OS/Windows/驱动/windows驱动开发教程/【驱动学习】6-内核字符串/