カーネル WFP フィルターを FWPM_LAYER_OUTBOUND_IPPACKET_V4 に登録しました。ここで、各 IPv4 NET_BUFFER_LIST をバッファーにコピーし、変更せずにワーカー スレッドから再注入しました。サブレイヤーとして FWPM_SUBLAYER_UNIVERSAL を使用しています。基本的:
mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)
sendComplete コールバックから NET_BUFFER_LIST_STATUS() と同様に 0 を返します。
これは UDP と ICMP (応答が返ってきます) では機能しますが、TCP パケットでは機能しません。テストしている仮想マシンから NetMon で SYN が送信されていることを確認できますが、NetMon は外部 (ホスト マシン内) でパケットが送信されていることを認識しません。もちろん、リモートホストからの応答はありません。
IP チェックサム (classifyFn で 0 として取得) を更新しようとしましたが、何も変わりません。TCP チェックサムは、classifyFn が受信した時点で既に正しいものです (NetMon が判断できる限り)。元の nbl、フラット バッファー、および WinDBG で新しく作成された nbl を調べたところ、それらにはすべて IP パケット (0x45 などで始まる) が含まれています。
フィルター用に新しいサブレイヤーを作成する必要がありますか? システム プロセスに関連付けられたワーカー スレッドから sendAsync を呼び出しているため、パケットは破棄されますか?