Операция совместного установщика
Примечание
Функции, описанные в этом разделе, не поддерживаются, и содержащиеся в них пакеты драйверов больше не будут получать подпись Майкрософт. См . раздел Использование универсального INF-файла.
Совместные установщики вызываются программой SetupAPI, как показано на следующем рисунке.
Незамеченные прямоугольники представляют компоненты, предоставляемые операционной системой для системных классов настройки устройств. Затеняемые поля представляют компоненты, которые можно предоставить. Если вы создаете пользовательский класс настройки устройства, вы также можете предоставить установщик класса. Однако вам редко требуется создавать новый класс настройки устройства, так как почти каждое устройство может быть связано с одним из предоставляемых системой классов настройки устройств. Дополнительные сведения о компонентах Windows см. в статье Общие сведения об установке устройств.
Совместные установщики могут быть предоставлены для определенного устройства (совместного установщика для конкретного устройства) или для класса установки устройства (класс совместного установщика). SetupAPI вызывает совместное установщик для конкретного устройства только при установке устройства, для которого зарегистрирован совместный установщик. Операционная система и поставщики могут зарегистрировать ноль или более совместных установщиков для устройства. SetupAPI вызывает совместный установщик класса при установке любого устройства класса установки устройства, для которого зарегистрирован совместный установщик. Операционная система и поставщики могут зарегистрировать один или несколько установщиков класса для класса установки устройства. Кроме того, совместный установщик класса можно зарегистрировать для одного или нескольких классов установки.
Windows и пользовательские приложения установки устройств устанавливают устройства, вызывая SetupDiCallClassInstaller с кодами функций установки устройств (DIF).
Во время настройки режима графического пользовательского интерфейса операционная система вызывает SetupDiCallClassInstaller с кодами DIF для обнаружения устройств, не относящихся к PnP, которые присутствуют в системе. IHV обычно предоставляет совместный установщик для выполнения этого действия для устройств, отличных от PnP, которые выпускает IHV.
Для каждого запроса DIF SetupDiCallClassInstaller вызывает любые соинсталлеры класса, зарегистрированные для класса установки устройства, любые соинсталлеры устройств, зарегистрированные для конкретного устройства, а затем установщик класса, предоставляемый системой для класса установки устройства, если он есть.
Пользовательские приложения установки устройств должны вызывать SetupDiCallClassInstaller , а не вызывать установщик совместного использования или установщик класса напрямую. Эта функция гарантирует, что все зарегистрированные совместные установщики вызываются соответствующим образом.
Как правило, совместные установщики класса регистрируются до установки устройства, а установщики для конкретных устройств регистрируются как часть установки устройства. Поэтому установщики классов обычно добавляются в список совместного установщика при его первой сборке и вызываются для всех запросов DIF во время установки устройства.
Операционная система добавляет в список совместного установщика устройства после выполнения запроса DIF_REGISTER_COINSTALLERS для устройства (или вызова SetupDiRegisterCoDeviceInstallers ). Совместное установщики устройств не участвуют в следующих запросах DIF:
Только совместное установщик класса (не совместное установщик для конкретного устройства) может отвечать на следующие запросы DIF:
DIF_NEWDEVICEWIZARD_PREANALYZE
DIF_NEWDEVICEWIZARD_POSTANALYZE
Совместный установщик устройства не подходит в этих контекстах либо потому, что определенное устройство еще не было идентифицировано или на этом раннем этапе установки, либо совместное установщики устройства еще не зарегистрированы.
На следующем рисунке показан порядок, в котором SetupDiCallClassInstaller вызывает соинсталлеры и установщики классов после регистрации всех установщиков, относящихся к конкретному устройству.
В примере, показанном на предыдущем рисунке, для класса установки этого устройства регистрируются два совместного установщика класса, а для устройства регистрируется один установщик для конкретного устройства. Следующие шаги соответствуют обведенным числам на предыдущем рисунке:
SetupDiCallClassInstaller вызывает со-установщик первого класса, указывая код DIF, указывающий обрабатываемый запрос на установку (DIF_INSTALLDEVICE в этом примере). Совместный установщик может участвовать в запросе на установку. В этом примере первый зарегистрированный совместный установщик класса возвращает NO_ERROR.
SetupDiCallClassInstaller, в свою очередь, вызывает все дополнительные зарегистрированные установщики классов. В этом примере второй установщик второго класса возвращает ERROR_DI_POSTPROCESSING_REQUIRED, который запрашивает вызов совместного установщика позже для постобработки.
SetupDiCallClassInstaller вызывает все зарегистрированные совместные установщики для конкретного устройства.
После вызова всех зарегистрированных совместно установленных установщиков SetupDiCallClassInstaller вызывает предоставленный системой установщик класса , если он имеется для класса установки устройства. В этом примере установщик класса возвращает ERROR_DI_DO_DEFAULT, что является типичным возвращаемым значением для установщиков классов.
SetupDiCallClassInstaller вызывает обработчик по умолчанию для запроса на установку, если он есть. DIF_INSTALLDEVICE имеет обработчик по умолчанию SetupDiInstallDevice, который является частью SetupAPI.
SetupDiCallClassInstaller вызывает все соинсталлеры, запрашивающие постобработку. В этом примере второй установщик второго класса запросил постобработку.
Постобработка совместного установщика аналогична подпрограммам IoCompletion драйвера, за исключением того, что совместный установщик вызывается второй раз в одной точке входа. Когда SetupDiCallClassInstaller вызывает совместный установщик для постобработки, он устанавливает для PostProcessingзначение TRUE , а InstallResult — соответствующее значение в параметре Context . В этом примере — Контекст. Параметр InstallResult NO_ERROR, так как обработчик по умолчанию успешно выполнен.
Для постобработки SetupDiCallClassInstaller вызывает со-установщики в обратном порядке. Если все соинсталлеры на предыдущем рисунке возвращали ERROR_DI_POSTPROCESSING_REQUIRED, SetupDiCallClassInstaller сначала вызывал Device_Coinstaller_1 для постобработки, затем Class_Coinstaller_2, а затем Class_Coinstaller_1. Установщики классов не запрашивают постобработку; это делают только совместные установщики.
Совместный установщик, запрашивающий постобработку, вызывается, даже если предыдущий совместный установщик не выполнил запрос на установку.