2013-10-14 163 views
0

首先尝试在Windows驱动程序开发。 如何将WCHAR数组(来自用户空间)转换为UNICODE_STRING(在内核模式下),假定WCHAR数组是而不是以空终止?将WCHAR *转换为UNICODE STRING

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

谢谢!

回答

1

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

WCHAR阵列必须以空终止。因此,如果您选中并且wchar-string不是空终止,则应该为空分配一个新缓冲区(+ sizeof(WCHAR)),复制数组内容,然后调用RtlInitUnicodeString。

要检查是否从用户模式WCHAR-string是空值终止我使用:

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; 
} 
+0

谢谢!因此,假设来自用户空间(irp-> AssociatedIrp.SystemBuffer)的缓冲区不是空终止的,我应该使用什么内核模式函数来分配新的whcar缓冲区? ExAllocatePoolWithTag? – user1782427

+0

是的您可以使用ExAllocatePool。 – ladan

0

的WCHAR阵列必须是空终止的。 UNICODE_STRING结构被设计用于计数的字符串,因此,可以与非NULL结尾的WCHAR数组一起工作 - 当然,您将必须知道长度。

例如,您可以使用RtlInitEmptyUnicodeString