下图显示了安装设备时自动配置的数据流。
安装打印机后,后台处理程序通过在调用中调用
DrvPrinterEvent并传递PRINTER_EVENT_INITIALIZE来初始化驱动程序。驱动程序使用 bidi 通信接口 获取感兴趣的数据,包括 \Printer.Configuration.DuplexUnit:Installed 和 \Printer.Configuration.HardDisk:Installed 等可安装选项的值。
bidi 通信接口查询端口监视器以获取这些属性的值。 端口监视器可能在其缓存中已有部分请求的数据。 为了说明目的,在以下步骤中,假定 \Printer.Configuration.HardDisk:Installed 的值位于端口监视器的缓存中,但 \Printer.Configuration.DuplexUnit:Installed 的值不是。
如果端口监视器具有缓存,并且已保存其中一个或多个请求的值,则端口监视器会将这些值返回到 bidi 通信接口。 对于缓存中未包含的任何值,端口监视器将返回ERROR_NO_DATA。 请注意,如果端口监视器实现缓存但缓存为空,则 bidi 查询可能会失败。 为防止此问题,端口监视器应在填充其缓存时通知 bidi 通信接口。
bidi 通信接口将它从端口监视器接收的信息传递给驱动程序。 如果从 bidi 通信接口到端口监视器的调用因任何原因导致失败,驱动程序应为这些属性设置默认值。 一旦端口监视器收到有关请求的属性的信息,它应向 bidi 通信接口发送包含此信息的通知。
驱动程序使用 \Printer.Configuration.HardDisk:Installed 的值(从端口监视器的缓存获取)和 \Printer.Configuration.DuplexUnit:Installed 的默认值更新注册表。
端口监视器查询设备中的这两个值,包括缓存的值(\Printer.Configuration.HardDisk:Installed)。
设备将查询属性的值发送到端口监视器。 对于缓存中尚不存在其值或其值与缓存中的值不同的任何属性,端口监视器将新值置于其缓存中。
端口监视器向后台处理程序发送一条通知,其中包含以前不在缓存中或更改的任何值。 在此示例中,端口监视器向后台处理程序发送有关 \Printer.Configuration.DuplexUnit:Installed 的新值的通知。 请注意,如果缓存的值与从设备接收的新值相同,端口监视器不会向后台处理程序发送通知。
后台处理程序通过调用
DrvPrinterEvent响应来自端口监视器的通知,并在此调用中传递PRINTER_EVENT_CONFIGURATION_UPDATE,以及所有已更改值的信息。 这个操作有两个目的:一是通知驱动程序那些首次放入缓存或其值已经改变的属性的值(例如:\Printer.Configuration.DuplexUnit:Installed),二是更新注册表。 对于每台打印机,后台打印程序会将对DrvPrinterEvent的调用进行序列化,这样驱动程序就不需要是线程安全的。由于设备信息存储在注册表中,因此驱动程序可以满足更新 UI 或设备功能信息的调用,而无需直接与物理设备通信。 驱动程序可以确定注册表中存储的信息正确,因为更改通知会触发驱动程序查询设备并更新设备配置状态。
驱动程序根据最新配置更新 UI。
驱动程序可以确定设备安装过程中发生更改的时间,因为通知消息携带更改的值。 但是,如果通知太大而无法通过通知机制发送,通知将具有一个或多个 ReducedSchema 实例,其中每个实例都指示设备特征已更改,但没有任何新值的详细信息。