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