【问题标题】:Convert WCHAR * to UNICODE STRING将 WCHAR * 转换为 UNICODE 字符串
【发布时间】:2013-10-22 09:55:30
【问题描述】:

首先尝试开发windows驱动程序。 假设 WCHAR 数组以空值结尾,我如何将 WCHAR 数组(来自用户空间)转换为 UNICODE_STRING(在内核模式下)?

我是否应该验证它是否以 null 结尾,并且它是否没有分配新的缓冲区(+2 为 null),然后使用 RtlAnsiXXX 函数?正确的方法是什么?

谢谢!

【问题讨论】:

    标签: kernel driver unicode-string wchar windows-kernel


    【解决方案1】:

    WCHAR 数组不必必须以 NULL 结尾。 UNICODE_STRING 结构是为计数字符串设计的,因此,它适用于非 NULL 终止的 WCHAR 数组——当然,您必须知道长度。

    例如,您可以使用 RtlInitEmptyUnicodeString

    【讨论】:

      【解决方案2】:

      要从 wchar 数组初始化 UNICODE_STRING,请使用 RtlInitUnicodeString。

      WCHAR 数组必须以 null 结尾

      所以如果你检查并且 wchar-string 不是以 null 结尾的,你应该分配一个新的缓冲区(+sizeof(WCHAR) for null),复制数组内容,然后调用 RtlInitUnicodeString。

      要检查来自用户模式的 wchar-string 是否以 null 结尾,我正在使用:

      BOOLEAN IsStringTerminated(PWCHAR Array, USHORT ArrayLength, USHORT *StringLength)
      {
          BOOLEAN bStringIsTerminated = FALSE;
          USHORT uiIndex = 0;
      
          *StringLength = 0;
      
          while(uiIndex < ArrayLength && bStringIsTerminated == FALSE)
          {
              if(Array[uiIndex] == L'\0')
              {
                  *StringLength = uiIndex + 1;
                  bStringIsTerminated = TRUE;
              }
              else
              {
                  uiIndex++;
              }
          }
      
          return bStringIsTerminated;
      }
      

      【讨论】:

      • 谢谢!所以假设来自用户空间的缓冲区(irp->AssociatedIrp.SystemBuffer)不是空终止的,我应该使用哪些内核模式函数来分配新的 whcar 缓冲区? ExAllocatePoolWithTag?
      • 是的,您可以为此使用 ExAllocatePool。
      猜你喜欢
      • 2013-11-08
      • 2012-03-28
      • 1970-01-01
      • 2011-05-12
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多