Windows の Network Driver


お久しぶりです。さなえすです。8月ももう終わりですね。

私事ですが、この間の週末は高円寺の阿波踊りに「マイクロソフト連」として参加させていただきました。“Windows 7  を掛け声に踊ったんですけど、腕も足も痛いし、汗は目に入るしで大変でした。最後まで頑張れたのは、沿道のみなさんから「マイクロソフトぉ~頑張れ~!」「せぶんせぶんせぶん~」と温かい声援をかけていただいたおかげです。お祭りを通じて、地域のみなさんとの距離がぐっと近くなる感じが、とっても良かったです♪ さて、皆さまのこの夏の思い出は何でしたか?

 

今日は、ずーっと書きたいなと思っていたトピック、ネットワークについて書こうと思います。Windows のネットワークに含まれるトピックは沢山あります。なので、その中でドライバーだけを取ってみても……やっぱり沢山あります。私が、初めて Windows の ネットワークドライバーの世界に触れた時、ドライバーの名称だけでも様々なものがあると感じました。例えば、ミニポートドライバー・NICドライバー・LANドライバー、ネットワーク フィルタードライバー、中間層ドライバー、TDI ドライバー、プロトコル ドライバー、…………などなど、たくさんありますが、少しずつお伝えできればいいなと思っています。

 

 

今日はまず、「NDIS ドライバー」のお話。

 

この Blog を書くにあたって、Windows Internals 5th Edition を参照したところ、NDISライブラリー含め、NDIS スタック上で動作するドライバーのことをまとめて「NDIS ドライバー」と称していました。このBlogでもそう呼ばせてもらおうと思います。ちなみにですが、NDISと書いて、通常「エヌディス」と読みますよ。

 

 

NDIS ライブラリー (Ndis.sys)

まず、Windows 上のネットワークドライバーを理解する上で、大きなポイントとなるのが NDISです。NDIS とは、Network Driver Interface Specification の略で、1989年に3Comとマイクロソフトによって共同で開発された、読んで字の如く、ネットワーク ドライバーにおけるインターフェースの仕様です。Windows 上では、NDIS ライブラリー(※ 仕様自体と分けるため NDIS ライブラリーと明記しましたが、以降 NDIS と称します)として実装されていて、実際のファイルは Drivers フォルダーの下にあります (\%SystemRoot%\System32\Drivers\Ndis.sys)

 

NDISでは OSI参照モデル を忠実に踏襲している訳ではありませんが、ネットワーク上での役割を大まかに理解してもらうためにあえて言いますと、NDIS OSI参照モデルで言うところの データリンク レイヤー(の一部)の範囲に位置しています。

 

clip_image001clip_image003

 

もっと具体的な役割としては、NDIS ドライバーが使用する API (NDIS ライブラリー関数) を提供するだけでなく、NDIS ドライバーの動作する実行環境をも提供しています。この「実行環境を提供している」というのは、大ざっぱな言い方をすれば、NDIS ドライバーは NDIS ライブラリー以外のドライバーと直接やり取りすることはなく、逆に言うと NDIS ライブラリーとのみやり取りすればよい、ということです。そのため、通常の WDMのドライバーが行うような IRP のハンドリングなどは直接行いませんし、他のドライバーから IoCallDriver などで呼び出されることも原則ありません。(独自のプロトコルを実装している場合は除きます)

 

現在 Window 7 ならびに Windows Server 2008 R2 でサポートされている NDIS のバージョンは 6.2 です。NDIS 5.x から NDIS 6.x へのメジャーアップデートは、Windows Vista (NDIS 6.0) のリリースのタイミングでされました。NDIS 6.x は、従来の NDIS 5.x と比べて、状態遷移の管理方法や、転送の基本となるパケットの構造などに様々な変更がなされ、動的かつ効率的に処理を行うことができるようになっています。なお、NDIS 6.x は下位互換を持っていますので、NDIS 5.x として適切に実装されたドライバーであれば Windows Vista Windows 7 などの NDIS 6.x の環境下でも動作します。ですが、実際のところ NDIS 5.x がラッピングされて NDIS 6.x 環境下で動作しているため、パフォーマンス面では効率が落ちてしまいます。そのため、これから新規に実装を行う場合は当然のこと、NDIS5.x 系のドライバーも、最新の NDIS バージョンへ移行することをお勧めします。

 

 

●その他のNDIS ドライバー

上記の NDIS以外に、どんなものがあるのかと言いますと、ミニポート ドライバー、フィルタードライバー(LWD: lightweight filter driver)、中間層 (IM: intermediate) ドライバー、プロトコル ドライバーなどの種類があります。実際に WDK にもサンプルが沢山用意されていますので、是非のぞいてみてほしいと思います (%BaseDir%\src\network\ndis)。

 clip_image001 

●ミニポート ドライバー:

LAN ドライバー、NIC ドライバー、様々な呼び方があるようですが、ネットワークアダプターの実質的な機能を提供するドライバーです。NDIS.sys と共に HW に最も近いレイヤーで動作するドライバーです。通常、Net クラスとして登録されます。

●フィルター ドライバー :

ミニポート ドライバー と プロトコル ドライバーの間に位置し、その特性を生かしてネットワークスタック上のデータをフィルタリングすることができます。用途に応じてクラスは様々ですが、NetTrans クラス、NetService クラスなどで登録され、中間層ドライバーに関しては、Net クラスのインターフェースも持ちます(後述)。

●プロトコル ドライバー :

ミニポート ドライバー、フィルター ドライバーより上位に位置するため、NDIS ドライバーの中でもよりアプリケーションに近いレイヤーで動作するドライバーです。アプリケーションと連動した独自プロトコルを実装することも可能です。こちらも用途に応じてクラスは様々ですが、NetTrans クラス、NetService クラスとして登録されることが多いようです。

 

clip_image004

 

フィルター ドライバーについて、ちょっと補足をします。一口にフィルタードライバーと言っても、現在の Windows では、様々な様相を呈しています。まず、代表的なフィルター ドライバーとして、LWD: lightweight filter driver があります。LWD だけでなく、中間層 (IM: intermediate) ドライバーもフィルタードライバーとみなされる場合もあります。中間層 (IM) ドライバーは、他とは特に異なっており、ミニポートドライバーとしてのインターフェース(“Miniport Edge”)と、プロトコルドライバーとしてのインターフェース(“Protocol Edge”)の両方を持っているという特徴があります。ミニポート ドライバー と プロトコル ドライバーの間に位置するため、中間層・Intermediate の名前を持つわけです。その特性ゆえ、フィルター ドライバーとして実装されることも多かったのですが、必ずしもいわゆるパケットなどを監視する “ネットワーク フィルター” の機能を持つとは限らず、仮想のネットワークアダプターとして実装することも可能です。余談ですが、中間層ドライバーは “Miniport Edge” と “Protocol Edge” それぞれに INF ファイルがあったりします。(INFファイルって1つしかないという先入観があったためか、私は最初「へえ~」と思いました。)INF は必ずしも 2 つに分ける必要はないですが、皆さん、普通は分けて書いているようですね。

 

 また NDIS ドライバー以外にも、Windows Filtering Platform(WFP) というフィルタリング専用の仕組みや、Winsock Kernel (WSK) のインターフェースも Vista から新たにサポートされています。この WFP の仕組みを利用してカーネルモードで動作するドライバーに、Callout ドライバーがあります。これまでにTDI クライアント ドライバーで実装されていたモデルに代わり、WSK のインターフェースを使用した実装へと更新することが推奨されています。

 

さて、NDIS ドライバーの住み分けが大体頭に入ったところで、手元の環境で実際に見てみたいと思います。

 

私の手元の環境では、コントロールパネルから確認したところ、2つのネットワーク接続が有効になっています。実は、このマシンには、ネットワークアダプターは 1 枚しか刺さっていません。左側の Local Area Connection が実際のネットワークアダプターに対して作られている接続で、右側の Local Area Connection 2 は、仮想的なネットワークアダプターに対する接続です。WDK MUX サンプルがインストールされていて、MUX は中間層ドライバーのサンプルです。

 

clip_image006

実際に、NDISにシンボルを合わせて、Debugger でそれぞれのインスタンスを見てみましょう。

 

OS: Windows 7 Enterprise (7600.16385) x86 バージョン

Symbol: http://msdl.microsoft.com/download/symbols

※パブリック シンボル サーバーを使用しています

 

0: kd> .reload /f ndis.sys

 

0: kd> !lmi ndis

Loaded Module Info: [ndis]

         Module: ndis

   Base Address: 8c697000

     Image Name: ndis.sys

   Machine Type: 332 (I386)

     Time Stamp: 4a5bbf58 Tue Jul 14 08:12:24 2009

           Size: b7000

       CheckSum: b5e1d

Characteristics: 102  perf

Debug Data Dirs: Type  Size     VA  Pointer

             CODEVIEW    21, 3e384,   3d984 RSDS – GUID: {A445ECC2-161F-4970-81DA-301D4F6F13BB}

               Age: 2, Pdb: ndis.pdb

                CLSID     4, 3e380,   3d980 [Data not mapped]

     Image Type: MEMORY   – Image read successfully from loaded memory.

    Symbol Type: PDB      – Symbols loaded successfully from symbol server.

                 c:\symbols\ndis.pdb\A445ECC2161F497081DA301D4F6F13BB2\ndis.pdb

    Load Report: public symbols , not source indexed

                 c:\symbols\ndis.pdb\A445ECC2161F497081DA301D4F6F13BB2\ndis.pdb

 

ネットワーク アダプターの実質的な機能を提供するドライバーはミニポートドライバーです。

ミニポートドライバー情報の一覧をダンプします。

 

0: kd> !ndiskd.miniport

    MiniDriver         Miniport            Name                               

    873825e0           873cc0e0            RAS Async Adapter

    8685aac0           86abe0e0            WAN Miniport (SSTP)

    86ab92f0           86abc0e0            WAN Miniport (PPTP)

    86ab7608           86ab80e0            WAN Miniport (PPPOE)

    86ab4898           86ab60e0            WAN Miniport (IPv6)

    86ab4898           868590e0            WAN Miniport (IP)

    86ab4898           868510e0            WAN Miniport (Network Monitor)

    86aab2b8           8683d0e0            Sample MUX-IM Virtual Miniport Driver

    868374d8           868330e0            WAN Miniport (L2TP)

    86778428           868360e0            WAN Miniport (IKEv2)

    867594d0           867430e0            Broadcom NetXtreme 57xx Gigabit Controller

    863c1d10           863b20e0            Microsoft Teredo Tunneling Adapter

    863c1d10           863b40e0            Microsoft ISATAP Adapter

    863c1d10           863ba0e0            Microsoft 6to4 Adapter #2

    863c1d10           856bb0e0            Microsoft 6to4 Adapter

 

ネットワークアダプターの個別の情報をダンプするには、リンクをクリックするか、アドレスを指定してダンプします。

まずは、Broadcom NetXtreme 57xx Gigabit Controllerから。

 

0: kd> !ndiskd.miniport 867430e0

 

 

MINIPORT

 

    Broadcom NetXtreme 57xx Gigabit Controller

 

    Ndis Handle        867430e0

    Ndis API Version   v6.20

    Adapter Context    86ae5000

    Miniport Driver    867594d0 – b57nd60x.sys  v1.0

    Ndis Verifier      [No flags set]

 

    Media Type         802.3

    Physical Medium    802.3

    Device Path        \??\PCI#VEN_14E4&DEV_1677&SUBSYS_01AD1028&REV_01#4&117729e2&0&00E0#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{6FF9F1D8-5A39-4A3F-B594-9759AE9C8A7A}

    Device Object      86743028

    MAC Address        00-14-22-41-3c-dd

 

 

STATE

 

    Miniport           Running

    Device PnP         Started

    Datapath           Normal

    Interface          Up

    Media              Connected

    Power              D0

    References         2

    User Handles       0

    Total Resets       0

    Pending OID        None

    Flags              2c452218

        ↑ BUS_MASTER, 64BIT_DMA, SG_DMA, DEFAULT_PORT_ACTIVATED,

        SUPPORTS_MEDIA_SENSE, DOES_NOT_DO_LOOPBACK, MEDIA_CONNECTED

    PnPFlags           00210061

        ↑ PM_SUPPORTED, DEVICE_POWER_ENABLED, DEVICE_POWER_WAKE_ENABLE,

        RECEIVED_START, HARDWARE_DEVICE

 

 

BINDINGS

 

    Filter List        Filter              Filter Driver      Context          _

    No filters are bound

 

    Open List          Open                Protocol           Context          _

    MUXP               86bfd798            86aab110           86bfdcf8

 

 

MORE INFORMATION

 

     → Driver handlers                      → Task offloads

     → Power management                     → PM protocol offloads

     → Pending OIDs                         → Timers

     → Pending NBLs                         → Receive Side Throttling

     → Wake-on-LAN (WoL)                    → Packet filter

     → Receive queues                       → Receive filtering

     → NDIS ports                           → NIC switch

 

同じように、MUX の仮想ネットワーク アダプターのほうもダンプしてみます。

 

0: kd> !ndiskd.miniport 8683d0e0     

 

 

MINIPORT

 

    Sample MUX-IM Virtual Miniport Driver

 

    Ndis Handle        8683d0e0

    Ndis API Version   v5.1

    Adapter Context    86bfeca8

    Miniport Driver    86aab2b8 – mux.sys  v255.65535

    Ndis Verifier      [No flags set]

 

    Media Type         802.3

    Physical Medium    NdisPhysicalMediumUnspecified

    Device Path        \??\Root#MS_MUXMP#0000#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{84AB8062-778A-439B-A886-E9923CC87AF5}

    Device Object      8683d028

    MAC Address        06-0a-22-41-3c-dd

 

 

STATE

 

    Miniport           Running

    Device PnP         Started

    Datapath           Normal

    Interface          Up

    Media              Connected

    Power              D0

    References         4

    User Handles       0

    Total Resets       0

    Pending OID        None

    Flags              2c45b800

        ↑ NOT_BUS_MASTER, IGNORE_PACKET_QUEUE, IGNORE_REQUEST_QUEUE,

        IGNORE_TOKEN_RING_ERRORS, INTERMEDIATE_DRIVER, DEFAULT_PORT_ACTIVATED,

        DESERIALIZED, RESOURCES_AVAILABLE, SUPPORTS_MEDIA_SENSE,

        DOES_NOT_DO_LOOPBACK, MEDIA_CONNECTED

    PnPFlags           00018021

        ↑ PM_SUPPORTED, DEVICE_POWER_ENABLED, NO_HALT_ON_SUSPEND,

        RECEIVED_START

 

 

BINDINGS

 

    Filter List        Filter              Filter Driver      Context          _

    No filters are bound

 

    Open List          Open                Protocol           Context          _

    NDISUIO            87072008            87074e68           870754f0

    TCPIP6             86ccf740            864845f8           86cd0008

    TCPIP              86ccaaa8            86484798           86cc9758

 

 

MORE INFORMATION

 

     → Driver handlers                      → Task offloads

     → Power management                     → PM protocol offloads

     → Pending OIDs                         → Timers

     → Pending NBLs                         → Receive Side Throttling

     → Wake-on-LAN (WoL)                    → Packet filter

     → Receive queues                       → Receive filtering

     → NDIS ports                           → NIC switch

 

MUX.sys は中間層ドライバーですので、プロトコルドライバーとしてのインターフェースも持っているはずです。

プロトコルドライバー情報の一覧をダンプします。

 

 

0: kd> !ndiskd.protocol

87075008 – RSPNDR

 

87074e68 – NDISUIO

  87072008 – Sample MUX-IM Virtual Miniport Driver

 

87071410 – LLTDIO

 

86c60690 – NDPROXY

  86cc9a60 – WAN Miniport (IKEv2)

  86cc9008 – WAN Miniport (IKEv2)

  86cc8a60 – WAN Miniport (L2TP)

  86cc8008 – WAN Miniport (L2TP)

  86cc1008 – WAN Miniport (PPPOE)

  86ca6260 – WAN Miniport (PPPOE)

  86ca6a60 – WAN Miniport (PPTP)

  86cb4260 – WAN Miniport (PPTP)

  86cb4a60 – WAN Miniport (SSTP)

  86ac11e8 – WAN Miniport (SSTP)

 

86ab7458 – RASPPPOE

 

86ab4a40 – NDISWAN

  86ee6008 – RAS Async Adapter

  86cd5008 – WAN Miniport (SSTP)

  86cd6008 – WAN Miniport (PPTP)

  86cd6a60 – WAN Miniport (PPPOE)

  86cca008 – WAN Miniport (L2TP)

  86cc7838 – WAN Miniport (IKEv2)

 

86aab110 – MUXP

  86bfd798 – Broadcom NetXtreme 57xx Gigabit Controller

 

866b5bc0 – WANARPV6

  86ccb7b8 – WAN Miniport (IPv6)

 

866b5e68 – WANARP

  86cd5a60 – WAN Miniport (IP)

 

864867d0 – TCPIP6TUNNEL

  86ace3f8 – Microsoft Teredo Tunneling Adapter

  86acc740 – Microsoft ISATAP Adapter

 

8648be60 – TCPIPTUNNEL

 

864845f8 – TCPIP6

  86ccf740 – Sample MUX-IM Virtual Miniport Driver

 

86484798 – TCPIP

  86ccaaa8 – Sample MUX-IM Virtual Miniport Driver

 

MUXPというプロトコルが、Broadcom NetXtreme 57xx Gigabit Controllerに対して関連付けられていますね。

 

ところで、Broadcom NetXtreme 57xx Gigabit Controllerのミニポート情報をもう一度見てください。

BINGINGSOpen List MUXPの名前があるのにお気づきでしょうか。

つまり、ミニポート側から見ても、MUXP プロトコルに関連付けられていることが分かります。

 

BINDINGS

 

    Filter List        Filter              Filter Driver      Context          _

    No filters are bound

 

    Open List          Open                Protocol           Context          _

    MUXP               86bfd798            86aab110           86bfdcf8

 

 

 

BIND の話が出たところで、時間がなくなってしまいましたので今日はここらへんでおしまいにしようと思います。

あんまり深く突っ込んだ内容ではなかったかもしれませんが、NDIS ドライバーの種類と雰囲気については、つかんでいただけましたでしょうか?

最後に、参考になりそうなサイトを【補足~リンク集~】に集めてみましたのでお時間のある時にでも見てみてください。

BIND の話は次回の私の投稿でできればな、と思っております。

 

ではまた!

 

  

【補足~リンク集~】

 

WHDC ネットワーク

各種ホワイトペーパーや様々なサイトへのリンクが集められています。是非、チェックしてみてください。

 

The NDIS blog

上記WHDCのネットワークのページの関連ブログにもリンクが張られています。本文中に記載した WinDBG の出力についてより詳しく知りたい方は是非こちらも参考にしてみてください。

[Re]Introducing NDISKD ~Over a decade of making NDIS developers dangerous~

Getting started with NDISKD ~Part 1 of a beginners guide to debugging with NDISKD~

NDISKD and !miniport ~The second installment of a beginners guide to debugging with NDISKD~

 

NDIS Developer’s Reference

Microsoft のサイトではありませんが、NDIS ドライバー開発に関するノウハウが沢山詰まっています!

 

Network Devices

MSDNドキュメントで情報をお探しの場合は、NDIS 6.x NDIS 5.x でドキュメントの構成を分けていますので、注意してください。

 

Skip to main content