업데이트 드라이버 패키지 작성

동일한 주기로 업데이트되지 않을 수 있는 다른 펌웨어 리소스 업데이트에 연결되지 않고 자체 버전 관리 체계를 유지할 수 있도록 ESRT 에 설명된 각 펌웨어 리소스에 대한 업데이트 페이로드를 자체 드라이버 패키지 에 번들로 묶고 배포해야 합니다.

다음 예제에서는 표 2의 ESRT 예제에서 {SYSTEM_FIRMWARE} 리소스를 대상으로 하는 펌웨어 리소스 업데이트에 대한 샘플 드라이버 패키지 INF 파일 정의를 제공하여 버전 1에서 버전 2로 업데이트합니다. 참조 목적으로 SYSTEM_FIRMWARE 리소스에 할당된 GUID가 6bd4efb9-23cc-4b4a-ac37-016517413e9a라고 가정해 보겠습니다.

[Version]
Signature   = "$WINDOWS NT$"
Provider    = %Provider%
Class       = Firmware
ClassGuid   = {f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
DriverVer   = 01/01/2012,2.0.0.0
CatalogFile = catalog.cat
PnpLockdown = 1

[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
; Prior to Windows 10, version 1803, the above should instead be:
; %MfgName% = Firmware,NTarm64

[Firmware.NTarm64.10.0...17134]
; Prior to Windows 10, version 1803, the above should instead be:
; [Firmware.NTarm64]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a}

[Firmware_Install.NT]
CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]
firmware.bin

[Firmware_Install.NT.Hw]
AddReg = Firmware_AddReg

[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002
HKR,,FirmwareFilename,,%13%\firmware.bin
; Prior to Windows 10, version 1803, the above should instead be:
; HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin

[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
firmware.bin = 1

[DestinationDirs]
DefaultDestDir = 13
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}

[Strings]
; localizable
Provider     = "Contoso Ltd."
MfgName      = "Fabrikam Inc."
FirmwareDesc = "Fabrikam System Firmware 2.0"
DiskName     = "Firmware Update"

; non-localizable
REG_DWORD     = 0x00010001

다음 섹션을 변경하여 설정에 맞게 사용자 지정합니다.

[Version]
DriverVer --> The date on which this driver package was authored and the driver version of this driver package. Driver version in this driver package must be greater than the current driver version
CatalogFile --> Name of the catalog file

firmware.bin --> Change all instances of firmware.bin with the name of the firmware image name

[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
[Firmware.NTarm64.10.0...17134] --> Change the architecture.
For x86, it should be NTx86
For AMD64, it should be NTamd64

[Firmware.NTarm64.10.0...17134]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource

[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002 --> Version of the firmware for the update
HKR,,FirmwareFilename,,%13%\firmware.bin --> firmware.bin should be replaced with the firmware image name
; Prior to Windows 10, version 1803, the above should instead be:
HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin --> The subdirectory named after the GUID of the firmware resource and the firmware image name

[DestinationDirs]
DefaultDestDir = 13 --> The full destination path as a 'run from Driver Store' binary
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The full destination path for the firmware image file based under a subdirectory named after the GUID of the firmware resource within the %SystemRoot%\Firmware directory

[Strings]
; localizable
Modify any strings here [optional]

다음 표에서는 위의 샘플 드라이버 패키지 INF 파일 정의를 참조하는 다양한 드라이버 패키지 INF 섹션 및 필드에 대해 설명합니다.

섹션/필드 의견
[버전] 드라이버 패키지 버전 관리 정보를 정의합니다.
공급자 %Provider% = Contoso Inc.

([Strings] 섹션에서 지역화됨)
전체 펌웨어 리소스 업데이트 드라이버 패키지의 공급자/공급업체를 식별합니다.
Class/ClassGuid 펌웨어/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
드라이버 패키지의 날짜를 지정합니다. PnP 디바이스 설치 시스템이 시스템에서 사용할 수 있는 최상의 드라이버 패키지를 정확하게 선택할 수 있도록 날짜와 버전은 실제 펌웨어 리소스 업데이트의 날짜와 버전을 최대한 가깝게 반영해야 합니다.
CatalogFile catalog.cat 드라이버 패키지 INF 파일 및 연결된 모든 펌웨어 리소스 업데이트 이진 파일에 서명하는 연결된 카탈로그 파일을 지정합니다.
PnpLockdown 1 관련 없는 애플리케이션에 의해 설치된 드라이버 파일이 외부에서 수정되지 않도록 보호하기 위해 PnP 드라이버 파일 잠금 메커니즘을 사용하도록 설정합니다. 펌웨어 리소스 업데이트의 경우 PnP 시스템 제어 외부에서 펌웨어 리소스 이미지 파일을 변조할 수 없도록 이 설정을 항상 사용하도록 설정해야 합니다.
[제조업체] 펌웨어 리소스 업데이트를 정의하는 모든 고유한 드라이버 제조업체/공급업체를 나열합니다. 각 제조업체 라인은 [<Models>] 섹션을 지정하고 지원되는 대상 플랫폼을 식별합니다.
%MfgName% Fabrikam Inc.

([Strings] 섹션에서 지역화됨)
펌웨어 리소스 업데이트의 제조업체/공급업체를 식별합니다. 공급자 필드와 같을 수 있습니다.
펌웨어

NTarm64.10.0... 17134
대상 드라이버 플랫폼을 포함하여 이 드라이버 패키지에서 지원하는 펌웨어 리소스 디바이스를 정의하는 [<Models>] 섹션을 식별합니다. 이 예제에서 드라이버는 17134 이상 빌드에 Windows 10 Arm64 기반 NT 플랫폼의 대상이며 [<Models>] 섹션은 [Firmware.NTarm64.10.0...입니다. 17134].
[Firmware.NTarm64.10.0... 17134] [<모델>] Windows 10용 Arm64 기반 NT 플랫폼 섹션은 업데이트가 정의된 모든 펌웨어 리소스 디바이스를 나열하는 17134 이상을 빌드합니다. 각 하드웨어 모델 줄은 [<DDInstall>] 섹션과 관련 하드웨어 ID 일치를 지정합니다.
%FirmwareDesc% Fabrikam 시스템 펌웨어 2.0

([Strings] 섹션에서 지역화됨)
펌웨어 리소스 업데이트를 설명합니다. 장치 관리자 및 기타 디바이스 관련 UI에서 연결된 펌웨어 리소스 디바이스 instance 표시하는 데 사용되는 기본 설명 문자열입니다. 이러한 이유로 설명에는 펌웨어 공급업체 및 버전이 포함될 수 있습니다.
Firmware_Install

UEFI\RES_{RESOURCE_GUID}
UEFI\RES_{RESOURCE_GUID} 하드웨어 ID로 식별된 디바이스 instance 대상으로 하는 펌웨어 리소스 업데이트에 대한 설치 단계가 포함된 [<DDInstall] 섹션을 식별합니다. 여기서 RESOURCE_GUID 업데이트되는 펌웨어 리소스의 GUID입니다.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
펌웨어 리소스 업데이트에 대한 설치 단계가 포함된 [<DDInstall>] 섹션입니다. 펌웨어 리소스 업데이트의 경우 펌웨어 리소스 업데이트를 위해 복사할 펌웨어 리소스 이미지 파일만 정의합니다. 이 예제에서 [<DDInstall>] 섹션은 [Firmware_Install.NT]입니다.
firmware.bin 복사할 펌웨어 리소스 업데이트 이미지 파일을 지정합니다. 이 파일이 복사되는 위치에 대한 자세한 내용은 아래 [DestinationDirs] 섹션을 참조하세요.
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Hw] 섹션에는 펌웨어 리소스 업데이트에 대한 하드웨어별 설치 단계가 포함되어 있습니다. 펌웨어 리소스 업데이트의 경우 대상 디바이스 instance 디바이스 하드웨어 키 아래에 설정된 레지스트리 값 형식으로 펌웨어 리소스 업데이트 구성 정보를 정의합니다.
FirmwareId {RESOURCE_GUID} 펌웨어 리소스 업데이트의 펌웨어 GUID입니다. 이는 UEFI\RES_{RESOURCE_GUID} 하드웨어 ID에 포함된 것과 동일한 펌웨어 리소스 GUID이지만 PnP 시스템은 모든 하드웨어 ID를 디바이스/드라이버 일치 목적으로 엄격하게 사용되는 불투명 문자열로 취급하므로 여기에서 독립 실행형 값으로 지정해야 합니다.
FirmwareVersion 0x00000002 REG_DWORD 값으로 지정된 펌웨어 리소스 업데이트의 펌웨어 버전입니다.
FirmwareFilename %13%\firmware.bin Windows 10 버전 1803 이상에서는 '드라이버 저장소에서 실행' 파일이어야 하며 예제와 같이 이진 파일에 대한 전체 경로를 제공해야 합니다. 버전 1803을 Windows 10 이전의 경우 {RESOURCE_GUID}이 특정 펌웨어 리소스를 대상으로 하는 모든 펌웨어 이미지 파일을 구성하는 데 사용되는 하위 디렉터리를 나타내도록 %SystemRoot%\Firmware 디렉터리 아래에 있는 펌웨어 리소스 업데이트의 Update 캡슐 이미지 파일 이름의 상대 경로 및 펌웨어 파일 이름이어야 합니다. 예를 들어 {RESOURCE_GUID}\firmware.bin입니다.
[SourceDisksNames] 펌웨어 업데이트 리소스 이미지 파일과 같은 연결된 드라이버 파일이 포함된 모든 고유한 드라이버 패키지 원본 디스크 위치를 나열합니다.
1 %DiskName% = 펌웨어 업데이트

([Strings] 섹션에서 지역화됨)
임의로 번호가 매겨진 드라이버 패키지 원본 디스크 ID와 설명 이름을 지정합니다. 선택적 드라이버 패키지 상대 하위 디렉터리가 지정되지 않으므로 이 디스크 ID에 연결된 모든 드라이버 파일(예: 펌웨어 리소스 업데이트 이미지 파일)은 INF 파일 바로 옆에 저장되어야 합니다.
[SourceDisksFiles] 드라이버 패키지에서 참조하는 모든 드라이버 파일을 나열하고 [SourceDisksNames] 섹션의 디스크 ID에 연결합니다.
firmware.bin 1 firmware.bin 펌웨어 리소스 업데이트 이미지 파일을 기본 디스크 ID와 연결하여 드라이버 패키지의 일부로 설정합니다. 선택적 파일 관련 하위 디렉터리가 지정되지 않으므로 이 드라이버 파일은 디스크 ID의 하위 디렉터리를 기준으로 라이브 상태가 될 것으로 예상되며, 이 경우 INF 파일 바로 옆에 있습니다.
[DestinationDirs] 드라이버 패키지에서 참조하는 모든 드라이버 파일의 대상 대상 디렉터리를 나열합니다.
DefaultDestDir 13 이 드라이버 패키지에서 복사한 모든 드라이버 파일의 기본 대상 디렉터리를 지정합니다. Windows 10 버전 1803 이상에서는 파일을 '드라이버 스토어에서 실행'하려면 DIRID 13이어야 합니다. 버전 1803을 Windows 10 전에 모든 파일의 대상이 %SystemRoot%\Firmware 아래에 있는지 지정하려면 10,펌웨어\{RESOURCE_GUID}이어야 합니다. 여기서 10(DIRID_WINDOWS)은 기본 %SystemRoot% 디렉터리를 나타내고 {RESOURCE_GUID}은 펌웨어 리소스 GUID의 이름을 따서 명명된 하위 디렉터리를 나타냅니다.
[문자열] 드라이버 패키지 INF 파일의 모든 간접 문자열 토큰(%token%)에 대한 키/값 매핑을 정의합니다. 문자열 토큰을 사용하면 로캘별 [문자열]을 도입하여 드라이버 패키지 INF 파일을 쉽게 지역화할 수 있습니다.<LanguageID>] 섹션. 문자열 토큰 대체를 사용하여 상수 숫자 값(예: REG_DWORD)을 정의하는 데도 유용할 수 있습니다.
공급자 "Contoso Ltd." 문자열 토큰 키/값 매핑의 예입니다.

사용자 자신과 다른 펌웨어 공급업체의 다른 펌웨어 이미지 파일과의 잠재적 충돌을 방지하기 위해 각 펌웨어 리소스 업데이트 이미지 파일 버전에 고유한 이름을 사용하는 것이 중요합니다. 예를 들어 공급업체 이름과 버전 제약 조건을 모두 충족하려면 위의 firmware.bin 에 다음 이름을 할당해야 합니다. Fabrikam-System-Firmware-2.0.bin.

OEM/IHV 사용자 지정 목적으로 잠재적으로 사용되는 지정된 펌웨어 리소스 업데이트 이미지의 변형이 동일한 Windows 시스템 이미지에 배포될 때 충돌하지 않도록 하려면 각 고유한 펌웨어 리소스 업데이트 이미지가 '드라이버 저장소에서 실행' 파일(Windows 10, 버전 1803 이상)이거나 %SystemRoot%\Firmware 디렉터리 내의 하위 디렉터리에서 유지 관리되는 것이 좋습니다. 이 하위 디렉터리의 이름은 대상 펌웨어 리소스 GUID의 이름을 따서 지정해야 합니다. 예를 들어 다음 펌웨어 리소스 업데이트 이미지 경로는 배포 제약 조건을 충족합니다. %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin

펌웨어 드라이버 패키지 서명 테스트

드라이버 패키지 INF 파일 및 펌웨어 페이로드 이진 파일이 준비되면 카탈로그 파일을 생성하려면 전체 드라이버 패키지에 서명해야 합니다. Windows가 펌웨어 리소스 업데이트를 안전하게 시작할 수 있도록 하려면 이 카탈로그 파일이 드라이버 패키지에 포함된 INF 파일 및 펌웨어 페이로드 이진 파일의 유효성 및 신뢰성을 보증하는 것이 중요합니다.

테스트 목적으로 드라이버 패키지에 자체 서명하는 단계는 아래에 열거되어 있습니다. 이러한 단계는 테스트 목적으로만 수행됩니다. 프로덕션 환경에서는 서명을 위해 파트너 센터에 펌웨어 업데이트 드라이버 패키지를 제출해야 합니다. 프로덕션용 펌웨어 드라이버 패키지에 서명하는 단계는 업데이트 패키지 인증 및 서명을 참조하세요.

  1. 최신 Windows SDK 및 Windows 드라이버 키트를 설치합니다. 그러면 makecert, pvk2pfx inf2cat 및 signtool 도구가 아래에 %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86설치됩니다.

  2. 다음 명령을 실행하여 테스트 인증서를 만듭니다.

    makecert.exe -r -pe -a sha256 -eku 1.3.6.1.5.5.7.3.3 -n CN=Foo -sv fwu.pvk fwu.cer
    pvk2pfx.exe -pvk fwu.pvk -spc fwu.cer -pi <Password entered during makecert prompt> -spc fwu.cer -pfx fwu.pfx
    

    자세한 내용은 MakeCert를 참조하세요.

  3. 다음 명령을 실행하여 카탈로그 파일을 만듭니다.

    Inf2Cat.exe /driver:"." /os:8_x64
    

    /driver 인수는 INF가 있는 위치를 가리킵니다. 펌웨어 드라이버 패키지가 의도된 OS에 따라 /os 인수의 값을 변경합니다. 자세한 내용은 Inf2Cat을 참조하세요.

    보안 카탈로그 및 드라이버에 대한 자세한 내용은 카탈로그 파일 및 디지털 서명 및PnP 드라이버 패키지에 대한 카탈로그 파일 만들기를 참조하세요.

  4. 다음 명령을 실행하여 카탈로그 파일에 서명합니다.

    signtool sign /fd sha256 /f fwu.pfx /p <Password entered during makecert prompt> delta.cat
    

    자세한 내용은 SignTool을 참조하세요.

  5. 테스트 시스템에 테스트 인증서를 설치합니다.

    1. fwu.cer 파일을 두 번 클릭하고 인증서 설치 옵션을 선택합니다.

    2. 인증서를 설치하는 동안 다음 옵션을 선택합니다.

      • 스토어 위치의 경우 로컬 머신을 선택합니다.

      • 인증서 저장소의 경우 신뢰할 수 있는 루트 인증 기관을 찾아 선택합니다.

  6. 펌웨어/BIOS 옵션에서 보안 부팅을 사용하지 않도록 설정합니다.

  7. BCD 옵션에서 테스트 서명을 사용하도록 설정하면 카탈로그가 프로덕션 서명되지 않은 경우에도 OS 로더가 부팅 중에 펌웨어 이미지 파일(firmware.bin)을 로드할 수 있습니다. 관리자 권한으로 다음 명령을 실행합니다.

    bcdedit /set testsigning on
    

드라이버 패키지가 서명되면 다음 메커니즘 중 하나를 사용하여 설치할 수 있습니다.

  • 장치 관리자. 수동 테스트를 위해 장치 관리자 펌웨어 리소스 업데이트를 시작하기 위해 펌웨어 리소스 디바이스를 찾고 드라이버를 업데이트하기 위한 친숙한 인터페이스를 제공합니다.

    1. "펌웨어" 클래스에서 원하는 펌웨어 리소스 디바이스를 찾아 유형별로 디바이스를 보거나 연결로 디바이스를 보는 동안 "Microsoft UEFI-Compliant 시스템" 디바이스에서 찾습니다.

    2. 펌웨어 리소스 디바이스를 마우스 오른쪽 단추로 클릭하고 "드라이버 소프트웨어 업데이트..."를 선택합니다. 옵션.

    3. "드라이버 소프트웨어용 내 컴퓨터 찾아보기" 옵션을 사용하여 최신 펌웨어 리소스 업데이트 드라이버 패키지를 찾아 펌웨어 리소스 디바이스에 설치합니다. 이 작업을 수행하면 지정된 펌웨어 리소스 업데이트 드라이버 패키지가 Windows 드라이버 저장소에 추가하고 설치를 시작하기 전에 이미 펌웨어 리소스 디바이스에 있을 수 있는 기존 펌웨어 리소스 업데이트 드라이버 패키지보다 최신 패키지가 됩니다.

  • pnputil. 자동화된 테스트를 위해 PnpUtil 명령줄 유틸리티를 관리자 권한 명령 프롬프트에서 사용하여 펌웨어 리소스 업데이트 드라이버 패키지를 Windows 드라이버 저장소로 가져오고 현재 설치된 드라이버 패키지 INF 파일의 DriverVer에 의해 설정되었거나 타사 제공 드라이버 패키지 INF 파일의 부족으로 인해 이전 펌웨어 리소스 버전을 사용 중인 모든/모든 적용 가능한 펌웨어 리소스 디바이스에서 디바이스 설치를 시작할 수 있습니다. 전부. 예를 들어 다음 명령줄을 사용하여 X:\firmware.inf를 추가하고 설치합니다.

    pnputil -i -a X:\firmware.inf
    

펌웨어 리소스 업데이트가 펌웨어 리소스 디바이스에 성공적으로 설치되었고 현재 펌웨어 버전보다 높은 버전인 펌웨어 리소스 업데이트를 제공하는 경우 디바이스는 업데이트 작업을 완료하기 위해 시스템 재부팅을 기다리고 있습니다. 이 상태의 디바이스는 디바이스 문제를 유지 관리하여 시스템을 다시 부팅해야 한다는 것을 나타내며, 다시 부팅이 수행될 때까지 디바이스가 시작되고 안정적인 상태로 복원되지 않도록 합니다.

펌웨어 업데이트의 상태 유효성 검사

펌웨어 드라이버 패키지가 성공적으로 설치되면 PnP는 업데이트를 적용하기 위해 시스템 재부팅을 요청합니다. 다시 부팅 후 업데이트의 상태 유효성을 검사할 수 있습니다. 업데이트의 상태 레지스트리 키 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}아래에 유지 관리됩니다.

RESOURCE_GUID 업데이트된 리소스의 GUID(ESRT)입니다.

"LastAttemptStatus" 레지스트리 값은 펌웨어 업데이트의 상태 나타냅니다. 여기서 값 0은 성공을 나타내고 0이 아닌 값은 실패를 나타냅니다. 이 레지스트리 키의 값은 ESRT의 LastAttemptStatus 값을 기반으로 OS 로더에 의해 채워진 NTSTATUS 코드입니다. 다음 표에서는 LastAttemptStatus 코드를 해당 NTSTATUS 코드에 매핑합니다.

LastAttemptStatus 코드 NTSTATUS 코드
Success 0 STATUS_SUCCESS 0x00000000
오류: 실패 1 STATUS_UNSUCCESSFUL 0xC0000001
오류: 리소스 부족 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
오류: 잘못된 버전 3 STATUS_REVISION_MISMATCH 0xC0000059
오류: 잘못된 이미지 형식 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
오류: 인증 오류 5 STATUS_ACCESS_DENIED 0xC0000022
오류: 전원 이벤트, AC 연결 안 됨 6 STATUS_POWER_STATE_INVALID 0xC00002D3
오류: 전원 이벤트, 배터리 부족 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

펌웨어 리소스 디바이스 노드의 하드웨어 ID 속성은 XXX가 새 펌웨어 버전인 펌웨어 버전의 변경 내용도 반영해야 합니다.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

펌웨어 업데이트에 실패한 경우 실패한 펌웨어 업데이트를 다시 시도할 수 있습니다.

  • 장치 관리자 펌웨어 노드를 확장하고 펌웨어 리소스 디바이스를 마우스 오른쪽 단추로 클릭한 다음 드라이버 소프트웨어 업데이트를 클릭합니다.

  • 내 컴퓨터에서 드라이버 소프트웨어 찾아보기를 클릭하고 다음 페이지에서 내 컴퓨터의 디바이스 드라이버 목록에서 선택하도록 허용을 클릭합니다.

  • 이전에 설치한 것과 동일한 드라이버를 선택하고 확인을 클릭합니다.

다음 재부팅 후 OS 로더는 펌웨어 드라이버 패키지의 페이로드를 사용하여 UpdateCapsule()을 호출합니다.

ESRT 테이블 정의

플러그 앤 플레이 디바이스

업데이트 처리

UEFI 환경의 디바이스 I/O

원활한 위기 방지 및 복구

펌웨어 업데이트 상태