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
10 #include "BootMaintenanceManager.h"
11 #include "BootMaintenanceManagerCustomizedUiSupport.h"
13 #define UI_HII_DRIVER_LIST_SIZE 0x8
16 EFI_STRING_ID PromptId
;
18 EFI_STRING_ID DevicePathId
;
20 BOOLEAN EmptyLineAfter
;
21 } UI_HII_DRIVER_INSTANCE
;
23 STATIC UI_HII_DRIVER_INSTANCE
*gHiiDriverList
;
27 Create the dynamic item to allow user to set the "BootNext" vaule.
29 @param[in] HiiHandle The hii handle for the Uiapp driver.
30 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
34 BmmCreateBootNextMenu(
35 IN EFI_HII_HANDLE HiiHandle
,
36 IN VOID
*StartOpCodeHandle
39 BM_MENU_ENTRY
*NewMenuEntry
;
40 BM_LOAD_CONTEXT
*NewLoadContext
;
42 VOID
*OptionsOpCodeHandle
;
45 if (BootOptionMenu
.MenuNumber
== 0) {
49 BootNextIndex
= NONE_BOOTNEXT_VALUE
;
51 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
52 ASSERT (OptionsOpCodeHandle
!= NULL
);
54 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
55 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
56 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
58 if (NewLoadContext
->IsBootNext
) {
59 HiiCreateOneOfOptionOpCode (
61 NewMenuEntry
->DisplayStringToken
,
62 EFI_IFR_OPTION_DEFAULT
,
63 EFI_IFR_TYPE_NUM_SIZE_32
,
66 BootNextIndex
= Index
;
68 HiiCreateOneOfOptionOpCode (
70 NewMenuEntry
->DisplayStringToken
,
72 EFI_IFR_TYPE_NUM_SIZE_32
,
78 if (BootNextIndex
== NONE_BOOTNEXT_VALUE
) {
79 HiiCreateOneOfOptionOpCode (
81 STRING_TOKEN (STR_NONE
),
82 EFI_IFR_OPTION_DEFAULT
,
83 EFI_IFR_TYPE_NUM_SIZE_32
,
87 HiiCreateOneOfOptionOpCode (
89 STRING_TOKEN (STR_NONE
),
91 EFI_IFR_TYPE_NUM_SIZE_32
,
96 HiiCreateOneOfOpCode (
98 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
99 VARSTORE_ID_BOOT_MAINT
,
100 BOOT_NEXT_VAR_OFFSET
,
101 STRING_TOKEN (STR_BOOT_NEXT
),
102 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
104 EFI_IFR_NUMERIC_SIZE_4
,
109 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
114 Create Time Out Menu in the page.
116 @param[in] HiiHandle The hii handle for the Uiapp driver.
117 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
121 BmmCreateTimeOutMenu (
122 IN EFI_HII_HANDLE HiiHandle
,
123 IN VOID
*StartOpCodeHandle
126 HiiCreateNumericOpCode (
128 (EFI_QUESTION_ID
) FORM_TIME_OUT_ID
,
129 VARSTORE_ID_BOOT_MAINT
,
130 BOOT_TIME_OUT_VAR_OFFSET
,
131 STRING_TOKEN(STR_NUM_AUTO_BOOT
),
132 STRING_TOKEN(STR_HLP_AUTO_BOOT
),
133 EFI_IFR_FLAG_CALLBACK
,
134 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
143 Create Boot Option menu in the page.
145 @param[in] HiiHandle The hii handle for the Uiapp driver.
146 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
150 BmmCreateBootOptionMenu (
151 IN EFI_HII_HANDLE HiiHandle
,
152 IN VOID
*StartOpCodeHandle
155 HiiCreateGotoOpCode (
158 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE
),
159 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP
),
160 EFI_IFR_FLAG_CALLBACK
,
166 Create Driver Option menu in the page.
168 @param[in] HiiHandle The hii handle for the Uiapp driver.
169 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
173 BmmCreateDriverOptionMenu (
174 IN EFI_HII_HANDLE HiiHandle
,
175 IN VOID
*StartOpCodeHandle
178 HiiCreateGotoOpCode (
180 FORM_DRIVER_SETUP_ID
,
181 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE
),
182 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP
),
183 EFI_IFR_FLAG_CALLBACK
,
189 Create Com Option menu in the page.
191 @param[in] HiiHandle The hii handle for the Uiapp driver.
192 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
196 BmmCreateComOptionMenu (
197 IN EFI_HII_HANDLE HiiHandle
,
198 IN VOID
*StartOpCodeHandle
201 HiiCreateGotoOpCode (
204 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE
),
205 STRING_TOKEN (STR_FORM_CON_MAIN_HELP
),
206 EFI_IFR_FLAG_CALLBACK
,
212 Create Com Option menu in the page.
214 @param[in] HiiHandle The hii handle for the Uiapp driver.
215 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
219 BmmCreateBootFromFileMenu (
220 IN EFI_HII_HANDLE HiiHandle
,
221 IN VOID
*StartOpCodeHandle
224 HiiCreateGotoOpCode (
227 STRING_TOKEN (STR_BOOT_FROM_FILE
),
228 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP
),
229 EFI_IFR_FLAG_CALLBACK
,
230 KEY_VALUE_BOOT_FROM_FILE
235 Create empty line menu in the front page.
237 @param HiiHandle The hii handle for the Uiapp driver.
238 @param StartOpCodeHandle The opcode handle to save the new opcode.
243 IN EFI_HII_HANDLE HiiHandle
,
244 IN VOID
*StartOpCodeHandle
247 HiiCreateSubTitleOpCode (StartOpCodeHandle
, STRING_TOKEN (STR_NULL_STRING
), 0, 0, 0);
251 Extract device path for given HII handle and class guid.
253 @param Handle The HII handle.
255 @retval NULL Fail to get the device path string.
256 @return PathString Get the device path string.
260 ExtractDevicePathFromHandle (
261 IN EFI_HII_HANDLE Handle
265 EFI_HANDLE DriverHandle
;
267 ASSERT (Handle
!= NULL
);
269 if (Handle
== NULL
) {
273 Status
= gHiiDatabase
->GetPackageListHandle (gHiiDatabase
, Handle
, &DriverHandle
);
274 if (EFI_ERROR (Status
)) {
278 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle
), FALSE
, FALSE
);
282 Check whether this driver need to be shown in the front page.
284 @param HiiHandle The hii handle for the driver.
285 @param Guid The special guid for the driver which is the target.
286 @param PromptId Return the prompt string id.
287 @param HelpId Return the help string id.
288 @param FormsetGuid Return the formset guid info.
290 @retval EFI_SUCCESS Search the driver success
295 IN EFI_HII_HANDLE HiiHandle
,
297 OUT EFI_STRING_ID
*PromptId
,
298 OUT EFI_STRING_ID
*HelpId
,
299 OUT VOID
*FormsetGuid
305 EFI_IFR_FORM_SET
*Buffer
;
311 Status
= HiiGetFormSetFromHiiHandle(HiiHandle
, &Buffer
,&BufferSize
);
312 if (EFI_ERROR (Status
)) {
318 Ptr
= (UINT8
*) Buffer
;
319 while(TempSize
< BufferSize
) {
320 TempSize
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
322 if (((EFI_IFR_OP_HEADER
*) Ptr
)->Length
<= OFFSET_OF (EFI_IFR_FORM_SET
, Flags
)){
323 Ptr
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
327 ClassGuidNum
= (UINT8
) (((EFI_IFR_FORM_SET
*)Ptr
)->Flags
& 0x3);
328 ClassGuid
= (EFI_GUID
*) (VOID
*)(Ptr
+ sizeof (EFI_IFR_FORM_SET
));
329 while (ClassGuidNum
-- > 0) {
330 if (!CompareGuid (Guid
, ClassGuid
)){
335 *PromptId
= ((EFI_IFR_FORM_SET
*)Ptr
)->FormSetTitle
;
336 *HelpId
= ((EFI_IFR_FORM_SET
*)Ptr
)->Help
;
337 CopyMem (FormsetGuid
, &((EFI_IFR_FORM_SET
*) Ptr
)->Guid
, sizeof (EFI_GUID
));
348 Search the drivers in the system which need to show in the front page
349 and insert the menu to the front page.
351 @param HiiHandle The hii handle for the Uiapp driver.
352 @param ClassGuid The class guid for the driver which is the target.
353 @param SpecialHandlerFn The pointer to the specail handler function, if any.
354 @param StartOpCodeHandle The opcode handle to save the new opcode.
356 @retval EFI_SUCCESS Search the driver success
360 BmmListThirdPartyDrivers (
361 IN EFI_HII_HANDLE HiiHandle
,
362 IN EFI_GUID
*ClassGuid
,
363 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn
,
364 IN VOID
*StartOpCodeHandle
370 EFI_STRING_ID TokenHelp
;
371 EFI_HII_HANDLE
*HiiHandles
;
372 CHAR16
*DevicePathStr
;
375 UI_HII_DRIVER_INSTANCE
*DriverListPtr
;
377 BOOLEAN EmptyLineAfter
;
379 if (gHiiDriverList
!= NULL
) {
380 FreePool (gHiiDriverList
);
383 HiiHandles
= HiiGetHiiHandles (NULL
);
384 ASSERT (HiiHandles
!= NULL
);
386 gHiiDriverList
= AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE
* sizeof (UI_HII_DRIVER_INSTANCE
));
387 ASSERT (gHiiDriverList
!= NULL
);
388 DriverListPtr
= gHiiDriverList
;
389 CurrentSize
= UI_HII_DRIVER_LIST_SIZE
;
391 for (Index
= 0, Count
= 0; HiiHandles
[Index
] != NULL
; Index
++) {
392 if (!IsRequiredDriver (HiiHandles
[Index
], ClassGuid
, &Token
, &TokenHelp
, &gHiiDriverList
[Count
].FormSetGuid
)) {
396 String
= HiiGetString (HiiHandles
[Index
], Token
, NULL
);
397 if (String
== NULL
) {
398 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
399 ASSERT (String
!= NULL
);
400 } else if (SpecialHandlerFn
!= NULL
) {
402 // Check whether need to rename the driver name.
404 EmptyLineAfter
= FALSE
;
405 if (SpecialHandlerFn (String
, &NewName
, &EmptyLineAfter
)) {
408 DriverListPtr
[Count
].EmptyLineAfter
= EmptyLineAfter
;
411 DriverListPtr
[Count
].PromptId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
414 String
= HiiGetString (HiiHandles
[Index
], TokenHelp
, NULL
);
415 if (String
== NULL
) {
416 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
417 ASSERT (String
!= NULL
);
419 DriverListPtr
[Count
].HelpId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
422 DevicePathStr
= ExtractDevicePathFromHandle(HiiHandles
[Index
]);
423 if (DevicePathStr
!= NULL
){
424 DriverListPtr
[Count
].DevicePathId
= HiiSetString (HiiHandle
, 0, DevicePathStr
, NULL
);
425 FreePool (DevicePathStr
);
427 DriverListPtr
[Count
].DevicePathId
= 0;
431 if (Count
>= CurrentSize
) {
432 DriverListPtr
= ReallocatePool (
433 CurrentSize
* sizeof (UI_HII_DRIVER_INSTANCE
),
434 (Count
+ UI_HII_DRIVER_LIST_SIZE
)
435 * sizeof (UI_HII_DRIVER_INSTANCE
),
438 ASSERT (DriverListPtr
!= NULL
);
439 gHiiDriverList
= DriverListPtr
;
440 CurrentSize
+= UI_HII_DRIVER_LIST_SIZE
;
444 FreePool (HiiHandles
);
447 while (gHiiDriverList
[Index
].PromptId
!= 0) {
448 HiiCreateGotoExOpCode (
451 gHiiDriverList
[Index
].PromptId
,
452 gHiiDriverList
[Index
].HelpId
,
456 &gHiiDriverList
[Index
].FormSetGuid
,
457 gHiiDriverList
[Index
].DevicePathId
460 if (gHiiDriverList
[Index
].EmptyLineAfter
) {
461 BmmCreateEmptyLine (HiiHandle
, StartOpCodeHandle
);