Compartilhar via


Chave do registro RunOnce

Todas as versões do Windows oferecem suporte a uma chave de registro, RunOnce, que pode ser usado para especificar comandos que o sistema executará uma vez e depois excluirá. A criação de chaves de registro RunOnce pode ser feita a partir de um pacote de driver.

Observação

A criação de uma chave de registro RunOnce para qualquer dispositivo que não seja SWENUM somente de software não é compatível com o isolamento do pacote de driver e não pode ser feita a partir de um driver do Windows.

No Windows 8 e no Windows 8.1, as entradas RunOnce para instalação de dispositivos SWENUM somente de software são processadas durante a instalação do dispositivo. Outras entradas RunOnce são adicionadas à chave RunOnce. Elas serão aplicadas na próxima vez que o sistema processar a chave RunOnce. A instalação do dispositivo não força o sistema a processar entradas RunOnce.

No Windows 7 e versões anteriores, imediatamente após a instalação de um dispositivo, o Windows executa o comando armazenado na chave RunOnce e depois remove a chave. Além disso, cada vez que o sistema é iniciado, ele executa o comando armazenado na chave RunOnce e depois remove a chave. Portanto, se você colocar um comando na chave RunOnce, você não poderá prever facilmente quando ele será executado.

Imediatamente após a instalação de um dispositivo, o Windows executa o comando armazenado na chave RunOnce e, em seguida, remove a chave. Além disso, cada vez que o sistema é iniciado, ele executa o comando armazenado na chave RunOnce e depois remove a chave. Portanto, se você colocar um comando na chave RunOnce, você não poderá prever facilmente quando ele será executado.

Para instalações de dispositivos, as chaves de registro RunOnce podem ser criadas usando add-registry-sections, que são especificados por meio de diretivas INF AddReg. Cada add-registry-section tem a seguinte sintaxe:

reg-root, [subkey], [value-entry-name], [flags], [value]

Os valores da raiz do registro (reg-root) e da subchave para a chave do registro RunOnce são os seguintes:

HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"

A cadeia de caracteres value-entry-name é omitida de uma entrada de registro RunOnce. O tipo de entrada, que é indicado pelo valor Flags, deve ser REG_SZ (Flags value of 0x00000000) or REG_EXPAND_SZ (valor Flags de 0x00010000). Para uma entrada do tipo REG_SZ (the default), o valor Flags pode ser omitido.

O parâmetro de valor em uma chave RunOnce especifica o comando a ser executado. Este parâmetro é uma cadeia de caracteres entre aspas que tem o seguinte formato:

Rundll32[.exe] DllName,EntryPoint[Arguments]

Por padrão, uma chave RunOnce é excluída após a execução do comando especificado. Você pode prefixar um parâmetro de valor de chave RunOnce com um ponto de exclamação (!) para adiar a exclusão da chave até que o comando seja executado com sucesso. Sem o prefixo do ponto de exclamação, se o comando especificado falhar, a chave RunOnce ainda será excluída e o comando não será executado na próxima vez que o sistema for iniciado.

Além disso, por padrão, as chaves RunOnce são ignoradas quando o sistema é iniciado no modo de segurança. O parâmetro de valor das chaves RunOnce pode ser prefixado com um asterisco (*) para forçar a execução do comando mesmo no modo de segurança.

Considere as seguintes diretrizes ao criar uma entrada de cadeia de caracteres de valor:

  • Rundll32 pode aparecer com ou sem a extensão do nome do arquivo .exe.

  • DllName é o caminho completo de uma DLL ou imagem executável. Com exceção da vírgula final necessária, a expressão não deve conter nenhuma vírgula. Se nenhuma extensão de nome de arquivo for fornecida, a extensão padrão será .dll.

  • EntryPoint é o nome do ponto de entrada dentro da DLL indicado por DllName.

  • Arguments é uma subcadeia de caracteres opcional que contém quaisquer argumentos que devem ser passados ​​para a DLL especificada.

  • Exatamente um espaço deve separar a cadeia de caracteres EntryPoint da subcadeia de caracteres Arguments.

O exemplo de código a seguir mostra a entrada add-registry-section que armazena um comando e seus argumentos na chaveRunOnce:

;; WDMAud swenum install

HKLM,%RunOnce%,"WDM_WDMAUD",,\
"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install"

[Strings]
RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
WDM_WDMAUD.DeviceId = "{CD171DE3-69E5-11D2-B56D-0000F8754380}"
KSNAME_Filter = "{9B365890-165F-11D0-A195-0020AFD156E4}"
KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}"

As seguintes regras se aplicam quando você usa chaves de registro RunOnce para instalações de dispositivos:

  • Essas chaves de registro devem ser usadas somente para instalações de dispositivos somente de software enumerados pelo SWENUM, o enumerador de dispositivos de software.

  • As chaves RunOnce devem consistir apenas em chamadas para Rundll32.exe. Caso contrário, o WHQL não assinará digitalmente o pacote do driver.

  • O código a ser executado não deve solicitar a entrada de usuário.

  • As instalações no servidor são executadas em um contexto de sistema. Por esse motivo, você deve ter certeza de que o código a ser executado não contém vulnerabilidades de segurança e que as permissões de arquivo impedem que o código seja modificado maliciosamente.

  • A partir do Windows Vista, o sistema não executará os comandos especificados pelas chaves RunOnce se um usuário sem privilégios de administrador estiver conectado ao sistema. Isso pode levar a instalações incompletas ou corrompidas após a reinicialização do sistema.

    Antes que o aplicativo de instalação do dispositivo crie as entradas RunOnce, ele informa ao usuário atual que um usuário com privilégios de administrador deve fazer logon após a reinicialização do sistema.

    Para obter mais informações, consulte Desenvolvimento de aplicativos que rodam no logon no Windows Vista.