Usando o pool de dispositivos em drivers UMDF
User-Mode As versões 1.11 e 2.0 do UMDF (Driver Framework)
Se o driver do UMDF (User-Mode Driver Framework) foi criado com a versão 1.11 ou 2.0 e está em execução em Windows 8 ou posterior, a estrutura cria uma única instância do Wudfhost que pode hospedar várias pilhas de dispositivos. Essa técnica é chamada de pool de dispositivos. O main benefício do pool de dispositivos é o consumo de memória reduzido em um ambiente com vários dispositivos UMDF.
Se um dispositivo em pool falhar, a estrutura encerrará a instância do Wudfhost e tentará reiniciar todos os dispositivos que estavam anteriormente no pool. Se o dispositivo falhar novamente enquanto estiver em pool, a estrutura criará um processo Wudfhost separado para o dispositivo e tentará iniciar o dispositivo novamente.
Se o dispositivo falhar no processo de host separado, a estrutura tentará reiniciá-lo até cinco vezes. A estrutura redefine a contagem de erros do dispositivo para uma quando trinta minutos se passaram desde a última falha.
Se o sistema for reinicializado, a estrutura repoolá dispositivos, exceto aqueles que falharam durante a execução em um processo separado.
Para desabilitar o pool de dispositivos para um dispositivo específico, use a diretiva UmdfHostProcessSharing na seção DDInstall específica do WDF do INF. Para obter informações sobre UmdfHostProcessSharing, consulte Especificando diretivas do WDF em arquivos INF.
Se o driver usar E/S direta, você deverá definir UmdfHostProcessSharing como ProcessSharingDisabled. Caso contrário, o driver poderá falhar ao iniciar. Se WdfDeviceIoBufferedOrDirect estiver selecionado e o dispositivo estiver em pool, a estrutura alterará o método de acesso de buffer para E/S em buffer. Se WdfDeviceIoBufferedOrDirect estiver selecionado e o dispositivo não estiver em pool, a estrutura alterará o método de acesso de buffer para E/S direta.
Para selecionar um método de acesso de buffer, seu driver deve chamar o método IWDFDeviceInitialize2::SetIoTypePreference de sua função de retorno de chamada IDriverEntry::OnDeviceAdd . Para obter informações sobre métodos de acesso, consulte Acessando buffers de dados em drivers de UMDF-Based.
Versões 1.9 e anteriores do UMDF
Se o driver tiver sido criado com UMDF versão 1.9 ou anterior, a estrutura criará uma instância separada do processo de host (Wudfhost) para cada pilha de dispositivos.
Se o dispositivo não for iniciado, a estrutura tentará reiniciá-lo até cinco vezes. A estrutura redefine a contagem de erros do dispositivo para uma quando trinta minutos se passaram desde a última falha.
Em um ambiente não em pool, se várias pilhas de dispositivos compartilharem o mesmo driver UMDF:
- Cada pilha de dispositivo é carregada em um processo wudfHost separado.
- A estrutura chama os métodos IDriverEntry::OnInitialize e IDriverEntry::OnDeinitialize do driver uma vez para cada pilha de dispositivos.
- A estrutura chama o método IDriverEntry::OnDeviceAdd do driver uma vez para cada pilha de dispositivos. Cada objeto de dispositivo está associado a um objeto de driver separado.
Em um ambiente em pool, se várias pilhas de dispositivos compartilharem o mesmo driver de modo de usuário:
- Cada pilha de dispositivo é carregada no mesmo processo WudfHost.
- A estrutura chama os métodos IDriverEntry::OnInitialize e IDriverEntry::OnDeinitialize do driver apenas uma vez.
- A estrutura chama o método IDriverEntry::OnDeviceAdd do driver uma vez para cada pilha de dispositivos. Cada objeto de dispositivo está associado ao mesmo objeto de driver.
Como há apenas um objeto driver em uma configuração em pool, o driver não deve armazenar nenhum contexto por dispositivo em variáveis globais ou em objetos compartilhados entre os dispositivos, como o objeto de retorno de chamada do driver. Em vez disso, o driver deve armazenar o contexto por dispositivo em um objeto que não é compartilhado entre as pilhas de dispositivo, como o objeto de retorno de chamada do dispositivo do driver.