1

仮想マシンから送信されたパケットをフィルター処理する必要がある Hyper-V 2012 用のコールアウト ドライバーを作成しています。

WFP の FWPM_LAYER_EGRESS_VSWITCH_TRANSPORT_V4 レイヤーにフィルターを追加しました。コールアウト関数は、NET_BUFFER_LIST に型キャストしているパケット バッファを受信します。データポインターを取得するために次のことを行っています

pNetBuffer = NET_BUFFER_LIST_FIRST_NB((NET_BUFFER_LIST*)pClassifyData->pPacket); pContiguousData = NdisGetDataBuffer(pNetBuffer, NET_BUFFER_DATA_LENGTH(pNetBuffer), 0, 1, 0);

パケット データをテストする単純なクライアント サーバー アプリケーションがあります。クライアントは VM 上にあり、サーバーは別のマシンです。私が観察したように、クライアントからサーバーに送信されたデータは切り捨てられ、最後にガベージ値が追加されます。サーバーからクライアントにメッセージを送信する場合、問題はありません。このレイヤーフィルターを追加しないと、クライアントサーバーは問題なく動作します。

コールバック関数は、ipHeaderSize と transportHeaderSize を含むメタデータを受け取ります。これらの値は両方ともゼロです。これらは正しい値ですか、それとも非ゼロであるべきですか?? コールアウト関数でパケットからデータを抽出し、それを安全にさらなるレイヤーに転送するのを手伝ってくれる人はいますか?

ありがとうございました。

4

1 に答える 1

1

これらは TCP パケットです。サイズとオフセット情報を調べました。問題はパケット全体で一貫しているようです。(NET_BUFFER_LIST*)pClassifyData->pPacket で以下の値を確認しました。

NET_BUFFER_LIST->NetBUfferListHeader->NetBUfferListData->FirstNetBuffer->NetBufferHeader->NetBufferData->CurrentMdl->MappedSystemVa

最初の 24 バイトだけが正しく送信され、残りはガベージです。

たとえば、パケットの合計サイズは 0x36 + 0x18 = 0x4E です。すべてのパケットで一定である最初の 0x36 バイトに何があるかわかりません。TCP/IP ヘッダーですか? 2 番目の部分 0x18 は、送信した実際のデータです。

API NdisQueryMdl() を使用して、MDL リストから取得することさえ試みました。

そのため、受信側では 24 バイトしか正しく取得できず、残りはガベージです。NET_BUFFER_LIST から完全なバッファを読み取る方法は?

于 2013-04-03T16:00:47.633 に答える