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を再起動させなければならないところが厳しいですが・・・
以上、よろしくお願いいたします。