Partilhar via


Gravando instaladores de classe e Co-Installers

Observação

Os recursos descritos nesta seção não têm suporte em pacotes de driver universal ou móvel. Consulte Usando um arquivo INF universal.

Esta seção contém as diretrizes que você deve seguir ao escrever um co-instalador:

Exibindo uma interface do usuário

Salvando o estado de instalação do dispositivo

Carregando arquivos executáveis ou DLL

Iniciando outros processos ou serviços

Para obter mais informações sobre como escrever um co-instalador, consulte Escrevendo um co-instalador.

Exibindo uma interface do usuário

A instalação do dispositivo é executada principalmente em um serviço de sistema (nãointerativo). Portanto, um usuário não pode ver ou responder a nenhuma interface do usuário que apareça neste contexto. Qualquer caixa de diálogo fornecida no co-instalador durante o processamento de um código DIF (função de instalação do dispositivo) faz com que a instalação do dispositivo pare de responder.

Na maioria dos casos, os co-instaladores não devem interagir com o usuário, exceto durante o processamento de uma ação de conclusão da instalação. As ações de conclusão de instalação são executadas em um contexto interativo.

Nota Os co-instaladores não devem falhar em um código DIF com ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION porque isso faz com que a instalação do dispositivo falhe. Se a instalação do dispositivo exigir interação do usuário, os co-instaladores deverão dar suporte a ações de conclusão de instalação.

Salvando o estado de instalação do dispositivo

Não salve o estado de instalação do dispositivo na DLL (biblioteca de vínculo dinâmico ) do co-instalador . Como o Windows geralmente descarrega a DLL depois que um código DIF é manipulado pelo instalador, todas as informações de estado salvas na DLL não persistiriam.

Para preservar com segurança o estado do instalador de dispositivo, os instaladores de classe ou os co-instaladores devem salvar as informações de estado como propriedades dentro da chave de driver do dispositivo no registro. Para fazer isso, execute estas etapas:

  1. Para recuperar um identificador do Registro para a chave de driver de uma instância de dispositivo, use SetupDiOpenDevRegKey com o parâmetro KeyType definido como DIREG_DRV.

  2. Use SetupDiGetDevicePropertyKeys (para recuperar todas as chaves de propriedade de uma instância do dispositivo) ou SetupDiGetDeviceProperty (para recuperar uma chave de propriedade de instância de dispositivo especificada).

  3. Use SetupDiSetDeviceProperty para salvar a chave de propriedade da instância do dispositivo.

Carregando arquivos executáveis ou DLL

Se o co-instalador tentar carregar um arquivo executável não assinado ou uma DLL em uma plataforma windows de 64 bits, os sistemas operacionais impedirão que ele seja carregado nesse ambiente seguro.

Para carregar com segurança um arquivo executável ou DLL por um instalador de classe ou co-instalador, é altamente recomendável que o arquivo executável ou a DLL esteja incluído em seu pacote de driver assinado digitalmente. Para obter mais informações sobre como assinar pacotes de driver, consulte Assinatura de driver.

Nota Os instaladores de classe e os co-instaladores não devem carregar módulos de DLL por chamadas de função explícitas, como LoadLibrary ou criando dependências de link.

Iniciando outros processos ou serviços

Durante a instalação do dispositivo, o Windows não pode acompanhar processos adicionais e não consegue determinar o que está fazendo ou quando terminar. Por exemplo, o Windows pode iniciar ou parar o dispositivo ou iniciar uma reinicialização do sistema enquanto o processo está executando uma ação crítica.

Na maioria dos casos, os co-instaladores não devem iniciar outros processos ou serviços. No entanto, os instaladores podem iniciar outros processos com segurança chamando CreateProcess de uma função ou caixa de diálogo exibida por meio de uma ação de conclusão de instalação. O instalador não deve permitir que o usuário continue na caixa de diálogo ou procedimento até que o processo criado seja encerrado.