開始シーケンス
アダプタードライバーはカーネルモードドライバーサービスとしてインストールされるため、オペレーティングシステムはシステム起動時にアダプタードライバーを読み込み、ドライバーの 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) のオーディオアダプタードライバーのサンプルを参照してください。