字符串的使用
// 0. 驱动是和系统相关的,需要设置目标系统
// 设置项目属性中的目标系统版本为对应版本
// 1. 包含提供内核结构相关的头文件
#include <ntddk.h>
//字符串结构体
// typedef struct _UNICODE_STRING {
// USHORT Length; // 字符串长度
// USHORT MaximumLength; // 最大长度
// PWSTR Buffer; // 字符串缓存区
// } UNICODE_STRING, * PUNICODE_STRING;
//申请的内存空间的指针,用于释放空间
PVOID Buffer = NULL;
// 驱动卸载的回调函数,会在卸载的时候被调用
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
//释放空间
ExFreePoolWithTag(Buffer, '0000');
KdPrint(("down...\n"));
UNREFERENCED_PARAMETER(DriverObject);
}
// 2. 提供驱动程序的入口函数
NTSTATUS DriverEntry(
PDRIVER_OBJECT DriverObject, // 驱动对象,类似实例句柄
PUNICODE_STRING RegistryPath) // 字符串指针,保存驱动在注册表的路径
{
// 参数可以通过下面的宏解除警告。
UNREFERENCED_PARAMETER(RegistryPath);
UNREFERENCED_PARAMETER(DriverObject);
// 通过 DbgBreakPoint 可以为驱动程序设置一个断点
//DbgBreakPoint();
//设置回调函数
DriverObject->DriverUnload = DriverUnload;
// 当驱动程序处于 Check 版本时,进行输出
KdPrint(("up...\n"));
// 初始化的方式之一: 在创建的时候直接设置为常量字符串
UNICODE_STRING String = RTL_CONSTANT_STRING(L"CONSTANT STRINGA");
// 初始化的方式之二: 在创建之后,再进行初始化
RtlInitUnicodeString(&String, L"CONSTANT STRINGB");
KdPrint(("%wZ\n",&String));
//初始化之三
//创建一个字符串结构
UNICODE_STRING str1;
//初始化为CONSTANT STRINGB
RtlInitUnicodeString(&str1, L"CONSTANT STRINGB");
//申请一段内存
Buffer = ExAllocatePoolWithTag(NonPagedPool, 0x100, '0000');
//清零
RtlZeroMemory(Buffer, 0x100);
//给前0x100字节填充为0xff
RtlFillMemory(Buffer, 0x100, 0xFF);
//拷贝abcd的8个字节到Buffer
RtlCopyMemory(Buffer, L"abcd", 8);
//将str1的buffer,大小,最大大小指向申请的内存
str1.Buffer = Buffer;
str1.Length = 8;
str1.MaximumLength = 0x100*2;
KdPrint(("%wZ\n",&str1));
// 3. 必须需要提供一个返回值,如果返回成功
// 那么就会加载成功,其他值都是加载失败
return STATUS_SUCCESS;
}
字符串相关函数
* RtlInitUnicodeString: 初始化
* RtlCopyUnicodeString: 拷贝
* RtlCompareUnicodeString: 比较
* RtlUpcaseUnicodeString: 转大写
* RtlUnicodeStringToInteger: 串转整数
* RtlUnicodeStringToAnsiString: 转ANSI
* RtlAppendUnicodeStringToString: 追加
* RtlFreeUnicodeString: 销毁
* RtlIntegerToUnicodeString: 整数转字符串