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"
33 extern CONST EFI_HII_DATABASE_PROTOCOL
*mHiiDatabase
;
34 extern CONST EFI_HII_IMAGE_PROTOCOL
*mHiiImageProtocol
;
35 extern CONST EFI_HII_STRING_PROTOCOL
*mHiiStringProtocol
;
36 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRoutingProtocol
;
38 extern EFI_GUID gZeroGuid
;
41 Fetch the Ifr binary data of a FormSet.
43 @param Handle PackageList Handle
44 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
45 GUID), take the first FormSet found in package
47 @param BinaryLength The length of the FormSet IFR binary.
48 @param BinaryData The buffer designed to receive the FormSet.
50 @retval EFI_SUCCESS Buffer filled with the requested FormSet.
51 BufferLength was updated.
52 @retval EFI_INVALID_PARAMETER The handle is unknown.
53 @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot
54 be found with the requested FormId.
59 IN EFI_HII_HANDLE Handle
,
60 IN OUT EFI_GUID
*FormSetGuid
,
61 OUT UINTN
*BinaryLength
,
62 OUT UINT8
**BinaryData
66 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
72 BOOLEAN ReturnDefault
;
73 UINT32 PackageListLength
;
74 EFI_HII_PACKAGE_HEADER PackageHeader
;
78 ZeroMem (&PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));;
81 // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list
83 if (FormSetGuid
== NULL
|| CompareGuid (FormSetGuid
, &gZeroGuid
)) {
86 ReturnDefault
= FALSE
;
90 // Get HII PackageList
93 HiiPackageList
= NULL
;
94 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
95 if (Status
== EFI_BUFFER_TOO_SMALL
) {
96 HiiPackageList
= AllocatePool (BufferSize
);
97 ASSERT (HiiPackageList
!= NULL
);
99 Status
= mHiiDatabase
->ExportPackageLists (mHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
101 if (EFI_ERROR (Status
)) {
106 // Get Form package from this HII package List
108 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
110 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
112 while (Offset
< PackageListLength
) {
113 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
114 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
116 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORM
) {
118 // Search FormSet in this Form Package
120 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
121 while (Offset2
< PackageHeader
.Length
) {
122 OpCodeData
= Package
+ Offset2
;
124 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
126 // Check whether return default FormSet
133 // FormSet GUID is specified, check it
135 if (CompareGuid (FormSetGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
)))) {
140 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
143 if (Offset2
< PackageHeader
.Length
) {
145 // Target formset found
151 Offset
+= PackageHeader
.Length
;
154 if (Offset
>= PackageListLength
) {
156 // Form package not found in this Package List
158 gBS
->FreePool (HiiPackageList
);
159 return EFI_NOT_FOUND
;
162 if (ReturnDefault
&& FormSetGuid
!= NULL
) {
164 // Return the default FormSet GUID
166 CopyMem (FormSetGuid
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Guid
, sizeof (EFI_GUID
));
170 // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes
171 // in this FormSet; So, here just simply copy the data from start of a FormSet to the end
172 // of the Form Package.
174 *BinaryLength
= PackageHeader
.Length
- Offset2
;
175 *BinaryData
= AllocateCopyPool (*BinaryLength
, OpCodeData
);
177 gBS
->FreePool (HiiPackageList
);
179 if (*BinaryData
== NULL
) {
180 return EFI_OUT_OF_RESOURCES
;
187 Initialize the internal data structure of a FormSet.
189 @param Handle PackageList Handle
190 @param FormSetGuid GUID of a formset. If not specified (NULL or zero
191 GUID), take the first FormSet found in package
193 @param FormSet FormSet data structure.
195 @retval EFI_SUCCESS The function completed successfully.
196 @retval EFI_NOT_FOUND The specified FormSet could not be found.
201 IN EFI_HII_HANDLE Handle
,
202 IN OUT EFI_GUID
*FormSetGuid
,
203 OUT FORM_BROWSER_FORMSET
*FormSet
207 EFI_HANDLE DriverHandle
;
209 Status
= GetIfrBinaryData (Handle
, FormSetGuid
, &FormSet
->IfrBinaryLength
, &FormSet
->IfrBinaryData
);
210 if (EFI_ERROR (Status
)) {
214 FormSet
->HiiHandle
= Handle
;
215 CopyMem (&FormSet
->Guid
, FormSetGuid
, sizeof (EFI_GUID
));
218 // Retrieve ConfigAccess Protocol associated with this HiiPackageList
220 Status
= mHiiDatabase
->GetPackageListHandle (mHiiDatabase
, Handle
, &DriverHandle
);
221 if (EFI_ERROR (Status
)) {
224 FormSet
->DriverHandle
= DriverHandle
;
225 Status
= gBS
->HandleProtocol (
227 &gEfiHiiConfigAccessProtocolGuid
,
228 (VOID
**) &FormSet
->ConfigAccess
230 if (EFI_ERROR (Status
)) {
232 // Configuration Driver don't attach ConfigAccess protocol to its HII package
233 // list, then there will be no configuration action required
235 FormSet
->ConfigAccess
= NULL
;
239 // Parse the IFR binary OpCodes
241 Status
= ParseOpCodes (FormSet
);
242 if (EFI_ERROR (Status
)) {
249 Set the data position at Offset with Width in Node->Buffer based
252 @param Node The Buffer Storage Node.
253 @param Value The input value.
254 @param Offset The offset in Node->Buffer for the update.
255 @param Width The length of the Value.
262 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
,
263 IN CONST EFI_HII_VALUE
*Value
,
268 ASSERT (Node
->Signature
== UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE
);
269 ASSERT (Offset
+ Width
<= Node
->Size
);
271 CopyMem (Node
->Buffer
+ Offset
, &Value
->Value
.u8
, Width
);
276 Reset Question to its default value.
278 @param FormSet FormSet data structure.
279 @param DefaultId The Class of the default.
281 @retval EFI_SUCCESS Question is reset to default value.
286 IN FORM_BROWSER_FORMSET
*FormSet
,
287 IN FORM_BROWSER_FORM
*Form
,
288 IN FORM_BROWSER_STATEMENT
*Question
,
290 IN UINT16 VarStoreId
,
291 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
296 QUESTION_DEFAULT
*Default
;
297 QUESTION_OPTION
*Option
;
298 EFI_HII_VALUE
*HiiValue
;
300 Status
= EFI_SUCCESS
;
303 // Statement don't have storage, skip them
305 if (Question
->QuestionId
== 0) {
309 if (Question
->VarStoreId
!= VarStoreId
) {
313 ASSERT (Question
->Storage
->Type
== EFI_HII_VARSTORE_BUFFER
);
316 // There are three ways to specify default value for a Question:
317 // 1, use nested EFI_IFR_DEFAULT (highest priority)
318 // 2, set flags of EFI_ONE_OF_OPTION (provide Standard and Manufacturing default)
319 // 3, set flags of EFI_IFR_CHECKBOX (provide Standard and Manufacturing default) (lowest priority)
321 HiiValue
= &Question
->HiiValue
;
324 // EFI_IFR_DEFAULT has highest priority
326 if (!IsListEmpty (&Question
->DefaultListHead
)) {
327 Link
= GetFirstNode (&Question
->DefaultListHead
);
328 while (!IsNull (&Question
->DefaultListHead
, Link
)) {
329 Default
= QUESTION_DEFAULT_FROM_LINK (Link
);
331 if (Default
->DefaultId
== DefaultId
) {
332 if (Default
->ValueExpression
!= NULL
) {
334 // Default is provided by an Expression, evaluate it
336 Status
= EvaluateExpression (FormSet
, Form
, Default
->ValueExpression
);
337 if (EFI_ERROR (Status
)) {
341 CopyMem (HiiValue
, &Default
->ValueExpression
->Result
, sizeof (EFI_HII_VALUE
));
344 // Default value is embedded in EFI_IFR_DEFAULT
346 CopyMem (HiiValue
, &Default
->Value
, sizeof (EFI_HII_VALUE
));
349 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
353 Link
= GetNextNode (&Question
->DefaultListHead
, Link
);
360 if ((Question
->Operand
== EFI_IFR_ONE_OF_OP
) && !IsListEmpty (&Question
->OptionListHead
)) {
361 if (DefaultId
<= EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
363 // OneOfOption could only provide Standard and Manufacturing default
365 Link
= GetFirstNode (&Question
->OptionListHead
);
366 while (!IsNull (&Question
->OptionListHead
, Link
)) {
367 Option
= QUESTION_OPTION_FROM_LINK (Link
);
369 if (((DefaultId
== EFI_HII_DEFAULT_CLASS_STANDARD
) && (Option
->Flags
& EFI_IFR_OPTION_DEFAULT
)) ||
370 ((DefaultId
== EFI_HII_DEFAULT_CLASS_MANUFACTURING
) && (Option
->Flags
& EFI_IFR_OPTION_DEFAULT_MFG
))
372 CopyMem (HiiValue
, &Option
->Value
, sizeof (EFI_HII_VALUE
));
374 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
378 Link
= GetNextNode (&Question
->OptionListHead
, Link
);
384 // EFI_IFR_CHECKBOX - lowest priority
386 if (Question
->Operand
== EFI_IFR_CHECKBOX_OP
) {
387 if (DefaultId
<= EFI_HII_DEFAULT_CLASS_MANUFACTURING
) {
389 // Checkbox could only provide Standard and Manufacturing default
391 if (((DefaultId
== EFI_HII_DEFAULT_CLASS_STANDARD
) && (Question
->Flags
& EFI_IFR_CHECKBOX_DEFAULT
)) ||
392 ((DefaultId
== EFI_HII_DEFAULT_CLASS_MANUFACTURING
) && (Question
->Flags
& EFI_IFR_CHECKBOX_DEFAULT_MFG
))
394 HiiValue
->Value
.b
= TRUE
;
396 HiiValue
->Value
.b
= FALSE
;
399 SetNodeBuffer (Node
, HiiValue
, Question
->VarStoreInfo
.VarOffset
, Question
->StorageWidth
);
409 Reset Questions in a Form to their default value.
411 @param FormSet FormSet data structure.
412 @param Form The Form which to be reset.
413 @param DefaultId The Class of the default.
415 @retval EFI_SUCCESS The function completed successfully.
420 IN FORM_BROWSER_FORMSET
*FormSet
,
421 IN FORM_BROWSER_FORM
*Form
,
423 IN UINT16 VarStoreId
,
424 OUT UEFI_IFR_BUFFER_STORAGE_NODE
*Node
429 FORM_BROWSER_STATEMENT
*Question
;
431 Link
= GetFirstNode (&Form
->StatementListHead
);
432 while (!IsNull (&Form
->StatementListHead
, Link
)) {
433 Question
= FORM_BROWSER_STATEMENT_FROM_LINK (Link
);
435 // Reset Question to its default value
437 Status
= GetQuestionDefault (FormSet
, Form
, Question
, DefaultId
, VarStoreId
, Node
);
438 if (EFI_ERROR (Status
)) {
442 Link
= GetNextNode (&Form
->StatementListHead
, Link
);
449 Destroy all the buffer allocated for the fileds of
450 UEFI_IFR_BUFFER_STORAGE_NODE. The Node itself
453 @param FormSet FormSet data structure.
454 @param DefaultId The Class of the default.
461 IN UEFI_IFR_BUFFER_STORAGE_NODE
*Node
464 SafeFreePool (Node
->Buffer
);
465 SafeFreePool (Node
->Name
);
471 Get the default value for Buffer Type storage named by
472 a Default Store and a Storage Store from a FormSet.
473 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
474 allocated by this function. It is inserted to the link list.
476 @param DefaultStore The Default Store.
477 @param Storage The Storage.
478 @param FormSet The Form Set.
479 @param UefiDefaultsListHead The head of link list for the output.
481 @retval EFI_SUCCESS Successful.
485 GetBufferTypeDefaultIdAndStorageId (
486 IN FORMSET_DEFAULTSTORE
*DefaultStore
,
487 IN FORMSET_STORAGE
*Storage
,
488 IN FORM_BROWSER_FORMSET
*FormSet
,
489 OUT LIST_ENTRY
*UefiDefaultsListHead
492 UEFI_IFR_BUFFER_STORAGE_NODE
*Node
;
494 FORM_BROWSER_FORM
*Form
;
497 Node
= AllocateZeroPool (sizeof (UEFI_IFR_BUFFER_STORAGE_NODE
));
498 ASSERT (Node
!= NULL
);
500 Node
->Signature
= UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE
;
501 Node
->Name
= AllocateCopyPool (StrSize (Storage
->Name
), Storage
->Name
);
502 Node
->DefaultId
= DefaultStore
->DefaultId
;
503 Node
->StoreId
= Storage
->VarStoreId
;
504 CopyGuid (&Node
->Guid
, &Storage
->Guid
);
505 Node
->Size
= Storage
->Size
;
506 Node
->Buffer
= AllocateZeroPool (Node
->Size
);
508 // Extract default from IFR binary
510 Link
= GetFirstNode (&FormSet
->FormListHead
);
511 while (!IsNull (&FormSet
->FormListHead
, Link
)) {
512 Form
= FORM_BROWSER_FORM_FROM_LINK (Link
);
514 Status
= ExtractFormDefault (FormSet
, Form
, DefaultStore
->DefaultId
, Storage
->VarStoreId
, Node
);
515 ASSERT_EFI_ERROR (Status
);
517 Link
= GetNextNode (&FormSet
->FormListHead
, Link
);
520 InsertTailList (UefiDefaultsListHead
, &Node
->List
);
527 Get the default value for Buffer Type storage named by
528 a Default Store from a FormSet.
529 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE
530 allocated by this function. The output can be multiple instances
531 of UEFI_IFR_BUFFER_STORAGE_NODE. It is inserted to the link list.
533 @param DefaultStore The Default Store.
534 @param FormSet The Form Set.
535 @param UefiDefaultsListHead The head of link list for the output.
537 @retval EFI_SUCCESS Successful.
541 GetBufferTypeDefaultId (
542 IN FORMSET_DEFAULTSTORE
*DefaultStore
,
543 IN FORM_BROWSER_FORMSET
*FormSet
,
544 OUT LIST_ENTRY
*UefiDefaultsListHead
547 LIST_ENTRY
*StorageLink
;
548 FORMSET_STORAGE
*Storage
;
551 StorageLink
= GetFirstNode (&FormSet
->StorageListHead
);
553 while (!IsNull (&FormSet
->StorageListHead
, StorageLink
)) {
554 Storage
= FORMSET_STORAGE_FROM_LINK(StorageLink
);
556 if (Storage
->Type
== EFI_HII_VARSTORE_BUFFER
) {
557 Status
= GetBufferTypeDefaultIdAndStorageId (DefaultStore
, Storage
, FormSet
, UefiDefaultsListHead
);
560 StorageLink
= GetNextNode (&FormSet
->StorageListHead
, StorageLink
);
568 Get the default value for Buffer Type storage from the first FormSet
569 in the Package List specified by a EFI_HII_HANDLE.
571 The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE.
572 They are inserted to the link list.
574 @param UefiHiiHandle The handle for the package list.
575 @param UefiDefaultsListHead The head of link list for the output.
577 @retval EFI_SUCCESS Successful.
581 UefiIfrGetBufferTypeDefaults (
582 IN EFI_HII_HANDLE UefiHiiHandle
,
583 OUT LIST_ENTRY
**UefiDefaults
586 FORM_BROWSER_FORMSET
*FormSet
;
587 EFI_GUID FormSetGuid
;
588 LIST_ENTRY
*DefaultLink
;
589 FORMSET_DEFAULTSTORE
*DefaultStore
;
592 ASSERT (UefiDefaults
!= NULL
);
594 FormSet
= AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET
));
595 ASSERT (FormSet
!= NULL
);
597 CopyGuid (&FormSetGuid
, &gZeroGuid
);
598 Status
= InitializeFormSet (UefiHiiHandle
, &FormSetGuid
, FormSet
);
599 ASSERT_EFI_ERROR (Status
);
601 *UefiDefaults
= AllocateZeroPool (sizeof (LIST_ENTRY
));
602 ASSERT (UefiDefaults
!= NULL
);
603 InitializeListHead (*UefiDefaults
);
605 DefaultLink
= GetFirstNode (&FormSet
->DefaultStoreListHead
);
606 while (!IsNull (&FormSet
->DefaultStoreListHead
, DefaultLink
)) {
607 DefaultStore
= FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink
);
609 Status
= GetBufferTypeDefaultId (DefaultStore
, FormSet
, *UefiDefaults
);
610 ASSERT_EFI_ERROR (Status
);
612 DefaultLink
= GetNextNode (&FormSet
->DefaultStoreListHead
, DefaultLink
);
615 DestroyFormSet (FormSet
);
622 Convert the UEFI Buffer Type default values to a Framework HII default
623 values specified by a EFI_HII_VARIABLE_PACK_LIST structure.
625 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
626 which contains the default values retrived from
628 @param DefaultMask The default mask.
629 The valid values are FRAMEWORK_EFI_IFR_FLAG_DEFAULT
630 and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.
631 UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
632 from specification to valid default class.
633 @param VariablePackList The output default value in a format defined in Framework.
636 @retval EFI_SUCCESS Successful.
637 @retval EFI_INVALID_PARAMETER The default mask is not FRAMEWORK_EFI_IFR_FLAG_DEFAULT or
638 FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.
641 UefiDefaultsToFwDefaults (
642 IN LIST_ENTRY
*ListHead
,
643 IN UINTN DefaultMask
,
644 OUT EFI_HII_VARIABLE_PACK_LIST
**VariablePackList
648 UEFI_IFR_BUFFER_STORAGE_NODE
*Node
;
652 EFI_HII_VARIABLE_PACK
*Pack
;
653 EFI_HII_VARIABLE_PACK_LIST
*PackList
;
655 if (DefaultMask
== FRAMEWORK_EFI_IFR_FLAG_DEFAULT
) {
656 DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
;
657 } else if (DefaultMask
== FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
) {
658 DefaultId
= EFI_HII_DEFAULT_CLASS_MANUFACTURING
;
661 // UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING
662 // from specification to valid default class.
665 return EFI_INVALID_PARAMETER
;
669 // Calculate the size of the output EFI_HII_VARIABLE_PACK_LIST structure
673 List
= GetFirstNode (ListHead
);
674 while (!IsNull (ListHead
, List
)) {
675 Node
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List
);
677 if (Node
->DefaultId
== DefaultId
) {
679 Size
+= StrSize (Node
->Name
);
684 List
= GetNextNode (ListHead
, List
);
687 Size
= Size
+ Count
* (sizeof (EFI_HII_VARIABLE_PACK_LIST
) + sizeof (EFI_HII_VARIABLE_PACK
));
689 *VariablePackList
= AllocateZeroPool (Size
);
690 ASSERT (*VariablePackList
!= NULL
);
692 List
= GetFirstNode (ListHead
);
694 PackList
= (EFI_HII_VARIABLE_PACK_LIST
*) *VariablePackList
;
695 Pack
= (EFI_HII_VARIABLE_PACK
*) (PackList
+ 1);
696 while (!IsNull (ListHead
, List
)) {
697 Node
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List
);
700 if (Node
->DefaultId
== DefaultId
) {
702 Size
+= StrSize (Node
->Name
);
703 Size
+= sizeof (EFI_HII_VARIABLE_PACK
);
706 // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.
707 // So the default storage of Var Store in VFR from a Framework module
708 // should be translated to 0xFFEE.
710 if (Node
->StoreId
== RESERVED_VARSTORE_ID
) {
711 Pack
->VariableId
= 0;
713 Pack
->VariableId
= Node
->StoreId
;
716 // Initialize EFI_HII_VARIABLE_PACK
718 Pack
->Header
.Type
= 0;
719 Pack
->Header
.Length
= (UINT32
) Size
;
720 Pack
->VariableNameLength
= (UINT32
) StrSize (Node
->Name
);
721 CopyMem (&Pack
->VariableGuid
, &Node
->Guid
, sizeof (EFI_GUID
));
723 CopyMem ((UINT8
*) Pack
+ sizeof (EFI_HII_VARIABLE_PACK
), Node
->Name
, StrSize (Node
->Name
));
724 CopyMem ((UINT8
*) Pack
+ sizeof (EFI_HII_VARIABLE_PACK
) + Pack
->VariableNameLength
, Node
->Buffer
, Node
->Size
);
726 Size
+= sizeof (EFI_HII_VARIABLE_PACK_LIST
);
729 // initialize EFI_HII_VARIABLE_PACK_LIST
731 PackList
->VariablePack
= Pack
;
732 PackList
->NextVariablePack
= (EFI_HII_VARIABLE_PACK_LIST
*)((UINT8
*) PackList
+ Size
);
736 List
= GetNextNode (ListHead
, List
);
745 Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.
747 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE
748 which contains the default values retrived from
756 IN LIST_ENTRY
*ListHead
760 UEFI_IFR_BUFFER_STORAGE_NODE
*Default
;
762 Link
= GetFirstNode (ListHead
);
764 while (!IsNull (ListHead
, Link
)) {
765 Default
= UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link
);
767 RemoveEntryList (Link
);
769 DestroyDefaultNode (Default
);
771 Link
= GetNextNode (ListHead
, Link
);