【解決方法】ミニフィルター ドライバーからの Filtergetmessage


相反する結果でかなり長い間これに取り組んできたので、誰かがいくつかの問題を解決できることを願っています。 プロセスの作成を監視する c++ でコーディングされたミニフィルター ドライバーがあり、通信ポートで FltSendMessage を使用しており、値がドライバーから正しく送信されていることを確認できます。 私が抱えている問題は、FilterGetMessage を PInvoke し、intptr を文字列に変換して VB.NET アプリケーションへの出力を取得しようとしたときです。 私はまったく何も受け取っていないか、大量の意味不明なものを受け取っています。誰かが何が問題なのかを知るのを手伝ってくれるなら、これはvb.netコードです。

<DllImport("fltlib.dll")>
Shared Function FilterConnectCommunicationPort(
<MarshalAs(UnmanagedType.LPWStr)>portName As String,
options As UInteger,
context As IntPtr,
sizeOfContext As Short,
securityAttributes As IntPtr,
<Out> ByRef portHandle As SafeFileHandle) As UInteger
End Function

<DllImport("fltlib.dll")>
Shared Function FilterGetMessage(
portHandle As SafeFileHandle,
messageBuffer As IntPtr, //or? FILTER_MESSAGE_HEADER
messageBufferSize As Integer,
<[In], [Out]> ByRef overlapped As intptr) As Boolean
End Function
<StructLayout(LayoutKind.Sequential)>
   Public Structure FILTER_MESSAGE_HEADER
       Public ReplyLength As UInt32
       Public MessageId As UInt64
   End Structure

while ループを使用して、スレッド内で FilterGetMessage From を呼び出しています。

Dim FltSize = ((1 << 11) - 1) * 2 + 2 '4096 Same as buffer size in driver
 Dim FltMessage As IntPtr = Marshal.AllocHGlobal(FltSize)

do while true
If FilterGetMessage(Communication_Port_Handle, FltMessage, FltSize, intptr.Zero) = True Then
       Dim FltPointer = Marshal.PtrToStringUni(FltMessage)
       Invoke(Sub() RichTextBox1.AppendText("FILTERGETMESSAGE: " & FltPointer))
       Invoke(Sub() RichTextBox1.AppendText(vbCrLf))
End If
loop

FltSendMessage が成功したかどうかを debugview に報告するようにドライバー内にテスト文字列を設定しました。そこには問題がないように見えます。また、vb.net アプリケーションで FilterGetMessage が true を返します。つながります。 そのため、なぜ何も得られないのか、プログラムを実行すると意味不明になることがあります。

ドライバーはファイル名を wchar_t として送信しています。いくつかの調査を行った後、vb.net equivlant は文字列型であることがわかりました。この構造体もあります。

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
   Public Structure node
       <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=BUFFER_SIZE)>
       Public y As String
   End Structure

この構造体が役立つかどうかはわかりませんが、役立つ場合はこの質問に追加することを考えました。

私が試したこと:

c++/cli を使用してみましたが、整数と const リテラル文字列を返す以外に運がありませんでした。

Unicode、ANSI、その他でエンコードを試みました
また、送信および割り当てられるバッファサイズを確認して再確認しました

解決策 1

それについてまだ助けが必要ですか?
ドライバーと vb.net クライアントのバッファー サイズは同じですか?
fltlib.dll からの FilterConnectCommunicationPort および FilterGetMessage 関数の P/Invoke 署名は正しいようです。

いくつかの問題: FilterGetMessage 呼び出しなど、あなたが渡している intptr.ゼロ、する必要があります 何もない 代わりは。 ループ「do while true」を変更する必要があります。 これが私が提案するものです:

Dim FltSize = ((1 << 11) - 1) * 2 + 2 '4096 Same as buffer size in driver
Dim FltMessage As IntPtr = Marshal.AllocHGlobal(FltSize)
Dim FltHeader As FILTER_MESSAGE_HEADER

do while true
    If FilterGetMessage(Communication_Port_Handle, FltMessage, FltSize, Nothing) = True Then
        FltHeader = CType(Marshal.PtrToStructure(FltMessage, GetType(FILTER_MESSAGE_HEADER)), FILTER_MESSAGE_HEADER)
        Dim FltPointer = Marshal.PtrToStringUni(FltMessage + Marshal.SizeOf(FltHeader), CInt(FltHeader.ReplyLength))
        Invoke(Sub() RichTextBox1.AppendText("FILTERGETMESSAGE: " & FltPointer))
        Invoke(Sub() RichTextBox1.AppendText(vbCrLf))
    End If
loop

コメント

タイトルとURLをコピーしました