ネットワークドライバー
ネットワークドライバーは、TDIドライバー(トランスポートドライバーインターフェイス)とNDISドライバー(ネットワークドライバーインターフェイス仕様)の2つのカテゴリに分類できます。 TDIドライバーは、SMBクライアント、SMBサーバー、SMBラッパー(NFFS、MSFS)などの高レベルドライバーです。 NDISドライバーを検討します。 NDISは特別なドライバー(ndis.sysファイルがそれに対応します)で、低レベルのネットワークドライバーで使用される機能が含まれています。 NDISは、それ自体、低レベルのネットワークドライバーを包み込み、相互およびハードウェアとの通信の仲介者です。 実際、NDISはWindowsの3番目のコアと考えることができます。 NDISとは何かをより明確に理解するために、次の図を見ることができます。

この図からわかるように、NDISドライバーには3つのタイプがあります。
- ミニポートドライバー(アダプタードライバー)
- 中間ドライバー(psched.sysなど)
- プロトコルドライバー(例:tcpip.sys)
それぞれを個別に検討しましょう。
ミニポートドライバー
ハードウェアの各ネットワーク部分には、独自のミニポートドライバーがあります。 ミニポートドライバーは、NDISを介していくつかのコマンドを受け取ります。 ミニポートドライバーの機能は次のように説明できます。
- デバイス(アダプター)を初期化します
- ネットワーク接続の作成/有効化/無効化/削除
- クライアントへの発行またはアダプター設定の変更
- パッケージを送る
- パケットを受信する
- アダプタステータスに関するOSアラート
- 再起動してアダプターを停止する
ミニポートドライバーには、さまざまなイベントを通知する22個の標準コールバック関数が含まれています(これらの関数の一部はNULLになる可能性があるため、ドライバーは対応するイベントを通知されません)。 NDISは、ミニポートドライバーが使用する約150の関数をエクスポートします。
ミニポートドライバは、「コネクションレス」(たとえば、イーサネットアダプタドライバ)と「コネクション指向」(たとえば、モデムドライバ)です。 接続指向のドライバーでは、コールバックシステムはもう少し複雑です。通信チャネルへの接続、チャネルからの切断、チャネルの選択(ワイヤレスアダプター用)などに関連するイベントハンドラーが含まれます。 一部のConnection指向の操作では、ドライバーは名前の「Co」プレフィックスが異なる特別なNDIS関数を呼び出します(たとえば、NdisMIndicateReceivePacketの代わりに、Connection指向のドライバーはNdisMColndicateReceivePacketを呼び出す必要があります)。
各コールバックは、情報の発行、データの送信、データの受信など、独自のタスクを実行します。 詳細については、WDK(DDK)のヘルプを参照してください。 ここで、コールバックに関する完全な情報を取得できます。
プロトコルドライバーは、ミニポートドライバーに委ねることができます(ミニポートドライバーが単独でこれを実行できるか、アダプターがハードウェアレベルで実行できる場合)。その機能の一部(たとえば、IPパケットのチェックサムまたはデジタル署名を区別したり、大きなTCPパケットをフラグメント化します)。 これにより、ネットワークメーカーが大幅に強化されます。
たとえば、ミニポートドライバーがサポートできるさまざまな追加の高度なインターフェイスがあります。
- LBFO(ロードバランシングとフェイルオーバー)-それを理解しているアダプターが、発信トラフィックを相互に分散し、互いのエラーを修正できるようにします。 ただし、これはWindowsがほとんどインストールされないバックボーンルーター(大規模ネットワークの中央ルーター)でのみ意味があります。
- FFP(高速転送パス)-それを理解するアダプターが、OSの関与やメインのコンピュータープロセッサーのロードなしで、純粋にハードウェアでパケットをルーティング/フィルター処理できるようにします。
中間ドライバー
上記の中間ドライバーは、ミニポートドライバーとして表示されます(写真を参照)。 仮想アダプタのように、そして以下-仮想プロトコルのようなプロトコルドライバーのように(もう一度、画像を見てください)。 特別な場合として、中間ドライバーが上からしか見えない場合があります。
通常、中間ドライバーは次のいずれかを実行します。
- プログラムが互いに干渉しないように、異なるクライアントプログラムのアダプターへの「公正な」アクセスを編成する
- トラフィックのフィルタリングとインターセプト
- これらのネットワークが異なる場合(イーサネットとWI-FIなど)、ネットワーク間でパケットをルーティングします。
スニファーがネットワークトラフィックのスキャンに使用するのは断続的なドライバーです。 ある中間ドライバーの仮想プロトコルが別の中間ドライバーの仮想アダプターにバインドされている場合、中間ドライバーは互いに位置合わせできます。 しかし、パフォーマンスが低下するため、これはめったに行われません。
プロトコルドライバー
プロトコルドライバーは、NDIS仕様の最高レベルです。 これらのドライバーは、各パッケージにリソースを割り当て、アプリケーションデータをパッケージにコピーし、それらを低レベルのドライバーに渡すことを約束します。 プロトコルドライバーは、基盤となるドライバーからパケットを受信するためのインターフェイスも提供します。
プロトコルドライバーには、たとえばTCP / IP(tspip.sys)などのネットワークプロトコルスタックを実装するトランスポートドライバーも含まれます。
投稿が読者にとって興味深い場合は、以下の投稿で、独自のスニファーのような中間ドライバーの例を記述するか、ドライバーの各タイプ(ミニポート、中間、またはプロトコル)の記述方法について説明することができます。
ご清聴ありがとうございました。