2013-10-14 164 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