デバイス オブジェクトの作成

モノリシック ドライバーは、I/O 要求を処理する物理、論理、または仮想デバイスごとにデバイス オブジェクトを作成する必要があります。 デバイスのデバイス オブジェクトを作成しないドライバーは、デバイスの IRP を受信しません。

一部のテクノロジ領域では、クラス ドライバーまたはポート ドライバーに関連付けられているミニドライバーは、独自のデバイス オブジェクトを作成する必要はありません。 代わりに、クラスまたはポート ドライバーが、デバイス オブジェクトを作成し、デバイスのすべての IRP を受信します。 その後、クラス ドライバーまたはポート ドライバーは、ドライバー固有のメソッドを使用して、ミニドライバーに I/O 要求を渡します。 お使いのテクノロジ領域のドキュメントを参照して、ドライバーの代わりにデバイス オブジェクトを作成するクラス ドライバーまたはポート ドライバーが Microsoft によって提供されているかどうかを確認してください。

ドライバーは、IoCreateDevice または IoCreateDeviceSecure を呼び出して、デバイス オブジェクトを作成します。 使用すべきルーチンの判断基準については、次のセクションを参照してください。

WDM ファンクション ドライバーとフィルター ドライバーのデバイス オブジェクトの作成

WDM バス ドライバーのデバイス オブジェクトの作成

非 WDM バス ドライバーのデバイス オブジェクトの作成

ドライバーは、デバイス オブジェクトを作成するときに、IoCreateDevice または IoCreateDeviceSecure に次の情報を提供します。

  • デバイスのデバイス拡張のサイズ。 デバイス拡張は、ドライバーがデバイス固有のストレージに使用できるシステム割り当てストレージです。 詳細については、「デバイス拡張」を参照してください。

  • デバイス オブジェクトによって表される DeviceType を示すシステム定義定数。 詳細については「デバイスの種類の指定」を参照してください。

  • デバイスのデバイス特性を示す 1 つ以上のシステム定義定数。 詳細については「デバイスの特性の指定」を参照してください。

  • デバイス オブジェクトの Flags のビットを DO_EXCLUSIVE で設定するかどうかを指定する、Exclusive という名前のブール値。これは、ドライバーがビデオ、シリアル、並列、サウンド デバイスなどの排他的デバイスをサービスすることを示します。 WDM ドライバーは、ExclusiveFALSE に設定する必要があります。 詳細については、「デバイス オブジェクトへの排他アクセスの指定」を参照してください。

  • ドライバーのドライバー オブジェクトへのポインター。 WDM 関数またはフィルター ドライバーは、その AddDevice ルーチンへのパラメーターとして、そのドライバー オブジェクトへのポインターを受け取ります。 すべてのドライバーは、DriverEntry ルーチンでドライバー オブジェクトへのポインターを受け取ります。 システムはこのポインターを使用して、ドライバーをデバイス オブジェクトに関連付けます。

  • デバイス名を指定する null 終端 Unicode 文字列 (DeviceName) へのポインター (省略可能)。 バス ドライバー以外の WDM ドライバーは、デバイス名を指定しないでください。指定した場合、PnP マネージャーのセキュリティ機能がバイパスされます。 詳細については、「名前付きデバイス オブジェクト」を参照してください。

IoCreateDevice または IoCreateDeviceSecure の呼び出しが成功すると、I/O マネージャーは、デバイス オブジェクト自体と、デバイス オブジェクトに関連付けられている他のすべてのデータ構造体 (デバイス拡張を含む) 用のストレージを提供します。このデータ構造体はゼロで初期化されます。

WDM ファンクション ドライバーとフィルター ドライバーのデバイス オブジェクトの作成

バス ドライバー以外の WDM ドライバーは、IoCreateDevice を呼び出してデバイス オブジェクトを作成します。 ほとんどの WDM ドライバーは、AddDevice ルーチン内からデバイス オブジェクトを作成します。 ドライブ レイアウト IOCTL に応答する必要があるディスク ドライバーなど、一部のドライバーは、ディスパッチ ルーチンから IoCreateDevice を呼び出します。

Windows Driver Kit (WDK) ドキュメント状態のデバイスの種類固有のセクションに別段の記述がない限り、ドライバーは、その AddDevice ルーチンでそのデバイス オブジェクトを作成する必要があります。 詳細については、「AddDevice ルーチンの記述」を参照してください。

WDM バス ドライバーのデバイス オブジェクトの作成

WDM バス ドライバーは、リレーションシップの種類が BusRelations の場合、IRP_MN_QUERY_DEVICE_RELATIONS 要求に応答して新しいデバイスを列挙するときに PDO を作成します。

バス ドライバーがデバイス オブジェクトを作成する場合に、IoCreateDevice を呼び出すか、IoCreateDeviceSecure を呼び出すかは、次の規則によって決まります。

  • デバイスが raw モードで使用できる場合は、IoCreateDeviceSecure を呼び出す必要があります。

  • デバイスが raw モードに対応していない場合、バス ドライバーは IoCreateDevice または IoCreateDeviceSecure を使用できます。 IoCreateDevice は、バス上のデバイスの既定のシステム セキュリティが適切な 場合に使用できます。IoCreateDeviceSecure を使用して、より厳格なセキュリティ記述子を指定できます。 詳細については、「デバイス アクセスの制御」を参照してください。

非 WDM バス ドライバーのデバイス オブジェクトの作成

WDM 以外のドライバーでは、IoCreateDevice を使用して名前のないデバイス オブジェクトを作成し、IoCreateDeviceSecure を使用して名前付きデバイス オブジェクトを作成します。 WDM 以外のドライバーの名前のないデバイス オブジェクトはユーザー モードからアクセスできないため、ドライバーは通常、少なくとも 1 つの名前付きオブジェクトを作成する必要があります。