2 Legacy Boot Maintainence UI implementation.
4 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "LegacyBootMaintUi.h"
19 LEGACY_BOOT_OPTION_CALLBACK_DATA
*mLegacyBootOptionPrivate
= NULL
;
20 EFI_GUID mLegacyBootOptionGuid
= LEGACY_BOOT_OPTION_FORMSET_GUID
;
21 CHAR16 mLegacyBootStorageName
[] = L
"LegacyBootData";
22 BBS_TYPE mBbsType
[] = {BBS_FLOPPY
, BBS_HARDDISK
, BBS_CDROM
, BBS_EMBED_NETWORK
, BBS_BEV_DEVICE
, BBS_UNKNOWN
};
23 BOOLEAN mFirstEnterLegacyForm
= FALSE
;
27 /// Legacy FD Info from LegacyBios.GetBbsInfo()
29 LEGACY_MENU_OPTION LegacyFDMenu
= {
30 LEGACY_MENU_OPTION_SIGNATURE
,
36 /// Legacy HD Info from LegacyBios.GetBbsInfo()
38 LEGACY_MENU_OPTION LegacyHDMenu
= {
39 LEGACY_MENU_OPTION_SIGNATURE
,
45 /// Legacy CD Info from LegacyBios.GetBbsInfo()
47 LEGACY_MENU_OPTION LegacyCDMenu
= {
48 LEGACY_MENU_OPTION_SIGNATURE
,
54 /// Legacy NET Info from LegacyBios.GetBbsInfo()
56 LEGACY_MENU_OPTION LegacyNETMenu
= {
57 LEGACY_MENU_OPTION_SIGNATURE
,
63 /// Legacy NET Info from LegacyBios.GetBbsInfo()
65 LEGACY_MENU_OPTION LegacyBEVMenu
= {
66 LEGACY_MENU_OPTION_SIGNATURE
,
72 VOID
*mLegacyStartOpCodeHandle
= NULL
;
73 VOID
*mLegacyEndOpCodeHandle
= NULL
;
74 EFI_IFR_GUID_LABEL
*mLegacyStartLabel
= NULL
;
75 EFI_IFR_GUID_LABEL
*mLegacyEndLabel
= NULL
;
78 HII_VENDOR_DEVICE_PATH mLegacyBootOptionHiiVendorDevicePath
= {
84 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
85 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
88 { 0x6bc75598, 0x89b4, 0x483d, { 0x91, 0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 0x31 } }
92 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
94 (UINT8
) (END_DEVICE_PATH_LENGTH
),
95 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
102 Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo().
113 Base on the L"LegacyDevOrder" variable to build the current order data.
117 GetLegacyOptionsOrder (
122 Re-order the Boot Option according to the DevOrder.
124 The routine re-orders the Boot Option in BootOption array according to
125 the order specified by DevOrder.
127 @param DevOrder Pointer to buffer containing the BBS Index,
128 high 8-bit value 0xFF indicating a disabled boot option
129 @param DevOrderCount Count of the BBS Index
130 @param EnBootOption Callee allocated buffer containing the enabled Boot Option Numbers
131 @param EnBootOptionCount Count of the enabled Boot Option Numbers
132 @param DisBootOption Callee allocated buffer containing the disabled Boot Option Numbers
133 @param DisBootOptionCount Count of the disabled Boot Option Numbers
135 @return EFI_SUCCESS The function completed successfully.
136 @retval other Contain some error, details see the status return by gRT->SetVariable.
139 OrderLegacyBootOption4SameType (
142 UINT16
**EnBootOption
,
143 UINTN
*EnBootOptionCount
,
144 UINT16
**DisBootOption
,
145 UINTN
*DisBootOptionCount
149 UINT16
*NewBootOption
;
155 EFI_BOOT_MANAGER_LOAD_OPTION BootOption
;
157 CHAR16 OptionName
[sizeof ("Boot####")];
158 UINT16
*BbsIndexArray
;
159 UINT16
*DeviceTypeArray
;
161 GetEfiGlobalVariable2 (L
"BootOrder", (VOID
**) &BootOrder
, &BootOrderSize
);
162 ASSERT (BootOrder
!= NULL
);
164 BbsIndexArray
= AllocatePool (BootOrderSize
);
165 DeviceTypeArray
= AllocatePool (BootOrderSize
);
166 *EnBootOption
= AllocatePool (BootOrderSize
);
167 *DisBootOption
= AllocatePool (BootOrderSize
);
168 *DisBootOptionCount
= 0;
169 *EnBootOptionCount
= 0;
171 Status
= EFI_SUCCESS
;
173 ASSERT (BbsIndexArray
!= NULL
);
174 ASSERT (DeviceTypeArray
!= NULL
);
175 ASSERT (*EnBootOption
!= NULL
);
176 ASSERT (*DisBootOption
!= NULL
);
178 for (Index
= 0; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
180 UnicodeSPrint (OptionName
, sizeof (OptionName
), L
"Boot%04x", BootOrder
[Index
]);
181 Status
= EfiBootManagerVariableToLoadOption (OptionName
, &BootOption
);
182 ASSERT_EFI_ERROR (Status
);
184 if ((DevicePathType (BootOption
.FilePath
) == BBS_DEVICE_PATH
) &&
185 (DevicePathSubType (BootOption
.FilePath
) == BBS_BBS_DP
)) {
187 // Legacy Boot Option
189 ASSERT (BootOption
.OptionalDataSize
== sizeof (LEGACY_BOOT_OPTION_BBS_DATA
));
191 DeviceTypeArray
[Index
] = ((BBS_BBS_DEVICE_PATH
*) BootOption
.FilePath
)->DeviceType
;
192 BbsIndexArray
[Index
] = ((LEGACY_BOOT_OPTION_BBS_DATA
*) BootOption
.OptionalData
)->BbsIndex
;
194 DeviceTypeArray
[Index
] = BBS_TYPE_UNKNOWN
;
195 BbsIndexArray
[Index
] = 0xFFFF;
197 EfiBootManagerFreeLoadOption (&BootOption
);
201 // Record the corresponding Boot Option Numbers according to the DevOrder
202 // Record the EnBootOption and DisBootOption according to the DevOrder
204 StartPosition
= BootOrderSize
/ sizeof (UINT16
);
205 NewBootOption
= AllocatePool (DevOrderCount
* sizeof (UINT16
));
206 ASSERT (NewBootOption
!= NULL
);
207 while (DevOrderCount
-- != 0) {
208 for (Index
= 0; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
209 if (BbsIndexArray
[Index
] == (DevOrder
[DevOrderCount
] & 0xFF)) {
210 StartPosition
= MIN (StartPosition
, Index
);
211 NewBootOption
[DevOrderCount
] = BootOrder
[Index
];
213 if ((DevOrder
[DevOrderCount
] & 0xFF00) == 0xFF00) {
214 (*DisBootOption
)[*DisBootOptionCount
] = BootOrder
[Index
];
215 (*DisBootOptionCount
)++;
217 (*EnBootOption
)[*EnBootOptionCount
] = BootOrder
[Index
];
218 (*EnBootOptionCount
)++;
226 // Overwrite the old BootOption
228 CopyMem (&BootOrder
[StartPosition
], NewBootOption
, (*DisBootOptionCount
+ *EnBootOptionCount
) * sizeof (UINT16
));
229 Status
= gRT
->SetVariable (
231 &gEfiGlobalVariableGuid
,
237 FreePool (NewBootOption
);
238 FreePool (DeviceTypeArray
);
239 FreePool (BbsIndexArray
);
245 Update the legacy BBS boot option. L"LegacyDevOrder" and gEfiLegacyDevOrderVariableGuid EFI Variable
246 is udpated with the new Legacy Boot order. The EFI Variable of "Boot####" and gEfiGlobalVariableGuid
249 @param NVMapData The data for egacy BBS boot.
251 @return EFI_SUCCESS The function completed successfully.
252 @retval EFI_NOT_FOUND If L"LegacyDevOrder" and gEfiLegacyDevOrderVariableGuid EFI Variable can not be found.
253 @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resource
254 @retval other Contain some error, details see the status return by gRT->SetVariable.
258 IN LEGACY_BOOT_NV_DATA
*NVMapData
269 LEGACY_MENU_OPTION
*OptionMenu
;
271 UINT16
*InitialLegacyDev
;
274 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
281 UINT16
*EnBootOption
;
282 UINTN EnBootOptionCount
;
283 UINT16
*DisBootOption
;
284 UINTN DisBootOptionCount
;
292 DisBootOption
= NULL
;
295 DisMap
= mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
;
296 Status
= EFI_SUCCESS
;
299 // Update the Variable "LegacyDevOrder"
301 GetVariable2 (VAR_LEGACY_DEV_ORDER
, &gEfiLegacyDevOrderVariableGuid
, (VOID
**) &VarData
, &VarSize
);
302 if (VarData
== NULL
) {
303 return EFI_NOT_FOUND
;
305 OriginalPtr
= VarData
;
307 while (mBbsType
[CurrentType
] != BBS_UNKNOWN
) {
308 switch (mBbsType
[CurrentType
]) {
310 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyFDMenu
;
311 LegacyDev
= NVMapData
->LegacyFD
;
312 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyFD
;
313 BufferSize
= sizeof (NVMapData
->LegacyFD
);
317 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyHDMenu
;
318 LegacyDev
= NVMapData
->LegacyHD
;
319 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyHD
;
321 BufferSize
= sizeof (NVMapData
->LegacyHD
);
325 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyCDMenu
;
326 LegacyDev
= NVMapData
->LegacyCD
;
327 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyCD
;
328 BufferSize
= sizeof (NVMapData
->LegacyCD
);
331 case BBS_EMBED_NETWORK
:
332 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyNETMenu
;
333 LegacyDev
= NVMapData
->LegacyNET
;
334 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyNET
;
335 BufferSize
= sizeof (NVMapData
->LegacyNET
);
339 ASSERT (mBbsType
[CurrentType
] == BBS_BEV_DEVICE
);
340 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyBEVMenu
;
341 LegacyDev
= NVMapData
->LegacyBEV
;
342 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyBEV
;
343 BufferSize
= sizeof (NVMapData
->LegacyBEV
);
348 // Check whether has value changed.
350 if (CompareMem (LegacyDev
, InitialLegacyDev
, BufferSize
) == 0) {
355 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) OriginalPtr
;
356 while (VarData
< OriginalPtr
+ VarSize
) {
357 if (DevOrder
->BbsType
== mBbsType
[CurrentType
]) {
361 VarData
+= sizeof (BBS_TYPE
) + DevOrder
->Length
;
362 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
365 if (VarData
>= OriginalPtr
+ VarSize
) {
366 FreePool (OriginalPtr
);
367 return EFI_NOT_FOUND
;
370 NewOrder
= AllocateZeroPool (DevOrder
->Length
- sizeof (DevOrder
->Length
));
371 if (NewOrder
== NULL
) {
372 FreePool (OriginalPtr
);
373 return EFI_OUT_OF_RESOURCES
;
376 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
377 if (0xFF == LegacyDev
[Index
]) {
381 NewOrder
[Index
] = LegacyDev
[Index
];
385 // Only the enable/disable state of each boot device with same device type can be changed,
386 // so we can count on the index information in DevOrder.
387 // DisMap bit array is the only reliable source to check a device's en/dis state,
388 // so we use DisMap to set en/dis state of each item in NewOrder array
390 for (Index2
= 0; Index2
< OptionMenu
->MenuNumber
; Index2
++) {
391 Tmp
= (UINT16
) (DevOrder
->Data
[Index2
] & 0xFF);
394 if ((DisMap
[Pos
] & (1 << Bit
)) != 0) {
395 NewOrder
[Index
] = (UINT16
) (0xFF00 | Tmp
);
403 DevOrder
->Length
- sizeof (DevOrder
->Length
)
408 // Update BootOrder and Boot####.Attribute
410 // 1. Re-order the Option Number in BootOrder according to Legacy Dev Order
412 ASSERT (OptionMenu
->MenuNumber
== DevOrder
->Length
/ sizeof (UINT16
) - 1);
414 Status
= OrderLegacyBootOption4SameType (
416 DevOrder
->Length
/ sizeof (UINT16
) - 1,
422 if (EFI_ERROR(Status
)) {
427 // 2. Deactivate the DisBootOption and activate the EnBootOption
429 for (Index
= 0; Index
< DisBootOptionCount
; Index
++) {
430 UnicodeSPrint (VarName
, sizeof (VarName
), L
"Boot%04x", DisBootOption
[Index
]);
431 GetEfiGlobalVariable2 (VarName
, (VOID
**) &BootOptionVar
, &OptionSize
);
432 if (BootOptionVar
!= NULL
) {
433 Attribute
= (UINT32
*) BootOptionVar
;
434 *Attribute
&= ~LOAD_OPTION_ACTIVE
;
436 Status
= gRT
->SetVariable (
438 &gEfiGlobalVariableGuid
,
444 FreePool (BootOptionVar
);
448 for (Index
= 0; Index
< EnBootOptionCount
; Index
++) {
449 UnicodeSPrint (VarName
, sizeof (VarName
), L
"Boot%04x", EnBootOption
[Index
]);
450 GetEfiGlobalVariable2 (VarName
, (VOID
**) &BootOptionVar
, &OptionSize
);
451 if (BootOptionVar
!= NULL
) {
452 Attribute
= (UINT32
*) BootOptionVar
;
453 *Attribute
|= LOAD_OPTION_ACTIVE
;
455 Status
= gRT
->SetVariable (
457 &gEfiGlobalVariableGuid
,
463 FreePool (BootOptionVar
);
468 FreePool (EnBootOption
);
469 FreePool (DisBootOption
);
474 Status
= gRT
->SetVariable (
475 VAR_LEGACY_DEV_ORDER
,
476 &gEfiLegacyDevOrderVariableGuid
,
477 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_NON_VOLATILE
,
483 if (EnBootOption
!= NULL
) {
484 FreePool (EnBootOption
);
487 if (DisBootOption
!= NULL
) {
488 FreePool (DisBootOption
);
491 FreePool (OriginalPtr
);
496 This function allows a caller to extract the current configuration for one
497 or more named elements from the target driver.
500 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
501 @param Request A null-terminated Unicode string in <ConfigRequest> format.
502 @param Progress On return, points to a character in the Request string.
503 Points to the string's null terminator if request was successful.
504 Points to the most recent '&' before the first failing name/value
505 pair (or the beginning of the string if the failure is in the
506 first name/value pair) if the request was not successful.
507 @param Results A null-terminated Unicode string in <ConfigAltResp> format which
508 has all values filled in for the names in the Request string.
509 String to be allocated by the called function.
511 @retval EFI_SUCCESS The Results is filled with the requested values.
512 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
513 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.
514 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
519 LegacyBootOptionExtractConfig (
520 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
521 IN CONST EFI_STRING Request
,
522 OUT EFI_STRING
*Progress
,
523 OUT EFI_STRING
*Results
526 if (Progress
== NULL
|| Results
== NULL
) {
527 return EFI_INVALID_PARAMETER
;
530 return EFI_NOT_FOUND
;
534 This function processes the results of changes in configuration.
537 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
538 @param Configuration A null-terminated Unicode string in <ConfigResp> format.
539 @param Progress A pointer to a string filled in with the offset of the most
540 recent '&' before the first failing name/value pair (or the
541 beginning of the string if the failure is in the first
542 name/value pair) or the terminating NULL if all was successful.
544 @retval EFI_SUCCESS The Results is processed successfully.
545 @retval EFI_INVALID_PARAMETER Configuration is NULL.
546 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
551 LegacyBootOptionRouteConfig (
552 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
553 IN CONST EFI_STRING Configuration
,
554 OUT EFI_STRING
*Progress
558 EFI_HII_CONFIG_ROUTING_PROTOCOL
*ConfigRouting
;
559 LEGACY_BOOT_NV_DATA
*CurrentNVMapData
;
563 if (Configuration
== NULL
|| Progress
== NULL
) {
564 return EFI_INVALID_PARAMETER
;
567 *Progress
= Configuration
;
570 // Check routing data in <ConfigHdr>.
571 // Note: there is no name for Name/Value storage, only GUID will be checked
573 if (!HiiIsConfigHdrMatch (Configuration
, &mLegacyBootOptionGuid
, mLegacyBootStorageName
)) {
574 return EFI_NOT_FOUND
;
577 Status
= gBS
->LocateProtocol (
578 &gEfiHiiConfigRoutingProtocolGuid
,
580 (VOID
**) &ConfigRouting
582 if (EFI_ERROR (Status
)) {
587 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
589 CurrentNVMapData
= &mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
;
590 Status
= ConfigRouting
->ConfigToBlock (
593 (UINT8
*) CurrentNVMapData
,
597 ASSERT_EFI_ERROR (Status
);
599 Status
= UpdateBBSOption (CurrentNVMapData
);
605 Refresh the global UpdateData structure.
609 RefreshLegacyUpdateData (
614 // Free current updated date
616 if (mLegacyStartOpCodeHandle
!= NULL
) {
617 HiiFreeOpCodeHandle (mLegacyStartOpCodeHandle
);
619 if (mLegacyEndOpCodeHandle
!= NULL
) {
620 HiiFreeOpCodeHandle (mLegacyEndOpCodeHandle
);
624 // Create new OpCode Handle
626 mLegacyStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
627 mLegacyEndOpCodeHandle
= HiiAllocateOpCodeHandle ();
630 // Create Hii Extend Label OpCode as the start opcode
632 mLegacyStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
633 mLegacyStartOpCodeHandle
,
636 sizeof (EFI_IFR_GUID_LABEL
)
638 mLegacyStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
640 mLegacyStartLabel
->Number
= FORM_BOOT_LEGACY_DEVICE_ID
;
643 // Create Hii Extend Label OpCode as the start opcode
645 mLegacyEndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
646 mLegacyEndOpCodeHandle
,
649 sizeof (EFI_IFR_GUID_LABEL
)
651 mLegacyEndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
653 mLegacyEndLabel
->Number
= FORM_BOOT_LEGACY_LABEL_END
;
658 Get the Menu Entry from the list in Menu Entry List.
660 If MenuNumber is great or equal to the number of Menu
661 Entry in the list, then ASSERT.
663 @param MenuOption The Menu Entry List to read the menu entry.
664 @param MenuNumber The index of Menu Entry.
666 @return The Menu Entry.
671 LEGACY_MENU_OPTION
*MenuOption
,
675 LEGACY_MENU_ENTRY
*NewMenuEntry
;
679 ASSERT (MenuNumber
< MenuOption
->MenuNumber
);
681 List
= MenuOption
->Head
.ForwardLink
;
682 for (Index
= 0; Index
< MenuNumber
; Index
++) {
683 List
= List
->ForwardLink
;
686 NewMenuEntry
= CR (List
, LEGACY_MENU_ENTRY
, Link
, LEGACY_MENU_ENTRY_SIGNATURE
);
692 Create string tokens for a menu from its help strings and display strings
694 @param HiiHandle Hii Handle of the package to be updated.
695 @param MenuOption The Menu whose string tokens need to be created
699 CreateLegacyMenuStringToken (
700 IN EFI_HII_HANDLE HiiHandle
,
701 IN LEGACY_MENU_OPTION
*MenuOption
704 LEGACY_MENU_ENTRY
*NewMenuEntry
;
707 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
708 NewMenuEntry
= GetMenuEntry (MenuOption
, Index
);
710 NewMenuEntry
->DisplayStringToken
= HiiSetString (
713 NewMenuEntry
->DisplayString
,
717 if (NULL
== NewMenuEntry
->HelpString
) {
718 NewMenuEntry
->HelpStringToken
= NewMenuEntry
->DisplayStringToken
;
720 NewMenuEntry
->HelpStringToken
= HiiSetString (
723 NewMenuEntry
->HelpString
,
731 Create a dynamic page so that Legacy Device boot order
732 can be set for specified device type.
734 @param UpdatePageId The form ID. It also spefies the legacy device type.
739 UpdateLegacyDeviceOrderPage (
740 IN UINT16 UpdatePageId
743 LEGACY_MENU_OPTION
*OptionMenu
;
744 LEGACY_MENU_ENTRY
*NewMenuEntry
;
745 EFI_STRING_ID StrRef
;
746 EFI_STRING_ID StrRefHelp
;
754 VOID
*OptionsOpCodeHandle
;
755 VOID
*DefaultOpCodeHandle
;
765 RefreshLegacyUpdateData();
768 // Create oneof option list
770 switch (UpdatePageId
) {
771 case FORM_FLOPPY_BOOT_ID
:
772 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyFDMenu
;
773 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
774 TypeStr
= STR_FLOPPY
;
775 TypeStrHelp
= STR_FLOPPY_HELP
;
776 FormTitle
= STR_FLOPPY_TITLE
;
777 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyFD
;
780 case FORM_HARDDISK_BOOT_ID
:
781 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyHDMenu
;
782 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
783 TypeStr
= STR_HARDDISK
;
784 TypeStrHelp
= STR_HARDDISK_HELP
;
785 FormTitle
= STR_HARDDISK_TITLE
;
786 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyHD
;
789 case FORM_CDROM_BOOT_ID
:
790 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyCDMenu
;
791 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
793 TypeStrHelp
= STR_CDROM_HELP
;
794 FormTitle
= STR_CDROM_TITLE
;
795 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyCD
;
798 case FORM_NET_BOOT_ID
:
799 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyNETMenu
;
800 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
802 TypeStrHelp
= STR_NET_HELP
;
803 FormTitle
= STR_NET_TITLE
;
804 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyNET
;
807 case FORM_BEV_BOOT_ID
:
808 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyBEVMenu
;
809 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
811 TypeStrHelp
= STR_BEV_HELP
;
812 FormTitle
= STR_BEV_TITLE
;
813 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyBEV
;
817 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
821 HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, STRING_TOKEN(STR_ORDER_CHANGE_PROMPT
), FormTitle
, NULL
);
823 CreateLegacyMenuStringToken (mLegacyBootOptionPrivate
->HiiHandle
, OptionMenu
);
825 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
826 ASSERT (OptionsOpCodeHandle
!= NULL
);
829 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
830 NewMenuEntry
= GetMenuEntry (OptionMenu
, Index
);
832 // Create OneOf for each legacy device
834 HiiCreateOneOfOptionOpCode (
836 NewMenuEntry
->DisplayStringToken
,
838 EFI_IFR_TYPE_NUM_SIZE_16
,
839 ((LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
844 // Create OneOf for item "Disabled"
846 HiiCreateOneOfOptionOpCode (
848 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
850 EFI_IFR_TYPE_NUM_SIZE_16
,
855 // Create oneof tag here for FD/HD/CD #1 #2
857 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
858 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
859 ASSERT (DefaultOpCodeHandle
!= NULL
);
861 HiiCreateDefaultOpCode (
863 EFI_HII_DEFAULT_CLASS_STANDARD
,
864 EFI_IFR_TYPE_NUM_SIZE_16
,
869 // Create the string for oneof tag
871 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
872 StrRef
= HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, 0, String
, NULL
);
874 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
875 StrRefHelp
= HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, 0, String
, NULL
);
877 HiiCreateOneOfOpCode (
878 mLegacyStartOpCodeHandle
,
879 (EFI_QUESTION_ID
) (Key
+ Index
),
880 VARSTORE_ID_LEGACY_BOOT
,
881 (UINT16
) (Key
+ Index
* 2 - CONFIG_OPTION_OFFSET
),
884 EFI_IFR_FLAG_CALLBACK
,
885 EFI_IFR_NUMERIC_SIZE_2
,
887 DefaultOpCodeHandle
//NULL //
890 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
894 mLegacyBootOptionPrivate
->HiiHandle
,
895 &mLegacyBootOptionGuid
,
896 LEGACY_ORDER_CHANGE_FORM_ID
,
897 mLegacyStartOpCodeHandle
,
898 mLegacyEndOpCodeHandle
901 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
906 Adjust question value when one question value has been changed.
908 @param QuestionId The question id for the value changed question.
909 @param Value The value for the changed question.
914 IN UINT16 QuestionId
,
915 IN EFI_IFR_TYPE_VALUE
*Value
920 LEGACY_BOOT_NV_DATA
*CurrentNVMap
;
940 // Update Select FD/HD/CD/NET/BEV Order Form
942 ASSERT ((QuestionId
>= LEGACY_FD_QUESTION_ID
) && (QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
));
944 CurrentNVMap
= &mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
;
945 HiiGetBrowserData (&mLegacyBootOptionGuid
, mLegacyBootStorageName
, sizeof (LEGACY_BOOT_NV_DATA
), (UINT8
*) CurrentNVMap
);
946 DisMap
= mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
;
948 if (QuestionId
>= LEGACY_FD_QUESTION_ID
&& QuestionId
< LEGACY_FD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
949 Number
= (UINT16
) LegacyFDMenu
.MenuNumber
;
950 CurrentVal
= CurrentNVMap
->LegacyFD
;
951 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyFD
;
952 } else if (QuestionId
>= LEGACY_HD_QUESTION_ID
&& QuestionId
< LEGACY_HD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
953 Number
= (UINT16
) LegacyHDMenu
.MenuNumber
;
954 CurrentVal
= CurrentNVMap
->LegacyHD
;
955 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyHD
;
956 } else if (QuestionId
>= LEGACY_CD_QUESTION_ID
&& QuestionId
< LEGACY_CD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
957 Number
= (UINT16
) LegacyCDMenu
.MenuNumber
;
958 CurrentVal
= CurrentNVMap
->LegacyCD
;
959 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyCD
;
960 } else if (QuestionId
>= LEGACY_NET_QUESTION_ID
&& QuestionId
< LEGACY_NET_QUESTION_ID
+ MAX_MENU_NUMBER
) {
961 Number
= (UINT16
) LegacyNETMenu
.MenuNumber
;
962 CurrentVal
= CurrentNVMap
->LegacyNET
;
963 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyNET
;
964 } else if (QuestionId
>= LEGACY_BEV_QUESTION_ID
&& QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
) {
965 Number
= (UINT16
) LegacyBEVMenu
.MenuNumber
;
966 CurrentVal
= CurrentNVMap
->LegacyBEV
;
967 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyBEV
;
971 // First, find the different position
972 // if there is change, it should be only one
974 for (Index
= 0; Index
< Number
; Index
++) {
975 if (CurrentVal
[Index
] != Default
[Index
]) {
976 OldValue
= Default
[Index
];
977 NewValue
= CurrentVal
[Index
];
982 if (Index
!= Number
) {
984 // there is change, now process
986 if (0xFF == NewValue
) {
988 // This item will be disable
989 // Just move the items behind this forward to overlap it
992 Bit
= 7 - (OldValue
% 8);
993 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
994 for (Index2
= Index
; Index2
< Number
- 1; Index2
++) {
995 CurrentVal
[Index2
] = CurrentVal
[Index2
+ 1];
998 CurrentVal
[Index2
] = 0xFF;
1000 for (Index2
= 0; Index2
< Number
; Index2
++) {
1001 if (Index2
== Index
) {
1005 if (Default
[Index2
] == NewValue
) {
1007 // If NewValue is in OldLegacyDev array
1008 // remember its old position
1010 NewValuePos
= Index2
;
1015 if (Index2
!= Number
) {
1017 // We will change current item to an existing item
1018 // (It's hard to describe here, please read code, it's like a cycle-moving)
1020 for (Index2
= NewValuePos
; Index2
!= Index
;) {
1021 if (NewValuePos
< Index
) {
1022 CurrentVal
[Index2
] = Default
[Index2
+ 1];
1025 CurrentVal
[Index2
] = Default
[Index2
- 1];
1031 // If NewValue is not in OldlegacyDev array, we are changing to a disabled item
1032 // so we should modify DisMap to reflect the change
1035 Bit
= 7 - (NewValue
% 8);
1036 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] & (~ (UINT8
) (1 << Bit
)));
1037 if (0xFF != OldValue
) {
1039 // Because NewValue is a item that was disabled before
1040 // so after changing the OldValue should be disabled
1041 // actually we are doing a swap of enable-disable states of two items
1044 Bit
= 7 - (OldValue
% 8);
1045 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1050 // To prevent DISABLE appears in the middle of the list
1051 // we should perform a re-ordering
1055 while (Index
< Number
) {
1056 if (0xFF != CurrentVal
[Index
]) {
1063 while (Index2
< Number
) {
1064 if (0xFF != CurrentVal
[Index2
]) {
1071 if (Index2
< Number
) {
1072 CurrentVal
[Index
] = CurrentVal
[Index2
];
1073 CurrentVal
[Index2
] = 0xFF;
1080 // Return correct question value.
1082 Value
->u16
= CurrentVal
[Index3
];
1083 CopyMem (Default
, CurrentVal
, sizeof (UINT16
) * Number
);
1087 // Pass changed uncommitted data back to Form Browser
1089 HiiSetBrowserData (&mLegacyBootOptionGuid
, mLegacyBootStorageName
, sizeof (LEGACY_BOOT_NV_DATA
), (UINT8
*) CurrentNVMap
, NULL
);
1093 This call back function is registered with Boot Manager formset.
1094 When user selects a boot option, this call back function will
1095 be triggered. The boot option is saved for later processing.
1098 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
1099 @param Action Specifies the type of action taken by the browser.
1100 @param QuestionId A unique value which is sent to the original exporting driver
1101 so that it can identify the type of data to expect.
1102 @param Type The type of value for the question.
1103 @param Value A pointer to the data being sent to the original exporting driver.
1104 @param ActionRequest On return, points to the action requested by the callback function.
1106 @retval EFI_SUCCESS The callback successfully handled the action.
1107 @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
1112 LegacyBootOptionCallback (
1113 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
1114 IN EFI_BROWSER_ACTION Action
,
1115 IN EFI_QUESTION_ID QuestionId
,
1117 IN EFI_IFR_TYPE_VALUE
*Value
,
1118 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
1121 if (Action
!= EFI_BROWSER_ACTION_CHANGED
&& Action
!= EFI_BROWSER_ACTION_CHANGING
&& Action
!= EFI_BROWSER_ACTION_FORM_OPEN
) {
1123 // Do nothing for other UEFI Action. Only do call back when data is changed or the form is open.
1125 return EFI_UNSUPPORTED
;
1128 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
1129 return EFI_INVALID_PARAMETER
;
1132 if (Action
== EFI_BROWSER_ACTION_FORM_OPEN
) {
1133 if (QuestionId
== FORM_FLOPPY_BOOT_ID
) {
1134 if (!mFirstEnterLegacyForm
) {
1136 // The leagcyBootMaintUiLib depends on the LegacyBootManagerLib to realize its functionality.
1137 // We need to do the leagcy boot options related actions after the LegacyBootManagerLib has been initialized.
1138 // Opening the legacy menus is the appropriate time that the LegacyBootManagerLib has already been initialized.
1140 mFirstEnterLegacyForm
= TRUE
;
1141 GetLegacyOptions ();
1142 GetLegacyOptionsOrder ();
1147 if (Action
== EFI_BROWSER_ACTION_CHANGING
) {
1148 switch (QuestionId
) {
1149 case FORM_FLOPPY_BOOT_ID
:
1150 case FORM_HARDDISK_BOOT_ID
:
1151 case FORM_CDROM_BOOT_ID
:
1152 case FORM_NET_BOOT_ID
:
1153 case FORM_BEV_BOOT_ID
:
1154 UpdateLegacyDeviceOrderPage (QuestionId
);
1160 } else if (Action
== EFI_BROWSER_ACTION_CHANGED
) {
1161 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
1162 return EFI_INVALID_PARAMETER
;
1165 if ((QuestionId
>= LEGACY_FD_QUESTION_ID
) && (QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
)) {
1166 AdjustOptionValue(QuestionId
, Value
);
1174 Create a menu entry by given menu type.
1176 @param MenuType The Menu type to be created.
1178 @retval NULL If failed to create the menu.
1179 @return the new menu entry.
1187 LEGACY_MENU_ENTRY
*MenuEntry
;
1190 // Create new menu entry
1192 MenuEntry
= AllocateZeroPool (sizeof (LEGACY_MENU_ENTRY
));
1193 if (MenuEntry
== NULL
) {
1197 MenuEntry
->VariableContext
= AllocateZeroPool (sizeof (LEGACY_DEVICE_CONTEXT
));
1198 if (MenuEntry
->VariableContext
== NULL
) {
1199 FreePool (MenuEntry
);
1203 MenuEntry
->Signature
= LEGACY_MENU_ENTRY_SIGNATURE
;
1209 Base on the L"LegacyDevOrder" variable to build the current order data.
1213 GetLegacyOptionsOrder (
1220 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1223 LEGACY_MENU_OPTION
*OptionMenu
;
1233 DisMap
= ZeroMem (mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
, sizeof (mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
));
1236 // Get Device Order from variable
1238 GetVariable2 (VAR_LEGACY_DEV_ORDER
, &gEfiLegacyDevOrderVariableGuid
, (VOID
**) &VarData
, &VarSize
);
1240 if (NULL
!= VarData
) {
1241 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1242 while (VarData
< VarTmp
+ VarSize
) {
1243 switch (DevOrder
->BbsType
) {
1245 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyFD
;
1246 OptionMenu
= &LegacyFDMenu
;
1250 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyHD
;
1251 OptionMenu
= &LegacyHDMenu
;
1255 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyCD
;
1256 OptionMenu
= &LegacyCDMenu
;
1259 case BBS_EMBED_NETWORK
:
1260 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyNET
;
1261 OptionMenu
= &LegacyNETMenu
;
1264 case BBS_BEV_DEVICE
:
1265 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyBEV
;
1266 OptionMenu
= &LegacyBEVMenu
;
1272 DEBUG ((DEBUG_ERROR
, "Unsupported device type found!\n"));
1277 // Create oneof tag here for FD/HD/CD #1 #2
1279 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1280 TotalLength
= sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
);
1281 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ TotalLength
);
1283 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1284 LegacyDev
[Index
] = 0xFF;
1285 Pos
= (VarDevOrder
& 0xFF) / 8;
1286 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1287 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1289 LegacyDev
[Index
] = VarDevOrder
& 0xFF;
1294 VarData
+= *(UINT16
*) VarData
;
1295 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1299 CopyMem (&mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
, &mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
, sizeof (LEGACY_BOOT_NV_DATA
));
1300 CopyMem (&mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
, &mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
, sizeof (LEGACY_BOOT_NV_DATA
));
1305 Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo().
1313 LEGACY_MENU_ENTRY
*NewMenuEntry
;
1314 LEGACY_DEVICE_CONTEXT
*NewLegacyDevContext
;
1315 EFI_BOOT_MANAGER_LOAD_OPTION
*BootOption
;
1316 UINTN BootOptionCount
;
1325 // Initialize Bbs Table Context from BBS info data
1327 InitializeListHead (&LegacyFDMenu
.Head
);
1328 InitializeListHead (&LegacyHDMenu
.Head
);
1329 InitializeListHead (&LegacyCDMenu
.Head
);
1330 InitializeListHead (&LegacyNETMenu
.Head
);
1331 InitializeListHead (&LegacyBEVMenu
.Head
);
1339 EfiBootManagerConnectAll ();
1342 // for better user experience
1343 // 1. User changes HD configuration (e.g.: unplug HDD), here we have a chance to remove the HDD boot option
1344 // 2. User enables/disables UEFI PXE, here we have a chance to add/remove EFI Network boot option
1346 EfiBootManagerRefreshAllBootOption ();
1348 BootOption
= EfiBootManagerGetLoadOptions (&BootOptionCount
, LoadOptionTypeBoot
);
1349 for (Index
= 0; Index
< BootOptionCount
; Index
++) {
1350 if ((DevicePathType (BootOption
[Index
].FilePath
) != BBS_DEVICE_PATH
) ||
1351 (DevicePathSubType (BootOption
[Index
].FilePath
) != BBS_BBS_DP
)
1355 ASSERT (BootOption
[Index
].OptionalDataSize
== sizeof (LEGACY_BOOT_OPTION_BBS_DATA
));
1356 NewMenuEntry
= CreateMenuEntry ();
1357 ASSERT (NewMenuEntry
!= NULL
);
1359 NewLegacyDevContext
= (LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
;
1360 NewLegacyDevContext
->BbsIndex
= ((LEGACY_BOOT_OPTION_BBS_DATA
*) BootOption
[Index
].OptionalData
)->BbsIndex
;
1361 NewLegacyDevContext
->Description
= AllocateCopyPool (StrSize (BootOption
[Index
].Description
), BootOption
[Index
].Description
);
1362 ASSERT (NewLegacyDevContext
->Description
!= NULL
);
1364 NewMenuEntry
->DisplayString
= NewLegacyDevContext
->Description
;
1365 NewMenuEntry
->HelpString
= NULL
;
1367 switch (((BBS_BBS_DEVICE_PATH
*) BootOption
[Index
].FilePath
)->DeviceType
) {
1368 case BBS_TYPE_FLOPPY
:
1369 InsertTailList (&LegacyFDMenu
.Head
, &NewMenuEntry
->Link
);
1373 case BBS_TYPE_HARDDRIVE
:
1374 InsertTailList (&LegacyHDMenu
.Head
, &NewMenuEntry
->Link
);
1378 case BBS_TYPE_CDROM
:
1379 InsertTailList (&LegacyCDMenu
.Head
, &NewMenuEntry
->Link
);
1383 case BBS_TYPE_EMBEDDED_NETWORK
:
1384 InsertTailList (&LegacyNETMenu
.Head
, &NewMenuEntry
->Link
);
1389 InsertTailList (&LegacyBEVMenu
.Head
, &NewMenuEntry
->Link
);
1395 EfiBootManagerFreeLoadOptions (BootOption
, BootOptionCount
);
1397 LegacyFDMenu
.MenuNumber
= FDNum
;
1398 LegacyHDMenu
.MenuNumber
= HDNum
;
1399 LegacyCDMenu
.MenuNumber
= CDNum
;
1400 LegacyNETMenu
.MenuNumber
= NETNum
;
1401 LegacyBEVMenu
.MenuNumber
= BEVNum
;
1407 Install Boot Manager Menu driver.
1409 @param ImageHandle The image handle.
1410 @param SystemTable The system table.
1412 @retval EFI_SUCEESS Install Boot manager menu success.
1413 @retval Other Return error status.
1418 LegacyBootMaintUiLibConstructor (
1419 IN EFI_HANDLE ImageHandle
,
1420 IN EFI_SYSTEM_TABLE
*SystemTable
1424 EFI_LEGACY_BIOS_PROTOCOL
*LegacyBios
;
1425 LEGACY_BOOT_OPTION_CALLBACK_DATA
*LegacyBootOptionData
;
1427 Status
= gBS
->LocateProtocol (&gEfiLegacyBiosProtocolGuid
, NULL
, (VOID
**) &LegacyBios
);
1428 if (!EFI_ERROR (Status
)) {
1430 // Create LegacyBootOptionData structures for Driver Callback
1432 LegacyBootOptionData
= AllocateZeroPool (sizeof (LEGACY_BOOT_OPTION_CALLBACK_DATA
));
1433 ASSERT (LegacyBootOptionData
!= NULL
);
1435 LegacyBootOptionData
->MaintainMapData
= AllocateZeroPool (sizeof (LEGACY_BOOT_MAINTAIN_DATA
));
1436 ASSERT (LegacyBootOptionData
->MaintainMapData
!= NULL
);
1438 LegacyBootOptionData
->ConfigAccess
.ExtractConfig
= LegacyBootOptionExtractConfig
;
1439 LegacyBootOptionData
->ConfigAccess
.RouteConfig
= LegacyBootOptionRouteConfig
;
1440 LegacyBootOptionData
->ConfigAccess
.Callback
= LegacyBootOptionCallback
;
1443 // Install Device Path Protocol and Config Access protocol to driver handle
1445 Status
= gBS
->InstallMultipleProtocolInterfaces (
1446 &LegacyBootOptionData
->DriverHandle
,
1447 &gEfiDevicePathProtocolGuid
,
1448 &mLegacyBootOptionHiiVendorDevicePath
,
1449 &gEfiHiiConfigAccessProtocolGuid
,
1450 &LegacyBootOptionData
->ConfigAccess
,
1453 ASSERT_EFI_ERROR (Status
);
1456 // Publish our HII data
1458 LegacyBootOptionData
->HiiHandle
= HiiAddPackages (
1459 &mLegacyBootOptionGuid
,
1460 LegacyBootOptionData
->DriverHandle
,
1461 LegacyBootMaintUiVfrBin
,
1462 LegacyBootMaintUiLibStrings
,
1465 ASSERT (LegacyBootOptionData
->HiiHandle
!= NULL
);
1467 mLegacyBootOptionPrivate
= LegacyBootOptionData
;
1474 Destructor of Customized Display Library Instance.
1476 @param ImageHandle The firmware allocated handle for the EFI image.
1477 @param SystemTable A pointer to the EFI System Table.
1479 @retval EFI_SUCCESS The destructor completed successfully.
1480 @retval Other value The destructor did not complete successfully.
1485 LegacyBootMaintUiLibDestructor (
1486 IN EFI_HANDLE ImageHandle
,
1487 IN EFI_SYSTEM_TABLE
*SystemTable
1492 if (mLegacyBootOptionPrivate
!= NULL
&& mLegacyBootOptionPrivate
->DriverHandle
!= NULL
) {
1493 Status
= gBS
->UninstallMultipleProtocolInterfaces (
1494 mLegacyBootOptionPrivate
->DriverHandle
,
1495 &gEfiDevicePathProtocolGuid
,
1496 &mLegacyBootOptionHiiVendorDevicePath
,
1497 &gEfiHiiConfigAccessProtocolGuid
,
1498 &mLegacyBootOptionPrivate
->ConfigAccess
,
1501 ASSERT_EFI_ERROR (Status
);
1503 HiiRemovePackages (mLegacyBootOptionPrivate
->HiiHandle
);
1505 FreePool (mLegacyBootOptionPrivate
->MaintainMapData
);
1506 FreePool (mLegacyBootOptionPrivate
);