]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerCustomizedUiSupport.c
MdeModulePkg: Fix misuses of AllocateCopyPool
[mirror_edk2.git] / MdeModulePkg / Library / BootMaintenanceManagerUiLib / BootMaintenanceManagerCustomizedUiSupport.c
CommitLineData
a85be3ae
ED
1/** @file\r
2The functions for Boot Maintainence Main menu.\r
3\r
4Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15\r
16#include "BootMaintenanceManager.h"\r
17#include "BootMaintenanceManagerCustomizedUiSupport.h"\r
18\r
19#define UI_HII_DRIVER_LIST_SIZE 0x8\r
20\r
21typedef struct {\r
22 EFI_STRING_ID PromptId;\r
23 EFI_STRING_ID HelpId;\r
24 EFI_STRING_ID DevicePathId;\r
25 EFI_GUID FormSetGuid;\r
26 BOOLEAN EmptyLineAfter;\r
27} UI_HII_DRIVER_INSTANCE;\r
28\r
7b13510f 29STATIC UI_HII_DRIVER_INSTANCE *gHiiDriverList;\r
a85be3ae
ED
30\r
31\r
32/**\r
33 Create the dynamic item to allow user to set the "BootNext" vaule.\r
34\r
8caa3caa
DB
35 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
36 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
37\r
38**/\r
39VOID\r
40BmmCreateBootNextMenu(\r
41 IN EFI_HII_HANDLE HiiHandle,\r
42 IN VOID *StartOpCodeHandle\r
43 )\r
44{\r
45 BM_MENU_ENTRY *NewMenuEntry;\r
720eea6a 46 BM_LOAD_CONTEXT *NewLoadContext;\r
a85be3ae
ED
47 UINT16 Index;\r
48 VOID *OptionsOpCodeHandle;\r
720eea6a 49 UINT32 BootNextIndex;\r
a85be3ae 50\r
720eea6a 51 if (BootOptionMenu.MenuNumber == 0) {\r
a85be3ae
ED
52 return;\r
53 }\r
54\r
720eea6a
ED
55 BootNextIndex = NONE_BOOTNEXT_VALUE;\r
56\r
a85be3ae
ED
57 OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
58 ASSERT (OptionsOpCodeHandle != NULL);\r
59\r
60 for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
61 NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
720eea6a
ED
62 NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
63\r
64 if (NewLoadContext->IsBootNext) {\r
65 HiiCreateOneOfOptionOpCode (\r
66 OptionsOpCodeHandle,\r
67 NewMenuEntry->DisplayStringToken,\r
68 EFI_IFR_OPTION_DEFAULT,\r
69 EFI_IFR_TYPE_NUM_SIZE_32,\r
70 Index\r
71 );\r
72 BootNextIndex = Index;\r
73 } else {\r
74 HiiCreateOneOfOptionOpCode (\r
75 OptionsOpCodeHandle,\r
76 NewMenuEntry->DisplayStringToken,\r
77 0,\r
78 EFI_IFR_TYPE_NUM_SIZE_32,\r
79 Index\r
80 );\r
81 }\r
82 }\r
a85be3ae 83\r
720eea6a
ED
84 if (BootNextIndex == NONE_BOOTNEXT_VALUE) {\r
85 HiiCreateOneOfOptionOpCode (\r
86 OptionsOpCodeHandle,\r
87 STRING_TOKEN (STR_NONE),\r
88 EFI_IFR_OPTION_DEFAULT,\r
89 EFI_IFR_TYPE_NUM_SIZE_32,\r
90 NONE_BOOTNEXT_VALUE\r
91 );\r
92 } else {\r
a85be3ae
ED
93 HiiCreateOneOfOptionOpCode (\r
94 OptionsOpCodeHandle,\r
720eea6a 95 STRING_TOKEN (STR_NONE),\r
a85be3ae 96 0,\r
720eea6a
ED
97 EFI_IFR_TYPE_NUM_SIZE_32,\r
98 NONE_BOOTNEXT_VALUE\r
a85be3ae
ED
99 );\r
100 }\r
101\r
a85be3ae
ED
102 HiiCreateOneOfOpCode (\r
103 StartOpCodeHandle,\r
104 (EFI_QUESTION_ID) BOOT_NEXT_QUESTION_ID,\r
105 VARSTORE_ID_BOOT_MAINT,\r
106 BOOT_NEXT_VAR_OFFSET,\r
107 STRING_TOKEN (STR_BOOT_NEXT),\r
108 STRING_TOKEN (STR_BOOT_NEXT_HELP),\r
109 0,\r
720eea6a 110 EFI_IFR_NUMERIC_SIZE_4,\r
a85be3ae
ED
111 OptionsOpCodeHandle,\r
112 NULL\r
113 );\r
114\r
115 HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
116\r
117}\r
118\r
119/**\r
120 Create Time Out Menu in the page.\r
121\r
122 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
123 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
124\r
125**/\r
126VOID\r
127BmmCreateTimeOutMenu (\r
128 IN EFI_HII_HANDLE HiiHandle,\r
129 IN VOID *StartOpCodeHandle\r
130 )\r
131{\r
132 HiiCreateNumericOpCode (\r
133 StartOpCodeHandle,\r
134 (EFI_QUESTION_ID) FORM_TIME_OUT_ID,\r
135 VARSTORE_ID_BOOT_MAINT,\r
136 BOOT_TIME_OUT_VAR_OFFSET,\r
137 STRING_TOKEN(STR_NUM_AUTO_BOOT),\r
138 STRING_TOKEN(STR_HLP_AUTO_BOOT),\r
139 EFI_IFR_FLAG_CALLBACK,\r
140 EFI_IFR_NUMERIC_SIZE_2 | EFI_IFR_DISPLAY_UINT_DEC,\r
141 0,\r
142 65535,\r
143 0,\r
144 NULL\r
145 );\r
146}\r
147\r
148/**\r
149 Create Boot Option menu in the page.\r
150\r
151 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
152 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
153\r
154**/\r
155VOID\r
156BmmCreateBootOptionMenu (\r
157 IN EFI_HII_HANDLE HiiHandle,\r
158 IN VOID *StartOpCodeHandle\r
159 )\r
160{\r
161 HiiCreateGotoOpCode (\r
162 StartOpCodeHandle,\r
163 FORM_BOOT_SETUP_ID,\r
164 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE),\r
165 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP),\r
166 EFI_IFR_FLAG_CALLBACK,\r
167 FORM_BOOT_SETUP_ID\r
168 );\r
169}\r
170\r
171/**\r
172 Create Driver Option menu in the page.\r
173\r
174 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
175 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
176\r
177**/\r
178VOID\r
179BmmCreateDriverOptionMenu (\r
180 IN EFI_HII_HANDLE HiiHandle,\r
181 IN VOID *StartOpCodeHandle\r
182 )\r
183{\r
184 HiiCreateGotoOpCode (\r
185 StartOpCodeHandle,\r
186 FORM_DRIVER_SETUP_ID,\r
187 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE),\r
188 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP),\r
189 EFI_IFR_FLAG_CALLBACK,\r
190 FORM_DRIVER_SETUP_ID\r
191 );\r
192}\r
193\r
194/**\r
195 Create Com Option menu in the page.\r
196\r
197 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
198 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
199\r
200**/\r
201VOID\r
202BmmCreateComOptionMenu (\r
203 IN EFI_HII_HANDLE HiiHandle,\r
204 IN VOID *StartOpCodeHandle\r
205 )\r
206{\r
207 HiiCreateGotoOpCode (\r
208 StartOpCodeHandle,\r
209 FORM_CON_MAIN_ID,\r
210 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE),\r
211 STRING_TOKEN (STR_FORM_CON_MAIN_HELP),\r
212 EFI_IFR_FLAG_CALLBACK,\r
213 FORM_CON_MAIN_ID\r
214 );\r
215}\r
216\r
217/**\r
218 Create Com Option menu in the page.\r
219\r
220 @param[in] HiiHandle The hii handle for the Uiapp driver.\r
221 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
222\r
223**/\r
224VOID\r
225BmmCreateBootFromFileMenu (\r
226 IN EFI_HII_HANDLE HiiHandle,\r
227 IN VOID *StartOpCodeHandle\r
228 )\r
229{\r
230 HiiCreateGotoOpCode (\r
231 StartOpCodeHandle,\r
232 FORM_MAIN_ID,\r
233 STRING_TOKEN (STR_BOOT_FROM_FILE),\r
234 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP),\r
235 EFI_IFR_FLAG_CALLBACK,\r
236 KEY_VALUE_BOOT_FROM_FILE\r
237 );\r
238}\r
239\r
240/**\r
241 Create empty line menu in the front page.\r
242\r
243 @param HiiHandle The hii handle for the Uiapp driver.\r
244 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
245\r
246**/\r
247VOID\r
248BmmCreateEmptyLine (\r
249 IN EFI_HII_HANDLE HiiHandle,\r
250 IN VOID *StartOpCodeHandle\r
251 )\r
252{\r
253 HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);\r
254}\r
255\r
256/**\r
257 Extract device path for given HII handle and class guid.\r
258\r
259 @param Handle The HII handle.\r
260\r
261 @retval NULL Fail to get the device path string.\r
262 @return PathString Get the device path string.\r
263\r
264**/\r
265CHAR16 *\r
266ExtractDevicePathFromHandle (\r
267 IN EFI_HII_HANDLE Handle\r
268 )\r
269{\r
270 EFI_STATUS Status;\r
271 EFI_HANDLE DriverHandle;\r
272\r
273 ASSERT (Handle != NULL);\r
274\r
275 if (Handle == NULL) {\r
276 return NULL;\r
277 }\r
278\r
279 Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
280 if (EFI_ERROR (Status)) {\r
281 return NULL;\r
282 }\r
283\r
284 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);\r
285}\r
286\r
287/**\r
288 Check whether this driver need to be shown in the front page.\r
289\r
290 @param HiiHandle The hii handle for the driver.\r
291 @param Guid The special guid for the driver which is the target.\r
292 @param PromptId Return the prompt string id.\r
293 @param HelpId Return the help string id.\r
294 @param FormsetGuid Return the formset guid info.\r
295\r
296 @retval EFI_SUCCESS Search the driver success\r
297\r
298**/\r
299BOOLEAN\r
300IsRequiredDriver (\r
301 IN EFI_HII_HANDLE HiiHandle,\r
302 IN EFI_GUID *Guid,\r
303 OUT EFI_STRING_ID *PromptId,\r
304 OUT EFI_STRING_ID *HelpId,\r
305 OUT VOID *FormsetGuid\r
306 )\r
307{\r
308 EFI_STATUS Status;\r
309 UINT8 ClassGuidNum;\r
310 EFI_GUID *ClassGuid;\r
311 EFI_IFR_FORM_SET *Buffer;\r
312 UINTN BufferSize;\r
313 UINT8 *Ptr;\r
314 UINTN TempSize;\r
315 BOOLEAN RetVal;\r
316\r
317 Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);\r
318 if (EFI_ERROR (Status)) {\r
319 return FALSE;\r
320 }\r
321\r
322 RetVal = FALSE;\r
323 TempSize = 0;\r
324 Ptr = (UINT8 *) Buffer;\r
325 while(TempSize < BufferSize) {\r
326 TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
327\r
328 if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){\r
329 Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;\r
330 continue;\r
331 }\r
332\r
333 ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);\r
334 ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));\r
335 while (ClassGuidNum-- > 0) {\r
336 if (!CompareGuid (Guid, ClassGuid)){\r
337 ClassGuid ++;\r
338 continue;\r
339 }\r
340\r
341 *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;\r
342 *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;\r
343 CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));\r
344 RetVal = TRUE;\r
345 }\r
346 }\r
347\r
348 FreePool (Buffer);\r
349\r
350 return RetVal;\r
351}\r
352\r
353/**\r
354 Search the drivers in the system which need to show in the front page\r
355 and insert the menu to the front page.\r
356\r
357 @param HiiHandle The hii handle for the Uiapp driver.\r
358 @param ClassGuid The class guid for the driver which is the target.\r
8caa3caa 359 @param SpecialHandlerFn The pointer to the specail handler function, if any.\r
a85be3ae 360 @param StartOpCodeHandle The opcode handle to save the new opcode.\r
a85be3ae
ED
361\r
362 @retval EFI_SUCCESS Search the driver success\r
363\r
364**/\r
365EFI_STATUS\r
366BmmListThirdPartyDrivers (\r
367 IN EFI_HII_HANDLE HiiHandle,\r
368 IN EFI_GUID *ClassGuid,\r
369 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,\r
370 IN VOID *StartOpCodeHandle\r
371 )\r
372{\r
373 UINTN Index;\r
374 EFI_STRING String;\r
375 EFI_STRING_ID Token;\r
376 EFI_STRING_ID TokenHelp;\r
377 EFI_HII_HANDLE *HiiHandles;\r
378 CHAR16 *DevicePathStr;\r
379 UINTN Count;\r
380 UINTN CurrentSize;\r
381 UI_HII_DRIVER_INSTANCE *DriverListPtr;\r
382 EFI_STRING NewName;\r
383 BOOLEAN EmptyLineAfter;\r
384\r
385 if (gHiiDriverList != NULL) {\r
386 FreePool (gHiiDriverList);\r
387 }\r
388\r
389 HiiHandles = HiiGetHiiHandles (NULL);\r
390 ASSERT (HiiHandles != NULL);\r
391\r
392 gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));\r
393 ASSERT (gHiiDriverList != NULL);\r
394 DriverListPtr = gHiiDriverList;\r
395 CurrentSize = UI_HII_DRIVER_LIST_SIZE;\r
396\r
397 for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {\r
398 if (!IsRequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {\r
399 continue;\r
400 }\r
401\r
402 String = HiiGetString (HiiHandles[Index], Token, NULL);\r
403 if (String == NULL) {\r
404 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
405 ASSERT (String != NULL);\r
406 } else if (SpecialHandlerFn != NULL) {\r
407 //\r
408 // Check whether need to rename the driver name.\r
409 //\r
410 EmptyLineAfter = FALSE;\r
411 if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {\r
412 FreePool (String);\r
413 String = NewName;\r
414 DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;\r
415 }\r
416 }\r
417 DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);\r
418 FreePool (String);\r
419\r
420 String = HiiGetString (HiiHandles[Index], TokenHelp, NULL);\r
421 if (String == NULL) {\r
422 String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);\r
423 ASSERT (String != NULL);\r
424 }\r
425 DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);\r
426 FreePool (String);\r
427\r
428 DevicePathStr = ExtractDevicePathFromHandle(HiiHandles[Index]);\r
429 if (DevicePathStr != NULL){\r
430 DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);\r
431 FreePool (DevicePathStr);\r
432 } else {\r
433 DriverListPtr[Count].DevicePathId = 0;\r
434 }\r
435\r
436 Count++;\r
437 if (Count >= CurrentSize) {\r
469293f8
JW
438 DriverListPtr = ReallocatePool (\r
439 CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),\r
440 (Count + UI_HII_DRIVER_LIST_SIZE)\r
441 * sizeof (UI_HII_DRIVER_INSTANCE),\r
442 gHiiDriverList\r
443 );\r
a85be3ae 444 ASSERT (DriverListPtr != NULL);\r
a85be3ae
ED
445 gHiiDriverList = DriverListPtr;\r
446 CurrentSize += UI_HII_DRIVER_LIST_SIZE;\r
447 }\r
448 }\r
449\r
450 FreePool (HiiHandles);\r
451\r
452 Index = 0;\r
453 while (gHiiDriverList[Index].PromptId != 0) {\r
454 HiiCreateGotoExOpCode (\r
455 StartOpCodeHandle,\r
456 0,\r
457 gHiiDriverList[Index].PromptId,\r
458 gHiiDriverList[Index].HelpId,\r
459 0,\r
460 0,\r
461 0,\r
462 &gHiiDriverList[Index].FormSetGuid,\r
463 gHiiDriverList[Index].DevicePathId\r
464 );\r
465\r
466 if (gHiiDriverList[Index].EmptyLineAfter) {\r
467 BmmCreateEmptyLine (HiiHandle, StartOpCodeHandle);\r
468 }\r
469\r
470 Index ++;\r
471 }\r
472\r
473 return EFI_SUCCESS;\r
474}\r
475\r