多くのドライバーは、 IoCreateDevice を呼び出すことによって、複数の種類のデバイス オブジェクトを作成します。 ドライバーによっては、ドライバーが FDO を作成する前であっても、ドライバーと通信するアプリケーションを許可する DriverEntry ルーチンでコントロール デバイス オブジェクトを作成します。 たとえば、ファイル システム ドライバーは、 IoRegisterFileSystem を使用してファイル システムとして自身を登録するときに、ファイル システムの通知を処理するデバイス オブジェクトを作成します。
ドライバーは、作成するすべてのデバイス オブジェクトに対する IRP_MJ_CREATE 要求の準備ができている必要があります。 成功状態で要求を完了した後、ドライバーは、作成されたファイル オブジェクトでユーザーがアクセスできる I/O 要求を受け取る必要があります。 そのため、複数のデバイス オブジェクトを作成するすべてのドライバーは、各 I/O 要求で指定されているデバイス オブジェクトを確認する必要があります。
たとえば、ドライバーが DriverEntry でコントロール デバイス オブジェクト全体を作成し、その AddDevice ルーチンに別のデバイス オブジェクトのセットを作成するとします。 AddDevice ルーチンは、下位レベルのドライバーに関する情報を使用してデバイス拡張機能を初期化しますが、コントロール デバイス オブジェクトにはこの情報が含まれていないとします。 この場合、すべてのディスパッチ ルーチンは、受信した各デバイス オブジェクトを確認するように注意する必要があります。 そうしないと、デバイス拡張機能情報を使用しようとしたときにドライバーがクラッシュする可能性があります。