许多驱动程序通过调用 IoCreateDevice 创建多个设备对象。 某些驱动程序在其 DriverEntry 例程中创建控制设备对象,以允许应用程序与驱动程序通信,甚至在驱动程序创建 FDO 之前也是如此。 例如,文件系统驱动程序在将自己注册为 IoRegisterFileSystem 的文件系统时创建设备对象来处理文件系统通知。
驱动程序(driver)应为其创建的任何设备对象准备好 IRP_MJ_CREATE 请求。 在完成具有成功状态的请求后,驱动程序应该会在创建的文件对象上接收任何用户可访问的 I/O 请求。 因此,任何创建多个设备对象的驱动程序都必须检查每个 I/O 请求指定的设备对象。
例如,假设驱动程序在 DriverEntry 中创建整体控制设备对象,然后在其 AddDevice 例程中创建另一组设备对象。 假设 AddDevice 例程使用有关较低级别的驱动程序的信息初始化设备扩展,但控制设备对象不包含此信息。 在这种情况下,所有调度例程都必须小心检查它们接收的每个设备对象。 否则,在尝试使用设备扩展信息时,驱动程序可能会崩溃。