在裝置安裝期間自動設定
下圖顯示安裝裝置時,自動設定中的資料流程。
安裝印表機時,多工緩衝處理器會在呼叫中呼叫
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 實例,其中每一個實例都表示裝置特性已變更,但沒有其新值的任何詳細資料。