设备安装期间的自动配置
下图显示了安装设备时自动配置中的数据流。
安装打印机后,后台处理程序通过调用
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 实例,其中每个实例都指示设备特征已更改,但没有任何有关其新值的详细信息。