首先嚐試在Windows驅動程序開發。 如何將WCHAR數組(來自用戶空間)轉換爲UNICODE_STRING(在內核模式下),假定WCHAR數組是而不是以空終止?將WCHAR *轉換爲UNICODE STRING
我應該驗證它是否以null結束,如果它沒有分配一個新的緩衝區(+2爲null),然後使用RtlAnsiXXX函數?什麼是正確的方法?
謝謝!
首先嚐試在Windows驅動程序開發。 如何將WCHAR數組(來自用戶空間)轉換爲UNICODE_STRING(在內核模式下),假定WCHAR數組是而不是以空終止?將WCHAR *轉換爲UNICODE STRING
我應該驗證它是否以null結束,如果它沒有分配一個新的緩衝區(+2爲null),然後使用RtlAnsiXXX函數?什麼是正確的方法?
謝謝!
要從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;
}
的WCHAR陣列不必須是空終止的。 UNICODE_STRING結構被設計用於計數的字符串,因此,可以與非NULL結尾的WCHAR數組一起工作 - 當然,您將必須知道長度。
例如,您可以使用RtlInitEmptyUnicodeString。
謝謝!因此,假設來自用戶空間(irp-> AssociatedIrp.SystemBuffer)的緩衝區不是空終止的,我應該使用什麼內核模式函數來分配新的whcar緩衝區? ExAllocatePoolWithTag? – user1782427
是的您可以使用ExAllocatePool。 – ladan