]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/UiApp/FrontPageCustomizedUiSupport.c
MdeModulePkg/BootManagerUiLib: No need to connect all devices
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / FrontPageCustomizedUiSupport.c
CommitLineData
c9802c45
ED
1/** @file\r
2\r
3 This library class defines a set of interfaces to customize Ui module\r
4\r
5Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
6This program and the accompanying materials are licensed and made available under\r
7the terms and conditions of the BSD License that accompanies this distribution.\r
8The 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#include <Uefi.h>\r
16\r
17#include <Guid/MdeModuleHii.h>\r
18#include <Guid/GlobalVariable.h>\r
19\r
20#include <Protocol/HiiConfigAccess.h>\r
21#include <Protocol/HiiString.h>\r
22\r
23#include <Library/HiiLib.h>\r
24#include <Library/DebugLib.h>\r
25#include <Library/UefiLib.h>\r
26#include <Library/BaseMemoryLib.h>\r
27#include <Library/PcdLib.h>\r
28#include <Library/MemoryAllocationLib.h>\r
29#include <Library/UefiRuntimeServicesTableLib.h>\r
30#include <Library/UefiHiiServicesLib.h>\r
31#include <Library/DevicePathLib.h>\r
32#include <Library/UefiBootServicesTableLib.h>\r
33#include "FrontPageCustomizedUiSupport.h"\r
34\r
35//\r
36// This is the VFR compiler generated header file which defines the\r
37// string identifiers.\r
38//\r
39#define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001\r
40\r
41#define UI_HII_DRIVER_LIST_SIZE 0x8\r
42\r
43#define FRONT_PAGE_KEY_CONTINUE 0x1000\r
44#define FRONT_PAGE_KEY_RESET 0x1001\r
45#define FRONT_PAGE_KEY_LANGUAGE 0x1002\r
46\r
47typedef struct {\r
48 EFI_STRING_ID PromptId;\r
49 EFI_STRING_ID HelpId;\r
50 EFI_STRING_ID DevicePathId;\r
51 EFI_GUID FormSetGuid;\r
52 BOOLEAN EmptyLineAfter;\r
53} UI_HII_DRIVER_INSTANCE;\r
54\r
55CHAR8 *gLanguageString;\r
56EFI_STRING_ID *gLanguageToken;\r
57UI_HII_DRIVER_INSTANCE *gHiiDriverList;\r
7258076b 58extern EFI_HII_HANDLE gStringPackHandle;\r
c9802c45
ED
59\r
60\r
61/**\r
62 Get next language from language code list (with separator ';').\r
63\r
64 If LangCode is NULL, then ASSERT.\r
65 If Lang is NULL, then ASSERT.\r
66\r
67 @param LangCode On input: point to first language in the list. On\r
68 output: point to next language in the list, or\r
69 NULL if no more language in the list.\r
70 @param Lang The first language in the list.\r
71\r
72**/\r
73VOID\r
74GetNextLanguage (\r
75 IN OUT CHAR8 **LangCode,\r
76 OUT CHAR8 *Lang\r
77 )\r
78{\r
79 UINTN Index;\r
80 CHAR8 *StringPtr;\r
81\r
82 ASSERT (LangCode != NULL);\r
83 ASSERT (*LangCode != NULL);\r
84 ASSERT (Lang != NULL);\r
85\r
86 Index = 0;\r
87 StringPtr = *LangCode;\r
88 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
89 Index++;\r
90 }\r
91\r
92 CopyMem (Lang, StringPtr, Index);\r
93 Lang[Index] = 0;\r
94\r
95 if (StringPtr[Index] == ';') {\r
96 Index++;\r
97 }\r
98 *LangCode = StringPtr + Index;\r
99}\r
100\r
101/**\r
102 This function processes the language changes in configuration.\r
103\r
104 @param Value A pointer to the data being sent to the original exporting driver.\r
105\r
106\r
107 @retval TRUE The callback successfully handled the action.\r
108 @retval FALSE The callback not supported in this handler.\r
109\r
110**/\r
111EFI_STATUS\r
112LanguageChangeHandler (\r
113 IN EFI_IFR_TYPE_VALUE *Value\r
114 )\r
115{\r
116 CHAR8 *LangCode;\r
117 CHAR8 *Lang;\r
118 UINTN Index;\r
119 EFI_STATUS Status;\r
120\r
121 //\r
122 // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
123 //\r
124 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
125 ASSERT (Lang != NULL);\r
126\r
127 Index = 0;\r
128 LangCode = gLanguageString;\r
129 while (*LangCode != 0) {\r
130 GetNextLanguage (&LangCode, Lang);\r
131\r
132 if (Index == Value->u8) {\r
133 break;\r
134 }\r
135\r
136 Index++;\r
137 }\r
138\r
139 if (Index == Value->u8) {\r
140 Status = gRT->SetVariable (\r
141 L"PlatformLang",\r
142 &gEfiGlobalVariableGuid,\r
143 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
144 AsciiStrSize (Lang),\r
145 Lang\r
146 );\r
147 if (EFI_ERROR (Status)) {\r
148 FreePool (Lang);\r
149 return EFI_DEVICE_ERROR;\r
150 }\r
151 } else {\r
152 ASSERT (FALSE);\r
153 }\r
154 FreePool (Lang);\r
155\r
156 return EFI_SUCCESS;\r
157}\r
158\r
159/**\r
160 This function processes the results of changes in configuration.\r
161\r
162\r
163 @param HiiHandle Points to the hii handle for this formset.\r
164 @param Action Specifies the type of action taken by the browser.\r
165 @param QuestionId A unique value which is sent to the original exporting driver\r
166 so that it can identify the type of data to expect.\r
167 @param Type The type of value for the question.\r
168 @param Value A pointer to the data being sent to the original exporting driver.\r
169 @param ActionRequest On return, points to the action requested by the callback function.\r
170 @param Status Return the handle status.\r
171\r
172 @retval TRUE The callback successfully handled the action.\r
173 @retval FALSE The callback not supported in this handler.\r
174\r
175**/\r
176BOOLEAN\r
177UiSupportLibCallbackHandler (\r
178 IN EFI_HII_HANDLE HiiHandle,\r
179 IN EFI_BROWSER_ACTION Action,\r
180 IN EFI_QUESTION_ID QuestionId,\r
181 IN UINT8 Type,\r
182 IN EFI_IFR_TYPE_VALUE *Value,\r
183 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,\r
184 OUT EFI_STATUS *Status\r
185 )\r
186{\r
187 if (QuestionId != FRONT_PAGE_KEY_CONTINUE &&\r
188 QuestionId != FRONT_PAGE_KEY_RESET &&\r
189 QuestionId != FRONT_PAGE_KEY_LANGUAGE) {\r
190 return FALSE;\r
191 }\r
192\r
193 if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
194 //\r
195 // Do nothing for other UEFI Action. Only do call back when data is changed.\r
196 //\r
197 *Status = EFI_UNSUPPORTED;\r
81c14606 198 return TRUE;\r
c9802c45
ED
199 }\r
200\r
201 if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
202 if ((Value == NULL) || (ActionRequest == NULL)) {\r
203 *Status = EFI_INVALID_PARAMETER;\r
81c14606 204 return TRUE;\r
c9802c45
ED
205 }\r
206\r
207 *Status = EFI_SUCCESS;\r
208 switch (QuestionId) {\r
209 case FRONT_PAGE_KEY_CONTINUE:\r
210 //\r
211 // This is the continue - clear the screen and return an error to get out of FrontPage loop\r
212 //\r
213 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
214 break;\r
215\r
216 case FRONT_PAGE_KEY_LANGUAGE:\r
217 *Status = LanguageChangeHandler(Value);\r
218 break;\r
219\r
220 case FRONT_PAGE_KEY_RESET:\r
221 //\r
222 // Reset\r
223 //\r
224 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
225 *Status = EFI_UNSUPPORTED;\r
226\r
227 default:\r
228 break;\r
229 }\r
230 }\r
231\r
232 return TRUE;\r
233}\r
234\r
235/**\r
236 Create Select language menu in the front page with oneof opcode.\r
237\r
238 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
c9802c45
ED
239 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
240\r
c9802c45
ED
241**/\r
242VOID\r
243UiCreateLanguageMenu (\r
244 IN EFI_HII_HANDLE HiiHandle,\r
245 IN VOID *StartOpCodeHandle\r
246 )\r
247{\r
248 CHAR8 *LangCode;\r
249 CHAR8 *Lang;\r
250 CHAR8 *CurrentLang;\r
251 UINTN OptionCount;\r
252 CHAR16 *StringBuffer;\r
253 VOID *OptionsOpCodeHandle;\r
254 UINTN StringSize;\r
255 EFI_STATUS Status;\r
256 EFI_HII_STRING_PROTOCOL *HiiString;\r
257\r
258 Lang = NULL;\r
259 StringBuffer = NULL;\r
260\r
261 //\r
262 // Init OpCode Handle and Allocate space for creation of UpdateData Buffer\r
263 //\r
264 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
265 ASSERT (OptionsOpCodeHandle != NULL);\r
266\r
267 GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
268\r
269 //\r
270 // Get Support language list from variable.\r
271 //\r
272 GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL);\r
273 if (gLanguageString == NULL) {\r
274 gLanguageString = AllocateCopyPool (\r
275 AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
276 (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
277 );\r
278 ASSERT (gLanguageString != NULL);\r
279 }\r
280\r
281 if (gLanguageToken == NULL) {\r
282 //\r
283 // Count the language list number.\r
284 //\r
285 LangCode = gLanguageString;\r
286 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
287 ASSERT (Lang != NULL);\r
288\r
289 OptionCount = 0;\r
290 while (*LangCode != 0) {\r
291 GetNextLanguage (&LangCode, Lang);\r
292 OptionCount ++;\r
293 }\r
294\r
295 //\r
296 // Allocate extra 1 as the end tag.\r
297 //\r
298 gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));\r
299 ASSERT (gLanguageToken != NULL);\r
300\r
301 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);\r
302 ASSERT_EFI_ERROR (Status);\r
303\r
304 LangCode = gLanguageString;\r
305 OptionCount = 0;\r
306 while (*LangCode != 0) {\r
307 GetNextLanguage (&LangCode, Lang);\r
308\r
309 StringSize = 0;\r
310 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
311 if (Status == EFI_BUFFER_TOO_SMALL) {\r
312 StringBuffer = AllocateZeroPool (StringSize);\r
313 ASSERT (StringBuffer != NULL);\r
314 Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);\r
315 ASSERT_EFI_ERROR (Status);\r
316 }\r
317\r
318 if (EFI_ERROR (Status)) {\r
319 StringBuffer = AllocatePool (AsciiStrSize (Lang) * sizeof (CHAR16));\r
320 ASSERT (StringBuffer != NULL);\r
321 AsciiStrToUnicodeStr (Lang, StringBuffer);\r
322 }\r
323\r
324 ASSERT (StringBuffer != NULL);\r
325 gLanguageToken[OptionCount] = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
326 FreePool (StringBuffer);\r
327\r
328 OptionCount++;\r
329 }\r
330 }\r
331\r
332 ASSERT (gLanguageToken != NULL);\r
333 LangCode = gLanguageString;\r
334 OptionCount = 0;\r
335 if (Lang == NULL) {\r
336 Lang = AllocatePool (AsciiStrSize (gLanguageString));\r
337 ASSERT (Lang != NULL);\r
338 }\r
339 while (*LangCode != 0) {\r
340 GetNextLanguage (&LangCode, Lang);\r
341\r
342 if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {\r
343 HiiCreateOneOfOptionOpCode (\r
344 OptionsOpCodeHandle,\r
345 gLanguageToken[OptionCount],\r
346 EFI_IFR_OPTION_DEFAULT,\r
347 EFI_IFR_NUMERIC_SIZE_1,\r
348 (UINT8) OptionCount\r
349 );\r
350 } else {\r
351 HiiCreateOneOfOptionOpCode (\r
352 OptionsOpCodeHandle,\r
353 gLanguageToken[OptionCount],\r
354 0,\r
355 EFI_IFR_NUMERIC_SIZE_1,\r
356 (UINT8) OptionCount\r
357 );\r
358 }\r
359\r
360 OptionCount++;\r
361 }\r
362\r
363 if (CurrentLang != NULL) {\r
364 FreePool (CurrentLang);\r
365 }\r
366 FreePool (Lang);\r
367\r
368 HiiCreateOneOfOpCode (\r
369 StartOpCodeHandle,\r
370 FRONT_PAGE_KEY_LANGUAGE,\r
371 0,\r
372 0,\r
373 STRING_TOKEN (STR_LANGUAGE_SELECT),\r
374 STRING_TOKEN (STR_LANGUAGE_SELECT_HELP),\r
375 EFI_IFR_FLAG_CALLBACK,\r
376 EFI_IFR_NUMERIC_SIZE_1,\r
377 OptionsOpCodeHandle,\r
378 NULL\r
379 );\r
380}\r
381\r
382/**\r
383 Create continue menu in the front page.\r
384\r
385 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
386 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
387\r
388**/\r
389VOID\r
390UiCreateContinueMenu (\r
391 IN EFI_HII_HANDLE HiiHandle,\r
392 IN VOID *StartOpCodeHandle\r
393 )\r
394{\r
395 HiiCreateActionOpCode (\r
396 StartOpCodeHandle,\r
397 FRONT_PAGE_KEY_CONTINUE,\r
398 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
399 STRING_TOKEN (STR_CONTINUE_PROMPT),\r
400 EFI_IFR_FLAG_CALLBACK,\r
401 0\r
402 );\r
403}\r
404\r
405/**\r
406 Create empty line menu in the front page.\r
407\r
408 @param HiiHandle The hii handle for the Uiapp driver.\r
409 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
410\r
411**/\r
412VOID\r
413UiCreateEmptyLine (\r
414 IN EFI_HII_HANDLE HiiHandle,\r
415 IN VOID *StartOpCodeHandle\r
416 )\r
417{\r
418 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);\r
419}\r
420\r
421/**\r
422 Create Reset menu in the front page.\r
423\r
424 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
425 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
426\r
427**/\r
428VOID\r
429UiCreateResetMenu (\r
430 IN EFI_HII_HANDLE HiiHandle,\r
431 IN VOID *StartOpCodeHandle\r
432 )\r
433{\r
434 HiiCreateActionOpCode (\r
435 StartOpCodeHandle,\r
436 FRONT_PAGE_KEY_RESET,\r
437 STRING_TOKEN (STR_RESET_STRING),\r
438 STRING_TOKEN (STR_RESET_STRING),\r
439 EFI_IFR_FLAG_CALLBACK,\r
440 0\r
441 );\r
442}\r
443\r
444/**\r
445 Extract device path for given HII handle and class guid.\r
446\r
447 @param Handle The HII handle.\r
448\r
449 @retval NULL Fail to get the device path string.\r
450 @return PathString Get the device path string.\r
451\r
452**/\r
453CHAR16 *\r
454ExtractDevicePathFromHiiHandle (\r
455 IN EFI_HII_HANDLE Handle\r
456 )\r
457{\r
458 EFI_STATUS Status;\r
459 EFI_HANDLE DriverHandle;\r
460\r
461 ASSERT (Handle != NULL);\r
462\r
463 if (Handle == NULL) {\r
464 return NULL;\r
465 }\r
466\r
467 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
468 if (EFI_ERROR (Status)) {\r
469 return NULL;\r
470 }\r
471\r
472 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
473}\r
474\r
475/**\r
476 Check whether this driver need to be shown in the front page.\r
477\r
478 @param HiiHandle The hii handle for the driver.\r
479 @param Guid The special guid for the driver which is the target.\r
480 @param PromptId Return the prompt string id.\r
481 @param HelpId Return the help string id.\r
482 @param FormsetGuid Return the formset guid info.\r
483\r
484 @retval EFI_SUCCESS Search the driver success\r
485\r
486**/\r
487BOOLEAN\r
488RequiredDriver (\r
489 IN EFI_HII_HANDLE HiiHandle,\r
490 IN EFI_GUID *Guid,\r
491 OUT EFI_STRING_ID *PromptId,\r
492 OUT EFI_STRING_ID *HelpId,\r
493 OUT VOID *FormsetGuid\r
494 )\r
495{\r
496 EFI_STATUS Status;\r
497 UINT8 ClassGuidNum;\r
498 EFI_GUID *ClassGuid;\r
499 EFI_IFR_FORM_SET *Buffer;\r
500 UINTN BufferSize;\r
501 UINT8 *Ptr;\r
502 UINTN TempSize;\r
503 BOOLEAN RetVal;\r
504\r
505 Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);\r
506 if (EFI_ERROR (Status)) {\r
507 return FALSE;\r
508 }\r
509\r
510 RetVal = FALSE;\r
511 TempSize = 0;\r
512 Ptr = (UINT8 *) Buffer;\r
513 while(TempSize < BufferSize) {\r
514 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
515\r
516 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
517 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
518 continue;\r
519 }\r
520\r
521 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
522 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
523 while (ClassGuidNum-- > 0) {\r
524 if (!CompareGuid (Guid, ClassGuid)){\r
525 ClassGuid ++;\r
526 continue;\r
527 }\r
528\r
529 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;\r
530 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;\r
531 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));\r
532 RetVal = TRUE;\r
533 }\r
534 }\r
535\r
536 FreePool (Buffer);\r
537\r
538 return RetVal;\r
539}\r
540\r
541/**\r
542 Search the drivers in the system which need to show in the front page\r
543 and insert the menu to the front page.\r
544\r
545 @param HiiHandle The hii handle for the Uiapp driver.\r
546 @param ClassGuid The class guid for the driver which is the target.\r
8caa3caa 547 @param SpecialHandlerFn The pointer to the specail handler function, if any.\r
c9802c45 548 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
c9802c45
ED
549\r
550 @retval EFI_SUCCESS Search the driver success\r
551\r
552**/\r
553EFI_STATUS\r
554UiListThirdPartyDrivers (\r
555 IN EFI_HII_HANDLE HiiHandle,\r
556 IN EFI_GUID *ClassGuid,\r
557 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,\r
558 IN VOID *StartOpCodeHandle\r
559 )\r
560{\r
561 UINTN Index;\r
562 EFI_STRING String;\r
563 EFI_STRING_ID Token;\r
564 EFI_STRING_ID TokenHelp;\r
565 EFI_HII_HANDLE *HiiHandles;\r
566 CHAR16 *DevicePathStr;\r
567 UINTN Count;\r
568 UINTN CurrentSize;\r
569 UI_HII_DRIVER_INSTANCE *DriverListPtr;\r
570 EFI_STRING NewName;\r
571 BOOLEAN EmptyLineAfter;\r
572\r
573 if (gHiiDriverList != NULL) {\r
574 FreePool (gHiiDriverList);\r
575 }\r
576\r
577 HiiHandles = HiiGetHiiHandles (NULL);\r
578 ASSERT (HiiHandles != NULL);\r
579\r
580 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));\r
581 ASSERT (gHiiDriverList != NULL);\r
582 DriverListPtr = gHiiDriverList;\r
583 CurrentSize = UI_HII_DRIVER_LIST_SIZE;\r
584\r
585 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {\r
586 if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {\r
587 continue;\r
588 }\r
589\r
590 String = HiiGetString (HiiHandles[Index], Token, NULL);\r
591 if (String == NULL) {\r
7258076b 592 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
593 ASSERT (String != NULL);\r
594 } else if (SpecialHandlerFn != NULL) {\r
595 //\r
596 // Check whether need to rename the driver name.\r
597 //\r
598 EmptyLineAfter = FALSE;\r
599 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {\r
600 FreePool (String);\r
601 String = NewName;\r
602 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;\r
603 }\r
604 }\r
605 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);\r
606 FreePool (String);\r
607\r
608 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);\r
609 if (String == NULL) {\r
7258076b 610 String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
c9802c45
ED
611 ASSERT (String != NULL);\r
612 }\r
613 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);\r
614 FreePool (String);\r
615\r
616 DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);\r
617 if (DevicePathStr != NULL){\r
618 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
619 FreePool (DevicePathStr);\r
620 } else {\r
621 DriverListPtr[Count].DevicePathId = 0;\r
622 }\r
623\r
624 Count++;\r
625 if (Count >= CurrentSize) {\r
626 DriverListPtr = AllocateCopyPool ((Count + UI_HII_DRIVER_LIST_SIZE) * sizeof (UI_HII_DRIVER_INSTANCE), gHiiDriverList);\r
627 ASSERT (DriverListPtr != NULL);\r
628 FreePool (gHiiDriverList);\r
629 gHiiDriverList = DriverListPtr;\r
630 CurrentSize += UI_HII_DRIVER_LIST_SIZE;\r
631 }\r
632 }\r
633\r
634 FreePool (HiiHandles);\r
635\r
636 Index = 0;\r
637 while (gHiiDriverList[Index].PromptId != 0) {\r
638 HiiCreateGotoExOpCode (\r
639 StartOpCodeHandle,\r
640 0,\r
641 gHiiDriverList[Index].PromptId,\r
642 gHiiDriverList[Index].HelpId,\r
643 0,\r
644 0,\r
645 0,\r
646 &gHiiDriverList[Index].FormSetGuid,\r
647 gHiiDriverList[Index].DevicePathId\r
648 );\r
649\r
650 if (gHiiDriverList[Index].EmptyLineAfter) {\r
651 UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);\r
652 }\r
653\r
654 Index ++;\r
655 }\r
656\r
657 return EFI_SUCCESS;\r
658}\r