Now let's try to dump the configuration settings for the applications that we've created earlier.
Let's take HIIFormCheckbox.efi
as initial example. This is our minimal HII Form application.
Load its driver in UEFI shell:
FS0:\> load HIIFormCheckbox.efi
And check HIIConfig.efi dump
output:
FS0:\> HIIConfig.efi dump
<...>
It can be a surprise, but the EFI_HII_CONFIG_ROUTING_PROTOCOL.ExportConfig()
call doesn't return settings for the storage created by the HIIFormCheckbox.efi
driver. But at the same time it is possible to return this settings via the direct EFI_HII_CONFIG_ROUTING_PROTOCOL.ExtractConfig()
call. This is the behaviour for storages created with a help of a efivarstore
helper.
So let's try to construct request for our storage. This is the example from the UefiLessonsPkg/HIIFormCheckbox/Form.vfr
code:
#define FORMSET_GUID {0xef2acc91, 0x7b50, 0x4ab9, {0xab, 0x67, 0x2b, 0x4, 0xf8, 0xbc, 0x13, 0x5e}}
formset
guid = FORMSET_GUID,
title = STRING_TOKEN(FORMSET_TITLE),
help = STRING_TOKEN(FORMSET_HELP),
efivarstore UINT8,
attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
name = CheckboxValue,
guid = FORMSET_GUID;
form
formid = 1,
title = STRING_TOKEN(FORMID1_TITLE);
checkbox
varid = CheckboxValue,
prompt = STRING_TOKEN(CHECKBOX_PROMPT),
help = STRING_TOKEN(CHECKBOX_HELP),
endcheckbox;
endform;
endformset;
And here is how we encoded DevicePath in the UefiLessonsPkg/HIIFormCheckbox/HIIFormCheckbox.c
file:
HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
FORMSET_GUID
},
{
END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE,
{
(UINT8) (END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
}
}
};
Putting all of this together our request would look like this:
HIIConfig.efi extract ef2acc91-7b50-4ab9-ab67-2b04f8bc135e CheckboxValue VenHw(ef2acc91-7b50-4ab9-ab67-2b04f8bc135e)
So let's try to use it:
FS0:\> HIIConfig.efi extract ef2acc91-7b50-4ab9-ab67-2b04f8bc135e CheckboxValue VenHw(ef2acc91-7b50-4ab9-ab67-2b04f8bc135e)
Request: GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400
Response: GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400&OFFSET=0000&WIDTH=0001&VALUE=00&GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b0<...>
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
ALTCFG=0000
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
ALTCFG=0001
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
The output is broken in 3 groups. The first group corresponds to the current data setting. Currently the UINT8 value for the Checkbox is equal to 0x00.
The next 2 groups describe alternative configurations. These configurations under the ALTCFG=0000
and ALTCFG=0001
correspond to defaults:
ALTCFG=0000
- Standard defaultALTCFG=0001
- Manufacturing default
We don't have any code for the defaults in our VFR, therefore HII subsystem have returned zero values in them.
Now let's try to go to the form browser and manually change the checkbox value.
After that issue the extract call again:
FS0:\> HIIConfig.efi extract ef2acc91-7b50-4ab9-ab67-2b04f8bc135e CheckboxValue VenHw(ef2acc91-7b50-4ab9-ab67-2b04f8bc135e)
Request: GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400
Response: GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400&OFFSET=0000&WIDTH=0001&VALUE=01&GUID=91cc2aef507bb94aab672b04f8bc135e&NAME=0043006800650063006b0062006f007800560061006c00750065&PATH=0104140091cc2aef507bb94aab672b0<...>
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
OFFSET=0000 WIDTH=0001 VALUE=01
01 | .
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
ALTCFG=0000
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
GUID=91cc2aef507bb94aab672b04f8bc135e (EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E)
NAME=0043006800650063006b0062006f007800560061006c00750065 (CheckboxValue)
PATH=0104140091cc2aef507bb94aab672b04f8bc135e7fff0400 (VenHw(EF2ACC91-7B50-4AB9-AB67-2B04F8BC135E))
ALTCFG=0001
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
You can see how the returned data in the first group (current setting) has changed to the 0x01.
Now let's try to work with more advanced application: HIIFormDataElements.efi
.
It encodes data in a custom UEFI_VARIABLE_STRUCTURE
(UefiLessonsPkg/HIIFormDataElements/Data.h
):
#define FORMSET_GUID {0x531bc507, 0x9191, 0x4fa2, {0x94, 0x46, 0xb8, 0x44, 0xe3, 0x5d, 0xd1, 0x2a}}
#define UEFI_VARIABLE_STRUCTURE_NAME L"FormData"
#pragma pack(1)
typedef struct {
UINT8 CheckboxValue;
UINT16 NumericValue;
CHAR16 StringValue[11];
EFI_HII_DATE DateValue;
EFI_HII_TIME TimeValue;
UINT8 OneOfValue;
UINT8 OrderedListValue[3];
} UEFI_VARIABLE_STRUCTURE;
#pragma pack()
And the VFR code looks like this (UefiLessonsPkg/HIIFormDataElements/Form.vfr
):
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,
guid = FORMSET_GUID;
defaultstore StandardDefault,
prompt = STRING_TOKEN(STANDARD_DEFAULT_PROMPT),
attribute = 0x0000;
defaultstore ManufactureDefault,
prompt = STRING_TOKEN(MFG_DEFAULT_PROMPT),
attribute = 0x0001;
form
formid = 1,
title = STRING_TOKEN(FORMID1_TITLE);
checkbox
varid = FormData.CheckboxValue,
prompt = STRING_TOKEN(CHECKBOX_PROMPT),
help = STRING_TOKEN(CHECKBOX_HELP),
default = TRUE, defaultstore = StandardDefault,
default = FALSE, defaultstore = ManufactureDefault,
endcheckbox;
numeric
name = NumericQuestion,
varid = FormData.NumericValue,
prompt = STRING_TOKEN(NUMERIC_PROMPT),
help = STRING_TOKEN(NUMERIC_HELP),
flags = NUMERIC_SIZE_2 | DISPLAY_UINT_HEX,
//minimum = 0x1234,
//maximum = 0xaa55,
minimum = 0,
maximum = 10,
step = 1,
default = 7, defaultstore = StandardDefault,
default = 8, defaultstore = ManufactureDefault,
endnumeric;
string
name = StringQuestion,
varid = FormData.StringValue,
prompt = STRING_TOKEN(STRING_PROMPT),
help = STRING_TOKEN(STRING_HELP),
minsize = 5,
maxsize = 10,
default = STRING_TOKEN(STRING_DEFAULT), defaultstore = StandardDefault,
default = STRING_TOKEN(STRING_PROMPT), defaultstore = ManufactureDefault,
endstring;
date
varid = FormData.DateValue,
prompt = STRING_TOKEN(DATE_PROMPT),
help = STRING_TOKEN(DATE_HELP),
default = 2021/05/22,
enddate;
time
varid = FormData.TimeValue,
prompt = STRING_TOKEN(TIME_PROMPT),
help = STRING_TOKEN(TIME_HELP),
default = 23:55:33,
endtime;
oneof
name = OneOfQuestion,
varid = FormData.OneOfValue,
prompt = STRING_TOKEN(ONEOF_PROMPT),
help = STRING_TOKEN(ONEOF_HELP),
option text = STRING_TOKEN(ONEOF_OPTION1), value = 0x00, flags = 0;
option text = STRING_TOKEN(ONEOF_OPTION2), value = 0x33, flags = MANUFACTURING;
option text = STRING_TOKEN(ONEOF_OPTION3), value = 0x55, flags = DEFAULT;
endoneof;
orderedlist
varid = FormData.OrderedListValue,
prompt = STRING_TOKEN(ORDERED_LIST_PROMPT),
help = STRING_TOKEN(ORDERED_LIST_HELP),
option text = STRING_TOKEN(ORDERED_LIST_OPTION1), value = 0x0A, flags = 0;
option text = STRING_TOKEN(ORDERED_LIST_OPTION2), value = 0x0B, flags = 0;
option text = STRING_TOKEN(ORDERED_LIST_OPTION3), value = 0x0C, flags = 0;
default = {0x0c, 0x0b, 0x0a},
endlist;
resetbutton
defaultstore = StandardDefault,
prompt = STRING_TOKEN(BTN_STANDARD_DEFAULT_PROMPT),
help = STRING_TOKEN(BTN_STANDARD_DEFAULT_HELP),
endresetbutton;
resetbutton
defaultstore = ManufactureDefault,
prompt = STRING_TOKEN(BTN_MFG_DEFAULT_PROMPT),
help = STRING_TOKEN(BTN_MFG_DEFAULT_HELP),
endresetbutton;
endform;
endformset;
DevicePath is also encoded like VenHw(FORMSET_GUID)
(UefiLessonsPkg/HIIFormDataElements/HIIFormDataElements.c
):
HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath = {
{
{
HARDWARE_DEVICE_PATH,
HW_VENDOR_DP,
{
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
}
},
FORMSET_GUID
},
{
END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE,
{
(UINT8) (END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
}
}
};
Let's try to load the driver to the environment:
FS0:\> load HIIFormDataElements.efi
And request its HII configuration data:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a)
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400
Response: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=0000&WIDTH=0001&VALUE=00&OFFSET=0001&WIDTH=0002&VALUE=0000&OFFSET=0003&WIDTH=0014&VALUE=0000000000000000000000000000000000000000&OFFSET=0019&WIDTH=0004&VALUE=00000000&OFFSET=001<...>
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
OFFSET=0001 WIDTH=0002 VALUE=0000
00 00 | ..
OFFSET=0003 WIDTH=0014 VALUE=0000000000000000000000000000000000000000
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 | ....
OFFSET=0019 WIDTH=0004 VALUE=00000000
00 00 00 00 | ....
OFFSET=001d WIDTH=0003 VALUE=000000
00 00 00 | ...
OFFSET=0020 WIDTH=0001 VALUE=00
00 | .
OFFSET=0021 WIDTH=0003 VALUE=000000
00 00 00 | ...
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0000
OFFSET=0000 WIDTH=0001 VALUE=01
01 | .
OFFSET=0001 WIDTH=0002 VALUE=0007
07 00 | ..
OFFSET=0003 WIDTH=0014 VALUE=00660065006400200067006e0069007200740053
53 00 74 00 72 00 69 00 6E 00 67 00 20 00 64 00 | S.t.r.i.n.g. .d.
65 00 66 00 | e.f.
OFFSET=0019 WIDTH=0004 VALUE=160507e5
E5 07 05 16 | ....
OFFSET=001d WIDTH=0003 VALUE=213717
17 37 21 | .7!
OFFSET=0020 WIDTH=0001 VALUE=55
55 | U
OFFSET=0021 WIDTH=0003 VALUE=0a0b0c
0C 0B 0A | ...
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0001
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
OFFSET=0001 WIDTH=0002 VALUE=0008
08 00 | ..
OFFSET=0003 WIDTH=0014 VALUE=006f0072007000200067006e0069007200740053
53 00 74 00 72 00 69 00 6E 00 67 00 20 00 70 00 | S.t.r.i.n.g. .p.
72 00 6F 00 | r.o.
OFFSET=0019 WIDTH=0004 VALUE=160507e5
E5 07 05 16 | ....
OFFSET=001d WIDTH=0003 VALUE=213717
17 37 21 | .7!
OFFSET=0020 WIDTH=0001 VALUE=33
33 | 3
OFFSET=0021 WIDTH=0003 VALUE=0a0b0c
0C 0B 0A | ...
Here you can see the current values (by default they are all zeros), and the Standard and Manufacturing defaults. As we've actually filled defaults in the VFR code, you can see different data for the Standard and Manufacturing cases.
You can request individual form elements if you provide offset and width in the request. For example here is how you can get settings for the string
element:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a) 3 14
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=3&WIDTH=14
Response: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=3&WIDTH=14&VALUE=0000000000000000000000000000000000000000&GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd1<...>
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
OFFSET=3 WIDTH=14 VALUE=0000000000000000000000000000000000000000
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................
00 00 00 00 | ....
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0000
OFFSET=0003 WIDTH=0014 VALUE=00660065006400200067006e0069007200740053
53 00 74 00 72 00 69 00 6E 00 67 00 20 00 64 00 | S.t.r.i.n.g. .d.
65 00 66 00 | e.f.
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0001
OFFSET=0003 WIDTH=0014 VALUE=006f0072007000200067006e0069007200740053
53 00 74 00 72 00 69 00 6E 00 67 00 20 00 70 00 | S.t.r.i.n.g. .p.
72 00 6F 00 | r.o.
It is not required that OFFSET...OFFSET+WIDTH
should be on the element boundaries. You can provide any OFFSET/WIDTH combination that defines a range within the storage limits. For example 0 2
would include the checkbox
and a part of the numeric
element:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a) 0 2
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=0&WIDTH=2
Response: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=0&WIDTH=2&VALUE=0000&GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&ALTCFG=0000&OFFSET=0000&WI<...>
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
OFFSET=0 WIDTH=2 VALUE=0000
00 00 | ..
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0000
OFFSET=0000 WIDTH=0001 VALUE=01
01 | .
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0001
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
In such cases ALTCFG
's are provided only for the elements that are covered fully by the OFFSET/WIDTH combination. This is why there is ALTCFG
only for the checkbox
element, but not for the numeric
element. If you'll provide 0 3
as OFFSET/WIDTH, both elements would be covered by the range and alternative configurations would be displayed for both of them:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a) 0 3
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=0&WIDTH=3
Response: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=0&WIDTH=3&VALUE=000000&GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&ALTCFG=0000&OFFSET=0000&<...>
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
OFFSET=0 WIDTH=3 VALUE=000000
00 00 00 | ...
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0000
OFFSET=0000 WIDTH=0001 VALUE=01
01 | .
OFFSET=0001 WIDTH=0002 VALUE=0007
07 00 | ..
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
FS0:\> 46006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
ALTCFG=0001
OFFSET=0000 WIDTH=0001 VALUE=00
00 | .
OFFSET=0001 WIDTH=0002 VALUE=0008
08 00 | ..
And if offset/width doesn't cover any element range, there wouldn't be any ALTCFG
's in the output at all:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a) 12 3
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=12&WIDTH=3
Response: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=12&WIDTH=3&VALUE=000000
GUID=07c51b539191a24f9446b844e35dd12a (531BC507-9191-4FA2-9446-B844E35DD12A)
NAME=0046006f0072006d0044006100740061 (FormData)
PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400 (VenHw(531BC507-9191-4FA2-9446-B844E35DD12A))
OFFSET=12 WIDTH=3 VALUE=000000
00 00 00 | ...
Finally if you'll provide OFFSET/WIDTH that cover range outside of the storage limit, you would get an error:
FS0:\> HIIConfig.efi extract 531bc507-9191-4fa2-9446-b844e35dd12a FormData VenHw(531bc507-9191-4fa2-9446-b844e35dd12a) 21 9
Request: GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=21&WIDTH=9
Part of string was unparsed GUID=07c51b539191a24f9446b844e35dd12a&NAME=0046006f0072006d0044006100740061&PATH=0104140007c51b539191a24f9446b844e35dd12a7fff0400&OFFSET=21&WIDTH=9
Error! ExtractConfig returned Device Error
You can try to modify form element values via the form browser and look how extract
response correctly displays the new data.