開始シーケンス

アダプター ドライバーはカーネル モード ドライバー サービスとしてインストールされるため、オペレーティング システムはシステム起動時にアダプター ドライバーをロードし、ドライバーの DriverEntry ルーチンを呼び出します。 DriverEntry ルーチンは、ドライバー オブジェクトとレジストリ パス名という 2 つのパラメーターを受け取ります。 DriverEntry は、ドライバー オブジェクトおよびレジストリ パス名のパラメーターに加えて、アダプター ドライバーの AddDevice 関数へのポインターである 3 番目のパラメーターを使用して、PortCls 関数 PcInitializeAdapterDriver を呼び出す必要があります。

次の例では、ドライバーの DriverEntry 関数はMyAddDevice、ドライバーの AddDevice 関数を指す関数ポインターを 3 番目のパラメーターとして PcInitializeAdapterDriver ルーチンに渡します。

NTSTATUS 
  DriverEntry( 
    PDRIVER_OBJECT  DriverObject,
    PUNICODE_STRING  RegistryPath
    )
  {
      return PcInitializeAdapterDriver(DriverObject, RegistryPath, MyAddDevice);
  }

PcInitializeAdapterDriver ルーチンは、提供された AddDevice ルーチンをドライバー オブジェクトのドライバー拡張機能にインストールし、PortCls ドライバーの IRP ハンドラーをドライバー オブジェクト自体にインストールします。

次のコードは、ドライバーMyAddDeviceの関数の実装例です。

#define MAX_MINIPORTS 6    // maximum number of miniports
NTSTATUS
  MyAddDevice(
    PDRIVER_OBJECT  DriverObject,
    PDEVICE_OBJECT  PhysicalDeviceObject 
    )
  {
      return PcAddAdapterDevice(DriverObject, PhysicalDeviceObject, MyStartDevice,
                                MAX_MINIPORTS, 0);
  }

この関数は、PortCls 関数 PcAddAdapterDevice を呼び出します。この関数は、指定されたアダプター デバイスを作成し、ドライバーをデバイスに関連付け、アダプター ドライバーのMyStartDevice関数へのポインターを保存します。この関数は、オペレーティング システムがデバイスを起動するときに呼び出されます (デバイスの起動を参照)。 PcAddAdapterDevice ルーチンは、機能デバイス オブジェクト (FDO) を作成し、それをシステムによって提供される物理デバイス オブジェクト (PDO) に関連付けます。 新しい FDO は、PortCls がデバイスに関するコンテキスト情報を保存するために使用する拡張機能を使用して作成されます。 このコンテキストには、MyAddDeviceによって提供される MyStartDevice 関数ポインタが含まれます。

オペレーティング システムは、デバイスに割り当てるリソース (割り込み、DMA チャネル、I/O ポート アドレスなど) を決定した後、デバイスに起動要求 (IRP_MN_START_DEVICE) を送信します。 この要求に応答して、PortCls ドライバーの要求ハンドラーはアダプター ドライバーのMyStartDevice関数を呼び出します。これを次のコード例に示します:

NTSTATUS
  MyStartDevice(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp,
    PRESOURCELIST ResourceList
    )
  {
    ...
  }

要求ハンドラーは、MyStartDeviceデバイス オブジェクトへのポインター、IRP_MN_START_DEVICE 要求、およびリソース リスト (IResourceList を参照) を提供します。 このMyStartDevice関数は、リソース リストを、起動する必要がある各ミニポート ドライバーに必要なリソースに分割します。 次に、関数は各ミニポート ドライバーを開始し、制御を PortCls に返します。これにより、IRP が完了し、制御がオペレーティング システムに戻ります。

ドライバーのスタートアップ コードのその他の例については、Microsoft Windows ドライバー キット (WDK) のサンプル オーディオ アダプター ドライバーを参照してください。