Определение того, подключено ли устройство
Имейте в виду, что поведение вызываемого автозапуском приложения установки устройства должно зависеть от того, подключает ли пользователь оборудование первым или вставляет носитель распространения первым. Так как независимые поставщики оборудования (IHV) обычно предоставляют один диск распространителя, а диск может иметь только одно приложение, вызываемое автозапуском, приложение установки устройства, вызываемое автозапуском, должно определить, подключено ли устройство.
Чтобы определить, подключено ли устройство, приложение может вызвать функцию UpdateDriverForPlugAndPlayDevices , передав идентификатор оборудования устройства. Устройство подключено, если выполняется одно из следующих действий:
Функция возвращает значение TRUE. (При этом также устанавливается драйвер для устройства.)
Функция возвращает значение FALSE , а функция Win32 GetLastErrorвозвращает ERROR_NO_MORE_ITEMS. (Установка не выполняется.)
Устройство не подключено, если функция возвращает значение FALSE , а GetLastError возвращает NO_SUCH_DEVINST. (Установка не выполняется.)
Переустановка отключенного устройства
Когда устройство, которое ранее было подключено, теперь отключается, devnode устройства остается в системе, хотя оно и неактивно, и скрыто. Перед переустановкой такого устройства необходимо сначала найти этот "фантомный" devnode и пометить его как нуждающийся в переустановке. Затем, когда устройство будет снова подключено, Plug and Play повторно подберет устройство, найдет новый драйвер для него и установит драйвер для устройства.
Чтобы переустановить отключенное устройство, выполните приведенные далее действия.
Вызовите функцию SetupCopyOEMInf .
Функция SetupCopyOEMInf гарантирует наличие правильного INF-файла в каталоге %SystemRoot%\inf .
Найдите отключенные устройства.
Вызовите функцию SetupDiGetClassDevs . В вызове этой функции снимите флаг DIGCF_PRESENT в параметре Flags . Вы должны найти все устройства, а не только те, которые присутствуют. Вы можете сузить результаты поиска, указав конкретный класс устройства в параметре ClassGuid .
Найдите идентификаторы оборудования и совместимые идентификаторы неподключенных устройств.
SetupDiGetClassDevs возвращает дескрипторнабора сведений об устройствах , который содержит все установленные устройства, независимо от того, подключены они или нет, в классе устройства (при условии, что вы указали класс устройства на первом шаге). Выполняя последовательные вызовы функции SetupDiEnumDeviceInfo , вы можете использовать этот дескриптор для перечисления всех устройств в наборе сведений об устройствах. Каждый вызов предоставляет SP_DEVINFO_DATA структуру для устройства. Чтобы получить список идентификаторов оборудования, вызовите функцию SetupDiGetDeviceRegistryProperty с параметром Property , равным SPDRP_HARDWAREID. Чтобы получить список совместимых идентификаторов, вызовите ту же функцию, но с параметром Property , равным SPDRP_COMPATIBLEIDS. Оба списка являются строками MULTI-SZ.
Найдите совпадение между идентификатором устройства и идентификаторами оборудования (или совместимыми идентификаторами) предыдущего шага.
Убедитесь, что выполняется полное сравнение строк между идентификатором оборудования и совместимым идентификатором и идентификатором устройства. Частичное сравнение может привести к неправильным совпадениям.
При поиске совпадения вызовите функцию CM_Get_DevNode_Status , передав SP_DRVINFO_DATA. DevInst в параметре dnDevInst . Если эта функция возвращает CR_NO_SUCH_DEVINST, это подтверждает, что устройство не подключено (то есть имеет фантомный devnode).
Пометка устройства.
Вызовите функцию SetupDiGetDeviceRegistryProperty с параметром Property , равным SPDRP_CONFIGFLAGS. При возврате этой функции параметр PropertyBuffer указывает на значение ConfigFlags устройства из реестра. Выполните побитовое ИЛИ этого значения с помощью CONFIGFLAG_REINSTALL (определяется в Regstr.h). После этого вызовите функцию SetupDiSetDeviceRegistryProperty с параметром Property , равным SPDRP_CONFIGFLAGS, а для параметра PropertyBuffer — адрес измененного значения ConfigFlags устройства. Это действие изменяет значение ConfigFlags реестра, чтобы включить флаг CONFIGFLAG_REINSTALL. Это приводит к переустановке устройства при следующей повторной установке устройства.
Подключите устройство.
Plug and Play повторно обустраит устройство, найдет для него новый драйвер и установит этот драйвер.