まずはWindowsドライバ開発に挑戦。WCHAR配列がnullで終了していないと仮定して、WCHAR配列(ユーザー空間からのもの)をUNICODE_STRING(カーネルモード)に変換するにはどうすればよいですか?
null で終わるかどうか、および新しいバッファー (null の場合は +2) を割り当てないかどうかを確認してから、RtlAnsiXXX 関数を使用する必要がありますか? 適切な方法は何ですか?
ありがとう!
まずはWindowsドライバ開発に挑戦。WCHAR配列がnullで終了していないと仮定して、WCHAR配列(ユーザー空間からのもの)をUNICODE_STRING(カーネルモード)に変換するにはどうすればよいですか?
null で終わるかどうか、および新しいバッファー (null の場合は +2) を割り当てないかどうかを確認してから、RtlAnsiXXX 関数を使用する必要がありますか? 適切な方法は何ですか?
ありがとう!
wchar 配列から UNICODE_STRING を初期化するには、RtlInitUnicodeString を使用します。
WCHAR 配列は null で終了する必要があります。
したがって、チェックしたときに wchar-string が null で終了していない場合は、新しいバッファー (null の場合は +sizeof(WCHAR)) を割り当て、配列の内容をコピーしてから、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;
}
WCHAR 配列はNULL で終了する必要はありません。UNICODE_STRING 構造は、カウントされた文字列用に設計されているため、NULL で終了しない WCHAR 配列で機能します。もちろん、長さを知る必要があります。
たとえば、RtlInitEmptyUnicodeStringを使用できます。