Determinando se um dispositivo está conectado
Lembre-se de que o comportamento de um aplicativo de instalação de dispositivo invocado por AutoRun deve depender se o usuário conecta o hardware primeiro ou insere o meio de distribuição primeiro. Como os IHVs (fornecedores independentes de hardware) normalmente fornecem um disco de distribuição e um disco só pode ter um aplicativo invocado por AutoRun, seu aplicativo de instalação de dispositivo invocado por AutoRun deve determinar se o dispositivo está conectado.
Para determinar se um dispositivo está conectado, o aplicativo pode chamar a função UpdateDriverForPlugAndPlayDevices , passando a ID de hardware do dispositivo. O dispositivo será conectado se um dos seguintes itens for verdadeiro:
A função retorna TRUE. (Isso também instala o driver para o dispositivo.)
A função retorna FALSE e a função GetLastErrorwin32 retorna ERROR_NO_MORE_ITEMS. (Nenhuma instalação ocorre.)
O dispositivo não será conectado se a função retornar FALSE e GetLastError retornar NO_SUCH_DEVINST. (Nenhuma instalação ocorre.)
Reinstalando um dispositivo desconectado
Quando um dispositivo que antes era anexado agora está desconectado, o devnode do dispositivo permanece no sistema, embora esteja inativo e oculto. Antes de reinstalar esse dispositivo, primeiro você deve encontrar esse devnode "fantasma" e marcá-lo como precisando de reinstalação. Em seguida, quando o dispositivo estiver conectado novamente, Plug and Play reenumerará o dispositivo, localizará o novo driver para ele e instalará o driver para o dispositivo.
Para reinstalar um dispositivo desconectado:
Chame a função SetupCopyOEMInf .
A função SetupCopyOEMInf garante que o arquivo INF correto esteja presente no diretório %SystemRoot%\inf .
Localize os dispositivos desconectados.
Chame a função SetupDiGetClassDevs . Na chamada para essa função, desmarque o sinalizador DIGCF_PRESENT no parâmetro Flags . Você precisa encontrar todos os dispositivos, não apenas aqueles que estão presentes. Você pode restringir os resultados da pesquisa especificando a classe de dispositivo específica no parâmetro ClassGuid .
Localize as IDs de hardware e as IDs compatíveis de dispositivos desconectados.
SetupDiGetClassDevs retorna um identificador para o conjunto de informações do dispositivo que contém todos os dispositivos instalados, conectados ou não, na classe de dispositivo (supondo que você especificou uma classe de dispositivo na primeira etapa). Ao fazer chamadas sucessivas para a função SetupDiEnumDeviceInfo , você pode usar esse identificador para enumerar todos os dispositivos no conjunto de informações do dispositivo. Cada chamada fornece uma estrutura SP_DEVINFO_DATA para o dispositivo. Para obter a lista de IDs de hardware, chame a função SetupDiGetDeviceRegistryProperty com o parâmetro Property definido como SPDRP_HARDWAREID. Para obter a lista das IDs compatíveis, chame a mesma função, mas com o parâmetro Property definido como SPDRP_COMPATIBLEIDS. Ambas as listas são cadeias de caracteres MULTI-SZ.
Procure uma correspondência entre a ID do dispositivo e as IDs de hardware (ou IDs compatíveis) da etapa anterior.
Verifique se você executa comparações de cadeia de caracteres completas entre a ID de hardware/ID compatível e a ID do dispositivo. Uma comparação parcial pode levar a correspondências incorretas.
Quando encontrar uma correspondência, chame a função CM_Get_DevNode_Status , passando SP_DRVINFO_DATA. DevInst no parâmetro dnDevInst . Se essa função retornar CR_NO_SUCH_DEVINST, isso confirmará que o dispositivo está desanexado (ou seja, tem um devnode fantasma).
Marque o dispositivo.
Chame a função SetupDiGetDeviceRegistryProperty com o parâmetro Property definido como SPDRP_CONFIGFLAGS. Quando essa função retorna, o parâmetro PropertyBuffer aponta para o valor ConfigFlags do dispositivo do registro. Execute um OR bit a bit desse valor com CONFIGFLAG_REINSTALL (definido em Regstr.h). Depois de fazer isso, chame a função SetupDiSetDeviceRegistryProperty , com o parâmetro Property definido como SPDRP_CONFIGFLAGS e o parâmetro PropertyBuffer definido como o endereço do valor ConfigFlags modificado do dispositivo Essa ação modifica o valor ConfigFlags do registro para incorporar o sinalizador CONFIGFLAG_REINSTALL. Isso faz com que o dispositivo seja reinstalado na próxima vez que o dispositivo for reenumerado.
Conecte o dispositivo.
Plug and Play reenumerará o dispositivo, encontrará o novo driver para ele e instalará esse driver.