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


Обновление встроенного ПО устройства для УСТРОЙСТВ USB без использования совместного установщика

Внимание

Начиная с WDK для Windows 11 версии 22H2 распространяемые совместно установщики WDF больше не поддерживаются. Сведения о том, как обойти это изменение, см. в статье об известных проблемах, связанных с 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 драйвера addDevice для обновления встроенного ПО. Из этой процедуры драйвер фильтра WDF получает версию встроенного ПО устройства из раздела реестра HW устройства. Встроенное ПО устройства должно поместить версию встроенного ПО с помощью дескриптора MSOS в раздел реестра HW устройства.

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

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

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

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

Когда обратный вызов драйвера фильтра WDF EVT_WDF_DEVICE_D0_ENTRY вызывается позже, драйвер фильтра должен зарегистрировать уведомления об изменении интерфейса устройства с помощью CM_Register_Notification или IoRegisterPlugPlayNotification (UMDF или KMDF), чтобы прослушивать класс интерфейса устройства, в который usb-устройство будет регистрировать устройство. Пример Ror, драйвер фильтра обновления встроенного ПО для камеры 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 нижнего фильтра. Из этой процедуры драйвер фильтра запрашивает версию встроенного ПО устройства из раздела реестра HW устройства. Встроенное ПО устройства должно поместить версию встроенного ПО с помощью дескриптора MSOS или расширения USB-устройства в раздел реестра HW устройства.

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

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

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

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

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

Система перечисляет интерфейс устройства обновления встроенного ПО. Для этого интерфейса обновления встроенного ПО будет загружен пользовательский драйвер 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"