업데이트 처리
펌웨어 업데이트 패키지가 적용되고 시스템이 이후에 다시 부팅되면 Windows OS 로더는 모든 펌웨어 페이로드 파일(이 예제에서는 firmware.bin)을 실제 메모리로 로드합니다. Windows OS 로더는 UEFI UpdateCapsule을 호출할 때 사용할 GUID 및 플래그를 설명하는 각 업데이트의 해당 ESRT 항목의 정보를 사용하여 캡슐 헤더를 만듭니다. 각 캡슐 헤더의 플래그 필드를 설정할 때 Windows OS 로더는 항상 CAPSULE_FLAGS_PERSIST_ACROSS_RESET 및 CAPSULE_FLAGS_INITIATE_RESET 설정합니다. Windows OS 로더는 드라이버 패키지의 INF에 캡슐 플래그가 지정된 경우 DEVICE_FIRMWARE 펌웨어 유형에 대한 CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE 추가로 설정할 수 있습니다. 소유 캡슐 플래그는 INF에도 지정될 수 있으며, 지정된 경우 UEFI UpdateCapsule을 호출할 때 추가로 포함됩니다.
업데이트 드라이버 패키지 작성의 ESRT 테이블 정의 및 펌웨어 리소스 업데이트 드라이버 패키지 INF 예제의 ESRT 예제를 다시 참조하면 Windows OS 로더가 UpdateCapsule에 전달하기 위해 만든 캡슐 헤더는 다음과 같습니다.
| 필드 | 값 | 의견 |
|---|---|---|
| 캡슐 가이드 | {SYSTEM_FIRMWARE} | 해당 ESRT 리소스 항목의 FirmwareClass에서 |
| HeaderSize | ... | 페이지 맞춤 firmware.bin 시작에 패딩됩니다. |
| 플래그 | 0x50000 | 지속하고 초기화합니다. |
| CapsuleImageSize | ... | 캡슐 헤더 크기 + firmware.bin의 크기입니다. |
이 예제에서는 ESRT 테이블에 정의된 두 디바이스 중 하나만 새 펌웨어 리소스 업데이트 드라이버 패키지를 설치했습니다. 표 2의 두 번째 디바이스에 대해 펌웨어 리소스 업데이트 드라이버 패키지를 작성한 다음 해당 펌웨어 리소스 디바이스에 설치한 경우 두 번째 캡슐 헤더는 다음과 같이 만들어집니다.
| 필드 | 값 | 의견 |
|---|---|---|
| 캡슐 가이드 | {DEVICE_FIRMWARE} | 해당 ESRT 리소스 항목의 FirmwareClass에서 |
| HeaderSize | ... | 페이지 맞춤 디바이스에 패딩됩니다. BIN 시작. |
| 플래그 | 0x50000 | 시스템 테이블을 유지, 시작, 다시 설정 및 채웁니다. OR'd는 해당 ESRT 리소스 항목의 CapsuleFlags에서 0x8010. |
| CapsuleImageSize | ... | 캡슐 헤더 크기 + 디바이스 크기입니다. 빈. |
Windows OS 로더가 보류 중인 모든 펌웨어 업데이트를 로드하고 이를 설명하는 데 필요한 데이터 구조를 만든 후 ExitBootServices를 호출하기 전에 UpdateCapsule 런타임 서비스를 호출합니다.
참고 UpdateCapsule은 플랫폼 펌웨어가 스토리지 디바이스를 포함한 모든 디바이스를 단독으로 제어할 수 있는 경우 ExitBootServices 이전에 호출됩니다. UpdateCapsule의 플랫폼 펌웨어 구현은 업데이트를 스테이징하거나 복구 롤백을 지원하기 위해 영구 스토리지에 펌웨어 업데이트 페이로드를 저장할 수 있습니다.