Compartir a través de


Determinar si un dispositivo está conectado

Tenga en cuenta que el comportamiento de una aplicación de instalación de dispositivos invocada automáticamente debe depender de si el usuario conecta primero el hardware o inserta primero el medio de distribución. Dado que los proveedores de hardware independientes (IHV) suelen proporcionar un disco de distribución y un disco solo puede tener una aplicación autorun-invoked, la aplicación de instalación de dispositivos autorun-invoked debe determinar si el dispositivo está conectado.

Para determinar si un dispositivo está conectado, la aplicación puede llamar a la función UpdateDriverForPlugAndPlayDevices , pasando el identificador de hardware del dispositivo. El dispositivo se conecta si se cumple una de las siguientes condiciones:

  • La función devuelve TRUE. (Esto también instala el controlador para el dispositivo).

  • La función devuelve FALSE y la función GetLastError de Win32devuelve ERROR_NO_MORE_ITEMS. (No se produce ninguna instalación).

El dispositivo no está conectado si la función devuelve FALSE y GetLastError devuelve NO_SUCH_DEVINST. (No se produce ninguna instalación).

Reinstalar un dispositivo desconectado

Cuando un dispositivo que anteriormente estaba conectado ahora está desconectado, el nodo dev del dispositivo permanece en el sistema, aunque está inactivo y oculto. Para poder volver a instalar este dispositivo, primero debe encontrar este nodo "fantasma" y marcarlo como necesite reinstalación. A continuación, cuando el dispositivo se conecte de nuevo, Plug and Play volverá a enumerar el dispositivo, busque el nuevo controlador para él e instale el controlador para el dispositivo.

Para volver a instalar un dispositivo desconectado:

  1. Llame a la función SetupCopyOEMInf .

    La función SetupCopyOEMInf garantiza que el archivo INF correcto esté presente en el directorio %SystemRoot%\inf .

  2. Busque los dispositivos desconectados.

    Llame a la función SetupDiGetClassDevs . En la llamada a esta función, borre la marca DIGCF_PRESENT en el parámetro Flags . Tienes que encontrar todos los dispositivos, no solo los que están presentes. Puede restringir los resultados de la búsqueda especificando la clase de dispositivo determinada en el parámetro ClassGuid .

  3. Busque los identificadores de hardware y los identificadores compatibles de dispositivos desconectados.

    SetupDiGetClassDevs devuelve un identificador al conjunto de información del dispositivo que contiene todos los dispositivos instalados, ya sea conectados o no, en la clase de dispositivo (suponiendo que especificó una clase de dispositivo en el primer paso). Al realizar llamadas sucesivas a la función SetupDiEnumDeviceInfo , puede usar este identificador para enumerar todos los dispositivos del conjunto de información del dispositivo. Cada llamada proporciona una estructura SP_DEVINFO_DATA para el dispositivo. Para obtener la lista de identificadores de hardware, llame a la función SetupDiGetDeviceRegistryProperty con el parámetro Property establecido en SPDRP_HARDWAREID. Para obtener la lista de los identificadores compatibles, llame a la misma función, pero con el parámetro Property establecido en SPDRP_COMPATIBLEIDS. Ambas listas son cadenas MULTI-SZ.

  4. Busque una coincidencia entre el identificador del dispositivo y los identificadores de hardware (o identificadores compatibles) del paso anterior.

    Asegúrese de realizar comparaciones de cadenas completas entre el identificador de hardware o el identificador compatible y el identificador del dispositivo. Una comparación parcial podría provocar coincidencias incorrectas.

    Cuando encuentre una coincidencia, llame a la función CM_Get_DevNode_Status y pase SP_DRVINFO_DATA. DevInst en el parámetro dnDevInst . Si esta función devuelve CR_NO_SUCH_DEVINST, eso confirma que el dispositivo no está conectado (es decir, tiene un devnode fantasma).

  5. Marque el dispositivo.

    Llame a la función SetupDiGetDeviceRegistryProperty con el parámetro Property establecido en SPDRP_CONFIGFLAGS. Cuando se devuelve esta función, el parámetro PropertyBuffer apunta al valor ConfigFlags del dispositivo del registro. Realice una operación OR bit a bit de este valor con CONFIGFLAG_REINSTALL (definido en Regstr.h). Después de hacerlo, llame a la función SetupDiSetDeviceRegistryProperty , con el parámetro Property establecido en SPDRP_CONFIGFLAGS y el parámetro PropertyBuffer establecido en la dirección del valor ConfigFlags modificado del dispositivo. Esta acción modifica el valor ConfigFlags del Registro para incorporar la marca CONFIGFLAG_REINSTALL. Esto hace que el dispositivo se vuelva a instalar la próxima vez que se vuelva aumerar el dispositivo.

  6. Conecte el dispositivo.

    Plug and Play volverá a enumerar el dispositivo, busque el nuevo controlador para él e instale ese controlador.