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.
- Suprimir o AutoRun programaticamente
- Usando o Registo para Desabilitar o AutoRun
- AutoRun para outros tipos de suportes de armazenamento
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 .