2 The functions for Boot Maintainence Main menu.
4 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "BootMaintenanceManager.h"
10 #include "BootMaintenanceManagerCustomizedUiSupport.h"
12 #define UI_HII_DRIVER_LIST_SIZE 0x8
15 EFI_STRING_ID PromptId
;
17 EFI_STRING_ID DevicePathId
;
19 BOOLEAN EmptyLineAfter
;
20 } UI_HII_DRIVER_INSTANCE
;
22 STATIC UI_HII_DRIVER_INSTANCE
*gHiiDriverList
;
25 Create the dynamic item to allow user to set the "BootNext" vaule.
27 @param[in] HiiHandle The hii handle for the Uiapp driver.
28 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
32 BmmCreateBootNextMenu (
33 IN EFI_HII_HANDLE HiiHandle
,
34 IN VOID
*StartOpCodeHandle
37 BM_MENU_ENTRY
*NewMenuEntry
;
38 BM_LOAD_CONTEXT
*NewLoadContext
;
40 VOID
*OptionsOpCodeHandle
;
43 if (BootOptionMenu
.MenuNumber
== 0) {
47 BootNextIndex
= NONE_BOOTNEXT_VALUE
;
49 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
50 ASSERT (OptionsOpCodeHandle
!= NULL
);
52 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
53 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
54 NewLoadContext
= (BM_LOAD_CONTEXT
*)NewMenuEntry
->VariableContext
;
56 if (NewLoadContext
->IsBootNext
) {
57 HiiCreateOneOfOptionOpCode (
59 NewMenuEntry
->DisplayStringToken
,
60 EFI_IFR_OPTION_DEFAULT
,
61 EFI_IFR_TYPE_NUM_SIZE_32
,
64 BootNextIndex
= Index
;
66 HiiCreateOneOfOptionOpCode (
68 NewMenuEntry
->DisplayStringToken
,
70 EFI_IFR_TYPE_NUM_SIZE_32
,
76 if (BootNextIndex
== NONE_BOOTNEXT_VALUE
) {
77 HiiCreateOneOfOptionOpCode (
79 STRING_TOKEN (STR_NONE
),
80 EFI_IFR_OPTION_DEFAULT
,
81 EFI_IFR_TYPE_NUM_SIZE_32
,
85 HiiCreateOneOfOptionOpCode (
87 STRING_TOKEN (STR_NONE
),
89 EFI_IFR_TYPE_NUM_SIZE_32
,
94 HiiCreateOneOfOpCode (
96 (EFI_QUESTION_ID
)BOOT_NEXT_QUESTION_ID
,
97 VARSTORE_ID_BOOT_MAINT
,
99 STRING_TOKEN (STR_BOOT_NEXT
),
100 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
102 EFI_IFR_NUMERIC_SIZE_4
,
107 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
111 Create Time Out Menu in the page.
113 @param[in] HiiHandle The hii handle for the Uiapp driver.
114 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
118 BmmCreateTimeOutMenu (
119 IN EFI_HII_HANDLE HiiHandle
,
120 IN VOID
*StartOpCodeHandle
123 HiiCreateNumericOpCode (
125 (EFI_QUESTION_ID
)FORM_TIME_OUT_ID
,
126 VARSTORE_ID_BOOT_MAINT
,
127 BOOT_TIME_OUT_VAR_OFFSET
,
128 STRING_TOKEN (STR_NUM_AUTO_BOOT
),
129 STRING_TOKEN (STR_HLP_AUTO_BOOT
),
130 EFI_IFR_FLAG_CALLBACK
,
131 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
140 Create Boot Option menu in the page.
142 @param[in] HiiHandle The hii handle for the Uiapp driver.
143 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
147 BmmCreateBootOptionMenu (
148 IN EFI_HII_HANDLE HiiHandle
,
149 IN VOID
*StartOpCodeHandle
152 HiiCreateGotoOpCode (
155 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE
),
156 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP
),
157 EFI_IFR_FLAG_CALLBACK
,
163 Create Driver Option menu in the page.
165 @param[in] HiiHandle The hii handle for the Uiapp driver.
166 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
170 BmmCreateDriverOptionMenu (
171 IN EFI_HII_HANDLE HiiHandle
,
172 IN VOID
*StartOpCodeHandle
175 HiiCreateGotoOpCode (
177 FORM_DRIVER_SETUP_ID
,
178 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE
),
179 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP
),
180 EFI_IFR_FLAG_CALLBACK
,
186 Create Com Option menu in the page.
188 @param[in] HiiHandle The hii handle for the Uiapp driver.
189 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
193 BmmCreateComOptionMenu (
194 IN EFI_HII_HANDLE HiiHandle
,
195 IN VOID
*StartOpCodeHandle
198 HiiCreateGotoOpCode (
201 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE
),
202 STRING_TOKEN (STR_FORM_CON_MAIN_HELP
),
203 EFI_IFR_FLAG_CALLBACK
,
209 Create Com Option menu in the page.
211 @param[in] HiiHandle The hii handle for the Uiapp driver.
212 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
216 BmmCreateBootFromFileMenu (
217 IN EFI_HII_HANDLE HiiHandle
,
218 IN VOID
*StartOpCodeHandle
221 HiiCreateGotoOpCode (
224 STRING_TOKEN (STR_BOOT_FROM_FILE
),
225 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP
),
226 EFI_IFR_FLAG_CALLBACK
,
227 KEY_VALUE_BOOT_FROM_FILE
232 Create empty line menu in the front page.
234 @param HiiHandle The hii handle for the Uiapp driver.
235 @param StartOpCodeHandle The opcode handle to save the new opcode.
240 IN EFI_HII_HANDLE HiiHandle
,
241 IN VOID
*StartOpCodeHandle
244 HiiCreateSubTitleOpCode (StartOpCodeHandle
, STRING_TOKEN (STR_NULL_STRING
), 0, 0, 0);
248 Extract device path for given HII handle and class guid.
250 @param Handle The HII handle.
252 @retval NULL Fail to get the device path string.
253 @return PathString Get the device path string.
257 ExtractDevicePathFromHandle (
258 IN EFI_HII_HANDLE Handle
262 EFI_HANDLE DriverHandle
;
264 ASSERT (Handle
!= NULL
);
266 if (Handle
== NULL
) {
270 Status
= gHiiDatabase
->GetPackageListHandle (gHiiDatabase
, Handle
, &DriverHandle
);
271 if (EFI_ERROR (Status
)) {
275 return ConvertDevicePathToText (DevicePathFromHandle (DriverHandle
), FALSE
, FALSE
);
279 Check whether this driver need to be shown in the front page.
281 @param HiiHandle The hii handle for the driver.
282 @param Guid The special guid for the driver which is the target.
283 @param PromptId Return the prompt string id.
284 @param HelpId Return the help string id.
285 @param FormsetGuid Return the formset guid info.
287 @retval EFI_SUCCESS Search the driver success
292 IN EFI_HII_HANDLE HiiHandle
,
294 OUT EFI_STRING_ID
*PromptId
,
295 OUT EFI_STRING_ID
*HelpId
,
296 OUT VOID
*FormsetGuid
302 EFI_IFR_FORM_SET
*Buffer
;
308 Status
= HiiGetFormSetFromHiiHandle (HiiHandle
, &Buffer
, &BufferSize
);
309 if (EFI_ERROR (Status
)) {
315 Ptr
= (UINT8
*)Buffer
;
316 while (TempSize
< BufferSize
) {
317 TempSize
+= ((EFI_IFR_OP_HEADER
*)Ptr
)->Length
;
319 if (((EFI_IFR_OP_HEADER
*)Ptr
)->Length
<= OFFSET_OF (EFI_IFR_FORM_SET
, Flags
)) {
320 Ptr
+= ((EFI_IFR_OP_HEADER
*)Ptr
)->Length
;
324 ClassGuidNum
= (UINT8
)(((EFI_IFR_FORM_SET
*)Ptr
)->Flags
& 0x3);
325 ClassGuid
= (EFI_GUID
*)(VOID
*)(Ptr
+ sizeof (EFI_IFR_FORM_SET
));
326 while (ClassGuidNum
-- > 0) {
327 if (!CompareGuid (Guid
, ClassGuid
)) {
332 *PromptId
= ((EFI_IFR_FORM_SET
*)Ptr
)->FormSetTitle
;
333 *HelpId
= ((EFI_IFR_FORM_SET
*)Ptr
)->Help
;
334 CopyMem (FormsetGuid
, &((EFI_IFR_FORM_SET
*)Ptr
)->Guid
, sizeof (EFI_GUID
));
345 Search the drivers in the system which need to show in the front page
346 and insert the menu to the front page.
348 @param HiiHandle The hii handle for the Uiapp driver.
349 @param ClassGuid The class guid for the driver which is the target.
350 @param SpecialHandlerFn The pointer to the specail handler function, if any.
351 @param StartOpCodeHandle The opcode handle to save the new opcode.
353 @retval EFI_SUCCESS Search the driver success
357 BmmListThirdPartyDrivers (
358 IN EFI_HII_HANDLE HiiHandle
,
359 IN EFI_GUID
*ClassGuid
,
360 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn
,
361 IN VOID
*StartOpCodeHandle
367 EFI_STRING_ID TokenHelp
;
368 EFI_HII_HANDLE
*HiiHandles
;
369 CHAR16
*DevicePathStr
;
372 UI_HII_DRIVER_INSTANCE
*DriverListPtr
;
374 BOOLEAN EmptyLineAfter
;
376 if (gHiiDriverList
!= NULL
) {
377 FreePool (gHiiDriverList
);
380 HiiHandles
= HiiGetHiiHandles (NULL
);
381 ASSERT (HiiHandles
!= NULL
);
383 gHiiDriverList
= AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE
* sizeof (UI_HII_DRIVER_INSTANCE
));
384 ASSERT (gHiiDriverList
!= NULL
);
385 DriverListPtr
= gHiiDriverList
;
386 CurrentSize
= UI_HII_DRIVER_LIST_SIZE
;
388 for (Index
= 0, Count
= 0; HiiHandles
[Index
] != NULL
; Index
++) {
389 if (!IsRequiredDriver (HiiHandles
[Index
], ClassGuid
, &Token
, &TokenHelp
, &gHiiDriverList
[Count
].FormSetGuid
)) {
393 String
= HiiGetString (HiiHandles
[Index
], Token
, NULL
);
394 if (String
== NULL
) {
395 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
396 ASSERT (String
!= NULL
);
397 } else if (SpecialHandlerFn
!= NULL
) {
399 // Check whether need to rename the driver name.
401 EmptyLineAfter
= FALSE
;
402 if (SpecialHandlerFn (String
, &NewName
, &EmptyLineAfter
)) {
405 DriverListPtr
[Count
].EmptyLineAfter
= EmptyLineAfter
;
409 DriverListPtr
[Count
].PromptId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
412 String
= HiiGetString (HiiHandles
[Index
], TokenHelp
, NULL
);
413 if (String
== NULL
) {
414 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
415 ASSERT (String
!= NULL
);
418 DriverListPtr
[Count
].HelpId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
421 DevicePathStr
= ExtractDevicePathFromHandle (HiiHandles
[Index
]);
422 if (DevicePathStr
!= NULL
) {
423 DriverListPtr
[Count
].DevicePathId
= HiiSetString (HiiHandle
, 0, DevicePathStr
, NULL
);
424 FreePool (DevicePathStr
);
426 DriverListPtr
[Count
].DevicePathId
= 0;
430 if (Count
>= CurrentSize
) {
431 DriverListPtr
= ReallocatePool (
432 CurrentSize
* sizeof (UI_HII_DRIVER_INSTANCE
),
433 (Count
+ UI_HII_DRIVER_LIST_SIZE
)
434 * sizeof (UI_HII_DRIVER_INSTANCE
),
437 ASSERT (DriverListPtr
!= NULL
);
438 gHiiDriverList
= DriverListPtr
;
439 CurrentSize
+= UI_HII_DRIVER_LIST_SIZE
;
443 FreePool (HiiHandles
);
446 while (gHiiDriverList
[Index
].PromptId
!= 0) {
447 HiiCreateGotoExOpCode (
450 gHiiDriverList
[Index
].PromptId
,
451 gHiiDriverList
[Index
].HelpId
,
455 &gHiiDriverList
[Index
].FormSetGuid
,
456 gHiiDriverList
[Index
].DevicePathId
459 if (gHiiDriverList
[Index
].EmptyLineAfter
) {
460 BmmCreateEmptyLine (HiiHandle
, StartOpCodeHandle
);