다음은 UefiLessonsPkg/HIIFormDataTemplate/HIIFormDataElements.c에 적용해야 하는 수정 사항이다.
...#include"Data.h"<--- 헤더 파일 추가하기...EFI_STRING UEFIVariableName = UEFI_VARIABLE_STRUCTURE_NAME; <--- UEFI 변수 이름에 대한 상수 추가EFI_STATUSEFIAPIHIIFormDataElementsUnload ( EFI_HANDLE ImageHandle ){ ... UEFI_VARIABLE_STRUCTURE EfiVarstore; <--- `UINT8`대신 우리의 커스텀 스토리지 사용 BufferSize = sizeof(UEFI_VARIABLE_STRUCTURE); <--- Status = gRT->GetVariable( UEFIVariableName,<--- UEFI 변수 이름으로 변수 사용&mHiiVendorDevicePath.VendorDevicePath.Guid,NULL,&BufferSize,&EfiVarstore);if (!EFI_ERROR(Status)) { Status =gRT->SetVariable( UEFIVariableName,<--- UEFI 변수 이름으로 변수 사용&mHiiVendorDevicePath.VendorDevicePath.Guid,0,0,NULL); ...}EFI_STATUSEFIAPIHIIFormDataElementsEntryPoint ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ){ ... UEFI_VARIABLE_STRUCTURE EfiVarstore; <--- `UINT8`대신 우리의 커스텀 스토리지 사용 BufferSize =sizeof(UEFI_VARIABLE_STRUCTURE); <--- Status =gRT->GetVariable ( UEFIVariableName,<--- UEFI 변수 이름으로 변수 사용&mHiiVendorDevicePath.VendorDevicePath.Guid,NULL,&BufferSize,&EfiVarstore);if (EFI_ERROR(Status)) {ZeroMem(&EfiVarstore,sizeof(EfiVarstore)); Status =gRT->SetVariable( UEFIVariableName,<--- UEFI 변수 이름으로 변수 사용&mHiiVendorDevicePath.VendorDevicePath.Guid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,sizeof(EfiVarstore),&EfiVarstore); ...}
그리고 UefiLessonsPkg/HIIFormDataElements/Form.vfr의 수정사항
#include<Uefi/UefiMultiPhase.h>#include"Data.h"<--- 헤더 파일 추가하기formset guid = FORMSET_GUID, title = STRING_TOKEN(FORMSET_TITLE), help = STRING_TOKEN(FORMSET_HELP), efivarstore UEFI_VARIABLE_STRUCTURE, <--- 사용자 정의 유형 사용 attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE, name = FormData, <--- 새 UEFI 변수 이름 guid = FORMSET_GUID; form formid = 1, title = STRING_TOKEN(FORMID1_TITLE); checkbox varid = FormData.CheckboxValue, <--- 구조체 요소로 엑세스 prompt = STRING_TOKEN(CHECKBOX_PROMPT), help = STRING_TOKEN(CHECKBOX_HELP), endcheckbox;endformset;
보다시피 기본적으로 값은 0이다.(ZeroMem(&EfiVarstore, sizeof(EfiVarstore))을 사용하기 때문) 이는 값이 제한 범위(5..20)를 벗어남을 의미한다. 요점은 HII 폼은 초기 값을 제어할 수 없다는 것이다. 최대값 및 최소값은 오직 사용자의입력에 대한 제한이다.
범위를 벗어난 값(예: 4)을 입력하려고 하면 폼에서 허용하지 않는다.
폼 엔진은 허용되지 않는 입력을 입력하는 것까지만 허용한다. 예를 들어 첫 번째 기호로 3을 입력하면 폼 엔진은 다른 숫자 기호를 추가로 입력하는 것을 허용하지 않는다. 값이 사용 가능한 범위를 벗어나기 때문이다.
그러나 허용 범위에 있으면 값을 성공적으로 입력하고 저장(F10)할 수 있다.
dmpstore 명령을 사용하여 값이 성공적으로 설정되었는지 확인할 수 있다. 우리의 경우 값은 저장소의 두 번째 바이트에 있다.(0x0f = 15)
numeric
varid = FormData.NumericValue,
prompt = STRING_TOKEN(NUMERIC_PROMPT),
help = STRING_TOKEN(NUMERIC_HELP),
minimum = 5,
maximum = 20,
step = 2,
endnumeric;
이 필드가 있는 경우 폼의 왼쪽 하단에 값 조정 도움말 메시지가 표시된다.
이는 +/-를 입력하여 요소 값을 늘리거나 줄일 수 있음을 의미한다. 그리고 +/-를 입력할 때마다 단계 필드에 설정한 값만큼 값이 증가/감소한다. 폼 엔진은 심지어 범위 필드를 어느 정도 존중한다. 예를 들어 값이 19이고 +를 입력하면 값이 20으로 설정된다. 다음 +는 값을 5로 변경하고 다음 +는 7로 변경한다.
EFI_IFR_NUMERIC
Summary:
Creates a number question.
Prototype:
#define EFI_IFR_NUMERIC_OP 0x07
typedef struct _EFI_IFR_NUMERIC {
EFI_IFR_OP_HEADER Header;
EFI_IFR_QUESTION_HEADER Question;
UINT8 Flags;
union {
struct {
UINT8 MinValue;
UINT8 MaxValue;
UINT8 Step;
} u8;
struct {
UINT16 MinValue;
UINT16 MaxValue;
UINT16 Step;
} u16;
struct {
UINT32 MinValue;
UINT32 MaxValue;
UINT32 Step;
} u32;
struct {
UINT64 MinValue;
UINT64 MaxValue;
UINT64 Step;
} u64;
} data;
} EFI_IFR_NUMERIC;
Members:
Header The sequence that defines the type of opcode as well as the length of the opcode being defined. Header.OpCode = EFI_IFR_NUMERIC_OP.
Question The standard question header.
Flags Specifies flags related to the numeric question.
MinValue The minimum value to be accepted by the browser for this opcode. The size of the data field may vary from 8 to 64 bits.
MaxValue The maximum value to be accepted by the browser for this opcode. The size of the data field may vary from 8 to 64 bits.
Step Defines the amount to increment or decrement the value each time a user requests a value change. If the step value is 0, then
the input mechanism for the numeric value is to be free-form and require the user to type in the actual value. The size of the
data field may vary from 8 to 64 bits.
checkbox 요소에 대해 이야기할 때 이미 EFI_IFR_OP_HEADER 및 EFI_IFR_QUESTION_HEADER를 조사했었다.