[ad_1]
相反する結果でかなり長い間これに取り組んできたので、誰かがいくつかの問題を解決できることを願っています。 プロセスの作成を監視する 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
[ad_2]
コメント