Как приложение установки устройства проверяет наличие установленных устройств
Приложение установки устройства должно определить, выполняются ли другие действия по установке устройства, прежде чем выполнять установку. Чтобы определить это, приложение установки устройства должно вызывать CMP_WaitNoPendingInstallEvents, обычно с нулевым значением времени ожидания. Если значение, возвращаемое этой функцией, указывает на ожидание других действий по установке (например, может быть активен мастер обнаружения нового оборудования), приложение установки устройства должно завершить работу.
Чтобы приложение установки устройства было совместимо с платформами, которые не поддерживают CMP_WaitNoPendingInstallEvents, приложение должно содержать следующий код:
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;
}
.
.
}
Использование этого кода основано на том, что если платформа не поддерживает CMP_WaitNoPendingInstallEvents, платформа не запускает автозапуск, если выполняются действия по установке.
Пример использования этого кода см. в пакете установки тостера в подкаталоге src\general\тостер комплекта драйверов Windows (WDK).