開始シーケンス

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

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

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 がデバイスに関するコンテキスト情報を格納するために使用する拡張機能を使用して作成されます。 このコンテキストには、 MyStartDevice によって MyAddDevice 提供される関数ポインターが含まれています。

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

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

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

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