Compartilhar via


Como um aplicativo de instalação de dispositivo verifica se há instalações de dispositivo em andamento

O aplicativo de instalação do dispositivo deve determinar se outras atividades de instalação do dispositivo estão em andamento antes de executar suas instalações. Para fazer essa determinação, o aplicativo de instalação do dispositivo deve chamar CMP_WaitNoPendingInstallEvents, normalmente com um valor de tempo limite zero. Se o valor retornado dessa função indicar que outras atividades de instalação estão pendentes (por exemplo, o Assistente de Novo Hardware Encontrado pode estar ativo), o aplicativo de instalação do dispositivo deverá sair.

Para tornar o aplicativo de instalação do dispositivo compatível com plataformas que não dão suporte a CMP_WaitNoPendingInstallEvents, o aplicativo deve incluir o seguinte código:

BOOL
IsDeviceInstallInProgress (VOID)
{
    HMODULE hModule;
    CMP_WAITNOPENDINGINSTALLEVENTS_PROC pCMP_WaitNoPendingInstallEvents;

    hModule = GetModuleHandle(TEXT("setupapi.dll"));
    if(!hModule)
    {
        // Should never happen since we're linked to SetupAPI, but...
        return FALSE;
    }

    pCMP_WaitNoPendingInstallEvents =
        (CMP_WAITNOPENDINGINSTALLEVENTS_PROC)GetProcAddress(hModule,
                                             "CMP_WaitNoPendingInstallEvents");
    if(!pCMP_WaitNoPendingInstallEvents)
    {
        // We're running on a release of the operating system that doesn't supply this function.
        // Trust the operating system to suppress AutoRun when appropriate.
        return FALSE;
    }
    return (pCMP_WaitNoPendingInstallEvents(0) == WAIT_TIMEOUT);
}

int
__cdecl
_tmain(IN int argc, IN PTCHAR argv[])
{
    if(IsDeviceInstallInProgress()) {
        //
        // We don't want to start right now.  Instead, our
        // device co-installer will invoke this application
        // (if necessary) during finish-install processing.
        //
        return -1;
    }
    .
    .
}

O uso desse código baseia-se na premissa de que, se uma plataforma não der suporte a CMP_WaitNoPendingInstallEvents, a plataforma não iniciará a Execução Automática se as atividades de instalação estiverem em andamento.

Para obter um exemplo de uso desse código, consulte o pacote de instalação da torradeira no subdiretório src\general\toaster do WDK (Windows Driver Kit).