Compartir a través de


Habilitar y deshabilitar la ejecución automática

Hay muchas situaciones en las que es posible que la ejecución automática tenga que estar deshabilitada temporalmente o persistentemente. Por ejemplo, La ejecución automática podría interferir con el funcionamiento de una aplicación en ejecución y debe deshabilitarse durante el tiempo. El sistema proporciona varias maneras de deshabilitar autoejecutar.

Suprimir autoejecutación mediante programación

Hay una variedad de situaciones en las que es posible que sea necesario suprimir autoejecutar mediante programación. Dos ejemplos son:

  • La aplicación tiene un programa de instalación que requiere que el usuario inserte otro disco que pueda contener un archivo Autorun.inf.
  • Durante el funcionamiento de la aplicación, es posible que el usuario tenga que insertar otro disco que pueda contener un archivo Autorun.inf.

En cualquier caso, normalmente no querrá iniciar otra aplicación mientras el original está en curso.

Los usuarios pueden suprimir manualmente la ejecución automática manteniendo presionada la tecla MAYÚS cuando insertan el CD-ROM. Sin embargo, normalmente es preferible controlar esta operación mediante programación en lugar de depender del usuario.

Con los sistemas que tienen shell versión 4.70 y posteriores, Windows envía un mensaje "QueryCancelAutoPlay" a la ventana en primer plano. La aplicación puede responder a este mensaje para suprimir autoejecutar. Este enfoque lo usan las utilidades del sistema, como el cuadro de diálogo Abrir común para deshabilitar autoejecutar.

Los fragmentos de código siguientes muestran cómo configurar y controlar este mensaje. La aplicación debe ejecutarse en la ventana en primer plano. En primer lugar, registre "QueryCancelAutoPlay" como mensaje de Windows:

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

La ventana de la aplicación debe estar en primer plano para recibir este mensaje. El controlador de mensajes debe devolver TRUE para cancelar autoejecutar y FALSE para habilitarlo. En el fragmento de código siguiente se muestra cómo usar este mensaje para deshabilitar autoejecutar.

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
        }
    }
}

Si la aplicación usa un cuadro de diálogo y necesita responder a un mensaje "QueryCancelAutoPlay", no puede devolver simplemente TRUE o FALSE. En su lugar, llame a SetWindowLong con nIndex establecido en DWL_MSGRESULT. Establezca el parámetro dwNewLong en TRUE para cancelar autoejecutar y FALSE para habilitarlo. Por ejemplo, el siguiente procedimiento de cuadro de diálogo de ejemplo cancela la ejecución automática cuando recibe un mensaje "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;               
        }
    } 

Uso del Registro para deshabilitar la ejecución automática

Hay dos valores del Registro que se pueden usar para deshabilitar de forma persistente AutoRun: NoDriveAutoRun y NoDriveTypeAutoRun. El primer valor deshabilita AutoRun para las letras de unidad especificadas y el segundo deshabilita AutoRun para una clase de unidades. Si alguno de estos valores se establece para deshabilitar autoejecutar para un dispositivo determinado, se deshabilitará.

Nota:

Los valores NoDriveAutoRun y NoDriveTypeAutoRun solo deben modificarse por los administradores del sistema para cambiar el valor de todo el sistema con fines administrativos o de prueba. Las aplicaciones no deben modificar estos valores, ya que no hay ninguna manera de restaurarlos de forma confiable a sus valores originales.

 

El valor NoDriveAutoRun deshabilita autoejecutar para las letras de unidad especificadas. Se trata de un valor de datos REG_DWORD, que se encuentra en la siguiente clave:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

El primer bit del valor corresponde a la unidad A:, la segunda a B:, etc. Para deshabilitar autoejecutar para una o varias letras de unidad, establezca los bits correspondientes. Por ejemplo, para deshabilitar las unidades A: y C: , establezca NoDriveAutoRun en 0x00000005.

El valor NoDriveTypeAutoRun deshabilita AutoRun para una clase de unidades. Se trata de un valor de datos de REG_BINARY de REG_DWORD o 4 bytes, que se encuentra en la misma clave.

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Policies
                  Explorer

Al establecer los bits del primer byte de este valor, se pueden excluir diferentes unidades de trabajo con AutoRun.

En la tabla siguiente se proporcionan los bits y las constantes de máscara de bits, que se pueden establecer en el primer byte de NoDriveTypeAutoRun para deshabilitar AutoRun para un tipo de unidad determinado. Debe reiniciar el Explorador de Windows antes de que los cambios surtan efecto.

Número de bits Constante de máscara de bits Descripción
0x04 DRIVE_REMOVEABLE El disco se puede quitar de la unidad (por ejemplo, un disquete).
0x08 DRIVE_FIXED No se puede quitar el disco de la unidad (un disco duro).
0x10 DRIVE_REMOTE Unidad de red.
0x20 DRIVE_CDROM Unidad de CD-ROM.
0x40 DRIVE_RAMDISK Disco RAM.

 

Autoejecutar para otros tipos de medios de almacenamiento

AutoRun está pensado principalmente para la distribución pública de aplicaciones en CD-ROM y DVD-ROM, y su uso no se recomienda para otros medios de almacenamiento. Sin embargo, a menudo resulta útil habilitar autoejecutar en otros tipos de medios de almacenamiento extraíbles. Esta característica se usa normalmente para simplificar la depuración de archivos AutoRun.inf. La ejecución automática solo funciona en dispositivos de almacenamiento extraíbles cuando se cumplen los siguientes criterios:

  • El dispositivo debe tener controladores compatibles con AutoRun. Para que sea compatible con AutoRun, un controlador debe notificar al sistema que se ha insertado un disco mediante el envío de un mensaje de WM_DEVICECHANGE .
  • El directorio raíz del medio insertado debe contener un archivo Autorun.inf.
  • El dispositivo no debe tener autoejecutar deshabilitado a través del Registro.
  • La aplicación en primer plano no ha suprimido autoejecutar .

Nota:

Esta característica no se debe usar para distribuir aplicaciones en medios extraíbles. Dado que la implementación de AutoRun en medios extraíbles proporciona una manera fácil de propagar virus informáticos, los usuarios deben ser sospechosos de cualquier disquete distribuido públicamente que contenga un archivo Autorun.inf.

 

Normalmente, AutoRun se inicia automáticamente, pero también se puede iniciar manualmente. Si el dispositivo cumple los criterios enumerados anteriormente, el menú contextual de la letra de unidad incluirá un comando de Reproducción automática . Para ejecutar AutoEjecutar manualmente, haga clic con el botón derecho en el icono de unidad y seleccione Reproducción automática en el menú contextual o haga doble clic en el icono de la unidad. Si los controladores no son compatibles con AutoRun, el menú contextual no tendrá un elemento Reproducción automática y No se puede iniciar AutoRun.

Los controladores compatibles con AutoRun se proporcionan con algunas unidades de disco extraíbles, así como otros tipos de medios extraíbles, como tarjetas CompactFlash. AutoRun también funciona con unidades de red asignadas a una letra de unidad con el Explorador de Windows o montadas con Microsoft Management Console (MMC). Al igual que con el hardware montado, una unidad de red montada debe tener un archivo Autorun.inf en su directorio raíz y no debe deshabilitarse a través del Registro.