Configuração automática durante a instalação do dispositivo
A figura a seguir mostra o fluxo de dados na configuração automática quando um dispositivo é instalado.
Quando uma impressora é instalada, o spooler inicializa o driver chamando
DrvPrinterEvent
e passando PRINTER_EVENT_INITIALIZE na chamada.O driver usa interfaces de comunicação bidi para obter os dados de interesse para ele, incluindo valores para opções instaláveis, como \Printer.Configuration.DuplexUnit:Installed e \Printer.Configuration.HardDisk:Installed.
A interface de comunicação bidi consulta o monitor de porta em busca de valores desses atributos. O monitor de porta pode ter alguns dos dados solicitados em seu cache. Para fins ilustrativos nas etapas a seguir, suponha que o valor de \Printer.Configuration.HardDisk:Installed esteja no cache do monitor de porta, mas o valor de \Printer.Configuration.DuplexUnit:Installed não está.
Se o monitor de porta tiver um cache e tiver salvo um ou mais dos valores solicitados nele, o monitor de porta retornará esses valores para a interface de comunicação bidi. Para quaisquer valores que não estão em seu cache, o monitor de porta retorna ERROR_NO_DATA. Observe que uma consulta bidi pode falhar se o monitor de porta implementar um cache, mas o cache estiver vazio. Para evitar esse problema, o monitor de porta deve notificar a interface de comunicação bidi quando seu cache for preenchido.
A interface de comunicação bidi passa as informações recebidas do monitor de porta para o driver. Se a chamada da interface de comunicação bidi para o monitor de porta resultar em falha por qualquer motivo, o driver deverá definir valores padrão para esses atributos. Assim que o monitor da porta receber informações sobre os atributos solicitados, ele deverá enviar uma notificação contendo essas informações para a interface de comunicação bidi.
O driver atualiza o registro com o valor de \Printer.Configuration.HardDisk:Installed (obtido do cache do monitor de porta) e o valor padrão para \Printer.Configuration.DuplexUnit:Installed.
O monitor de porta consulta o dispositivo em busca de ambos os valores, incluindo o valor que foi armazenado em cache (\Printer.Configuration.HardDisk:Installed).
O dispositivo envia seus valores para os atributos consultados para o monitor de porta. Para qualquer atributo cujo valor ainda não estava presente no cache ou cujo valor difere do do cache, o monitor de porta coloca o novo valor em seu cache.
O monitor de porta envia ao spooler uma notificação contendo todos os valores que anteriormente não estavam no cache ou que foram alterados. Neste exemplo, o monitor de porta envia uma notificação ao spooler sobre o novo valor de \Printer.Configuration.DuplexUnit:Installed. Observe que, se o valor armazenado em cache for o mesmo que o novo valor recebido do dispositivo, o monitor de porta não enviará uma notificação para o spooler.
O spooler responde à notificação do monitor de porta chamando
DrvPrinterEvent
, passando PRINTER_EVENT_CONFIGURATION_UPDATE além de informações sobre todos os valores alterados na chamada. Essa ação serve a duas finalidades: notificar o driver do valor de qualquer atributo cujo valor foi colocado no cache pela primeira vez ou cujo valor foi alterado (\Printer.Configuration.DuplexUnit:Installed, neste exemplo); para atualizar o registro. Para cada impressora, o spooler serializa suas chamadas para , paraDrvPrinterEvent
que o driver não precise ser thread-safe.Como as informações do dispositivo são armazenadas no registro, o driver pode atender a chamadas para atualizar informações de funcionalidades da interface do usuário ou do dispositivo sem a necessidade de se comunicar diretamente com o dispositivo físico. O driver pode ter certeza de que as informações armazenadas no registro estão corretas, pois as notificações de alteração disparam o driver para consultar o dispositivo e atualizar o estado de configuração do dispositivo.
O driver atualiza a interface do usuário de acordo com a configuração mais recente.
O driver pode determinar quando ocorreu uma alteração durante a instalação do dispositivo, pois a mensagem de notificação carrega o valor alterado. No entanto, se a notificação for muito grande para ser enviada por meio do mecanismo de notificação, a notificação terá uma ou mais instâncias do ReducedSchema, cada uma indicando que uma característica do dispositivo foi alterada, mas sem detalhes de seu novo valor.