Partilhar via


Ativando e desativando o AutoRun

Há muitas situações em que o AutoRun pode precisar ser desativado temporária ou persistentemente. Por exemplo, o AutoRun pode interferir com a operação de um aplicativo em execução e precisa ser desativado durante a duração. O sistema fornece várias maneiras de desativar o AutoRun.

Suprimindo o AutoRun programaticamente

Há uma variedade de situações em que o AutoRun pode precisar ser suprimido programaticamente. Dois exemplos são:

  • Seu aplicativo tem um programa de instalação que requer que o usuário insira outro disco que pode conter um arquivo Autorun.inf.
  • Durante a operação do seu aplicativo, o usuário pode precisar inserir outro disco que pode conter um arquivo Autorun.inf.

Em ambos os casos, normalmente não quererá iniciar outra aplicação enquanto o original estiver em curso.

Os usuários podem suprimir manualmente o AutoRun mantendo pressionada a tecla SHIFT quando inserem o CD-ROM. No entanto, geralmente é preferível lidar com essa operação programaticamente em vez de depender do usuário.

Com sistemas que têm o Shell versão 4.70 e posterior, o Windows envia uma mensagem "QueryCancelAutoPlay" para a janela de primeiro plano. Seu aplicativo pode responder a essa mensagem para suprimir o AutoRun. Essa abordagem é usada por utilitários do sistema, como a caixa de diálogo Abrir comum para desabilitar o AutoRun.

Os fragmentos de código a seguir ilustram como configurar e manipular essa mensagem. Seu aplicativo deve estar sendo executado na janela de primeiro plano. Primeiro, registre "QueryCancelAutoPlay" como uma mensagem do Windows:

uMessage = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));

A janela do aplicativo deve estar em primeiro plano para receber essa mensagem. O manipulador de mensagens deve retornar TRUE para cancelar o AutoRun e FALSE para habilitá-lo. O fragmento de código a seguir ilustra como usar essa mensagem para desabilitar o AutoRun.

UINT g_uQueryCancelAutoPlay = 0;

LRESULT WndProc(HWND hwnd, UINT uMsg,  WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    ... 
    default: 
        if (!g_uQueryCancelAutoPlay)
        { 
            g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));
        } 
        if (uMsg && uMsg == g_uQueryCancelAutoPlay)
        { 
            return TRUE;       // Cancel AutoRun
        }
    }
}

Se a sua aplicação estiver a usar uma caixa de diálogo e precisar de responder a uma mensagem "QueryCancelAutoPlay", não pode simplesmente devolver TRUE ou FALSE. Em vez disso, chame SetWindowLong com nIndex definido como DWL_MSGRESULT. Defina o parâmetro dwNewLong como TRUE para cancelar o AutoRun e FALSE para habilitá-lo. Por exemplo, o procedimento de caixa de diálogo de exemplo a seguir cancela o AutoRun quando recebe uma mensagem "QueryCancelAutoPlay".

UINT g_uQueryCancelAutoPlay = 0;

BOOL DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    ...
    default: 
        if (!g_uQueryCancelAutoPlay)
        {
            g_uQueryCancelAutoPlay = RegisterWindowMessage(TEXT("QueryCancelAutoPlay"));
        } 
        if (uMsg == g_uQueryCancelAutoPlay) 
        {
            SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);          
            return 1;               
        }
    } 

Usando o Registro para desativar o AutoRun

Há dois valores do Registro que podem ser usados para desabilitar persistentemente o AutoRun: NoDriveAutoRun e NoDriveTypeAutoRun. O primeiro valor desativa o AutoRun para letras de unidade especificadas e o segundo desativa o AutoRun para uma classe de discos. Se qualquer um desses valores estiver definido para desabilitar o AutoRun para um dispositivo específico, ele será desativado.

Observação

Os valores NoDriveAutoRun e NoDriveTypeAutoRun só devem ser modificados pelos administradores do sistema para alterar o valor de todo o sistema para fins de teste ou administrativos. Os aplicativos não devem modificar esses valores, pois não há como restaurá-los de forma confiável para seus valores originais.

 

O valor NoDriveAutoRun desativa o AutoRun para letras de unidade especificadas. É um valor de dados REG_DWORD, encontrado sob a seguinte chave:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

O primeiro bit do valor corresponde à unidade A:, o segundo a B:, e assim por diante. Para desativar o AutoRun para uma ou mais letras de unidade, defina os bits correspondentes. Por exemplo, para desativar as unidades A: e C:, defina NoDriveAutoRun como 0x00000005.

O valor NoDriveTypeAutoRun desativa o AutoRun para uma classe de unidades. É um valor de dados REG_DWORD ou REG_BINARY de 4 bytes, encontrado sob a mesma chave.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

Ao definir os bits do primeiro byte desse valor, diferentes unidades podem ser excluídas do trabalho com o AutoRun.

A tabela a seguir fornece as constantes de bits e a máscara de bits, que podem ser definidas no primeiro byte de NoDriveTypeAutoRun para desativar o AutoRun para um tipo específico de unidade. Tem de reiniciar o Explorador do Windows antes de as alterações entrarem em vigor.

Número de bits Constante de Máscara de Bits Descrição
0x04 DRIVE_REMOVÍVEL O disco pode ser removido da unidade (como um disquete).
0x08 DRIVE_FIXED O disco não pode ser removido da unidade (um disco rígido).
0x10 DRIVE_REMOTE Unidade de rede.
0x20 DRIVE_CDROM CD-ROM disco.
0x40 DRIVE_RAMDISK Disco RAM.

 

AutoRun para outros tipos de mídia de armazenamento

AutoRun destina-se principalmente à distribuição pública de aplicativos em CD-ROM e DVD-ROM, e seu uso é desencorajado para outras mídias de armazenamento. No entanto, muitas vezes é útil habilitar a Execução Automática em outros tipos de mídia de armazenamento removível. Esse recurso é normalmente usado para simplificar a depuração de arquivos AutoRun.inf. O AutoRun só funciona em dispositivos de armazenamento removíveis quando os seguintes critérios são atendidos:

  • O dispositivo deve ter drivers compatíveis com AutoRun. Para ser compatível com AutoRun, um driver deve notificar o sistema de que um disco foi inserido enviando uma mensagem WM_DEVICECHANGE.
  • O diretório raiz da mídia inserida deve conter um arquivo Autorun.inf.
  • O dispositivo não deve ter o AutoRun desativado através do de registro.
  • O aplicativo em primeiro plano não suprimido AutoRun.

Observação

Esse recurso não deve ser usado para distribuir aplicativos em mídia removível. Como a implementação do AutoRun em mídia removível fornece uma maneira fácil de espalhar vírus de computador, os usuários devem desconfiar de qualquer disquete distribuído publicamente que contenha um arquivo Autorun.inf.

 

Normalmente, o AutoRun é iniciado automaticamente, mas também pode ser iniciado manualmente. Se o dispositivo atender aos critérios listados acima, o menu de atalho da letra da unidade incluirá um comando de Reprodução Automática. Para executar o AutoRun manualmente, clique com o botão direito do rato no ícone da unidade e selecione Reprodução Automática no menu de contexto ou clique duas vezes no ícone da unidade. Se os drivers não forem compatíveis com AutoRun, o menu de atalho não terá um item de de Reprodução Automática e a Execução Automática não poderá ser iniciada.

Os drivers compatíveis com AutoRun são fornecidos com algumas unidades de disco removíveis, bem como alguns outros tipos de mídia removível, como placas CompactFlash. O AutoRun também funciona com unidades de rede mapeadas para uma letra de unidade com o Windows Explorer ou montadas com o Console de Gerenciamento Microsoft (MMC). Tal como acontece com o hardware montado, uma unidade de rede montada deve ter um ficheiro Autorun.inf no seu diretório raiz e não deve ser desativada através do registo .