2 Function and Macro defintions for to extract default values from UEFI Form package.
4 Copyright (c) 2008, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <FrameworkDxe.h>
18 #include <Protocol/FrameworkHii.h>
19 #include <Protocol/HiiDatabase.h>
21 #include <Library/BaseLib.h>
22 #include <Library/BaseMemoryLib.h>
23 #include <Library/DebugLib.h>
24 #include <Library/MemoryAllocationLib.h>
25 #include <Library/UefiBootServicesTableLib.h>
27 #include "UefiIfrParser.h"
28 #include "UefiIfrDefault.h"
29 #include "HiiDatabase.h"
34 extern CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
35 extern CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
36 extern CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
37 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
39 extern EFI_GUID gZeroGuid
;
42 Fetch the Ifr binary data of a FormSet.
44 @param Handle PackageList Handle
45 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
46 GUID), take the first FormSet found in package
48 @param BinaryLength The length of the FormSet IFR binary.
49 @param BinaryData The buffer designed to receive the FormSet.
51 @retval EFI_SUCCESS Buffer filled with the requested FormSet.
52 BufferLength was updated.
53 @retval EFI_INVALID_PARAMETER The handle is unknown.
54 @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot
55 be found with the requested FormId.
60 IN EFI_HII_HANDLE Handle
,
61 IN OUT EFI_GUID
*FormSetGuid
,
62 OUT UINTN
*BinaryLength
,
63 OUT UINT8
**BinaryData
67 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
73 BOOLEAN ReturnDefault
;
74 UINT32 PackageListLength
;
75 EFI_HII_PACKAGE_HEADER PackageHeader
;
79 ZeroMem (&PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));;
82 // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list
84 if (FormSetGuid
== NULL
|| CompareGuid (FormSetGuid
, &gZeroGuid
)) {
87 ReturnDefault
= FALSE
;
91 // Get HII PackageList
94 HiiPackageList
= NULL
;
95 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
96 if (Status
== EFI_BUFFER_TOO_SMALL
) {
97 HiiPackageList
= AllocatePool (BufferSize
);
98 ASSERT (HiiPackageList
!= NULL
);
100 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
102 if (EFI_ERROR (Status
)) {
107 // Get Form package from this HII package List
109 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
111 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
113 while (Offset
< PackageListLength
) {
114 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
115 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
117 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORM
) {
119 // Search FormSet in this Form Package
121 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
122 while (Offset2
< PackageHeader
.Length
) {
123 OpCodeData
= Package
+ Offset2
;
125 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
127 // Check whether return default FormSet
134 // FormSet GUID is specified, check it
136 if (CompareGuid (FormSetGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
)))) {
141 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
144 if (Offset2
< PackageHeader
.Length
) {
146 // Target formset found
152 Offset
+= PackageHeader
.Length
;
155 if (Offset
>= PackageListLength
) {
157 // Form package not found in this Package List
159 gBS
->FreePool (HiiPackageList
);
160 return EFI_NOT_FOUND
;
163 if (ReturnDefault
&& FormSetGuid
!= NULL
) {
165 // Return the default FormSet GUID
167 CopyMem (FormSetGuid
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
171 // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes
172 // in this FormSet; So, here just simply copy the data from start of a FormSet to the end
173 // of the Form Package.
175 *BinaryLength
= PackageHeader
.Length
- Offset2
;
176 *BinaryData
= AllocateCopyPool (*BinaryLength
, OpCodeData
);
178 gBS
->FreePool (HiiPackageList
);
180 if (*BinaryData
== NULL
) {
181 return EFI_OUT_OF_RESOURCES
;
188 Initialize the internal data structure of a FormSet.
190 @param Handle PackageList Handle
191 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
192 GUID), take the first FormSet found in package
194 @param FormSet FormSet data structure.
196 @retval EFI_SUCCESS The function completed successfully.
197 @retval EFI_NOT_FOUND The specified FormSet could not be found.
202 IN EFI_HII_HANDLE Handle
,
203 IN OUT EFI_GUID
*FormSetGuid
,
204 OUT FORM_BROWSER_FORMSET
*FormSet
208 EFI_HANDLE DriverHandle
;
210 Status
= GetIfrBinaryData (Handle
, FormSetGuid
, &FormSet
->IfrBinaryLength
, &FormSet
->IfrBinaryData
);
211 if (EFI_ERROR (Status
)) {
215 FormSet
->HiiHandle
= Handle
;
216 CopyMem (&FormSet
->Guid
, FormSetGuid
, sizeof (EFI_GUID
));
219 // Retrieve ConfigAccess Protocol associated with this HiiPackageList
221 Status
= mHiiDatabase
->GetPackageListHandle (mHiiDatabase
, Handle
, &DriverHandle
);
222 if (EFI_ERROR (Status
)) {
225 FormSet
->DriverHandle
= DriverHandle
;
226 Status
= gBS
->HandleProtocol (
228 &gEfiHiiConfigAccessProtocolGuid
,
229 (VOID
**) &FormSet
->ConfigAccess
231 if (EFI_ERROR (Status
)) {
233 // Configuration Driver don't attach ConfigAccess protocol to its HII package
234 // list, then there will be no configuration action required
236 FormSet
->ConfigAccess
= NULL
;
240 // Parse the IFR binary OpCodes
242 Status
= ParseOpCodes (FormSet
);
243 if (EFI_ERROR (Status
)) {
250 Set the data position at Offset with Width in Node->Buffer based
253 @param Node The Buffer Storage Node.
254 @param Value The input value.
255 @param Offset The offset in Node->Buffer for the update.
256 @param Width The length of the Value.
263 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
,
264 IN CONST EFI_HII_VALUE
*Value
,
269 ASSERT (Node
->Signature
== UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE
);
270 ASSERT (Offset
+ Width
<= Node
->Size
);
272 CopyMem (Node
->Buffer
+ Offset
, &Value
->Value
.u8
, Width
);
277 Reset Question to its default value.
279 @param FormSet FormSet data structure.
280 @param DefaultId The Class of the default.
282 @retval EFI_SUCCESS Question is reset to default value.
287 IN FORM_BROWSER_FORMSET
*FormSet
,
288 IN FORM_BROWSER_FORM
*Form
,
289 IN FORM_BROWSER_STATEMENT
*Question
,
291 IN UINT16 VarStoreId
,
292 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
297 QUESTION_DEFAULT
*Default
;
298 QUESTION_OPTION
*Option
;
299 EFI_HII_VALUE
*HiiValue
;
301 Status
= EFI_SUCCESS
;
304 // Statement don't have storage, skip them
306 if (Question
->QuestionId
== 0) {
310 if (Question
->VarStoreId
!= VarStoreId
) {
314 ASSERT (Question
->Storage
->Type
== EFI_HII_VARSTORE_BUFFER
);
317 // There are three ways to specify default value for a Question:
318 // 1, use nested EFI_IFR_DEFAULT (highest priority)
319 // 2, set flags of EFI_ONE_OF_OPTION (provide Standard and Manufacturing default)
320 // 3, set flags of EFI_IFR_CHECKBOX (provide Standard and Manufacturing default) (lowest priority)
322 HiiValue
= &Question
->HiiValue
;
325 // EFI_IFR_DEFAULT has highest priority
327 if (!IsListEmpty (&Question
->DefaultListHead
)) {
328 Link
= GetFirstNode (&Question
->DefaultListHead
);
329 while (!IsNull (&Question
->DefaultListHead
, Link
)) {
330 Default
= QUESTION_DEFAULT_FROM_LINK (Link
);
332 if (Default
->DefaultId
== DefaultId
) {
333 if (Default
->ValueExpression
!= NULL
) {
335 // Default is provided by an Expression, evaluate it
337 Status
= EvaluateExpression (FormSet
, Form
, Default
->ValueExpression
);
338 if (EFI_ERROR (Status
)) {
342 CopyMem (HiiValue
, &Default
->ValueExpression
->Result
, sizeof (EFI_HII_VALUE
));
345 // Default value is embedded in EFI_IFR_DEFAULT
347 CopyMem (HiiValue
, &Default
->Value
, sizeof (EFI_HII_VALUE
));
350 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
354 Link
= GetNextNode (&Question
->DefaultListHead
, Link
);
361 if ((Question
->Operand
== EFI_IFR_ONE_OF_OP
) && !IsListEmpty (&Question
->OptionListHead
)) {
362 if (DefaultId
<= EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
364 // OneOfOption could only provide Standard and Manufacturing default
366 Link
= GetFirstNode (&Question
->OptionListHead
);
367 while (!IsNull (&Question
->OptionListHead
, Link
)) {
368 Option
= QUESTION_OPTION_FROM_LINK (Link
);
370 if (((DefaultId
== EFI_HII_DEFAULT_CLASS_STANDARD
) && (Option
->Flags
& EFI_IFR_OPTION_DEFAULT
)) ||
371 ((DefaultId
== EFI_HII_DEFAULT_CLASS_MANUFACTURING
) && (Option
->Flags
& EFI_IFR_OPTION_DEFAULT_MFG
))
373 CopyMem (HiiValue
, &Option
->Value
, sizeof (EFI_HII_VALUE
));
375 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
379 Link
= GetNextNode (&Question
->OptionListHead
, Link
);
385 // EFI_IFR_CHECKBOX - lowest priority
387 if (Question
->Operand
== EFI_IFR_CHECKBOX_OP
) {
388 if (DefaultId
<= EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
390 // Checkbox could only provide Standard and Manufacturing default
392 if (((DefaultId
== EFI_HII_DEFAULT_CLASS_STANDARD
) && (Question
->Flags
& EFI_IFR_CHECKBOX_DEFAULT
)) ||
393 ((DefaultId
== EFI_HII_DEFAULT_CLASS_MANUFACTURING
) && (Question
->Flags
& EFI_IFR_CHECKBOX_DEFAULT_MFG
))
395 HiiValue
->Value
.b
= TRUE
;
397 HiiValue
->Value
.b
= FALSE
;
400 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
410 Reset Questions in a Form to their default value.
412 @param FormSet FormSet data structure.
413 @param Form The Form which to be reset.
414 @param DefaultId The Class of the default.
416 @retval EFI_SUCCESS The function completed successfully.
421 IN FORM_BROWSER_FORMSET
*FormSet
,
422 IN FORM_BROWSER_FORM
*Form
,
424 IN UINT16 VarStoreId
,
425 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
430 FORM_BROWSER_STATEMENT
*Question
;
432 Link
= GetFirstNode (&Form
->StatementListHead
);
433 while (!IsNull (&Form
->StatementListHead
, Link
)) {
434 Question
= FORM_BROWSER_STATEMENT_FROM_LINK (Link
);
436 // Reset Question to its default value
438 Status
= GetQuestionDefault (FormSet
, Form
, Question
, DefaultId
, VarStoreId
, Node
);
439 if (EFI_ERROR (Status
)) {
443 Link
= GetNextNode (&Form
->StatementListHead
, Link
);
450 Destroy all the buffer allocated for the fileds of
451 UEFI_IFR_BUFFER_STORAGE_NODE. The Node itself
454 @param FormSet FormSet data structure.
455 @param DefaultId The Class of the default.
462 IN UEFI_IFR_BUFFER_STORAGE_NODE
*Node
465 SafeFreePool (Node
->Buffer
);
466 SafeFreePool (Node
->Name
);
472 Get the default value for Buffer Type storage named by
473 a Default Store and a Storage Store from a FormSet.
474 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
475 allocated by this function. It is inserted to the link list.
477 @param DefaultStore The Default Store.
478 @param Storage The Storage.
479 @param FormSet The Form Set.
480 @param UefiDefaultsListHead The head of link list for the output.
482 @retval EFI_SUCCESS Successful.
486 GetBufferTypeDefaultIdAndStorageId (
487 IN FORMSET_DEFAULTSTORE
*DefaultStore
,
488 IN FORMSET_STORAGE
*Storage
,
489 IN FORM_BROWSER_FORMSET
*FormSet
,
490 OUT LIST_ENTRY
*UefiDefaultsListHead
493 UEFI_IFR_BUFFER_STORAGE_NODE
*Node
;
495 FORM_BROWSER_FORM
*Form
;
498 Node
= AllocateZeroPool (sizeof (UEFI_IFR_BUFFER_STORAGE_NODE
));
499 ASSERT (Node
!= NULL
);
501 Node
->Signature
= UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE
;
502 Node
->Name
= AllocateCopyPool (StrSize (Storage
->Name
), Storage
->Name
);
503 Node
->DefaultId
= DefaultStore
->DefaultId
;
504 Node
->StoreId
= Storage
->VarStoreId
;
505 CopyGuid (&Node
->Guid
, &Storage
->Guid
);
506 Node
->Size
= Storage
->Size
;
507 Node
->Buffer
= AllocateZeroPool (Node
->Size
);
509 // Extract default from IFR binary
511 Link
= GetFirstNode (&FormSet
->FormListHead
);
512 while (!IsNull (&FormSet
->FormListHead
, Link
)) {
513 Form
= FORM_BROWSER_FORM_FROM_LINK (Link
);
515 Status
= ExtractFormDefault (FormSet
, Form
, DefaultStore
->DefaultId
, Storage
->VarStoreId
, Node
);
516 ASSERT_EFI_ERROR (Status
);
518 Link
= GetNextNode (&FormSet
->FormListHead
, Link
);
521 InsertTailList (UefiDefaultsListHead
, &Node
->List
);
528 Get the default value for Buffer Type storage named by
529 a Default Store from a FormSet.
530 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
531 allocated by this function. The output can be multiple instances
532 of UEFI_IFR_BUFFER_STORAGE_NODE. It is inserted to the link list.
534 @param DefaultStore The Default Store.
535 @param FormSet The Form Set.
536 @param UefiDefaultsListHead The head of link list for the output.
538 @retval EFI_SUCCESS Successful.
542 GetBufferTypeDefaultId (
543 IN FORMSET_DEFAULTSTORE
*DefaultStore
,
544 IN FORM_BROWSER_FORMSET
*FormSet
,
545 OUT LIST_ENTRY
*UefiDefaultsListHead
548 LIST_ENTRY
*StorageLink
;
549 FORMSET_STORAGE
*Storage
;
552 StorageLink
= GetFirstNode (&FormSet
->StorageListHead
);
554 while (!IsNull (&FormSet
->StorageListHead
, StorageLink
)) {
555 Storage
= FORMSET_STORAGE_FROM_LINK(StorageLink
);
557 if (Storage
->Type
== EFI_HII_VARSTORE_BUFFER
) {
558 Status
= GetBufferTypeDefaultIdAndStorageId (DefaultStore
, Storage
, FormSet
, UefiDefaultsListHead
);
561 StorageLink
= GetNextNode (&FormSet
->StorageListHead
, StorageLink
);
569 Get the default value for Buffer Type storage from the first FormSet
570 in the Package List specified by a EFI_HII_HANDLE.
572 The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE.
573 They are inserted to the link list.
575 @param UefiHiiHandle The handle for the package list.
576 @param UefiDefaultsListHead The head of link list for the output.
578 @retval EFI_SUCCESS Successful.
582 UefiIfrGetBufferTypeDefaults (
583 IN EFI_HII_HANDLE UefiHiiHandle
,
584 OUT LIST_ENTRY
**UefiDefaults
587 FORM_BROWSER_FORMSET
*FormSet
;
588 EFI_GUID FormSetGuid
;
589 LIST_ENTRY
*DefaultLink
;
590 FORMSET_DEFAULTSTORE
*DefaultStore
;
593 ASSERT (UefiDefaults
!= NULL
);
595 FormSet
= AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET
));
596 ASSERT (FormSet
!= NULL
);
598 CopyGuid (&FormSetGuid
, &gZeroGuid
);
599 Status
= InitializeFormSet (UefiHiiHandle
, &FormSetGuid
, FormSet
);
600 ASSERT_EFI_ERROR (Status
);
602 *UefiDefaults
= AllocateZeroPool (sizeof (LIST_ENTRY
));
603 ASSERT (UefiDefaults
!= NULL
);
604 InitializeListHead (*UefiDefaults
);
606 DefaultLink
= GetFirstNode (&FormSet
->DefaultStoreListHead
);
607 while (!IsNull (&FormSet
->DefaultStoreListHead
, DefaultLink
)) {
608 DefaultStore
= FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink
);
610 Status
= GetBufferTypeDefaultId (DefaultStore
, FormSet
, *UefiDefaults
);
611 ASSERT_EFI_ERROR (Status
);
613 DefaultLink
= GetNextNode (&FormSet
->DefaultStoreListHead
, DefaultLink
);
616 DestroyFormSet (FormSet
);
623 Convert the UEFI Buffer Type default values to a Framework HII default
624 values specified by a EFI_HII_VARIABLE_PACK_LIST structure.
626 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
627 which contains the default values retrived from
629 @param DefaultMask The default mask.
630 The valid values are FRAMEWORK_EFI_IFR_FLAG_DEFAULT
631 and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.
632 UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
633 from specification to valid default class.
634 @param VariablePackList The output default value in a format defined in Framework.
637 @retval EFI_SUCCESS Successful.
638 @retval EFI_INVALID_PARAMETER The default mask is not FRAMEWORK_EFI_IFR_FLAG_DEFAULT or
639 FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.
642 UefiDefaultsToFwDefaults (
643 IN LIST_ENTRY
*ListHead
,
644 IN UINTN DefaultMask
,
645 OUT EFI_HII_VARIABLE_PACK_LIST
**VariablePackList
649 UEFI_IFR_BUFFER_STORAGE_NODE
*Node
;
653 EFI_HII_VARIABLE_PACK
*Pack
;
654 EFI_HII_VARIABLE_PACK_LIST
*PackList
;
656 if (DefaultMask
== FRAMEWORK_EFI_IFR_FLAG_DEFAULT
) {
657 DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
;
658 } else if (DefaultMask
== FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
) {
659 DefaultId
= EFI_HII_DEFAULT_CLASS_MANUFACTURING
;
662 // UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
663 // from specification to valid default class.
666 return EFI_INVALID_PARAMETER
;
670 // Calculate the size of the output EFI_HII_VARIABLE_PACK_LIST structure
674 List
= GetFirstNode (ListHead
);
675 while (!IsNull (ListHead
, List
)) {
676 Node
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List
);
678 if (Node
->DefaultId
== DefaultId
) {
680 Size
+= StrSize (Node
->Name
);
685 List
= GetNextNode (ListHead
, List
);
688 Size
= Size
+ Count
* (sizeof (EFI_HII_VARIABLE_PACK_LIST
) + sizeof (EFI_HII_VARIABLE_PACK
));
690 *VariablePackList
= AllocateZeroPool (Size
);
691 ASSERT (*VariablePackList
!= NULL
);
693 List
= GetFirstNode (ListHead
);
695 PackList
= (EFI_HII_VARIABLE_PACK_LIST
*) *VariablePackList
;
696 Pack
= (EFI_HII_VARIABLE_PACK
*) (PackList
+ 1);
697 while (!IsNull (ListHead
, List
)) {
698 Node
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List
);
701 if (Node
->DefaultId
== DefaultId
) {
703 Size
+= StrSize (Node
->Name
);
704 Size
+= sizeof (EFI_HII_VARIABLE_PACK
);
707 // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.
708 // So the default storage of Var Store in VFR from a Framework module
709 // should be translated to 0xFFEE.
711 if (Node
->StoreId
== RESERVED_VARSTORE_ID
) {
712 Pack
->VariableId
= 0;
714 Pack
->VariableId
= Node
->StoreId
;
717 // Initialize EFI_HII_VARIABLE_PACK
719 Pack
->Header
.Type
= 0;
720 Pack
->Header
.Length
= (UINT32
) Size
;
721 Pack
->VariableNameLength
= (UINT32
) StrSize (Node
->Name
);
722 CopyMem (&Pack
->VariableGuid
, &Node
->Guid
, sizeof (EFI_GUID
));
724 CopyMem ((UINT8
*) Pack
+ sizeof (EFI_HII_VARIABLE_PACK
), Node
->Name
, StrSize (Node
->Name
));
725 CopyMem ((UINT8
*) Pack
+ sizeof (EFI_HII_VARIABLE_PACK
) + Pack
->VariableNameLength
, Node
->Buffer
, Node
->Size
);
727 Size
+= sizeof (EFI_HII_VARIABLE_PACK_LIST
);
730 // initialize EFI_HII_VARIABLE_PACK_LIST
732 PackList
->VariablePack
= Pack
;
733 PackList
->NextVariablePack
= (EFI_HII_VARIABLE_PACK_LIST
*)((UINT8
*) PackList
+ Size
);
737 List
= GetNextNode (ListHead
, List
);
746 Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.
748 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
749 which contains the default values retrived from
757 IN LIST_ENTRY
*ListHead
761 UEFI_IFR_BUFFER_STORAGE_NODE
*Default
;
763 Link
= GetFirstNode (ListHead
);
765 while (!IsNull (ListHead
, Link
)) {
766 Default
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link
);
768 RemoveEntryList (Link
);
770 DestroyDefaultNode (Default
);
772 Link
= GetNextNode (ListHead
, Link
);