Предотвращение перезапусков системы во время установки устройства и Обновления драйверов
Чтобы избежать перезапуска системы во время установки устройства, используйте следующие правила:
Никогда не используйте записи Reboot или Restart в разделах INF DDInstall. Эти директивы изначально предоставлялись для обеспечения совместимости с Windows 9x/Me и не должны использоваться для Windows 2000 и более поздних версий Windows.
Не используйте флаги COPYFLG_FORCE_FILE_IN_USE или COPYFLG_REPLACE_BOOT_FILE с директивами INF CopyFiles, если это не является абсолютно необходимым.
Сделайте так, чтобы все файлы в пакете драйверовзапускались из хранилища драйверов.
Если файлы в пакете драйверов не запускаются из хранилища драйверов, назначьте новое имя файла каждой новой версии установщика класса или совместного установщика или библиотеки DLL службы. Это позволяет избежать необходимости перезапуска системы, если используется более старая версия. (На самом деле, если новое имя файла не используется для обновленного установщика класса или совместного установщика класса, эти новые файлы не будут использоваться для установки.)
Чтобы обновить драйверы устройства, следуйте правилам, перечисленным в разделе Обновление файлов драйверов.
Минимизация перезапусков при обновлении драйверов с файловой поддержкой
До Windows 10 все драйверы в режиме ядра были подкреплены файлом подкачки системы. В результате двоичный файл драйвера может быть перезаписан на диске даже во время работы драйвера.
Для повышения производительности, начиная с Windows 10, большинство драйверов, не относящихся к загрузке, поддерживаются двоичным файлом драйвера на диске.
Типы запуска драйверов, которые теперь поддерживаются файлами, включают:
SERVICE_SYSTEM_START (0x00000001)
SERVICE_AUTO_START (0x00000002)
SERVICE_DEMAND_START (0x00000003)
Драйверы запуска загрузки по-прежнему поддерживаются файлом подкачки.
Чтобы обновить драйвер с файловой поддержкой, используйте следующие рекомендации. В противном случае для обновления может потребоваться два перезапуска: один для замены файла и второй для загрузки новой версии драйвера.
Если вы используете INF-файл, выполните следующие действия.
Измените раздел CopyFiles ФАЙЛА драйвера для использования COPYFLG_IN_USE_RENAME следующим образом:
[MyDriver_Install.NT] CopyFiles=MyDriverCopy [MyDriverCopy] MyDriver.sys,,,0x00004000 ; COPYFLG_IN_USE_RENAME
Если вы используете этот флаг, Windows попытается заменить файл драйвера на диске. Дополнительные сведения см. в разделе Директива INF CopyFiles.
Если inf предназначен для драйвера PnP, во время установки устройства Windows пытается выгрузить работающий драйвер и перезапустить устройства, которые его используют, чтобы получить новую версию драйвера. В случае сбоя установка устройства указывает на то, что система должна быть перезагружена.
Если INF не предназначен для драйвера PnP и для обработки INF используется метод InstallHInfSection , остановите и перезапустите драйвер вручную:
Закройте все открытые дескрипторы для драйвера, а затем остановите драйвер одним из следующих способов:
sc.exe stop <mydriver>
ControlService(SERVICE_CONTROL_STOP)
Дополнительные сведения см. в разделе Функция ControlService.
Если вы не используете INF-файл, выполните следующие действия.
Остановите драйвер, как описано выше. Замените старый двоичный файл драйвера новым.
Если вы не можете остановить драйвер, переименуйте существующий файл, скопируйте новый файл на место и настройте существующий файл для удаления в будущем (например, используя MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT ). Чтобы начать использовать новую версию драйвера, необходимо перезапустить систему.