2 The functions for Boot Maintainence Main menu.
4 Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "BootMaintenanceManager.h"
17 #include "BootMaintenanceManagerCustomizedUiSupport.h"
19 #define UI_HII_DRIVER_LIST_SIZE 0x8
22 EFI_STRING_ID PromptId
;
24 EFI_STRING_ID DevicePathId
;
26 BOOLEAN EmptyLineAfter
;
27 } UI_HII_DRIVER_INSTANCE
;
29 STATIC UI_HII_DRIVER_INSTANCE
*gHiiDriverList
;
33 Create the dynamic item to allow user to set the "BootNext" vaule.
35 @param CallbackData The BMM context data.
39 BmmCreateBootNextMenu(
40 IN EFI_HII_HANDLE HiiHandle
,
41 IN VOID
*StartOpCodeHandle
44 BM_MENU_ENTRY
*NewMenuEntry
;
45 BM_LOAD_CONTEXT
*NewLoadContext
;
47 VOID
*OptionsOpCodeHandle
;
50 if (BootOptionMenu
.MenuNumber
== 0) {
54 BootNextIndex
= NONE_BOOTNEXT_VALUE
;
56 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
57 ASSERT (OptionsOpCodeHandle
!= NULL
);
59 for (Index
= 0; Index
< BootOptionMenu
.MenuNumber
; Index
++) {
60 NewMenuEntry
= BOpt_GetMenuEntry (&BootOptionMenu
, Index
);
61 NewLoadContext
= (BM_LOAD_CONTEXT
*) NewMenuEntry
->VariableContext
;
63 if (NewLoadContext
->IsBootNext
) {
64 HiiCreateOneOfOptionOpCode (
66 NewMenuEntry
->DisplayStringToken
,
67 EFI_IFR_OPTION_DEFAULT
,
68 EFI_IFR_TYPE_NUM_SIZE_32
,
71 BootNextIndex
= Index
;
73 HiiCreateOneOfOptionOpCode (
75 NewMenuEntry
->DisplayStringToken
,
77 EFI_IFR_TYPE_NUM_SIZE_32
,
83 if (BootNextIndex
== NONE_BOOTNEXT_VALUE
) {
84 HiiCreateOneOfOptionOpCode (
86 STRING_TOKEN (STR_NONE
),
87 EFI_IFR_OPTION_DEFAULT
,
88 EFI_IFR_TYPE_NUM_SIZE_32
,
92 HiiCreateOneOfOptionOpCode (
94 STRING_TOKEN (STR_NONE
),
96 EFI_IFR_TYPE_NUM_SIZE_32
,
101 HiiCreateOneOfOpCode (
103 (EFI_QUESTION_ID
) BOOT_NEXT_QUESTION_ID
,
104 VARSTORE_ID_BOOT_MAINT
,
105 BOOT_NEXT_VAR_OFFSET
,
106 STRING_TOKEN (STR_BOOT_NEXT
),
107 STRING_TOKEN (STR_BOOT_NEXT_HELP
),
109 EFI_IFR_NUMERIC_SIZE_4
,
114 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
119 Create Time Out Menu in the page.
121 @param[in] HiiHandle The hii handle for the Uiapp driver.
122 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
123 @param[in] PromptId The Prompt string id.
124 @param[in] HelpId The help string id.
125 @param[in] FormId The Form id for the dest form.
126 @param[in] QuestionId The question id for this goto question.
130 BmmCreateTimeOutMenu (
131 IN EFI_HII_HANDLE HiiHandle
,
132 IN VOID
*StartOpCodeHandle
135 HiiCreateNumericOpCode (
137 (EFI_QUESTION_ID
) FORM_TIME_OUT_ID
,
138 VARSTORE_ID_BOOT_MAINT
,
139 BOOT_TIME_OUT_VAR_OFFSET
,
140 STRING_TOKEN(STR_NUM_AUTO_BOOT
),
141 STRING_TOKEN(STR_HLP_AUTO_BOOT
),
142 EFI_IFR_FLAG_CALLBACK
,
143 EFI_IFR_NUMERIC_SIZE_2
| EFI_IFR_DISPLAY_UINT_DEC
,
152 Create Boot Option menu in the page.
154 @param[in] HiiHandle The hii handle for the Uiapp driver.
155 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
159 BmmCreateBootOptionMenu (
160 IN EFI_HII_HANDLE HiiHandle
,
161 IN VOID
*StartOpCodeHandle
164 HiiCreateGotoOpCode (
167 STRING_TOKEN (STR_FORM_BOOT_SETUP_TITLE
),
168 STRING_TOKEN (STR_FORM_BOOT_SETUP_HELP
),
169 EFI_IFR_FLAG_CALLBACK
,
175 Create Driver Option menu in the page.
177 @param[in] HiiHandle The hii handle for the Uiapp driver.
178 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
182 BmmCreateDriverOptionMenu (
183 IN EFI_HII_HANDLE HiiHandle
,
184 IN VOID
*StartOpCodeHandle
187 HiiCreateGotoOpCode (
189 FORM_DRIVER_SETUP_ID
,
190 STRING_TOKEN (STR_FORM_DRIVER_SETUP_TITLE
),
191 STRING_TOKEN (STR_FORM_DRIVER_SETUP_HELP
),
192 EFI_IFR_FLAG_CALLBACK
,
198 Create Com Option menu in the page.
200 @param[in] HiiHandle The hii handle for the Uiapp driver.
201 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
205 BmmCreateComOptionMenu (
206 IN EFI_HII_HANDLE HiiHandle
,
207 IN VOID
*StartOpCodeHandle
210 HiiCreateGotoOpCode (
213 STRING_TOKEN (STR_FORM_CON_MAIN_TITLE
),
214 STRING_TOKEN (STR_FORM_CON_MAIN_HELP
),
215 EFI_IFR_FLAG_CALLBACK
,
221 Create Com Option menu in the page.
223 @param[in] HiiHandle The hii handle for the Uiapp driver.
224 @param[in] StartOpCodeHandle The opcode handle to save the new opcode.
225 @param[in] PromptId The Prompt string id.
226 @param[in] HelpId The help string id.
227 @param[in] FormId The Form id for the dest form.
228 @param[in] QuestionId The question id for this goto question.
232 BmmCreateBootFromFileMenu (
233 IN EFI_HII_HANDLE HiiHandle
,
234 IN VOID
*StartOpCodeHandle
237 HiiCreateGotoOpCode (
240 STRING_TOKEN (STR_BOOT_FROM_FILE
),
241 STRING_TOKEN (STR_BOOT_FROM_FILE_HELP
),
242 EFI_IFR_FLAG_CALLBACK
,
243 KEY_VALUE_BOOT_FROM_FILE
248 Create empty line menu in the front page.
250 @param HiiHandle The hii handle for the Uiapp driver.
251 @param StartOpCodeHandle The opcode handle to save the new opcode.
256 IN EFI_HII_HANDLE HiiHandle
,
257 IN VOID
*StartOpCodeHandle
260 HiiCreateSubTitleOpCode (StartOpCodeHandle
, STRING_TOKEN (STR_NULL_STRING
), 0, 0, 0);
264 Extract device path for given HII handle and class guid.
266 @param Handle The HII handle.
268 @retval NULL Fail to get the device path string.
269 @return PathString Get the device path string.
273 ExtractDevicePathFromHandle (
274 IN EFI_HII_HANDLE Handle
278 EFI_HANDLE DriverHandle
;
280 ASSERT (Handle
!= NULL
);
282 if (Handle
== NULL
) {
286 Status
= gHiiDatabase
->GetPackageListHandle (gHiiDatabase
, Handle
, &DriverHandle
);
287 if (EFI_ERROR (Status
)) {
291 return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle
), FALSE
, FALSE
);
295 Check whether this driver need to be shown in the front page.
297 @param HiiHandle The hii handle for the driver.
298 @param Guid The special guid for the driver which is the target.
299 @param PromptId Return the prompt string id.
300 @param HelpId Return the help string id.
301 @param FormsetGuid Return the formset guid info.
303 @retval EFI_SUCCESS Search the driver success
308 IN EFI_HII_HANDLE HiiHandle
,
310 OUT EFI_STRING_ID
*PromptId
,
311 OUT EFI_STRING_ID
*HelpId
,
312 OUT VOID
*FormsetGuid
318 EFI_IFR_FORM_SET
*Buffer
;
324 Status
= HiiGetFormSetFromHiiHandle(HiiHandle
, &Buffer
,&BufferSize
);
325 if (EFI_ERROR (Status
)) {
331 Ptr
= (UINT8
*) Buffer
;
332 while(TempSize
< BufferSize
) {
333 TempSize
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
335 if (((EFI_IFR_OP_HEADER
*) Ptr
)->Length
<= OFFSET_OF (EFI_IFR_FORM_SET
, Flags
)){
336 Ptr
+= ((EFI_IFR_OP_HEADER
*) Ptr
)->Length
;
340 ClassGuidNum
= (UINT8
) (((EFI_IFR_FORM_SET
*)Ptr
)->Flags
& 0x3);
341 ClassGuid
= (EFI_GUID
*) (VOID
*)(Ptr
+ sizeof (EFI_IFR_FORM_SET
));
342 while (ClassGuidNum
-- > 0) {
343 if (!CompareGuid (Guid
, ClassGuid
)){
348 *PromptId
= ((EFI_IFR_FORM_SET
*)Ptr
)->FormSetTitle
;
349 *HelpId
= ((EFI_IFR_FORM_SET
*)Ptr
)->Help
;
350 CopyMem (FormsetGuid
, &((EFI_IFR_FORM_SET
*) Ptr
)->Guid
, sizeof (EFI_GUID
));
361 Search the drivers in the system which need to show in the front page
362 and insert the menu to the front page.
364 @param HiiHandle The hii handle for the Uiapp driver.
365 @param ClassGuid The class guid for the driver which is the target.
366 @param StartOpCodeHandle The opcode handle to save the new opcode.
367 @param SpecialHandler The pointer to the specail handler function, if any.
369 @retval EFI_SUCCESS Search the driver success
373 BmmListThirdPartyDrivers (
374 IN EFI_HII_HANDLE HiiHandle
,
375 IN EFI_GUID
*ClassGuid
,
376 IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn
,
377 IN VOID
*StartOpCodeHandle
383 EFI_STRING_ID TokenHelp
;
384 EFI_HII_HANDLE
*HiiHandles
;
385 CHAR16
*DevicePathStr
;
388 UI_HII_DRIVER_INSTANCE
*DriverListPtr
;
390 BOOLEAN EmptyLineAfter
;
392 if (gHiiDriverList
!= NULL
) {
393 FreePool (gHiiDriverList
);
396 HiiHandles
= HiiGetHiiHandles (NULL
);
397 ASSERT (HiiHandles
!= NULL
);
399 gHiiDriverList
= AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE
* sizeof (UI_HII_DRIVER_INSTANCE
));
400 ASSERT (gHiiDriverList
!= NULL
);
401 DriverListPtr
= gHiiDriverList
;
402 CurrentSize
= UI_HII_DRIVER_LIST_SIZE
;
404 for (Index
= 0, Count
= 0; HiiHandles
[Index
] != NULL
; Index
++) {
405 if (!IsRequiredDriver (HiiHandles
[Index
], ClassGuid
, &Token
, &TokenHelp
, &gHiiDriverList
[Count
].FormSetGuid
)) {
409 String
= HiiGetString (HiiHandles
[Index
], Token
, NULL
);
410 if (String
== NULL
) {
411 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
412 ASSERT (String
!= NULL
);
413 } else if (SpecialHandlerFn
!= NULL
) {
415 // Check whether need to rename the driver name.
417 EmptyLineAfter
= FALSE
;
418 if (SpecialHandlerFn (String
, &NewName
, &EmptyLineAfter
)) {
421 DriverListPtr
[Count
].EmptyLineAfter
= EmptyLineAfter
;
424 DriverListPtr
[Count
].PromptId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
427 String
= HiiGetString (HiiHandles
[Index
], TokenHelp
, NULL
);
428 if (String
== NULL
) {
429 String
= HiiGetString (HiiHandle
, STRING_TOKEN (STR_MISSING_STRING
), NULL
);
430 ASSERT (String
!= NULL
);
432 DriverListPtr
[Count
].HelpId
= HiiSetString (HiiHandle
, 0, String
, NULL
);
435 DevicePathStr
= ExtractDevicePathFromHandle(HiiHandles
[Index
]);
436 if (DevicePathStr
!= NULL
){
437 DriverListPtr
[Count
].DevicePathId
= HiiSetString (HiiHandle
, 0, DevicePathStr
, NULL
);
438 FreePool (DevicePathStr
);
440 DriverListPtr
[Count
].DevicePathId
= 0;
444 if (Count
>= CurrentSize
) {
445 DriverListPtr
= AllocateCopyPool ((Count
+ UI_HII_DRIVER_LIST_SIZE
) * sizeof (UI_HII_DRIVER_INSTANCE
), gHiiDriverList
);
446 ASSERT (DriverListPtr
!= NULL
);
447 FreePool (gHiiDriverList
);
448 gHiiDriverList
= DriverListPtr
;
449 CurrentSize
+= UI_HII_DRIVER_LIST_SIZE
;
453 FreePool (HiiHandles
);
456 while (gHiiDriverList
[Index
].PromptId
!= 0) {
457 HiiCreateGotoExOpCode (
460 gHiiDriverList
[Index
].PromptId
,
461 gHiiDriverList
[Index
].HelpId
,
465 &gHiiDriverList
[Index
].FormSetGuid
,
466 gHiiDriverList
[Index
].DevicePathId
469 if (gHiiDriverList
[Index
].EmptyLineAfter
) {
470 BmmCreateEmptyLine (HiiHandle
, StartOpCodeHandle
);