Wie eine Geräteinstallationsanwendung nach laufenden Geräteinstallationen sucht

Ihre Geräteinstallationsanwendung sollte ermitteln, ob andere Geräteinstallationsaktivitäten ausgeführt werden, bevor sie ihre Installationen ausführen. Um dies festzustellen, sollte die Geräteinstallationsanwendung CMP_WaitNoPendingInstallEvents aufrufen, in der Regel mit einem Nulltimeoutwert. Wenn der Rückgabewert dieser Funktion angibt, dass andere Installationsaktivitäten ausstehen (z. B. der Assistent für gefundene neue Hardware ist möglicherweise aktiv), sollte die Geräteinstallationsanwendung beendet werden.

Damit Ihre Geräteinstallationsanwendung mit Plattformen kompatibel ist, die CMP_WaitNoPendingInstallEvents nicht unterstützen, sollte die Anwendung den folgenden Code enthalten:

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

Die Verwendung dieses Codes basiert auf der Annahme, dass eine Plattform AutoRun nicht startet, wenn sie CMP_WaitNoPendingInstallEvents nicht unterstützt und Installationsaktivitäten ausgeführt werden.

Eine Beispielverwendung dieses Codes finden Sie im Toasterinstallationspaket unter dem Unterverzeichnis src\general\toaster des Windows-Treiberkit (WDK, Windows Driver Kit).