💻
UEFI 프로젝트
  • 🧑‍🏫프로젝트 개요
  • 📖UEFI 개념
    • 1. BIOS의 과거
    • 2. UEFI 개념
    • 3. BIOS vs UEFI
    • 4. UEFI 부팅 단계
  • 🖥️UEFI 개발
    • UEFI 개발 시작하기
      • 0. EDK II 빌드 환경 구성
      • 1. 간단한 EFI application 만들기
      • 2. 간단한 Pkg 만들기
      • 3. Hello World 출력하기
      • 4. 라이브러리와 Hello World
      • 5. Conf를 통한 Build 단순화
    • 핸들 및 프로토콜
      • 6. 핸들/프로토콜 데이터 베이스 구조 - Part 1
      • 7. 핸들/프로토콜 데이터 베이스 구조 - Part 2
      • 8. HandleProtocol API 함수 & ImageHandle 프로토콜을 통한 정보
      • 9. ProtocolsPerHandle API를 통한 ImageHandle 프로토콜 가져오기
      • 10. EFI_STATUS 타입 과 EFI_ERROR 매크로
    • 메모리 맵
      • 11. EFI 메모리 맵 정보 얻기
      • 12. EFI 메모리 맵을 리눅스 커널 스타일로 바꾸기
    • 명령줄 인수를 받는 간단한 앱 만들기
      • 13.ShellAppMain Entry point
      • 14.gRT->GetNextVariableName API를 사용하여 모든 변수 이름 및 GUID 가져오기
    • 부팅 옵션
      • 15. gRT->GetVariable API를 사용하여 부팅 변수 가져오기 및 구문 분석
      • 16. OVMF 이미지 내에 부팅 옵션 추가
      • 17. 부팅 옵션에 WaitForEvent 함수 추가
      • 18. ReadKeyStroke 함수로 사용자 입력 처리
      • 19. bcfg 명령어를 사용한 부팅 옵션 수정
    • PCD
      • 20. PCD 소개
      • 21. PCD 변수에 대한 Overriding
      • 22. Feature Flag PCD와 BOOLEAN FixedAtBuild PCD의 비교
      • 23. PatchableInModule PCD 및 GenPatchPcdTable/PatchPcdValue 유틸리티를 통해 PCD를 변경하는 방법
      • 24. Dynamic/DynamiEx PCDs
      • 25. PCD 더 알아보기
    • 테이블
      • 26. EFI_CONFIGURATION_TABLE에서 참조되는 테이블
      • 27. dmem/EFI_SMBIOS_PROTOCOL/smbiosview를 통해서 SMBIOS 정보 가져오기
      • 28. EFI_SHELL_PROTOCOL을 통하여 ACPI 테이블을 파일에 저장하기
      • 29. EFI_ACPI_SDT_PROTOCOL 및 ShellLib를 사용하여 ACPI BGRT 테이블에서 BMP 이미지 저장하기
    • PCI
      • 30. PCI 루트 브리지 찾은 후 시스템의 모든 PCI 기능 가져오기
      • 31. ShellLib/PrintLib 함수를 사용해 PCI Vendor/Device 정보 가져오기
      • 32. EFI_PCI_IO_PROTOCOL을 사용해 PCI Option ROM 이미지 표시
      • 33. EfiRom 유틸리티를 사용한 PCI Option ROM 이미지 파싱 및 생성
    • 드라이버 및 라이브러리
      • 34. 간단한 UEFI 드라이버 생성
      • 35. 애플리케이션에서 사용할 간단한 라이브러리 생성
      • 36. Library의 constructor와 destructor, NULL Library
      • 37. Shell에 acpiview 명령을 추가하는 방법 조사
      • 38. 사용자 지정 프로토콜을 만들고 사용하기
      • 39. RegisterKeyNotify / UnrigisterKeyNotify 함수를 사용해 단축키 기능을 추가하는 드라이버 만들기
      • 40. Key #### NVRAM 변수
    • 디버그
      • 41. DEBUG 출력문 내부 구조와 DEBUG 문 제어를 위한 PCD 분석, 그리고 OVMF 부트 로그 가져오기
      • 42. GDB를 이용한 Driver/Application 및 OVMF Debug
    • HII
      • 43. HII 데이터베이스 개념 및 출력
      • 44. HII 데이터베이스 내부
      • 45. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 문자열 목록 게시
      • 46. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 47. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 48. UNI 파일 및 HiiLib를 사용하여 HII String 패키지 게시 및 작업하기
      • 49.MODULE_UNI_FILE/PACKAGE_UNI_FILE/[UserExtensions.TianoCore."ExtraFiles"]의 도움으로 UNI 파일 선언하기
      • 50.UEFI_HII_RESOURCE_SECTION을 사용하여 문자열 패키지와 함께 HII 패키지 목록 게시하기
      • 51. UEFI APP에 메뉴얼 추가하기(shell의 -?와 help 옵션)
      • 52. Russian 글꼴 추가 - Part 1.
      • 53. Russian 글꼴 추가 - Part 2.
      • 54. EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수를 사용하여 다른 언어에 대한 문자열 패키지를 동적으로 추가
      • 55. PlatformLangCodes EFI 변수 수정 및 다른 언어를 동적 추가하기
      • 56. 코드에서 FILE_GUID 및 BASE_NAME을 가져오기
    • VFR
      • 57. VFR을 사용해 간단한 폼 생성 및 EFI_FORM_BROWSER2_PROTOCOL.SendForm()를 통해 화면에 폼 표시하기
      • 58. VFR 요소 : subtitle 및 text
      • 59. 간단한 폼 애플리케이션을 UEFI 드라이버 Form으로 변환하기
      • 60. gRT->SetVariable() 함수를 사용한 UEFI 변수 생성, 변경 및 삭제
      • 61.dmpstore 명령을 사용하여 변수를 파일에 저장/로드하기
      • 62. UEFI Device path의 구조
      • 63. checkbox를 가진 HII 폼 만들기
      • 64. checkbox를 가진 HII폼 만들기
      • 65. VFR 추가 입력 요소 Part 1: number
      • 66. VFR 추가 입력 요소 Part 2: string
      • 67. VFR 추가 입력 요소 Part 3: date & time
      • 68. VFR 추가 입력 요소 Part 3: oneof & orderedlist
      • 69. VFR의 조건부 키워드
      • 70. VFR의 상수 및 연산자가 내장된 기본 조건문
      • 71. 기본 VFR 내장 문자열용 함수
      • 72. label 키워드를 이용하여 HII 양식에 동적 요소 추가하기
      • 73. VFR question 기본값 설정
  • 🔐UEFI 보안
    • 1. 개요
    • 2. 공격 벡터
    • 3. mitigation
    • 4. 정적 분석 방법
    • 5. 동적 분석 방법
Powered by GitBook
On this page
  • Subtitle
  • IFR
  • 다른 subtitle
  • subtitle 범위 활용
  • 빈 문자열
  • Text 요소
  • 다른 text 필드
  1. UEFI 개발
  2. VFR

58. VFR 요소 : subtitle 및 text

이번 장에서는 폼 요소에 대해 알아본다.

이전 장에서 생성한 HIISimpleForm 애플리케이션과 비슷한 내용으로 새로운 HIIStaticForm 애플리케이션을 생성한다. 이전 장에서 생성한 애플리케이션과 차이는 폼 내용만 변경하므로 생성하는 방법은 다루지 않는다. Strings.uni 파일도 수정해야 한다.

VFR의 내용은 아래 내용으로 작성한다.

#define HIISTATICFORM_FORMSET_GUID  {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}}

formset
  guid     = HIISTATICFORM_FORMSET_GUID,
  title    = STRING_TOKEN(HIISTATICFORM_FORMSET_TITLE),
  help     = STRING_TOKEN(HIISTATICFORM_FORMSET_HELP),
  form
    formid = 1,
    title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);
  endform;
endformset;

빌드를 진행하면 아래와 같은 코드를 생성한다. Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst

formset
>00000000: 0E A7 C5 3C 78 32 51 E5 61 4B B7 BD 41 BA 71 7F BA 81 02 00 03 00 01 71 99 03 93 45 85 04 4B B4 5E 32 EB 83 26 04 0E
>00000027: 5C 06 00 00 00 00
>0000002D: 5C 06 00 00 01 00
  guid = {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}},
  title = STRING_TOKEN(0x0002),
  help = STRING_TOKEN(0x0003),
  form
>00000033: 01 86 01 00 04 00
    formid = 1,
    title = STRING_TOKEN(0x0004);
  endform;
>00000039: 29 02
endformset;
>0000003B: 29 02

이 형태는 제목이 있는 빈 형태로 생성된다.

Subtitle

아래 코드로 subtitle을 추가할 수 있다.

subtitle
  text = STRING_TOKEN(SUBTITLE1),
endsubtitle;

그러나 짧은 폼을 사용하는 것이 가장 일반적이다.

subtitle text = STRING_TOKEN(SUBTITLE1);

따라서 위 문자열을 폼 코드에 작성하면 된다.

...
form
  formid = 1,
  title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);

  subtitle text = STRING_TOKEN(SUBTITLE1);
endform;
...

UNI 파일에 subtitle을 위한 문자열을 추가한다.

#string SUBTITLE1                            #language en-US  "Subtitle1"

빌드 후 HIIStaticForm.c를 실행하면 아래와 같이 Subtitle1이 출력된 것을 볼 수 있다.

IFR

formset
>00000000: 0E A7 C5 3C 78 32 51 E5 61 4B B7 BD 41 BA 71 7F BA 81 02 00 03 00 01 71 99 03 93 45 85 04 4B B4 5E 32 EB 83 26 04 0E
>00000027: 5C 06 00 00 00 00
>0000002D: 5C 06 00 00 01 00
  guid = {0x32783cc5, 0xe551, 0x4b61, {0xb7, 0xbd, 0x41, 0xba, 0x71, 0x7f, 0xba, 0x81}},
  title = STRING_TOKEN(0x0002),
  help = STRING_TOKEN(0x0003),
  form
>00000033: 01 86 01 00 04 00
    formid = 1,
    title = STRING_TOKEN(0x0004);
    subtitle text = STRING_TOKEN(0x0005);
>00000039: 02 87 05 00 00 00 00
>00000040: 29 02
  endform;
>00000042: 29 02
endformset;
>00000044: 29 02

subtitle 추가 이전과 이후의 출력을 비교하면 아래와 같이 차이가 있다.

    subtitle text = STRING_TOKEN(0x0005);
>00000039: 02 87 05 00 00 00 00
>00000040: 29 02

2개의 opcode EFI_IFR_SUBTITLE과 EFI_IFR_END가 있다. 이미 EFI_IFR_END의 구조를 확인했기 때문에 이번에는 EFI_IFR_SUBTITLE을 확인한다.

EFI_IFR_SUBTITLE

Summary:
Creates a sub-title in the current form.

Prototype:

#define EFI_IFR_SUBTITLE_OP 0x02

typedef struct _EFI_IFR_SUBTITLE {
 EFI_IFR_OP_HEADER Header;
 EFI_IFR_STATEMENT_HEADER Statement;
 UINT8 Flags;
} EFI_IFR_SUBTITLE;

Members:
Header 		The sequence that defines the type of opcode as well as the length of the opcode being defined.
		For this tag, Header.OpCode = EFI_IFR_SUBTITLE_OP.
Flags 		Identifies specific behavior for the sub-title.

다른 subtitle

위에서 했던 것과 비슷하게 subtitle을 하나 더 생성한다.

...
form
  formid = 1,
  title = STRING_TOKEN(HIISTATICFORM_FORMID1_TITLE);

  subtitle text = STRING_TOKEN(SUBTITLE1);
  subtitle text = STRING_TOKEN(SUBTITLE2);
endform;
...

이 subtitle2는 subtitle1 뒤에 출력된다. 이 원칙은 모든 폼 요소에 적용된다. 기본적으로 다음 요소는 단순히 다른 문자열로 이동한다.

subtitle 범위 활용

위에서 봤듯이 EFI_IFR_SUBTITLE은 나중에 EFI_IFR_END에 의해 닫힌 범위를 열 수 있다.

subtitle 범위 내의 요소를 정의하여 범위 내의 모든 요소를 들여 쓸 수 있다.

아래 내용을 Form.vfr 파일에 작성한다.

subtitle
  text = STRING_TOKEN(SUBTITLE3),

  subtitle text = STRING_TOKEN(SUBTITLE4);
endsubtitle;

Strings.uni 파일에도 SUBTITLE3과 SUBTITLE4를 추가한다.

#string SUBTITLE3                            #language en-US  "Subtitle3"
#string SUBTITLE4                            #language en-US  "Subtitle4"

빌드 후 Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst 내용을 살펴보면 아래와 같이 추가된 것을 볼 수 있다.

    subtitle
>0000004B: 02 87 07 00 00 00 00
      text = STRING_TOKEN(0x0007),
      subtitle text = STRING_TOKEN(0x0008);
>00000052: 02 87 08 00 00 00 00
>00000059: 29 02
    endsubtitle;
>0000005B: 29 02

opcode EFI_IFR_SUBTITLE-EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_END를 확인할 수 있다. 만약 SUBTITLE4를 SUBTITLE3 범위에 넣지 않았을 경우에는 EFI_IFR_SUBTITLE-EFI_IFR_END-EFI_IFR_SUBTITLE-EFI_IFR_END로 된다.

더 깊게 이해하기 위해 SUBTITLE3의 범위 안에 다른 subtitle을 추가하고 범위 뒤에 다른 subtitle을 추가한다.

subtitle
  text = STRING_TOKEN(SUBTITLE3),

  subtitle text = STRING_TOKEN(SUBTITLE4);
  subtitle text = STRING_TOKEN(SUBTITLE5);
endsubtitle;

subtitle text = STRING_TOKEN(SUBTITLE6);

Strings.uni에도 SUBTITLE5와 SUBTITLE6을 추가한다.

#string SUBTITLE5                            #language en-US  "Subtitle5"
#string SUBTITLE6                            #language en-US  "Subtitle6"

빈 문자열

subtitle 요소는 빈 문자열을 폼에 쉽게 추가할 수 있는 방법이다.

SUBTITLE6 바로 위에 아래 코드를 작성한다.

subtitle text = STRING_TOKEN(STR_NULL);

Strings.uni에 STR_NULL을 추가한다.

#string STR_NULL                             #language en-US  ""

빌드 후 실행하면 SUBTITLE6 위가 띄어진 것을 볼 수 있다.

Text 요소

Form.vfr 파일의 마지막 subtitle 아래에 코드를 작성한다.

text
  help = STRING_TOKEN(TEXT1_HELP),
  text = STRING_TOKEN(TEXT1_TEXT);

Strings.uni 파일에 추가한다.

#string TEXT1_TEXT                           #language en-US  "Text1 title"
#string TEXT1_HELP                           #language en-US  "Text1 help"

Build/UefiLessonsPkg/RELEASE_GCC5/X64/UefiLessonsPkg/HIIStaticForm/HIIStaticForm/DEBUG/Form.lst를 확인하면 text가 범위를 열지 않아 하나의 EFI_IFR_TEXT만 생성된다.

    text
>00000078: 03 08 0C 00 0D 00 00 00
      help = STRING_TOKEN(0x000D),
      text = STRING_TOKEN(0x000C);
EFI_IFR_TEXT

Summary:
Creates a static text and image.

Prototype:

#define EFI_IFR_TEXT_OP 0x03

typedef struct _EFI_IFR_TEXT {
 EFI_IFR_OP_HEADER Header;
 EFI_IFR_STATEMENT_HEADER Statement;
 EFI_STRING_ID TextTwo;
} EFI_IFR_TEXT;

Members:
Header 		The sequence that defines the type of opcode as well as the length of the opcode being defined.
		For this tag, Header.OpCode = EFI_IFR_TEXT_OP.
Statement 	Standard statement header.
TextTwo 	The string token reference to the secondary string for this opcode.

Description:
This is a static text/image statement.

아래는 EFI_IFR_STATEMENT_HEADER 필드에 대한 정의다.

EFI_IFR_STATEMENT_HEADER

Summary:
Standard statement header.

Prototype:
typedef struct _EFI_IFR_STATEMENT_HEADER {
 EFI_STRING_ID Prompt;
 EFI_STRING_ID Help;
} EFI_IFR_STATEMENT_HEADER;

Members:
Prompt 	The string identifier of the prompt string for this particular statement. The value 0 indicates no prompt string.
Help 	The string identifier of the help string for this particular statement. The value 0 indicates no help string

Description:
This is the standard header for statements, including questions.

text 요소는 아래와 같이 출력된다.

text 요소와 subtitle 요소의 차이점은 text 요소는 선택할 수 있다는 점이다.

TEXT1 title을 생성했던 방법과 똑같이 TEXT2 title을 생성한다.

방향키를 사용해 Text1 title과 Text2 title을 선택할 수 있고 선택된 text에 따라 help도 자동으로 변경된다.

다른 text 필드

text 필드에 다른 text 요소를 추가할 수 있다.

text
  help = STRING_TOKEN(TEXT3_HELP),
  text = STRING_TOKEN(TEXT3_TEXT),
  text = STRING_TOKEN(TEXT3_TEXT_TWO);
#string TEXT3_TEXT                           #language en-US  "Text3 title"
#string TEXT3_TEXT_TWO                       #language en-US  "Text3 value"
#string TEXT3_HELP                           #language en-US  "Text3 help"

추가된 text 요소는 EFI_IFR_TEXT.TextTwo 필드에 추가된다.

Form Browser에는 아래와 같이 출력된다. 두 번째 문자열은 메뉴 항목의 선택된 위치에 배치된다.

Previous57. VFR을 사용해 간단한 폼 생성 및 EFI_FORM_BROWSER2_PROTOCOL.SendForm()를 통해 화면에 폼 표시하기Next59. 간단한 폼 애플리케이션을 UEFI 드라이버 Form으로 변환하기

Last updated 2 years ago

가장 간단한 폼 요소는 subtitle이다. 사용자에게 일부 정보를 표시하기 위한 대화형이 아닌 텍스트이다. 이 요소는 선택할 수 없다. EDKII Form Browser에서는 검은색으로 표시되는 대화형 요소와는 반대로 파란색으로 표시된다.

이번에 알아볼 요소는 text이다.

🖥️
https://edk2-docs.gitbook.io/edk-ii-vfr-specification/2_vfr_description_in_bnf/211_vfr_form_definition#2.11.5.1-vfr-subtitle-definition
https://edk2-docs.gitbook.io/edk-ii-vfr-specification/2_vfr_description_in_bnf/211_vfr_form_definition#2.11.5.2-vfr-text-definition
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi
HIIStaticForm.efi