仮想マシンから送信されたパケットをフィルター処理する必要がある 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 を含むメタデータを受け取ります。これらの値は両方ともゼロです。これらは正しい値ですか、それとも非ゼロであるべきですか?? コールアウト関数でパケットからデータを抽出し、それを安全にさらなるレイヤーに転送するのを手伝ってくれる人はいますか?
ありがとうございました。