]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c
code scrub:
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / UefiIfrDefault.c
CommitLineData
59336178 1/** @file\r
2 Function and Macro defintions for to extract default values from UEFI Form package.\r
3\r
4 Copyright (c) 2008, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
a9d85320 15#include "HiiDatabase.h"\r
59336178 16#include "UefiIfrParser.h"\r
17#include "UefiIfrDefault.h"\r
18\r
19//\r
20// Extern Variables\r
21//\r
22extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
59336178 23extern CONST EFI_HII_IMAGE_PROTOCOL *mHiiImageProtocol;\r
24extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProtocol;\r
25extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRoutingProtocol;\r
26\r
73d1dcbb 27CHAR16 FrameworkReservedVarstoreName[] = FRAMEWORK_RESERVED_VARSTORE_NAME;\r
28\r
59336178 29/**\r
30 Set the data position at Offset with Width in Node->Buffer based \r
31 the value passed in.\r
32\r
33 @param Node The Buffer Storage Node.\r
34 @param Value The input value.\r
35 @param Offset The offset in Node->Buffer for the update.\r
36 @param Width The length of the Value.\r
37 \r
38 @retval VOID\r
39\r
40**/\r
41VOID\r
42SetNodeBuffer (\r
43 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node,\r
44 IN CONST EFI_HII_VALUE *Value,\r
45 IN UINTN Offset,\r
46 IN UINTN Width\r
47 )\r
48{\r
49 ASSERT (Node->Signature == UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE);\r
50 ASSERT (Offset + Width <= Node->Size);\r
51\r
52 CopyMem (Node->Buffer + Offset, &Value->Value.u8, Width);\r
53}\r
54\r
55\r
56/**\r
57 Reset Question to its default value.\r
58\r
a9d85320 59 Note Framework 0.92's HII Implementation does not support for default value for these opcodes:\r
60 EFI_IFR_ORDERED_LIST_OP:\r
61 EFI_IFR_PASSWORD_OP:\r
62 EFI_IFR_STRING_OP:\r
63\r
59336178 64 @param FormSet FormSet data structure.\r
65 @param DefaultId The Class of the default.\r
66\r
67 @retval EFI_SUCCESS Question is reset to default value.\r
68\r
69**/\r
70EFI_STATUS\r
71GetQuestionDefault (\r
72 IN FORM_BROWSER_FORMSET *FormSet,\r
73 IN FORM_BROWSER_FORM *Form,\r
74 IN FORM_BROWSER_STATEMENT *Question,\r
75 IN UINT16 DefaultId,\r
76 IN UINT16 VarStoreId,\r
77 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
78 )\r
79{\r
80 EFI_STATUS Status;\r
81 LIST_ENTRY *Link;\r
82 QUESTION_DEFAULT *Default;\r
83 QUESTION_OPTION *Option;\r
84 EFI_HII_VALUE *HiiValue;\r
85\r
86 Status = EFI_SUCCESS;\r
87\r
88 //\r
89 // Statement don't have storage, skip them\r
90 //\r
91 if (Question->QuestionId == 0) {\r
92 return Status;\r
93 }\r
94\r
95 if (Question->VarStoreId != VarStoreId) {\r
96 return Status;\r
97 }\r
98\r
99 ASSERT (Question->Storage->Type == EFI_HII_VARSTORE_BUFFER);\r
100\r
101 //\r
102 // There are three ways to specify default value for a Question:\r
103 // 1, use nested EFI_IFR_DEFAULT (highest priority)\r
104 // 2, set flags of EFI_ONE_OF_OPTION (provide Standard and Manufacturing default)\r
105 // 3, set flags of EFI_IFR_CHECKBOX (provide Standard and Manufacturing default) (lowest priority)\r
106 //\r
107 HiiValue = &Question->HiiValue;\r
108\r
109 //\r
110 // EFI_IFR_DEFAULT has highest priority\r
111 //\r
112 if (!IsListEmpty (&Question->DefaultListHead)) {\r
113 Link = GetFirstNode (&Question->DefaultListHead);\r
114 while (!IsNull (&Question->DefaultListHead, Link)) {\r
115 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
116\r
117 if (Default->DefaultId == DefaultId) {\r
a9d85320 118 //\r
119 // Default value is embedded in EFI_IFR_DEFAULT\r
120 //\r
121 CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
59336178 122 \r
123 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
124 return EFI_SUCCESS;\r
125 }\r
126\r
127 Link = GetNextNode (&Question->DefaultListHead, Link);\r
128 }\r
129 }\r
130\r
131 //\r
132 // EFI_ONE_OF_OPTION\r
133 //\r
134 if ((Question->Operand == EFI_IFR_ONE_OF_OP) && !IsListEmpty (&Question->OptionListHead)) {\r
135 if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
136 //\r
137 // OneOfOption could only provide Standard and Manufacturing default\r
138 //\r
139 Link = GetFirstNode (&Question->OptionListHead);\r
140 while (!IsNull (&Question->OptionListHead, Link)) {\r
141 Option = QUESTION_OPTION_FROM_LINK (Link);\r
142\r
143 if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && (Option->Flags & EFI_IFR_OPTION_DEFAULT)) ||\r
144 ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && (Option->Flags & EFI_IFR_OPTION_DEFAULT_MFG))\r
145 ) {\r
146 CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
147\r
148 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
149 return EFI_SUCCESS;\r
150 }\r
151\r
152 Link = GetNextNode (&Question->OptionListHead, Link);\r
153 }\r
154 }\r
155 }\r
156\r
157 //\r
158 // EFI_IFR_CHECKBOX - lowest priority\r
159 //\r
160 if (Question->Operand == EFI_IFR_CHECKBOX_OP) {\r
161 if (DefaultId <= EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
162 //\r
163 // Checkbox could only provide Standard and Manufacturing default\r
164 //\r
165 if (((DefaultId == EFI_HII_DEFAULT_CLASS_STANDARD) && (Question->Flags & EFI_IFR_CHECKBOX_DEFAULT)) ||\r
166 ((DefaultId == EFI_HII_DEFAULT_CLASS_MANUFACTURING) && (Question->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG))\r
167 ) {\r
168 HiiValue->Value.b = TRUE;\r
169 } else {\r
170 HiiValue->Value.b = FALSE;\r
171 }\r
172\r
173 SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
174 return EFI_SUCCESS;\r
175 }\r
176 }\r
177\r
178 return Status;\r
179}\r
180\r
181\r
182/**\r
183 Reset Questions in a Form to their default value.\r
184\r
185 @param FormSet FormSet data structure.\r
186 @param Form The Form which to be reset.\r
187 @param DefaultId The Class of the default.\r
188\r
189 @retval EFI_SUCCESS The function completed successfully.\r
190\r
191**/\r
192EFI_STATUS\r
193ExtractFormDefault (\r
194 IN FORM_BROWSER_FORMSET *FormSet,\r
195 IN FORM_BROWSER_FORM *Form,\r
196 IN UINT16 DefaultId,\r
197 IN UINT16 VarStoreId,\r
198 OUT UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
199 )\r
200{\r
201 EFI_STATUS Status;\r
202 LIST_ENTRY *Link;\r
203 FORM_BROWSER_STATEMENT *Question;\r
204\r
205 Link = GetFirstNode (&Form->StatementListHead);\r
206 while (!IsNull (&Form->StatementListHead, Link)) {\r
207 Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
59336178 208 //\r
209 // Reset Question to its default value\r
210 //\r
211 Status = GetQuestionDefault (FormSet, Form, Question, DefaultId, VarStoreId, Node);\r
212 if (EFI_ERROR (Status)) {\r
213 continue;\r
214 }\r
215\r
0368663f 216 Link = GetNextNode (&Form->StatementListHead, Link);\r
59336178 217 }\r
218 return EFI_SUCCESS;\r
219}\r
220\r
221\r
222/**\r
223 Destroy all the buffer allocated for the fileds of\r
224 UEFI_IFR_BUFFER_STORAGE_NODE. The Node itself\r
225 will be freed too.\r
226\r
227 @param FormSet FormSet data structure.\r
228 @param DefaultId The Class of the default.\r
229\r
230 @retval VOID\r
231\r
232**/\r
233VOID\r
234DestroyDefaultNode (\r
235 IN UEFI_IFR_BUFFER_STORAGE_NODE *Node\r
236 )\r
237{\r
7001eaf8 238 FreePool (Node->Buffer);\r
239 FreePool (Node->Name);\r
240 FreePool (Node);\r
59336178 241}\r
242\r
243\r
244/**\r
245 Get the default value for Buffer Type storage named by\r
246 a Default Store and a Storage Store from a FormSet.\r
247 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE\r
248 allocated by this function. It is inserted to the link list.\r
249 \r
250 @param DefaultStore The Default Store.\r
251 @param Storage The Storage.\r
252 @param FormSet The Form Set.\r
253 @param UefiDefaultsListHead The head of link list for the output.\r
254\r
255 @retval EFI_SUCCESS Successful.\r
256 \r
257**/\r
258EFI_STATUS\r
259GetBufferTypeDefaultIdAndStorageId (\r
260 IN FORMSET_DEFAULTSTORE *DefaultStore,\r
261 IN FORMSET_STORAGE *Storage,\r
262 IN FORM_BROWSER_FORMSET *FormSet,\r
263 OUT LIST_ENTRY *UefiDefaultsListHead\r
264 )\r
265{\r
266 UEFI_IFR_BUFFER_STORAGE_NODE *Node;\r
267 LIST_ENTRY *Link;\r
268 FORM_BROWSER_FORM *Form;\r
269 EFI_STATUS Status;\r
270\r
271 Node = AllocateZeroPool (sizeof (UEFI_IFR_BUFFER_STORAGE_NODE));\r
272 ASSERT (Node != NULL);\r
273\r
274 Node->Signature = UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE;\r
275 Node->Name = AllocateCopyPool (StrSize (Storage->Name), Storage->Name);\r
276 Node->DefaultId = DefaultStore->DefaultId;\r
b47694b9 277 Node->StoreId = Storage->VarStoreId;\r
59336178 278 CopyGuid (&Node->Guid, &Storage->Guid);\r
279 Node->Size = Storage->Size;\r
280 Node->Buffer = AllocateZeroPool (Node->Size);\r
281 //\r
282 // Extract default from IFR binary\r
283 //\r
284 Link = GetFirstNode (&FormSet->FormListHead);\r
285 while (!IsNull (&FormSet->FormListHead, Link)) {\r
286 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
287\r
288 Status = ExtractFormDefault (FormSet, Form, DefaultStore->DefaultId, Storage->VarStoreId, Node);\r
289 ASSERT_EFI_ERROR (Status);\r
290\r
291 Link = GetNextNode (&FormSet->FormListHead, Link);\r
292 }\r
293\r
294 InsertTailList (UefiDefaultsListHead, &Node->List);\r
295 \r
296 return EFI_SUCCESS;\r
297}\r
298\r
299\r
300/**\r
301 Get the default value for Buffer Type storage named by\r
302 a Default Store from a FormSet.\r
303 The result is in the a instance of UEFI_IFR_BUFFER_STORAGE_NODE\r
304 allocated by this function. The output can be multiple instances\r
305 of UEFI_IFR_BUFFER_STORAGE_NODE. It is inserted to the link list.\r
306 \r
307 @param DefaultStore The Default Store.\r
308 @param FormSet The Form Set.\r
309 @param UefiDefaultsListHead The head of link list for the output.\r
310\r
311 @retval EFI_SUCCESS Successful.\r
312 \r
313**/\r
314EFI_STATUS\r
315GetBufferTypeDefaultId (\r
316 IN FORMSET_DEFAULTSTORE *DefaultStore,\r
317 IN FORM_BROWSER_FORMSET *FormSet,\r
318 OUT LIST_ENTRY *UefiDefaultsListHead\r
319 )\r
320{\r
0368663f 321 LIST_ENTRY *StorageLink;\r
59336178 322 FORMSET_STORAGE *Storage;\r
323 EFI_STATUS Status;\r
324\r
0368663f 325 StorageLink = GetFirstNode (&FormSet->StorageListHead);\r
59336178 326\r
0368663f 327 while (!IsNull (&FormSet->StorageListHead, StorageLink)) {\r
328 Storage = FORMSET_STORAGE_FROM_LINK(StorageLink);\r
59336178 329\r
330 if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
331 Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);\r
98b16b9d 332 ASSERT_EFI_ERROR (Status);\r
59336178 333 }\r
334\r
0368663f 335 StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);\r
59336178 336 }\r
337 \r
338 return EFI_SUCCESS;\r
339}\r
340\r
341\r
342/**\r
343 Get the default value for Buffer Type storage from the first FormSet\r
344 in the Package List specified by a EFI_HII_HANDLE.\r
345 \r
346 The results can be multiple instances of UEFI_IFR_BUFFER_STORAGE_NODE. \r
347 They are inserted to the link list.\r
348 \r
349 @param UefiHiiHandle The handle for the package list.\r
350 @param UefiDefaultsListHead The head of link list for the output.\r
351\r
352 @retval EFI_SUCCESS Successful.\r
353 \r
354**/\r
355EFI_STATUS\r
356UefiIfrGetBufferTypeDefaults (\r
a9d85320 357 IN HII_THUNK_CONTEXT *ThunkContext,\r
59336178 358 OUT LIST_ENTRY **UefiDefaults\r
359 )\r
360{\r
0368663f 361 LIST_ENTRY *DefaultLink;\r
59336178 362 FORMSET_DEFAULTSTORE *DefaultStore;\r
363 EFI_STATUS Status;\r
364\r
365 ASSERT (UefiDefaults != NULL);\r
366\r
59336178 367 *UefiDefaults = AllocateZeroPool (sizeof (LIST_ENTRY));\r
368 ASSERT (UefiDefaults != NULL);\r
369 InitializeListHead (*UefiDefaults);\r
370\r
a9d85320 371 DefaultLink = GetFirstNode (&ThunkContext->FormSet->DefaultStoreListHead);\r
372 while (!IsNull (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink)) {\r
0368663f 373 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
59336178 374\r
a9d85320 375 Status = GetBufferTypeDefaultId (DefaultStore, ThunkContext->FormSet, *UefiDefaults);\r
59336178 376 ASSERT_EFI_ERROR (Status);\r
377\r
a9d85320 378 DefaultLink = GetNextNode (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink); \r
59336178 379 }\r
380\r
59336178 381 return EFI_SUCCESS;\r
382}\r
383\r
384\r
385/**\r
386 Convert the UEFI Buffer Type default values to a Framework HII default\r
387 values specified by a EFI_HII_VARIABLE_PACK_LIST structure.\r
388 \r
389 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE\r
390 which contains the default values retrived from\r
391 a UEFI form set.\r
392 @param DefaultMask The default mask.\r
393 The valid values are FRAMEWORK_EFI_IFR_FLAG_DEFAULT\r
394 and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
395 UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING \r
396 from specification to valid default class.\r
397 @param VariablePackList The output default value in a format defined in Framework.\r
398 \r
399\r
400 @retval EFI_SUCCESS Successful.\r
401 @retval EFI_INVALID_PARAMETER The default mask is not FRAMEWORK_EFI_IFR_FLAG_DEFAULT or \r
402 FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
403**/\r
404EFI_STATUS\r
0368663f 405UefiDefaultsToFwDefaults (\r
59336178 406 IN LIST_ENTRY *ListHead,\r
407 IN UINTN DefaultMask,\r
a9d85320 408 IN EFI_VARSTORE_ID UefiFormSetDefaultVarStoreId,\r
59336178 409 OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
410 )\r
411{\r
412 LIST_ENTRY *List;\r
413 UEFI_IFR_BUFFER_STORAGE_NODE *Node;\r
414 UINTN Size;\r
415 UINTN Count;\r
416 UINT16 DefaultId;\r
417 EFI_HII_VARIABLE_PACK *Pack;\r
418 EFI_HII_VARIABLE_PACK_LIST *PackList;\r
1e22d0b0 419 UINTN Index;\r
59336178 420\r
421 if (DefaultMask == FRAMEWORK_EFI_IFR_FLAG_DEFAULT) {\r
422 DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
423 } else if (DefaultMask == FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING) {\r
424 DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
425 } else {\r
426 //\r
427 // UEFI spec only map FRAMEWORK_EFI_IFR_FLAG_DEFAULT and FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING \r
428 // from specification to valid default class.\r
429 //\r
430 ASSERT (FALSE);\r
431 return EFI_INVALID_PARAMETER;\r
432 }\r
433 \r
434 //\r
435 // Calculate the size of the output EFI_HII_VARIABLE_PACK_LIST structure\r
436 //\r
437 Size = 0;\r
438 Count = 0;\r
439 List = GetFirstNode (ListHead);\r
440 while (!IsNull (ListHead, List)) {\r
441 Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);\r
442\r
443 if (Node->DefaultId == DefaultId) {\r
444 Size += Node->Size;\r
73d1dcbb 445 if ((Node->StoreId == UefiFormSetDefaultVarStoreId) && (StrCmp (FrameworkReservedVarstoreName, Node->Name) != 0)) {\r
446 // The name of default VARSTORE with a Explicit declaration statement will be updated to L"Setup" to make sure\r
447 // the Framework HII Setup module will run correctly. Framework HII Setup module always assumed that default\r
448 // VARSTORE to have L"Setup" as name, Formset GUID as GUID. \r
449 Size += StrSize (FrameworkReservedVarstoreName);\r
450 } else {\r
451 Size += StrSize (Node->Name);\r
452 }\r
59336178 453\r
454 Count++;\r
455 }\r
456 \r
457 List = GetNextNode (ListHead, List); \r
458 }\r
459\r
1e22d0b0 460 if (Count == 0) {\r
461 *VariablePackList = NULL;\r
462 return EFI_NOT_FOUND;\r
463 }\r
464\r
59336178 465 Size = Size + Count * (sizeof (EFI_HII_VARIABLE_PACK_LIST) + sizeof (EFI_HII_VARIABLE_PACK));\r
466 \r
467 *VariablePackList = AllocateZeroPool (Size);\r
468 ASSERT (*VariablePackList != NULL);\r
469\r
470 List = GetFirstNode (ListHead);\r
471\r
472 PackList = (EFI_HII_VARIABLE_PACK_LIST *) *VariablePackList;\r
473 Pack = (EFI_HII_VARIABLE_PACK *) (PackList + 1);\r
1e22d0b0 474 Index = 0;\r
59336178 475 while (!IsNull (ListHead, List)) {\r
476 Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);\r
477\r
478 Size = 0; \r
479 if (Node->DefaultId == DefaultId) {\r
480 Size += Node->Size;\r
59336178 481 Size += sizeof (EFI_HII_VARIABLE_PACK); \r
482\r
483 //\r
484 // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.\r
485 // So the default storage of Var Store in VFR from a Framework module \r
03254710 486 // should be translated to the default Varstore ID.\r
59336178 487 //\r
73d1dcbb 488 if (Node->StoreId == UefiFormSetDefaultVarStoreId && (StrCmp (FrameworkReservedVarstoreName, Node->Name) != 0)) {\r
489 // The name of default VARSTORE with a Explicit declaration statement will be updated to L"Setup" to make sure\r
490 // the Framework HII Setup module will run correctly. Framework HII Setup module always assumed that default\r
491 // VARSTORE to have L"Setup" as name, Formset GUID as GUID. \r
59336178 492 Pack->VariableId = 0;\r
73d1dcbb 493 Pack->VariableNameLength = (UINT32) StrSize (FrameworkReservedVarstoreName);\r
494 CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK), FrameworkReservedVarstoreName, StrSize (FrameworkReservedVarstoreName));\r
495 DEBUG ((EFI_D_INFO, "VarstoreID: %x; Name: %s -> %s.\n", UefiFormSetDefaultVarStoreId, Node->Name, FrameworkReservedVarstoreName));\r
b47694b9 496 } else {\r
497 Pack->VariableId = Node->StoreId;\r
73d1dcbb 498 Pack->VariableNameLength = (UINT32) StrSize (Node->Name);\r
499 CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK), Node->Name, StrSize (Node->Name));\r
59336178 500 }\r
73d1dcbb 501\r
502 Size += Pack->VariableNameLength;\r
59336178 503 //\r
504 // Initialize EFI_HII_VARIABLE_PACK\r
505 //\r
506 Pack->Header.Type = 0;\r
dee6b58d 507 Pack->Header.Length = (UINT32) Size;\r
59336178 508 CopyMem (&Pack->VariableGuid, &Node->Guid, sizeof (EFI_GUID));\r
509 \r
59336178 510 CopyMem ((UINT8 *) Pack + sizeof (EFI_HII_VARIABLE_PACK) + Pack->VariableNameLength, Node->Buffer, Node->Size);\r
511\r
512 Size += sizeof (EFI_HII_VARIABLE_PACK_LIST);\r
513\r
514 //\r
1e22d0b0 515 // Initialize EFI_HII_VARIABLE_PACK_LIST\r
59336178 516 //\r
517 PackList->VariablePack = Pack;\r
1e22d0b0 518 Index++;\r
519 if (Index < Count) {\r
520 PackList->NextVariablePack = (EFI_HII_VARIABLE_PACK_LIST *)((UINT8 *) PackList + Size);\r
521 }\r
59336178 522 \r
523 }\r
524 \r
525 List = GetNextNode (ListHead, List); \r
526 }\r
527 \r
528 \r
529 return EFI_SUCCESS;\r
530}\r
531\r
532\r
533/**\r
534 Free up all buffer allocated for the link list of UEFI_IFR_BUFFER_STORAGE_NODE.\r
535 \r
536 @param ListHead The link list of UEFI_IFR_BUFFER_STORAGE_NODE\r
537 which contains the default values retrived from\r
538 a UEFI form set.\r
539 \r
540\r
b47694b9 541 @retval VOID\r
59336178 542**/\r
543VOID\r
544FreeDefaultList (\r
545 IN LIST_ENTRY *ListHead\r
546 )\r
547{\r
0368663f 548 LIST_ENTRY *Link;\r
59336178 549 UEFI_IFR_BUFFER_STORAGE_NODE *Default;\r
550\r
b074cb39 551 while (!IsListEmpty (ListHead)) {\r
552 Link = GetFirstNode (ListHead);\r
553 \r
0368663f 554 Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);\r
59336178 555\r
0368663f 556 RemoveEntryList (Link);\r
59336178 557 \r
558 DestroyDefaultNode (Default);\r
59336178 559 }\r
560\r
561 FreePool (ListHead);\r
562}\r
563\r