设备安装期间的自动配置

下图显示了在安装设备时自动配置的数据流。

diagram illustrating the data flow in autoconfiguration when a device is installed.

  1. 安装打印机后,后台处理程序通过在调用中调用 DrvPrinterEvent 并传递PRINTER_EVENT_INITIALIZE来初始化驱动程序。

  2. 驱动程序使用 bidi 通信接口 获取感兴趣的数据,包括可安装选项的值,例如 \Printer.Configuration.DuplexUnit:Installed 和 \Printer.Configuration.HardDisk:Installed。

  3. bidi 通信接口查询端口监视器以获取这些属性的值。 端口监视器可能在其缓存中请求了一些数据。 对于以下步骤中的说明性目的,假定 \Printer.Configuration.HardDisk:Installed 的值位于端口监视器的缓存中,但 \Printer.Configuration.DuplexUnit:Installed 的值不是。

  4. 如果端口监视器具有缓存,并且已保存其中一个或多个请求的值,则端口监视器会将这些值返回到 bidi 通信接口。 对于不在其缓存中的任何值,端口监视器将返回ERROR_NO_DATA。 请注意,如果端口监视器实现缓存但缓存为空,则 bidi 查询可能会失败。 为防止此问题,端口监视器应在填充其缓存时通知 bidi 通信接口。

  5. bidi 通信接口将它从端口监视器接收的信息传递给驱动程序。 如果从 bidi 通信接口到端口监视器的调用会导致出于任何原因而失败,驱动程序应为这些属性设置默认值。 端口监视器收到有关请求属性的信息后,应向 bidi 通信接口发送包含此信息的通知。

    驱动程序将注册表更新为 \Printer.Configuration.HardDisk:Installed (从端口监视器的缓存) 获取的值,以及 \Printer.Configuration.DuplexUnit:Installed 的默认值。

  6. 端口监视器查询设备以获取这两个值,包括缓存 (\Printer.Configuration.HardDisk:Installed) 的值。

  7. 设备将查询属性的值发送到端口监视器。 对于缓存中尚不存在其值或其值不同于缓存中的任何属性,端口监视器在其缓存中放置新值。

  8. 端口监视器向后台处理程序发送一条通知,其中包含以前不在缓存中或已更改的任何值。 在此示例中,端口监视器向后台处理程序发送有关 \Printer.Configuration.DuplexUnit:Installed 的新值的通知。 请注意,如果缓存的值与从设备接收的新值相同,端口监视器不会向后台处理程序发送通知。

  9. 后台处理程序通过调用 DrvPrinterEvent来响应来自端口监视器的通知,除了调用中所有已更改值的信息外,还会传递PRINTER_EVENT_CONFIGURATION_UPDATE。 此操作有两个用途:通知驱动程序其值首次放置在缓存中的任何属性的值,或者其值已更改 (\Printer.Configuration.DuplexUnit:Installed,在本示例中) ;更新注册表。 对于每个打印机,后台处理程序将序列化其调用 DrvPrinterEvent,以便驱动程序不需要线程安全。

    由于设备信息存储在注册表中,因此驱动程序可以满足对更新 UI 或设备功能信息的调用,而无需直接与物理设备通信。 驱动程序可以确定注册表中存储的信息正确,因为更改通知会触发驱动程序来查询设备并更新设备配置状态。

  10. 驱动程序根据最新配置更新 UI。

    驱动程序可以确定设备安装过程中发生更改的时间,因为通知消息携带更改的值。 但是,如果通知太大而无法通过通知机制发送,则通知将包含一个或多个 ReducedSchema 实例,其中每个实例指示设备特征已更改,但没有任何新值的详细信息。