Поделиться через


Обновление встроенного ПО USB-устройств без использования совместного установщика

Это важно

Начиная с WDK для Windows 11 версии 22H2 распространяемые совместно установщики WDF больше не поддерживаются. Чтобы узнать, как обойти это изменение, см. WDF redistributable co-installers не работают в статье известные проблемы WDK.

Поставщики USB-устройств используют сопутствующие установщики для обновления встроенного ПО устройств, использующих встроенные в систему драйверы USB-устройств. Однако соустановщики не поддерживаются новым стандартом «Универсальный INF», который является обязательным требованием в Windows 10. Это представляет собой проблему для существующего процесса обновления встроенного ПО USB-устройства. В этой статье описан рекомендуемый метод обновления встроенного ПО USB-устройства без совместного установщика.

Требования

Основными требованиями процесса обновления встроенного ПО USB-устройства являются:

  1. Простое обновление встроенного ПО без взаимодействия с пользователем

  2. Надежный механизм восстановления (например, без безвозвратного выхода устройств из строя)

  3. Работает в Windows 7 и более поздних версиях

Обзор

USB-устройства, такие как камеры UVC, выпускаются с возможностью обновления встроенного ПО на месте. Сегодня нет стандартного метода обновления встроенного ПО. Один элемент, который является общим для всех существующих механизмов обновления, заключается в том, что некоторый пользовательский набор программного обеспечения выполняется на клиенте и загружает встроенное ПО на устройство. Как правило, в процессе установки устройства устанавливается пакет программного обеспечения обновления встроенного ПО. Запуск совместного установщика запускает процесс обновления встроенного ПО. Отсутствие совместного установщика в Windows 10 запрещает поставщикам устройств обновлять встроенное ПО на этих устройствах в поле.

Рекомендуемый способ обойти отсутствие совместного установщика для сценария обновления встроенного ПО USB-устройства — использовать более низкий драйвер фильтра для USB-устройства, который запускает процесс обновления встроенного ПО. Во время вызова AddDevice драйвер фильтра проверяет версию встроенного ПО устройства и обновляет встроенное ПО при необходимости.

Обзор обновления встроенного ПО

При подключении USB-устройства к системе для устройства устанавливается универсальный драйвер папки "Входящие". После установки универсального драйвера ОС отправляет запрос на сервер Центра обновления Windows для проверки наличия пакета драйверов от конкретного производителя, загружает и устанавливает его. Установленный пакет драйверов выполняет обновление встроенного ПО.

Существует два способа обновления встроенного ПО:

  1. Фильтр-драйвер обновления прошивки

    1. Поставщик предоставил драйвер нижнего уровня фильтра, который выполняет обновление микропрограммного обеспечения.
  2. Драйвер устройства обновления прошивки

    1. Поставщик предоставил более низкий драйвер фильтра, который помещает устройство в режим обновления встроенного ПО.

    2. Устройство перечисляется как устройство обновления встроенного ПО.

    3. Поставщик предоставляет драйвер обновления встроенного ПО, который загружается на это устройство и обновляет встроенное ПО.

Метод 1: Драйвер фильтра обновления прошивки

В этом методе нижний драйвер фильтра для драйвера USB-устройства устанавливается в рамках процесса обновления драйвера. Этот драйвер фильтра выполняет обновление встроенного ПО.

Пакет обновления драйвера на сервере Центра обновления Windows содержит следующее:

  • Драйвер нижнего фильтра WDF для обновления микропрограммы

  • INF-файл для установки драйвера нижнего фильтра WDF для обновления прошивки.

  • Файл "firmware.bin"

Метод обновления встроенного ПО через драйвер нижнего фильтра UMDF.

При установке пакета обновления драйвера вызывается рутина AddDevice драйвера фильтра обновления встроенного ПО WDF. Из этой процедуры драйвер фильтра WDF получает версию встроенного ПО устройства из раздела реестра HW устройства. Встроенное ПО устройства должно с помощью дескриптора MSOS поместить версию встроенного ПО в соответствующий раздел реестра HW.

  1. Если версия встроенного ПО устройства и ожидаемый драйвер фильтра будут отличаться или

  2. Версия встроенного ПО недоступна в ключе реестра HW устройства

    1. Затем драйвер фильтра вставляется в стек устройств, возвращая успешное выполнение обратного вызова AddDevice .
  3. Кроме того, драйвер фильтра не вставляется в стек устройств

    1. Так как обновление встроенного ПО не требуется, так как устройство имеет ожидаемое встроенное ПО.

Когда обратный вызов EVT_WDF_DEVICE_D0_ENTRY драйвера фильтра вызывается в более поздний момент, драйвер фильтра должен зарегистрировать уведомления об изменении интерфейса устройства с помощью CM_Register_Notification или IoRegisterPlugPlayNotification (UMDF или KMDF), чтобы прослушивать класс интерфейса устройства, в который USB-устройство регистрирует устройство. Например, драйвер фильтра обновления встроенного ПО для камеры RGB регистрируется как "KSCATEGORY_VIDEO_CAMERA". При получении уведомления драйвер фильтра должен опубликовать рабочий элемент, который выполнит обновление встроенного ПО.

Драйверы обновления встроенного ПО на основе UMDF могут использовать определенные API-интерфейсы устройства или выдавать управление непосредственно для доступа к USB-устройству для выполнения обновления встроенного ПО. Например, драйвер фильтра на основе UMDF для камеры будет использовать API камеры для выполнения обновления встроенного ПО.

Драйверы обновления встроенного ПО на основе KMDF могут отправлять определенные поставщиком команды для выполнения обновления встроенного ПО.

После завершения прошивки встроенного ПО устройство должно отключиться и повторно подключиться к шине. Устройство повторно перечисляется с помощью нового встроенного ПО.

Метод использования драйвера фильтра обновления встроенного ПО рекомендуется для устройств, имеющих достаточно ресурсов для хранения двух полных образов встроенного ПО (образа обновления и образа резервного копирования) на памяти устройства. Причина заключается в том, что, если возникают сбои при скачивании обновленного встроенного ПО, устройство может прервать обновление и загрузить свою исходную версию встроенного ПО. Таким образом, не превращая устройство в бесполезный предмет.

Метод 2: Драйвер устройства для обновления прошивки

В этом методе устанавливается нижний фильтрующий драйвер для USB-устройства как часть процесса обновления драйвера. Этот драйвер фильтра отправляет на устройство команду для перезапуска в режиме обновления встроенного ПО, где устройство предоставляет интерфейс обновления встроенного ПО. Драйвер для интерфейса обновления встроенного ПО загружается и выполняет обновление встроенного ПО.

Пакет обновления драйвера на сервере центра обновления Windows для устройства содержит следующее:

  1. Драйвер нижнего фильтра WDF, который помещает устройство в режим обновления встроенного ПО

  2. Расширение INF для установки драйвера нижнего фильтра WDF

В дополнение к пакету обновления драйвера отдельный пакет драйвера обновления встроенного ПО для устройств присутствует в Центре обновления Windows с:

  1. Драйвер устройства обновления встроенного ПО WDF и его INF и

  2. Файл "firmware.bin".

Обновление встроенного ПО методом драйвера WDF.

При установке пакета обновления драйвера вызывается подпрограмма AddDevice драйвера WDF нижнего фильтра. Из этой процедуры фильтрующий драйвер запрашивает версию встроенного ПО устройства из ключа реестра оборудования устройства. Встроенное ПО устройства помещает "версию встроенного ПО", с использованием дескриптора MSOS или расширения INF USB-устройства, в мастер-ключ реестра оборудования устройства.

  1. Если версия встроенного ПО устройства и ожидаемая версия встроенного ПО фильтра различаются или

  2. Версия встроенного ПО недоступна в разделе реестра аппаратного обеспечения устройства.

  3. Затем драйвер фильтра WDF вставляется в стек устройств.

  4. Кроме того, драйвер фильтра WDF не вставляется в стек устройств.

Когда вызывается обратный вызов EVT_WDF_DEVICE_D0_ENTRY драйвера фильтра WDF, драйвер фильтра позже выдает устройству команду, которая переводит его в режим обновления прошивки. Устройство отключает и повторно подключается, предоставляя интерфейс обновления встроенного ПО.

Система перечисляет интерфейс устройства обновления встроенного ПО. Для этого интерфейса обновления встроенного ПО будет загружен пользовательский драйвер WDF, предоставленный поставщиком, в пакете обновления встроенного ПО. Этот драйвер обновляет встроенное ПО.

Когда вызывается обратный вызов EVT_WDF_DEVICE_D0_ENTRY драйвера обновления встроенного ПО WDF, драйвер должен запланировать рабочий элемент, который выполнит обновление встроенного ПО.

После завершения прошивки встроенного ПО устройство должно отключиться и повторно подключиться к шине. Устройство повторно перечисляется с помощью нового встроенного ПО.

Этот метод рекомендуется для устройств, которые не могут содержать обновленные и исходные образы встроенного ПО из-за нехватки памяти на устройстве. Причина заключается в том, что если во время скачивания обновленного встроенного ПО произошел сбой, устройство может отказаться от обновления и снова перейти в режим обновления прошивки, и обновление можно повторить. Таким образом, устройство не будет превращено в "кирпич".

Восстановление

Процесс обновления встроенного ПО может завершиться сбоем по различным причинам. В этом случае при повторном перечислении устройства драйвер обновления встроенного ПО может попытаться обновить встроенное ПО еще раз и может завершиться сбоем, и этот процесс обновления может завершиться циклом. Драйвер обновления встроенного ПО должен установить максимальное ограничение на количество повторных попыток, которые он может выполнить. Если обновление встроенного ПО превышает пороговое значение (например, три повторных попытки), драйвер фильтра не должен пытаться обновить встроенное ПО еще раз, пока новая версия драйвера не будет загружена из WU. Драйвер обновления встроенного ПО может использовать реестр для сохранения состояний повторных попыток.

В конце обновления встроенного ПО устройства рекомендуется выполнить сброс устройства и повторно инициировать его распознавание в системе.

Чтобы обновить встроенное ПО любым методом, перед этим необходимо остановить функции устройства. Это гарантирует отсутствие открытого дескриптора для устройства и избегает необходимости перезапуска ОС.

Пример INF

;==============================================================================
; Microsoft Extension INF for USB Camera Firmware Update UMDF Filter Driver
; Copyright (C) Microsoft Corporation.  All rights reserved.
;==============================================================================

[Version]
Signature="$WINDOWS NT$"
Class=Extension
ClassGUID={e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider=%CONTOSO%
ExtensionId={BC6EE554-271C-48C8-B713-8078833962BD} ; replace with your own GUID
CatalogFile.NT=SampleExtension.cat
DriverVer=08/28/2017,10.0.1700.000
PnpLockdown=1

[SourceDisksFiles]
ContosoFirmwareUpdateFilterDriver.dll=1
ContosoFirmware.bin=1

[SourceDisksNames]
1 = %MediaDescription%

[DestinationDirs]
UMDriverCopy=13
ContosoFirmwareCopy=13
DefaultDestDir = 13

[UMDriverCopy]
ContosoFirmwareUpdateFilterDriver.dll

[ContosoFirmwareCopy]
ContosoFirmware.bin

[Manufacturer]
%CONTOSO% = ContosoFirmwareUpdateFilterDriver,NTamd64.10.0...22000

[ContosoFirmwareUpdateFilterDriver.NTamd64.10.0...22000]
; replace with your camera device VID PID
%ContosoCamera.DeviceDesc% = ContosoFirmwareUpdateFilterDriver_Win11Install, USB\VID_1234&PID_1234&REV_1234

[ContosoFirmwareUpdateFilterDriver_Win11Install]
Include=wudfrd.inf
Needs=wudfrd.NT
CopyFiles=UMDriverCopy, ContosoFirmwareCopy

[ContosoFirmwareUpdateFilterDriver_Win11Install.HW]
Include=wudfrd.inf
Needs=wudfrd.NT.HW

[ContosoFirmwareUpdateFilterDriver.AddReg]
; Load the redirector as an lower filter on this specific device.
; 0x00010008 - FLG_ADDREG_TYPE_MULTI_SZ | FLG_ADDREG_APPEND
HKR,,"LowerFilters",0x00010008,"WUDFRd"

[ContosoFirmwareUpdateFilterDriver_Win11Install.Services]
Include=wudfrd.inf
Needs=WUDFRD.NT.Services

[ContosoFirmwareUpdateFilterDriver_Win11Install.Wdf]
UmdfService=ContosoFirmwareUpdateFilterDriver, ContosoFirmwareUpdateFilterDriver.UmdfFilter
UmdfServiceOrder=ContosoFirmwareUpdateFilterDriver

[ContosoFirmwareUpdateFilterDriver.UmdfFilter]
UmdfLibraryVersion=2.0.0
ServiceBinary= "%13%\ContosoFirmwareUpdateFilterDriver.dll"

[Strings]
CONTOSO = "Contoso Inc."
ContosoCamera.DeviceDesc = "Contoso Camera Extension"
MediaDescription="Contoso Camera Firmware Update Filter Driver Installation Media"
WudfRdDisplayName = "WDF Reflector Driver"