文書番号: 224784 - 最終更新日: 2004年3月3日 - リビジョン: 3.0

DDK:WDM/NDIS ミニポートドライバの書き方

この記事は、以前は次の ID で公開されていました: JP224784
すべて展開する | すべて折りたたむ

概要

最先端のネットワーク装置は、PC に接続するために、USB や IEEE 1394 のような新しいハードウェアインタフェースを使用します。これらの新しいハードウェアインタフェースを、WDM (Windows Driver Model) ミニポートドライバでサポートすることが必要になります。しかし、Windows 2000 と Windows 98 では、特別なインタフェースを提供し、ネットワークドライバをサポートしています。したがって、そのようなネットワーク装置は、上位エッジで NDIS ミニポートインタフェースを提供し、下位エッジで WDM ミニポートインタフェースを提供する、NDIS ミニポートドライバが必要になります。

詳細

WDM クラスデバイスをサポートする NDIS ミニポートドライバは、ハードウェアにアクセスするために NDIS ラッパーを使用しないので、NDIS によって階層化されたドライバとしてみなされます。その代わり、そのような NDIS ミニポートドライバは、該当する WDM バスドライバインタフェースの必要条件を厳守します。NDIS 仕様に則って、ドライバは以下のようにしなければなりません:
  • .inf ファイルには、NET クラスのデバイスとして識別させます。
  • DriverEntry で NdisMRegisterMiniport を使用します。ドライバは、いかなるイベントにも待機することによって、MiniportInitialize 関数をブロックしてはなりません。
  • NdisSetAttributesEx を使用して、属性フラグに NDIS_ATTRIBUTE_DESERIALIZE ビットを設定します。これによって、ミニポートドライバは、送受信パケットのシリアライズを行うことが要求されます。
  • 下位デバイスの PDO に NdisMGetDeviceProperty を使用します。
  • DeviceObject が必要であれば、IoCreatDevice ではなく、NdisMRegisterDevice を使用します。
  • 受信パケットを待ち行列に入れて、このキューを空にするために NdisTimerProc を使用し、上位のネットワーク層にパケットを通知します。これは、プロトコルがバイナリ互換の方法を使用している DPC レベルで、これらのパケットを受信することを保証するために行われます。
  • NDIS は、以下の IRP 用のハンドラをインストールすることを許可します:
    IRP_MJ_PNP
    IRP_MJ_POWER
    IRP_MJ_SYSTEM_CONTROL
  • NDIS 用と WDM 用のコードを別々のソース ファイルに作成します。これは、Ndis.h と Wdm.h にいくつかの定義が重複するためです。
  • 知らされたすべてのパケットを返すための待機と、完了するすべてのタイマを待機するために、HaltHandler を使用します。待機するためには、NdisWaitEvent を使用しなければなりません。USB/NDIS ドライバの場合、すべての受信がキャンセルされることを待機しなければなりません。
  • メモリ管理用のすべての呼び出しは NDIS ラッバーを使用します。同等の機能がある WDM 呼び出しより、NDIS ラッバー関数を使用しなければなりません。
  • 接続から切断とか、切断から接続というような、メディアの状態遷移を知らせます。
NDIS は、ミニポートに対して、デバイスローダー、クラスドライバ、プラグアンドプレイ マネージャ、WMI マネージャ、そしてパワーマネージャでもあります。たとえば、USB デバイス用のミニポートを設計する場合、USB のクライアントコードの基本となる USB BULK サンプルを使用すべきです。しかし、USB BULK サンプルのように IRP ハンドラはインストールしません。NDIS は、IRP ハンドラをインストールして、該当する操作の方向を決定します。そして、NDIS はミニポートに対して、更新リクエストを送信するために、ミニポートの RequestHandler を使用して、ミニポートの NDIS_MINIPORT_CHARACTERISTICS でコールバック関数を使用します:
  • NDIS は、ミニポートのために IRP_MN_START_DEVICE の間に InitializeHandler を呼び出します。
  • NDIS は、IRP_MN_STOP_DEVICE と IRP_MN_REMOVE_DEVICE の間に、ミニポートの HaltHandler を呼び出します。
  • NDIS は、デバイス状態が D0 よりも大きい時、IRP_MN_SET_POWER の間に、ミニポートの SetInformationHandler と HaltHandler を呼び出します。
  • NDIS は、デバイス状態が D0 に等しい時、IRP_MN_SET_POWER の間に、ミニポートの InitializeHandler と SetInformationHandler を呼び出します。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 224784? (http://support.microsoft.com/kb/224784/EN-US/ ) (最終更新日 2001-03-26) をもとに作成したものです。


この資料は以下の製品について記述したものです。
  • Microsoft Win32 Device Driver Kit for Windows 2000
  • Microsoft Windows 98 Driver Development Kit (DDK)
キーワード:?
kbhowto ndismregisterminiport halthandler kbfaq ndissetattributesex wdm KB224784
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
 

サポート技術情報の翻訳