Написание установщиков классов и Co-Installers
Примечание
Функции, описанные в этом разделе, не поддерживаются в универсальных или мобильных пакетах драйверов. См . раздел Использование универсального INF-файла.
В этом разделе содержатся рекомендации, которые следует соблюдать при написании совместного установщика.
Отображение пользовательского интерфейса
Сохранение состояния установки устройства
Загрузка исполняемых или DLL-файлов
Запуск других процессов или служб
Дополнительные сведения о создании совместного установщика см. в разделе Написание совместного установщика.
Отображение пользовательского интерфейса
Установка устройства в основном выполняется в системной (неинтерактивной) службе. Таким образом, пользователь не может видеть какой-либо пользовательский интерфейс, который отображается в этом контексте, или реагировать на него. Любое диалоговое окно, предоставляемое в совместном установщике во время обработки кода функции установки устройства (DIF ), приводит к тому, что установка устройства перестает отвечать на запросы.
В большинстве случаев совместные установщики не должны взаимодействовать с пользователем, кроме как во время обработки действия завершения установки. Действия завершения установки выполняются в интерактивном контексте.
Примечание Совместные установщики не должны завершать сбой кода DIF с ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION, так как это приводит к сбою установки устройства. Если для установки устройства требуется взаимодействие с пользователем, совместные установщики должны поддерживать действия завершения установки.
Сохранение состояния установки устройства
Не сохраняйте состояние установки устройства в библиотеке динамической компоновки совместного установщика (DLL). Так как Windows обычно выгружает библиотеку DLL после обработки кода DIF установщиком, все сведения о состоянии, сохраненные в библиотеке DLL, не сохраняются.
Чтобы безопасно сохранить состояние установщика устройства, установщики классов или совместно установщики должны сохранять сведения о состоянии в виде свойств в разделе драйвера устройства в реестре. Для этого выполните следующие действия:
Чтобы получить дескриптор реестра к ключу драйвера для экземпляра устройства, используйте SetupDiOpenDevRegKey с параметром KeyType , для которого задано значение DIREG_DRV.
Используйте SetupDiGetDevicePropertyKeys (для получения всех ключей свойств для экземпляра устройства) или SetupDiGetDeviceProperty (для получения указанного ключа свойства экземпляра устройства).
Используйте SetupDiSetDeviceProperty , чтобы сохранить ключ свойства экземпляра устройства.
Загрузка исполняемых или DLL-файлов
Если ваш совместный установщик пытается загрузить неподписанный исполняемый файл или библиотеку DLL на 64-разрядной платформе Windows, операционные системы предотвращают его загрузку в этой безопасной среде.
Для безопасной загрузки исполняемого файла или библиотеки DLL установщиком класса или совместного установщика настоятельно рекомендуется включить исполняемый файл или библиотеку DLL в пакет драйвера с цифровой подписью. Дополнительные сведения о том, как подписывать пакеты драйверов, см. в разделе Подписывание драйверов.
Примечание Установщики классов и соинсталляторы не должны загружать модули DLL с помощью явных вызовов функций, таких как LoadLibrary, или путем создания зависимостей ссылок.
Запуск других процессов или служб
Во время установки устройства Windows не может отслеживать дополнительные процессы и не может определить, что они делают и когда они будут завершены. Например, Windows может запустить или остановить устройство или запустить перезагрузку системы, пока процесс выполняет критическое действие.
В большинстве случаев совместному установщику не следует запускать другие процессы или службы. Однако установщики могут безопасно запускать другие процессы, вызывая CreateProcess из функции или диалогового окна, которое отображается в действии завершения установки. Установщик не должен позволять пользователю продолжать работу в диалоговом окне или процедуре до завершения созданного процесса.