ASCII字符串和宽字符串处理
2022-09-13
49
0
在驱动程序开发中,DDK将char和wchar_t类别,替换成CHAR和WCHAR类别驱动程序中用KdPrint打印ASCII字符串和宽字符串:
打印ASCII字符串
CHAR *string = “Hello”;
KdPrint(“%s\n”, string);
打印WCHAR字符串
WCHAR *string = L“Hello”;
KdPrint(“%S\n”, string);
KdPrint打印ANSI_STRING字符串与UNICODE_STRING
打印ANSI_STRING字符串:
ANSI_STRING ansiString;
//省去对ansiString初始化
KdPrint(“%Z\n”, &ansiString);
打印UNICODE_STRING字符串:
UNICODE_STRING uniString;
//省去对uniString初始化
KdPrint(“%wZ\n”, &uniString);
字符串复制
/************************************************************************
* 函数名称:RtlCopyString
* 功能描述:ANSI_STRING字符串复制
* 参数列表:
DestinationString:目的字符串
SourceString:源字符串
* 返回 值:VOID
*************************************************************************/
VOID RtlCopyString(
IN OUT PSTRING DestinationString,
IN PSTRING SourceString OPTIONAL);
/************************************************************************
* 函数名称:RtlCopyUnicodeString
* 功能描述:UNICODE_STRING字符串复制
* 参数列表:
DestinationString:目的字符串
SourceString:源字符串
* 返回 值:VOID
*************************************************************************/
VOID RtlCopyUnicodeString(
IN OUT PUNICODE_STRING DestinationString,
IN PUNICODE_STRING SourceString OPTIONAL);
使用方法:
//初始化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;
//将初始化UnicodeString1复制到UnicodeString2
RtlCopyUnicodeString(&UnicodeString2, &UnicodeString1);
//分别显示UnicodeString1和UnicodeString2
KdPrint((“UnicodeString1%wZ\n”, &UnicodeString1));
KdPrint((“UnicodeString2%wZ\n”, &UnicodeString2));
//销毁UnicodeString2
//注意UnicodeString1不用销毁
RtlFreeUnicodeString(&UnicodeString2);
5、字符串比较
/************************************************************************
* 函数名称:RtlCompareString
* 功能描述:ANSI_STRING字符串比较
* 参数列表:
String1:要比较的第一个字符串
String2:要比较的第二个字符串
CaseInSensitive:是否对大小写敏感
* 返回 值:比较结果
如果函数返回值为0,表示两个字符串相等
如果小于0,则表示第一个字符串小于第二个字符串
如果大于0,则表示第一个字符串大于第二个字符串
*************************************************************************/
LONG RtlCompareString(
IN PSTRING String1,
IN PSTRING String2,
IN BOOLEAN CaseInSensitive);
/************************************************************************
* 函数名称:RtlCompareUnicodeString
* 功能描述:UNICODE_STRING字符串比较
* 参数列表:
String1:要比较的第一个字符串
String2:要比较的第二个字符串
CaseInSensitive:是否对大小写敏感
* 返回 值:比较结果
如果函数返回值为0,表示两个字符串相等
如果小于0,则表示第一个字符串小于第二个字符串
如果大于0,则表示第一个字符串大于第二个字符串
*************************************************************************/
LONG RtlCompareUnicodeString(
IN PUNICODE_STRING String1,
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInSensitive);
如何使用RtlCompareUnicoodeString函数
UNICODE_STRING UnicodeString2;
RtlInitUnicodeString(&UnicodeString2, L“Hello”);
//判断字符串是否相等
if(RtlEqualUnicodeString(&UnicodeString1, &UnicodeString2, TRUE))
{
KdPrint((“UnicodeString1 and UnicodeString2 are equal\n”));
}
else
{
KdPrint((“UnicodeString1 and UnicodeString2 are NOT equal\n”));
}
字符串转化成大写
/************************************************************************
* 函数名称:RtlUpperString
* 功能描述:UNICODE_STRING字符串转化成大写
* 参数列表:
DestinationString:目的字符串
SourceString:源字符串
* 返回 值:VOID
*************************************************************************/
VOID RtlUpperString(
IN OUT PSTRING DestinationString,
IN PSTRING SourceString);
/************************************************************************
* 函数名称:RtlUpperString
* 功能描述:UNICODE_STRING字符串转化成大写
* 参数列表:
DestinationString:目的字符串
SourceString:源字符串
AllocateDesttinationString:是否为目的字符串分配内存
* 返回 值:VOID
*************************************************************************/
NTSTATUS RtlUpcaseUnicodeString(
IN OUT PUNICODE_STRING DestinationString OPTIONAL,
IN PCUNICODE_STRING SourceString,
IN BOOLEAN AllocateDesttinationString);
如何使用RtlUpcaseUnicodeString函数
//初始化UnicodeString1
UNICODE_STRING UnicodeString1;
RtlInitUnicodeString(&UnicodeString1, L“Hello World”);
//变化钱
KdPrint((“UnicodeString1:%wZ\n”, &UnicodeString1));
//转换成大写
RtlUpcaseUnicodeString(&UnicodeString1,&UnicodeString2,FALSE);
//变化后
KdPrint((“UnicodeString1:%wZ\n”, &UnicodeString1));