Автоматическая настройка во время установки устройства
На следующем рисунке показан поток данных при автоматической настройке при установке устройства.
При установке принтера диспетчер очереди очереди инициализирует драйвер, вызывая
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
, чтобы драйвер не должен быть потокобезопасным.Так как сведения об устройстве хранятся в реестре, драйвер может выполнять вызовы для обновления сведений о пользовательском интерфейсе или возможностях устройства без необходимости напрямую взаимодействовать с физическим устройством. Драйвер может быть уверен, что сведения, хранящиеся в реестре, верны, так как уведомления об изменениях активируют драйвер для запроса устройства и обновления состояния конфигурации устройства.
Драйвер обновляет пользовательский интерфейс в соответствии с последней конфигурацией.
Драйвер может определить, когда произошло изменение во время установки устройства, так как сообщение уведомления содержит измененное значение. Однако если уведомление слишком велико для отправки с помощью механизма уведомлений, оно будет содержать один или несколько экземпляров ReducedSchema, каждый из которых указывает на изменение характеристики устройства, но без каких-либо сведений о его новом значении.