]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
OptionMap->Guid may not align on UINT32 baundary.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Utility.c
CommitLineData
4259256b 1/**@file\r
2\r
3 This file contains the keyboard processing code to the HII database.\r
4\r
5Copyright (c) 2006 - 2008, Intel Corporation\r
6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16\r
17#include "HiiDatabase.h"\r
d4775f2a 18#include "HiiHandle.h"\r
4259256b 19\r
0368663f 20EFI_GUID gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
21EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
22\r
23\r
ee3428bb 24EFI_HII_HANDLE\r
0368663f 25FwHiiHandleToUefiHiiHandle (\r
26 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
27 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ee3428bb 28 )\r
29{\r
0368663f 30 HII_THUNK_CONTEXT *ThunkContext;\r
ee3428bb 31\r
0368663f 32 ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
ee3428bb 33 ASSERT (Private != NULL);\r
34\r
0368663f 35 ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
ee3428bb 36\r
0368663f 37 if (ThunkContext != NULL) {\r
38 return ThunkContext->UefiHiiHandle;\r
ee3428bb 39 }\r
40 \r
41 return (EFI_HII_HANDLE) NULL;\r
42}\r
43\r
ebbd2793 44\r
0368663f 45HII_THUNK_CONTEXT *\r
46FwHiiHandleToThunkContext (\r
47 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
48 IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
ebbd2793 49 )\r
50{\r
0368663f 51 LIST_ENTRY *Link;\r
52 HII_THUNK_CONTEXT *ThunkContext;\r
53\r
ebbd2793 54\r
0368663f 55 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ebbd2793 56\r
0368663f 57 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
58 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
59\r
60 if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
61 return ThunkContext;\r
ebbd2793 62 }\r
0368663f 63\r
64 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ebbd2793 65 }\r
66\r
0368663f 67 return NULL;\r
ebbd2793 68}\r
69\r
0368663f 70HII_THUNK_CONTEXT *\r
71UefiHiiHandleToThunkContext (\r
72 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
ea58467b 73 IN EFI_HII_HANDLE UefiHiiHandle\r
74 )\r
75{\r
0368663f 76 LIST_ENTRY *Link;\r
77 HII_THUNK_CONTEXT *ThunkContext;\r
ea58467b 78\r
0368663f 79 Link = GetFirstNode (&Private->ThunkContextListHead);\r
ea58467b 80\r
0368663f 81 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
82 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
83\r
84 if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
85 return ThunkContext;\r
ea58467b 86 }\r
0368663f 87 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
ea58467b 88 }\r
89\r
0368663f 90 return NULL;\r
ea58467b 91}\r
99a83b4c 92\r
93EFI_HII_HANDLE *\r
0368663f 94TagGuidToUefiHiiHandle (\r
95 IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
99a83b4c 96 IN CONST EFI_GUID *Guid\r
97 )\r
98{\r
0368663f 99 LIST_ENTRY *Link;\r
100 HII_THUNK_CONTEXT *ThunkContext;\r
101\r
102 Link = GetFirstNode (&Private->ThunkContextListHead);\r
99a83b4c 103\r
0368663f 104 while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
105 ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
99a83b4c 106\r
0368663f 107 if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
108 return ThunkContext->UefiHiiHandle;\r
99a83b4c 109 }\r
0368663f 110\r
111 Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
99a83b4c 112 }\r
113\r
0368663f 114 return NULL;\r
99a83b4c 115 \r
116}\r
117\r
0368663f 118\r
d4775f2a 119VOID\r
0368663f 120DestroyThunkContextForUefiHiiHandle (\r
121 IN HII_THUNK_PRIVATE_DATA *Private,\r
122 IN EFI_HII_HANDLE UefiHiiHandle\r
123 )\r
124{\r
125 HII_THUNK_CONTEXT *ThunkContext;\r
126\r
127 ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
128 ASSERT (ThunkContext != NULL);\r
129\r
d4775f2a 130 DestroyThunkContext (ThunkContext);\r
0368663f 131}\r
132\r
133\r
134/**\r
135 This function create a HII_THUNK_CONTEXT for a package list registered\r
136 by a module calling EFI_HII_DATABASE_PROTOCOL.NewPackageList. It records\r
137 the PackageListGuid in EFI_HII_PACKAGE_LIST_HEADER in the TagGuid in \r
138 HII_THUNK_CONTEXT created. This TagGuid will be used as a key to s\r
139\r
140**/\r
141HII_THUNK_CONTEXT *\r
142CreateThunkContextForUefiHiiHandle (\r
0368663f 143 IN EFI_HII_HANDLE UefiHiiHandle\r
144 )\r
145{\r
146 EFI_STATUS Status;\r
147 EFI_GUID PackageGuid;\r
148 HII_THUNK_CONTEXT *ThunkContext;\r
149\r
150 ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
151 ASSERT (ThunkContext != NULL);\r
152 \r
153 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
154\r
d4775f2a 155 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
0368663f 156 if (EFI_ERROR (Status)) {\r
157 return NULL;\r
158 }\r
159 \r
160 ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
161 \r
162 Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
163 ASSERT_EFI_ERROR (Status);\r
164 \r
165 CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
166\r
167 InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
168 InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
169 \r
0368663f 170 return ThunkContext;\r
171}\r
172\r
173\r
174UINTN\r
175GetPackageCountByType (\r
176 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
177 IN UINT8 PackageType\r
ea58467b 178 )\r
179{\r
0368663f 180 UINTN Count;\r
181 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
182\r
183 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
184 Count = 0;\r
185 \r
186 while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
187 if (PackageHeader->Type == PackageType ) {\r
188 Count++;\r
189 }\r
190 PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
191 }\r
192 \r
193 \r
194 return Count;\r
195}\r
196\r
197LIST_ENTRY *\r
198GetOneOfOptionMapEntryListHead (\r
199 IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
200 IN UINT16 QuestionId\r
201 )\r
202{\r
203 LIST_ENTRY *Link;\r
204 ONE_OF_OPTION_MAP *Map;\r
205\r
206 Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
207\r
208 while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
209 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
210 if (QuestionId == Map->QuestionId) {\r
211 return &Map->OneOfOptionMapEntryListHead;\r
212 }\r
213 Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
214 }\r
215 \r
216 return NULL;\r
217}\r
99a83b4c 218\r
59930165 219VOID\r
220GetAttributesOfFirstFormSet (\r
221 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
222 )\r
223{\r
224 EFI_STATUS Status;\r
225 EFI_HII_PACKAGE_LIST_HEADER *List;\r
226 EFI_HII_PACKAGE_HEADER *Package;\r
227 UINTN Size;\r
228 EFI_IFR_OP_HEADER *OpCode;\r
229 UINTN Offset;\r
230 EFI_IFR_GUID_CLASS *Class;\r
231 EFI_IFR_FORM_SET *FormSet;\r
232 EFI_IFR_GUID_SUBCLASS *SubClass;\r
233\r
234 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
235 ASSERT_EFI_ERROR (Status);\r
236\r
237 //\r
238 // There must be at least one EFI_HII_PACKAGE_FORM in the package list.\r
239 //\r
240 ASSERT (GetPackageCountByType (List, EFI_HII_PACKAGE_FORM) >= 1);\r
241\r
242 //\r
243 // Skip the package list header.\r
244 //\r
245 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
246\r
247 while (Package->Type != EFI_HII_PACKAGE_END) {\r
248\r
249 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
250\r
251 //\r
252 // Skip the package header\r
253 //\r
254 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
255 while (Offset < Package->Length) {\r
256 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
257\r
258 switch (OpCode->OpCode) {\r
259 case EFI_IFR_FORM_SET_OP:\r
260 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
261 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
262 ThunkContext->FormSetHelp = FormSet->Help;\r
263 break;\r
264 \r
265\r
266 case EFI_IFR_GUID_OP:\r
267 Class = (EFI_IFR_GUID_CLASS*) OpCode;\r
268 if (CompareGuid (&Class->Guid, &gTianoHiiIfrGuid)) {\r
269 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
270\r
271 switch (Class->ExtendOpCode) {\r
272 case EFI_IFR_EXTEND_OP_CLASS:\r
273 ThunkContext->FormSetClass = Class->Class;\r
274 break;\r
275 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
276 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
277 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
278 break;\r
279\r
280 default:\r
281 break;\r
282 }\r
283 }\r
284 break;\r
285 \r
286 default:\r
287 break;\r
288 \r
289 }\r
290\r
291 Offset += OpCode->Length;\r
292 }\r
293 //\r
294 // The attributes of first FormSet is ready now.\r
295 //\r
296 FreePool (List);\r
297 return;\r
298 \r
299 break;\r
300 }\r
301\r
302 Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
303 }\r
304\r
305}\r
306\r
99a83b4c 307\r
0368663f 308EFI_STATUS\r
309CreateQuestionIdMap (\r
310 IN OUT HII_THUNK_CONTEXT *ThunkContext\r
311 )\r
312{\r
313 EFI_STATUS Status;\r
314 EFI_HII_PACKAGE_LIST_HEADER *List;\r
315 EFI_HII_PACKAGE_HEADER *Package;\r
316 UINTN Size;\r
317 EFI_IFR_OP_HEADER *OpCode;\r
318 UINTN Offset;\r
319 QUESTION_ID_MAP *IdMap;\r
320 EFI_IFR_VARSTORE *VarStore;\r
321 EFI_IFR_FORM_SET *FormSet;\r
322 EFI_IFR_QUESTION_HEADER *Question;\r
323 LIST_ENTRY *QuestionIdMapEntryListHead;\r
324 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
325 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
326 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
327 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
328 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
329 EFI_IFR_GUID_CLASS *Class;\r
59930165 330 EFI_IFR_GUID_SUBCLASS *SubClass;\r
0368663f 331 \r
332\r
333 Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
334 if (EFI_ERROR (Status)) {\r
335 return Status;\r
ea58467b 336 }\r
99a83b4c 337\r
0368663f 338 //\r
339 // Get all VarStoreId and build the the QuestionId map.\r
340 // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
341 // EFI_IFR_QUESTION_HEADER.QuestionId -> UEFI Question ID\r
342 //\r
343\r
344 //\r
345 // Skip the package list header.\r
346 //\r
347 Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
348\r
349 while (Package->Type != EFI_HII_PACKAGE_END) {\r
350\r
351 if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
352\r
353 //\r
354 // Skip the package header\r
355 //\r
356 Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
357 while (Offset < Package->Length) {\r
358 OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
359\r
360 switch (OpCode->OpCode) {\r
361 case EFI_IFR_FORM_SET_OP:\r
362 FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
363 ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
364 ThunkContext->FormSetHelp = FormSet->Help;\r
365 break;\r
366 \r
367 case EFI_IFR_VARSTORE_OP:\r
368 //\r
369 // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
370 //\r
371 VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
372 IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
373 ASSERT (IdMap != NULL);\r
374 \r
375 IdMap->Signature = QUESTION_ID_MAP_SIGNATURE;\r
376 IdMap->VarStoreId = VarStore->VarStoreId;\r
377 IdMap->VarSize = VarStore->Size;\r
378 InitializeListHead (&IdMap->MapEntryListHead);\r
379 InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
380 break;\r
381\r
382 case EFI_IFR_NUMERIC_OP:\r
383 case EFI_IFR_CHECKBOX_OP:\r
384 case EFI_IFR_ONE_OF_OP:\r
385 case EFI_IFR_ORDERED_LIST_OP:\r
386 case EFI_IFR_STRING_OP:\r
387 //case EFI_IFR_PASSWORD_OP:\r
388 Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
389 QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
390\r
391 if (QuestionIdMapEntryListHead != NULL) {\r
392 //\r
393 // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
394 //\r
395 IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
396 ASSERT (IdMapEntry != NULL);\r
397\r
398 IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
399 IdMapEntry->UefiQid = Question->QuestionId;\r
400 IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
401\r
402 InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
403 }\r
404\r
405 break;\r
406 \r
407 case EFI_IFR_GUID_OP:\r
408 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
409 if (CompareGuid (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
410 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
411 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
412 if (OneOfOptinMapEntryListHead == NULL) {\r
413 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
414 ASSERT (OneOfOptionMap != NULL);\r
415\r
416 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
417 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
418 OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
419 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
420 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
421 InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
422 }\r
423 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
424 ASSERT (OneOfOptionMapEntry != NULL);\r
425\r
426 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
427 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
428 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
429 \r
430 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
431 }\r
4406efb4 432 }else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID))) {\r
0368663f 433 Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
434\r
435 switch (Class->ExtendOpCode) {\r
436 case EFI_IFR_EXTEND_OP_CLASS:\r
437 ThunkContext->FormSetClass = Class->Class;\r
438 break;\r
439 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
59930165 440 SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
441 ThunkContext->FormSetSubClass = SubClass->SubClass;\r
0368663f 442 break;\r
443\r
444 default:\r
445 break;\r
446 }\r
447 }\r
448 break;\r
449 \r
450 default:\r
451 break;\r
452 \r
453 }\r
454\r
455 Offset += OpCode->Length;\r
456 }\r
457 //\r
458 // Only Form Package is in a Package List.\r
459 //\r
460 break;\r
461 }\r
462\r
463 Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
464 }\r
465\r
466 FreePool (List);\r
ea58467b 467 return EFI_SUCCESS;\r
468}\r
99a83b4c 469\r
0368663f 470\r
471LIST_ENTRY *\r
472GetMapEntryListHead (\r
473 IN CONST HII_THUNK_CONTEXT *ThunkContext,\r
474 IN UINT16 VarStoreId\r
475 )\r
476{\r
477 LIST_ENTRY *Link;\r
478 QUESTION_ID_MAP *Map;\r
479\r
480 Link = GetFirstNode (&ThunkContext->QuestionIdMapListHead);\r
481\r
482 while (!IsNull (&ThunkContext->QuestionIdMapListHead, Link)) {\r
483 Map = QUESTION_ID_MAP_FROM_LINK (Link);\r
484 if (VarStoreId == Map->VarStoreId) {\r
485 return &Map->MapEntryListHead;\r
486 }\r
487 Link = GetNextNode (&ThunkContext->QuestionIdMapListHead, Link);\r
488 }\r
489 return NULL;\r
490}\r
491\r
492\r
d4775f2a 493HII_THUNK_CONTEXT *\r
494CreateThunkContext (\r
495 IN HII_THUNK_PRIVATE_DATA *Private,\r
496 IN UINTN StringPackageCount,\r
497 IN UINTN IfrPackageCount\r
498 )\r
499{\r
500 EFI_STATUS Status;\r
501 HII_THUNK_CONTEXT *ThunkContext;\r
502\r
503 ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
504 ASSERT (ThunkContext != NULL);\r
505 \r
506 ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
507 ThunkContext->IfrPackageCount = IfrPackageCount;\r
508 ThunkContext->StringPackageCount = StringPackageCount;\r
509 Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
510 if (EFI_ERROR (Status)) {\r
511 return NULL;\r
512 }\r
513\r
514 InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
515 InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
516\r
517\r
518 return ThunkContext;\r
519 \r
520}\r
521\r
522VOID\r
523DestroyThunkContext (\r
524 IN HII_THUNK_CONTEXT *ThunkContext\r
525 )\r
526{\r
527 ASSERT (ThunkContext != NULL);\r
528\r
529 FreeHiiHandle (ThunkContext->FwHiiHandle);\r
530\r
531 DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
532\r
533 DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
534\r
535 RemoveEntryList (&ThunkContext->Link);\r
536\r
537 FreePool (ThunkContext);\r
538}\r
539\r
540\r
541VOID\r
542DestroyQuestionIdMap (\r
543 IN LIST_ENTRY *QuestionIdMapListHead\r
544 )\r
545{\r
546 QUESTION_ID_MAP *IdMap;\r
547 QUESTION_ID_MAP_ENTRY *IdMapEntry;\r
548 LIST_ENTRY *Link;\r
549 LIST_ENTRY *Link2;\r
550\r
551 while (!IsListEmpty (QuestionIdMapListHead)) {\r
552 Link = GetFirstNode (QuestionIdMapListHead);\r
553 \r
554 IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
555\r
556 while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
557 Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
558 \r
59930165 559 IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 560\r
561 RemoveEntryList (Link2);\r
562\r
563 FreePool (IdMapEntry);\r
564 }\r
565\r
566 RemoveEntryList (Link);\r
567 FreePool (IdMap);\r
568 }\r
569}\r
570\r
571VOID\r
572DestoryOneOfOptionMap (\r
573 IN LIST_ENTRY *OneOfOptionMapListHead\r
574 )\r
575{\r
576 ONE_OF_OPTION_MAP *Map;\r
577 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
578 LIST_ENTRY *Link;\r
579 LIST_ENTRY *Link2;\r
580\r
581 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
582 Link = GetFirstNode (OneOfOptionMapListHead);\r
583 \r
584 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
585\r
586 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
587 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
588 \r
59930165 589 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
d4775f2a 590\r
591 RemoveEntryList (Link2);\r
592\r
593 FreePool (MapEntry);\r
594 }\r
595\r
596 RemoveEntryList (Link);\r
597 FreePool (Map);\r
598 }\r
599}\r
600\r
601\r
602\r
603\r