NDIS6.0 中間フィルタドライバからのタスクオフロード機能の設定

お世話になっております。Serowと申します。

[開発環境]
ターゲットOS:Windows Vista Ultimate SP1
WDK:WDK build 6000

現在NDIS6.0の中間フィルタドライバを開発しております。
ドライバの位置は、"TCP/IP プロトコルドライバ" -> "中間フィルタドライバ" -> "miniport ドライバ" です。

このフィルタドライバには2つのモードがあり、ユーザモードからのDeviceIoControl()でAモードとBモードを切り替えるようになっています。
Aモードで動作中は送受信パケットのデータを一部変更するため、タスクオフロード機能を無効にする必要があります。また、Bモードで動作中はデータの変更はしないため、タスクオフロード機能は有効にしたいと考えております。

そこでこのフィルタドライバ内から、NICでサポートされているタスクオフロード機能の有効/無効の切り替えを以下のように試みています。

1.Aモード動作開始時、NdisRequest()をOID_TCP_OFFLOAD_CURRENT_CONFIGで実行し、現在のタスクオフロードサポート情報(NDIS_OFFLOAD構造体)を取得。
2.有効になっている機能があれば、NDIS_OFFLOAD_PARAMETERS構造体に無効を設定し、NdisRequest()をOID_TCP_OFFLOAD_PARAMETERSで実行する。

上記1/2の処理で、有効になっている機能を無効化することができました。
次に無効化した機能を元に戻すため、以下の処理を実行しました。

3.Bモード動作開始時、NdisRequest()をOID_TCP_OFFLOAD_CURRENT_CONFIGで実行し、現在のタスクオフロードサポート情報(NDIS_OFFLOAD構造体)を取得。
4.取得した情報と以前の情報から元に戻す(有効にする)機能を決定する。NDIS_OFFLOAD_PARAMETERS構造体に有効を設定し、NdisRequest()をOID_TCP_OFFLOAD_PARAMETERSで実行する。
5.設定されているか確認のために、NdisRequest()をOID_TCP_OFFLOAD_CURRENT_CONFIGで実行し、現在のタスクオフロードサポート情報(NDIS_OFFLOAD構造体)を取得。

手順5で有効になっていることが確認できるのですが、TCP/IP プロトコルドライバから渡されるパケットはタスクオフロード機能が無効の時と同じままになってしまいます。

また、以下のことを確認しました。

・手順4の後、IP HelperのGetIpInterfaceEntry()で対象NICの情報を取得したところ、有効になっています。
・デバイスマネージャからNICのタスクオフロードのプロパティを確認しても無効のままとなっています(例えば、TCP Tx Checksum Offloadなど)。

中間フィルタドライバからタスクオフロード機能を有効にはできないのでしょうか。

何かご存知の方がいらっしゃいましたら、お教えいただきたく存じます。
よろしくお願いいたします。

お世話になっており

お世話になっております。Serowです。

いろいろと試してみましたが、一度無効にしたタスクオフロード機能を、
ドライバ内から有効にすることは出来ませんでした。

そこでドライバインストール中は常にタスクオフロード機能を無効にする仕様とし、以下のように実装しました。

①ドライバインストール時、次のレジストリを変更し、タスクオフロード機能を無効にする。
 "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
 DWORD値の"DisableTaskOffload"に"1"を設定(存在しなければ作成する)。
②OSを再起動する(TCP/IPプロトコルに設定を反映させるため)。
③タスクオフロード機能が無効の状態で動作する。

また、ドライバアンインストール時に当該レジストリを削除し、OSを再起動させることでタスクオフロード機能が有効な状態に戻ります。

ドライバインストール後にOSを再起動させなければならないところが厳しいですが・・・

以上、よろしくお願いいたします。