Windows内核代码片段
+ -

ASCII字符串和宽字符串处理

2022-09-13 31 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));

0 篇笔记 写笔记

UNICODE_STRING的初始化
UNICODE_STRING结构体的三个成员可以看到,其包含的是字符串的指针,字符串的实际长度和字符串指针的内存空间长。学过C语言的我们都知道,要对一个指针的内存进行赋值,就必须确定这个指针指向的内存空间可用,否则会导致内存使用异常。在应用层中会导致应用程序异常,而在驱动中会导致蓝屏。我们们这里使......
字符串UNICODE_STRING
在Windows下编程,根据字符串的使用分为UNICODE编程和我们平常使用的多字节编程。我们开发Windows驱动使用的是C语言。在C语言中定义的字符串是以为结尾表示一个字符串的结束。 char* pStr="www.pnpon.com";// ansi字符串 ......
UNICODE_STRING的拼接
像普通的字符串使用strcat一样,UNICODE_STRING也支持拼接功能。UNICODE_STRING的拼接按源字符的类型分为以下几中:RtlAppendUnicodeToString拼接将一个宽字节接接到UNICODE_STRING中。这里使用RtlAppendUnicodeToStrin......
UNICODE_STRING的打印
字符串的连接另一种常见的情况是字符串和数字的组合。有时数字需要被转换为字符串。有时需要把若干个数字和字符串混合组合起来。这往往用于打印日志的时候。日志中可能含有文件名、时间、和行号,以及其他的信息。熟悉C语言的读者会使用sprintf。这个函数的宽字符版本为swprintf。该函数在驱动开发中依然......
UNICODE_STRING的拷贝复制
由于UNICODE_STRINGANSI_STRING字符串是一个结构体,所以UNICODE_STRINGANSI_STRING字符串的拷贝就不能使用wcscpy和strcpy来进行拷贝了。微软的WDK中提供了专门的函数RtlCopyUnicodeString和RtlCopyString来进行U......
Windows内核STRING转UNICODE
VOIDConvertToUnicodeString( IN CHAR * Buffer, IN ULONG ResultBufferLength, IN ULONG ResultBufferOffset, OUT LPWSTR ResultBuffer, ......
ANSI_STRING字符串与UNICODE_STRING字符串相互转换 - Windows内核模式下的字符串操作
函数名称:RtlUnicodeStringToAnsiString功能描述:将UNICODE_STRING字符串转化成ANSI_STRING字符串参数列表:DestinationString:需要转化的字符串SourceString:需要转换的原字符串AllocateDesctinationSt......
ASCII字符串和宽字符串处理
在驱动程序开发中,DDK将char和wchar_t类别,替换成CHAR和WCHAR类别驱动程序中用KdPrint打印ASCII字符串和宽字符串:打印ASCII字符串 CHAR *string = “Hello”;  KdPrint(“%s ”, string);打印WCHAR字符串  ......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!