2 Legacy Boot Maintainence UI implementation.
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 "LegacyBootMaintUi.h"
18 LEGACY_BOOT_OPTION_CALLBACK_DATA
*mLegacyBootOptionPrivate
= NULL
;
19 EFI_GUID mLegacyBootOptionGuid
= LEGACY_BOOT_OPTION_FORMSET_GUID
;
20 CHAR16 mLegacyBootStorageName
[] = L
"LegacyBootData";
21 BBS_TYPE mBbsType
[] = {BBS_FLOPPY
, BBS_HARDDISK
, BBS_CDROM
, BBS_EMBED_NETWORK
, BBS_BEV_DEVICE
, BBS_UNKNOWN
};
22 BOOLEAN mFirstEnterLegacyForm
= FALSE
;
26 /// Legacy FD Info from LegacyBios.GetBbsInfo()
28 LEGACY_MENU_OPTION LegacyFDMenu
= {
29 LEGACY_MENU_OPTION_SIGNATURE
,
35 /// Legacy HD Info from LegacyBios.GetBbsInfo()
37 LEGACY_MENU_OPTION LegacyHDMenu
= {
38 LEGACY_MENU_OPTION_SIGNATURE
,
44 /// Legacy CD Info from LegacyBios.GetBbsInfo()
46 LEGACY_MENU_OPTION LegacyCDMenu
= {
47 LEGACY_MENU_OPTION_SIGNATURE
,
53 /// Legacy NET Info from LegacyBios.GetBbsInfo()
55 LEGACY_MENU_OPTION LegacyNETMenu
= {
56 LEGACY_MENU_OPTION_SIGNATURE
,
62 /// Legacy NET Info from LegacyBios.GetBbsInfo()
64 LEGACY_MENU_OPTION LegacyBEVMenu
= {
65 LEGACY_MENU_OPTION_SIGNATURE
,
71 VOID
*mLegacyStartOpCodeHandle
= NULL
;
72 VOID
*mLegacyEndOpCodeHandle
= NULL
;
73 EFI_IFR_GUID_LABEL
*mLegacyStartLabel
= NULL
;
74 EFI_IFR_GUID_LABEL
*mLegacyEndLabel
= NULL
;
77 HII_VENDOR_DEVICE_PATH mLegacyBootOptionHiiVendorDevicePath
= {
83 (UINT8
) (sizeof (VENDOR_DEVICE_PATH
)),
84 (UINT8
) ((sizeof (VENDOR_DEVICE_PATH
)) >> 8)
87 { 0x6bc75598, 0x89b4, 0x483d, { 0x91, 0x60, 0x7f, 0x46, 0x9a, 0x96, 0x35, 0x31 } }
91 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
93 (UINT8
) (END_DEVICE_PATH_LENGTH
),
94 (UINT8
) ((END_DEVICE_PATH_LENGTH
) >> 8)
101 Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo().
112 Base on the L"LegacyDevOrder" variable to build the current order data.
116 GetLegacyOptionsOrder (
121 Re-order the Boot Option according to the DevOrder.
123 The routine re-orders the Boot Option in BootOption array according to
124 the order specified by DevOrder.
126 @param DevOrder Pointer to buffer containing the BBS Index,
127 high 8-bit value 0xFF indicating a disabled boot option
128 @param DevOrderCount Count of the BBS Index
129 @param EnBootOption Callee allocated buffer containing the enabled Boot Option Numbers
130 @param EnBootOptionCount Count of the enabled Boot Option Numbers
131 @param DisBootOption Callee allocated buffer containing the disabled Boot Option Numbers
132 @param DisBootOptionCount Count of the disabled Boot Option Numbers
134 @return EFI_SUCCESS The function completed successfully.
135 @retval other Contain some error, details see the status return by gRT->SetVariable.
138 OrderLegacyBootOption4SameType (
141 UINT16
**EnBootOption
,
142 UINTN
*EnBootOptionCount
,
143 UINT16
**DisBootOption
,
144 UINTN
*DisBootOptionCount
148 UINT16
*NewBootOption
;
154 EFI_BOOT_MANAGER_LOAD_OPTION BootOption
;
156 CHAR16 OptionName
[sizeof ("Boot####")];
157 UINT16
*BbsIndexArray
;
158 UINT16
*DeviceTypeArray
;
160 GetEfiGlobalVariable2 (L
"BootOrder", (VOID
**) &BootOrder
, &BootOrderSize
);
161 ASSERT (BootOrder
!= NULL
);
163 BbsIndexArray
= AllocatePool (BootOrderSize
);
164 DeviceTypeArray
= AllocatePool (BootOrderSize
);
165 *EnBootOption
= AllocatePool (BootOrderSize
);
166 *DisBootOption
= AllocatePool (BootOrderSize
);
167 *DisBootOptionCount
= 0;
168 *EnBootOptionCount
= 0;
170 Status
= EFI_SUCCESS
;
172 ASSERT (BbsIndexArray
!= NULL
);
173 ASSERT (DeviceTypeArray
!= NULL
);
174 ASSERT (*EnBootOption
!= NULL
);
175 ASSERT (*DisBootOption
!= NULL
);
177 for (Index
= 0; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
179 UnicodeSPrint (OptionName
, sizeof (OptionName
), L
"Boot%04x", BootOrder
[Index
]);
180 Status
= EfiBootManagerVariableToLoadOption (OptionName
, &BootOption
);
181 ASSERT_EFI_ERROR (Status
);
183 if ((DevicePathType (BootOption
.FilePath
) == BBS_DEVICE_PATH
) &&
184 (DevicePathSubType (BootOption
.FilePath
) == BBS_BBS_DP
)) {
186 // Legacy Boot Option
188 ASSERT (BootOption
.OptionalDataSize
== sizeof (LEGACY_BOOT_OPTION_BBS_DATA
));
190 DeviceTypeArray
[Index
] = ((BBS_BBS_DEVICE_PATH
*) BootOption
.FilePath
)->DeviceType
;
191 BbsIndexArray
[Index
] = ((LEGACY_BOOT_OPTION_BBS_DATA
*) BootOption
.OptionalData
)->BbsIndex
;
193 DeviceTypeArray
[Index
] = BBS_TYPE_UNKNOWN
;
194 BbsIndexArray
[Index
] = 0xFFFF;
196 EfiBootManagerFreeLoadOption (&BootOption
);
200 // Record the corresponding Boot Option Numbers according to the DevOrder
201 // Record the EnBootOption and DisBootOption according to the DevOrder
203 StartPosition
= BootOrderSize
/ sizeof (UINT16
);
204 NewBootOption
= AllocatePool (DevOrderCount
* sizeof (UINT16
));
205 ASSERT (NewBootOption
!= NULL
);
206 while (DevOrderCount
-- != 0) {
207 for (Index
= 0; Index
< BootOrderSize
/ sizeof (UINT16
); Index
++) {
208 if (BbsIndexArray
[Index
] == (DevOrder
[DevOrderCount
] & 0xFF)) {
209 StartPosition
= MIN (StartPosition
, Index
);
210 NewBootOption
[DevOrderCount
] = BootOrder
[Index
];
212 if ((DevOrder
[DevOrderCount
] & 0xFF00) == 0xFF00) {
213 (*DisBootOption
)[*DisBootOptionCount
] = BootOrder
[Index
];
214 (*DisBootOptionCount
)++;
216 (*EnBootOption
)[*EnBootOptionCount
] = BootOrder
[Index
];
217 (*EnBootOptionCount
)++;
225 // Overwrite the old BootOption
227 CopyMem (&BootOrder
[StartPosition
], NewBootOption
, (*DisBootOptionCount
+ *EnBootOptionCount
) * sizeof (UINT16
));
228 Status
= gRT
->SetVariable (
230 &gEfiGlobalVariableGuid
,
236 FreePool (NewBootOption
);
237 FreePool (DeviceTypeArray
);
238 FreePool (BbsIndexArray
);
244 Update the legacy BBS boot option. L"LegacyDevOrder" and gEfiLegacyDevOrderVariableGuid EFI Variable
245 is udpated with the new Legacy Boot order. The EFI Variable of "Boot####" and gEfiGlobalVariableGuid
248 @param NVMapData The data for egacy BBS boot.
250 @return EFI_SUCCESS The function completed successfully.
251 @retval EFI_NOT_FOUND If L"LegacyDevOrder" and gEfiLegacyDevOrderVariableGuid EFI Variable can not be found.
252 @retval EFI_OUT_OF_RESOURCES Fail to allocate memory resource
253 @retval other Contain some error, details see the status return by gRT->SetVariable.
257 IN LEGACY_BOOT_NV_DATA
*NVMapData
268 LEGACY_MENU_OPTION
*OptionMenu
;
270 UINT16
*InitialLegacyDev
;
273 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
280 UINT16
*EnBootOption
;
281 UINTN EnBootOptionCount
;
282 UINT16
*DisBootOption
;
283 UINTN DisBootOptionCount
;
291 DisBootOption
= NULL
;
294 DisMap
= mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
;
295 Status
= EFI_SUCCESS
;
298 // Update the Variable "LegacyDevOrder"
300 GetVariable2 (VAR_LEGACY_DEV_ORDER
, &gEfiLegacyDevOrderVariableGuid
, (VOID
**) &VarData
, &VarSize
);
301 if (VarData
== NULL
) {
302 return EFI_NOT_FOUND
;
304 OriginalPtr
= VarData
;
306 while (mBbsType
[CurrentType
] != BBS_UNKNOWN
) {
307 switch (mBbsType
[CurrentType
]) {
309 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyFDMenu
;
310 LegacyDev
= NVMapData
->LegacyFD
;
311 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyFD
;
312 BufferSize
= sizeof (NVMapData
->LegacyFD
);
316 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyHDMenu
;
317 LegacyDev
= NVMapData
->LegacyHD
;
318 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyHD
;
320 BufferSize
= sizeof (NVMapData
->LegacyHD
);
324 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyCDMenu
;
325 LegacyDev
= NVMapData
->LegacyCD
;
326 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyCD
;
327 BufferSize
= sizeof (NVMapData
->LegacyCD
);
330 case BBS_EMBED_NETWORK
:
331 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyNETMenu
;
332 LegacyDev
= NVMapData
->LegacyNET
;
333 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyNET
;
334 BufferSize
= sizeof (NVMapData
->LegacyNET
);
338 ASSERT (mBbsType
[CurrentType
] == BBS_BEV_DEVICE
);
339 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyBEVMenu
;
340 LegacyDev
= NVMapData
->LegacyBEV
;
341 InitialLegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyBEV
;
342 BufferSize
= sizeof (NVMapData
->LegacyBEV
);
347 // Check whether has value changed.
349 if (CompareMem (LegacyDev
, InitialLegacyDev
, BufferSize
) == 0) {
354 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) OriginalPtr
;
355 while (VarData
< OriginalPtr
+ VarSize
) {
356 if (DevOrder
->BbsType
== mBbsType
[CurrentType
]) {
360 VarData
+= sizeof (BBS_TYPE
) + DevOrder
->Length
;
361 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
364 if (VarData
>= OriginalPtr
+ VarSize
) {
365 FreePool (OriginalPtr
);
366 return EFI_NOT_FOUND
;
369 NewOrder
= AllocateZeroPool (DevOrder
->Length
- sizeof (DevOrder
->Length
));
370 if (NewOrder
== NULL
) {
371 FreePool (OriginalPtr
);
372 return EFI_OUT_OF_RESOURCES
;
375 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
376 if (0xFF == LegacyDev
[Index
]) {
380 NewOrder
[Index
] = LegacyDev
[Index
];
384 // Only the enable/disable state of each boot device with same device type can be changed,
385 // so we can count on the index information in DevOrder.
386 // DisMap bit array is the only reliable source to check a device's en/dis state,
387 // so we use DisMap to set en/dis state of each item in NewOrder array
389 for (Index2
= 0; Index2
< OptionMenu
->MenuNumber
; Index2
++) {
390 Tmp
= (UINT16
) (DevOrder
->Data
[Index2
] & 0xFF);
393 if ((DisMap
[Pos
] & (1 << Bit
)) != 0) {
394 NewOrder
[Index
] = (UINT16
) (0xFF00 | Tmp
);
402 DevOrder
->Length
- sizeof (DevOrder
->Length
)
407 // Update BootOrder and Boot####.Attribute
409 // 1. Re-order the Option Number in BootOrder according to Legacy Dev Order
411 ASSERT (OptionMenu
->MenuNumber
== DevOrder
->Length
/ sizeof (UINT16
) - 1);
413 Status
= OrderLegacyBootOption4SameType (
415 DevOrder
->Length
/ sizeof (UINT16
) - 1,
421 if (EFI_ERROR(Status
)) {
426 // 2. Deactivate the DisBootOption and activate the EnBootOption
428 for (Index
= 0; Index
< DisBootOptionCount
; Index
++) {
429 UnicodeSPrint (VarName
, sizeof (VarName
), L
"Boot%04x", DisBootOption
[Index
]);
430 GetEfiGlobalVariable2 (VarName
, (VOID
**) &BootOptionVar
, &OptionSize
);
431 if (BootOptionVar
!= NULL
) {
432 Attribute
= (UINT32
*) BootOptionVar
;
433 *Attribute
&= ~LOAD_OPTION_ACTIVE
;
435 Status
= gRT
->SetVariable (
437 &gEfiGlobalVariableGuid
,
443 FreePool (BootOptionVar
);
447 for (Index
= 0; Index
< EnBootOptionCount
; Index
++) {
448 UnicodeSPrint (VarName
, sizeof (VarName
), L
"Boot%04x", EnBootOption
[Index
]);
449 GetEfiGlobalVariable2 (VarName
, (VOID
**) &BootOptionVar
, &OptionSize
);
450 if (BootOptionVar
!= NULL
) {
451 Attribute
= (UINT32
*) BootOptionVar
;
452 *Attribute
|= LOAD_OPTION_ACTIVE
;
454 Status
= gRT
->SetVariable (
456 &gEfiGlobalVariableGuid
,
462 FreePool (BootOptionVar
);
467 FreePool (EnBootOption
);
468 FreePool (DisBootOption
);
473 Status
= gRT
->SetVariable (
474 VAR_LEGACY_DEV_ORDER
,
475 &gEfiLegacyDevOrderVariableGuid
,
476 EFI_VARIABLE_BOOTSERVICE_ACCESS
| EFI_VARIABLE_NON_VOLATILE
,
482 if (EnBootOption
!= NULL
) {
483 FreePool (EnBootOption
);
486 if (DisBootOption
!= NULL
) {
487 FreePool (DisBootOption
);
490 FreePool (OriginalPtr
);
495 This function allows a caller to extract the current configuration for one
496 or more named elements from the target driver.
499 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
500 @param Request A null-terminated Unicode string in <ConfigRequest> format.
501 @param Progress On return, points to a character in the Request string.
502 Points to the string's null terminator if request was successful.
503 Points to the most recent '&' before the first failing name/value
504 pair (or the beginning of the string if the failure is in the
505 first name/value pair) if the request was not successful.
506 @param Results A null-terminated Unicode string in <ConfigAltResp> format which
507 has all values filled in for the names in the Request string.
508 String to be allocated by the called function.
510 @retval EFI_SUCCESS The Results is filled with the requested values.
511 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.
512 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.
513 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
518 LegacyBootOptionExtractConfig (
519 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
520 IN CONST EFI_STRING Request
,
521 OUT EFI_STRING
*Progress
,
522 OUT EFI_STRING
*Results
525 if (Progress
== NULL
|| Results
== NULL
) {
526 return EFI_INVALID_PARAMETER
;
529 return EFI_NOT_FOUND
;
533 This function processes the results of changes in configuration.
536 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
537 @param Configuration A null-terminated Unicode string in <ConfigResp> format.
538 @param Progress A pointer to a string filled in with the offset of the most
539 recent '&' before the first failing name/value pair (or the
540 beginning of the string if the failure is in the first
541 name/value pair) or the terminating NULL if all was successful.
543 @retval EFI_SUCCESS The Results is processed successfully.
544 @retval EFI_INVALID_PARAMETER Configuration is NULL.
545 @retval EFI_NOT_FOUND Routing data doesn't match any storage in this driver.
550 LegacyBootOptionRouteConfig (
551 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
552 IN CONST EFI_STRING Configuration
,
553 OUT EFI_STRING
*Progress
557 EFI_HII_CONFIG_ROUTING_PROTOCOL
*ConfigRouting
;
558 LEGACY_BOOT_NV_DATA
*CurrentNVMapData
;
562 if (Configuration
== NULL
|| Progress
== NULL
) {
563 return EFI_INVALID_PARAMETER
;
567 // Check routing data in <ConfigHdr>.
568 // Note: there is no name for Name/Value storage, only GUID will be checked
570 if (!HiiIsConfigHdrMatch (Configuration
, &mLegacyBootOptionGuid
, mLegacyBootStorageName
)) {
571 return EFI_NOT_FOUND
;
574 Status
= gBS
->LocateProtocol (
575 &gEfiHiiConfigRoutingProtocolGuid
,
577 (VOID
**) &ConfigRouting
579 if (EFI_ERROR (Status
)) {
584 // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
586 CurrentNVMapData
= &mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
;
587 Status
= ConfigRouting
->ConfigToBlock (
590 (UINT8
*) CurrentNVMapData
,
594 ASSERT_EFI_ERROR (Status
);
596 Status
= UpdateBBSOption (CurrentNVMapData
);
602 Refresh the global UpdateData structure.
606 RefreshLegacyUpdateData (
611 // Free current updated date
613 if (mLegacyStartOpCodeHandle
!= NULL
) {
614 HiiFreeOpCodeHandle (mLegacyStartOpCodeHandle
);
616 if (mLegacyEndOpCodeHandle
!= NULL
) {
617 HiiFreeOpCodeHandle (mLegacyEndOpCodeHandle
);
621 // Create new OpCode Handle
623 mLegacyStartOpCodeHandle
= HiiAllocateOpCodeHandle ();
624 mLegacyEndOpCodeHandle
= HiiAllocateOpCodeHandle ();
627 // Create Hii Extend Label OpCode as the start opcode
629 mLegacyStartLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
630 mLegacyStartOpCodeHandle
,
633 sizeof (EFI_IFR_GUID_LABEL
)
635 mLegacyStartLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
637 mLegacyStartLabel
->Number
= FORM_BOOT_LEGACY_DEVICE_ID
;
640 // Create Hii Extend Label OpCode as the start opcode
642 mLegacyEndLabel
= (EFI_IFR_GUID_LABEL
*) HiiCreateGuidOpCode (
643 mLegacyEndOpCodeHandle
,
646 sizeof (EFI_IFR_GUID_LABEL
)
648 mLegacyEndLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
650 mLegacyEndLabel
->Number
= FORM_BOOT_LEGACY_LABEL_END
;
655 Get the Menu Entry from the list in Menu Entry List.
657 If MenuNumber is great or equal to the number of Menu
658 Entry in the list, then ASSERT.
660 @param MenuOption The Menu Entry List to read the menu entry.
661 @param MenuNumber The index of Menu Entry.
663 @return The Menu Entry.
668 LEGACY_MENU_OPTION
*MenuOption
,
672 LEGACY_MENU_ENTRY
*NewMenuEntry
;
676 ASSERT (MenuNumber
< MenuOption
->MenuNumber
);
678 List
= MenuOption
->Head
.ForwardLink
;
679 for (Index
= 0; Index
< MenuNumber
; Index
++) {
680 List
= List
->ForwardLink
;
683 NewMenuEntry
= CR (List
, LEGACY_MENU_ENTRY
, Link
, LEGACY_MENU_ENTRY_SIGNATURE
);
689 Create string tokens for a menu from its help strings and display strings
691 @param HiiHandle Hii Handle of the package to be updated.
692 @param MenuOption The Menu whose string tokens need to be created
696 CreateLegacyMenuStringToken (
697 IN EFI_HII_HANDLE HiiHandle
,
698 IN LEGACY_MENU_OPTION
*MenuOption
701 LEGACY_MENU_ENTRY
*NewMenuEntry
;
704 for (Index
= 0; Index
< MenuOption
->MenuNumber
; Index
++) {
705 NewMenuEntry
= GetMenuEntry (MenuOption
, Index
);
707 NewMenuEntry
->DisplayStringToken
= HiiSetString (
710 NewMenuEntry
->DisplayString
,
714 if (NULL
== NewMenuEntry
->HelpString
) {
715 NewMenuEntry
->HelpStringToken
= NewMenuEntry
->DisplayStringToken
;
717 NewMenuEntry
->HelpStringToken
= HiiSetString (
720 NewMenuEntry
->HelpString
,
728 Create a dynamic page so that Legacy Device boot order
729 can be set for specified device type.
731 @param UpdatePageId The form ID. It also spefies the legacy device type.
736 UpdateLegacyDeviceOrderPage (
737 IN UINT16 UpdatePageId
740 LEGACY_MENU_OPTION
*OptionMenu
;
741 LEGACY_MENU_ENTRY
*NewMenuEntry
;
742 EFI_STRING_ID StrRef
;
743 EFI_STRING_ID StrRefHelp
;
751 VOID
*OptionsOpCodeHandle
;
752 VOID
*DefaultOpCodeHandle
;
762 RefreshLegacyUpdateData();
765 // Create oneof option list
767 switch (UpdatePageId
) {
768 case FORM_FLOPPY_BOOT_ID
:
769 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyFDMenu
;
770 Key
= (UINT16
) LEGACY_FD_QUESTION_ID
;
771 TypeStr
= STR_FLOPPY
;
772 TypeStrHelp
= STR_FLOPPY_HELP
;
773 FormTitle
= STR_FLOPPY_TITLE
;
774 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyFD
;
777 case FORM_HARDDISK_BOOT_ID
:
778 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyHDMenu
;
779 Key
= (UINT16
) LEGACY_HD_QUESTION_ID
;
780 TypeStr
= STR_HARDDISK
;
781 TypeStrHelp
= STR_HARDDISK_HELP
;
782 FormTitle
= STR_HARDDISK_TITLE
;
783 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyHD
;
786 case FORM_CDROM_BOOT_ID
:
787 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyCDMenu
;
788 Key
= (UINT16
) LEGACY_CD_QUESTION_ID
;
790 TypeStrHelp
= STR_CDROM_HELP
;
791 FormTitle
= STR_CDROM_TITLE
;
792 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyCD
;
795 case FORM_NET_BOOT_ID
:
796 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyNETMenu
;
797 Key
= (UINT16
) LEGACY_NET_QUESTION_ID
;
799 TypeStrHelp
= STR_NET_HELP
;
800 FormTitle
= STR_NET_TITLE
;
801 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyNET
;
804 case FORM_BEV_BOOT_ID
:
805 OptionMenu
= (LEGACY_MENU_OPTION
*) &LegacyBEVMenu
;
806 Key
= (UINT16
) LEGACY_BEV_QUESTION_ID
;
808 TypeStrHelp
= STR_BEV_HELP
;
809 FormTitle
= STR_BEV_TITLE
;
810 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
.LegacyBEV
;
814 DEBUG ((EFI_D_ERROR
, "Invalid command ID for updating page!\n"));
818 HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, STRING_TOKEN(STR_ORDER_CHANGE_PROMPT
), FormTitle
, NULL
);
820 CreateLegacyMenuStringToken (mLegacyBootOptionPrivate
->HiiHandle
, OptionMenu
);
822 OptionsOpCodeHandle
= HiiAllocateOpCodeHandle ();
823 ASSERT (OptionsOpCodeHandle
!= NULL
);
826 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
827 NewMenuEntry
= GetMenuEntry (OptionMenu
, Index
);
829 // Create OneOf for each legacy device
831 HiiCreateOneOfOptionOpCode (
833 NewMenuEntry
->DisplayStringToken
,
835 EFI_IFR_TYPE_NUM_SIZE_16
,
836 ((LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
)->BbsIndex
841 // Create OneOf for item "Disabled"
843 HiiCreateOneOfOptionOpCode (
845 STRING_TOKEN (STR_DISABLE_LEGACY_DEVICE
),
847 EFI_IFR_TYPE_NUM_SIZE_16
,
852 // Create oneof tag here for FD/HD/CD #1 #2
854 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
855 DefaultOpCodeHandle
= HiiAllocateOpCodeHandle ();
856 ASSERT (DefaultOpCodeHandle
!= NULL
);
858 HiiCreateDefaultOpCode (
860 EFI_HII_DEFAULT_CLASS_STANDARD
,
861 EFI_IFR_TYPE_NUM_SIZE_16
,
866 // Create the string for oneof tag
868 UnicodeSPrint (String
, sizeof (String
), TypeStr
, Index
);
869 StrRef
= HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, 0, String
, NULL
);
871 UnicodeSPrint (String
, sizeof (String
), TypeStrHelp
, Index
);
872 StrRefHelp
= HiiSetString (mLegacyBootOptionPrivate
->HiiHandle
, 0, String
, NULL
);
874 HiiCreateOneOfOpCode (
875 mLegacyStartOpCodeHandle
,
876 (EFI_QUESTION_ID
) (Key
+ Index
),
877 VARSTORE_ID_LEGACY_BOOT
,
878 (UINT16
) (Key
+ Index
* 2 - CONFIG_OPTION_OFFSET
),
881 EFI_IFR_FLAG_CALLBACK
,
882 EFI_IFR_NUMERIC_SIZE_2
,
884 DefaultOpCodeHandle
//NULL //
887 HiiFreeOpCodeHandle (DefaultOpCodeHandle
);
891 mLegacyBootOptionPrivate
->HiiHandle
,
892 &mLegacyBootOptionGuid
,
893 LEGACY_ORDER_CHANGE_FORM_ID
,
894 mLegacyStartOpCodeHandle
,
895 mLegacyEndOpCodeHandle
898 HiiFreeOpCodeHandle (OptionsOpCodeHandle
);
903 Adjust question value when one question value has been changed.
905 @param QuestionId The question id for the value changed question.
906 @param Value The value for the changed question.
911 IN UINT16 QuestionId
,
912 IN EFI_IFR_TYPE_VALUE
*Value
917 LEGACY_BOOT_NV_DATA
*CurrentNVMap
;
937 // Update Select FD/HD/CD/NET/BEV Order Form
939 ASSERT ((QuestionId
>= LEGACY_FD_QUESTION_ID
) && (QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
));
941 CurrentNVMap
= &mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
;
942 HiiGetBrowserData (&mLegacyBootOptionGuid
, mLegacyBootStorageName
, sizeof (LEGACY_BOOT_NV_DATA
), (UINT8
*) CurrentNVMap
);
943 DisMap
= mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
;
945 if (QuestionId
>= LEGACY_FD_QUESTION_ID
&& QuestionId
< LEGACY_FD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
946 Number
= (UINT16
) LegacyFDMenu
.MenuNumber
;
947 CurrentVal
= CurrentNVMap
->LegacyFD
;
948 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyFD
;
949 } else if (QuestionId
>= LEGACY_HD_QUESTION_ID
&& QuestionId
< LEGACY_HD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
950 Number
= (UINT16
) LegacyHDMenu
.MenuNumber
;
951 CurrentVal
= CurrentNVMap
->LegacyHD
;
952 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyHD
;
953 } else if (QuestionId
>= LEGACY_CD_QUESTION_ID
&& QuestionId
< LEGACY_CD_QUESTION_ID
+ MAX_MENU_NUMBER
) {
954 Number
= (UINT16
) LegacyCDMenu
.MenuNumber
;
955 CurrentVal
= CurrentNVMap
->LegacyCD
;
956 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyCD
;
957 } else if (QuestionId
>= LEGACY_NET_QUESTION_ID
&& QuestionId
< LEGACY_NET_QUESTION_ID
+ MAX_MENU_NUMBER
) {
958 Number
= (UINT16
) LegacyNETMenu
.MenuNumber
;
959 CurrentVal
= CurrentNVMap
->LegacyNET
;
960 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyNET
;
961 } else if (QuestionId
>= LEGACY_BEV_QUESTION_ID
&& QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
) {
962 Number
= (UINT16
) LegacyBEVMenu
.MenuNumber
;
963 CurrentVal
= CurrentNVMap
->LegacyBEV
;
964 Default
= mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
.LegacyBEV
;
968 // First, find the different position
969 // if there is change, it should be only one
971 for (Index
= 0; Index
< Number
; Index
++) {
972 if (CurrentVal
[Index
] != Default
[Index
]) {
973 OldValue
= Default
[Index
];
974 NewValue
= CurrentVal
[Index
];
979 if (Index
!= Number
) {
981 // there is change, now process
983 if (0xFF == NewValue
) {
985 // This item will be disable
986 // Just move the items behind this forward to overlap it
989 Bit
= 7 - (OldValue
% 8);
990 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
991 for (Index2
= Index
; Index2
< Number
- 1; Index2
++) {
992 CurrentVal
[Index2
] = CurrentVal
[Index2
+ 1];
995 CurrentVal
[Index2
] = 0xFF;
997 for (Index2
= 0; Index2
< Number
; Index2
++) {
998 if (Index2
== Index
) {
1002 if (Default
[Index2
] == NewValue
) {
1004 // If NewValue is in OldLegacyDev array
1005 // remember its old position
1007 NewValuePos
= Index2
;
1012 if (Index2
!= Number
) {
1014 // We will change current item to an existing item
1015 // (It's hard to describe here, please read code, it's like a cycle-moving)
1017 for (Index2
= NewValuePos
; Index2
!= Index
;) {
1018 if (NewValuePos
< Index
) {
1019 CurrentVal
[Index2
] = Default
[Index2
+ 1];
1022 CurrentVal
[Index2
] = Default
[Index2
- 1];
1028 // If NewValue is not in OldlegacyDev array, we are changing to a disabled item
1029 // so we should modify DisMap to reflect the change
1032 Bit
= 7 - (NewValue
% 8);
1033 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] & (~ (UINT8
) (1 << Bit
)));
1034 if (0xFF != OldValue
) {
1036 // Because NewValue is a item that was disabled before
1037 // so after changing the OldValue should be disabled
1038 // actually we are doing a swap of enable-disable states of two items
1041 Bit
= 7 - (OldValue
% 8);
1042 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1047 // To prevent DISABLE appears in the middle of the list
1048 // we should perform a re-ordering
1052 while (Index
< Number
) {
1053 if (0xFF != CurrentVal
[Index
]) {
1060 while (Index2
< Number
) {
1061 if (0xFF != CurrentVal
[Index2
]) {
1068 if (Index2
< Number
) {
1069 CurrentVal
[Index
] = CurrentVal
[Index2
];
1070 CurrentVal
[Index2
] = 0xFF;
1077 // Return correct question value.
1079 Value
->u16
= CurrentVal
[Index3
];
1080 CopyMem (Default
, CurrentVal
, sizeof (UINT16
) * Number
);
1084 // Pass changed uncommitted data back to Form Browser
1086 HiiSetBrowserData (&mLegacyBootOptionGuid
, mLegacyBootStorageName
, sizeof (LEGACY_BOOT_NV_DATA
), (UINT8
*) CurrentNVMap
, NULL
);
1090 This call back function is registered with Boot Manager formset.
1091 When user selects a boot option, this call back function will
1092 be triggered. The boot option is saved for later processing.
1095 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
1096 @param Action Specifies the type of action taken by the browser.
1097 @param QuestionId A unique value which is sent to the original exporting driver
1098 so that it can identify the type of data to expect.
1099 @param Type The type of value for the question.
1100 @param Value A pointer to the data being sent to the original exporting driver.
1101 @param ActionRequest On return, points to the action requested by the callback function.
1103 @retval EFI_SUCCESS The callback successfully handled the action.
1104 @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
1109 LegacyBootOptionCallback (
1110 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL
*This
,
1111 IN EFI_BROWSER_ACTION Action
,
1112 IN EFI_QUESTION_ID QuestionId
,
1114 IN EFI_IFR_TYPE_VALUE
*Value
,
1115 OUT EFI_BROWSER_ACTION_REQUEST
*ActionRequest
1118 if (Action
!= EFI_BROWSER_ACTION_CHANGED
&& Action
!= EFI_BROWSER_ACTION_CHANGING
&& Action
!= EFI_BROWSER_ACTION_FORM_OPEN
) {
1120 // Do nothing for other UEFI Action. Only do call back when data is changed or the form is open.
1122 return EFI_UNSUPPORTED
;
1125 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
1126 return EFI_INVALID_PARAMETER
;
1129 if (Action
== EFI_BROWSER_ACTION_FORM_OPEN
) {
1130 if (QuestionId
== FORM_FLOPPY_BOOT_ID
) {
1131 if (!mFirstEnterLegacyForm
) {
1133 // The leagcyBootMaintUiLib depends on the LegacyBootManagerLib to realize its functionality.
1134 // We need to do the leagcy boot options related actions after the LegacyBootManagerLib has been initialized.
1135 // Opening the legacy menus is the appropriate time that the LegacyBootManagerLib has already been initialized.
1137 mFirstEnterLegacyForm
= TRUE
;
1138 GetLegacyOptions ();
1139 GetLegacyOptionsOrder ();
1144 if (Action
== EFI_BROWSER_ACTION_CHANGING
) {
1145 switch (QuestionId
) {
1146 case FORM_FLOPPY_BOOT_ID
:
1147 case FORM_HARDDISK_BOOT_ID
:
1148 case FORM_CDROM_BOOT_ID
:
1149 case FORM_NET_BOOT_ID
:
1150 case FORM_BEV_BOOT_ID
:
1151 UpdateLegacyDeviceOrderPage (QuestionId
);
1157 } else if (Action
== EFI_BROWSER_ACTION_CHANGED
) {
1158 if ((Value
== NULL
) || (ActionRequest
== NULL
)) {
1159 return EFI_INVALID_PARAMETER
;
1162 if ((QuestionId
>= LEGACY_FD_QUESTION_ID
) && (QuestionId
< LEGACY_BEV_QUESTION_ID
+ MAX_MENU_NUMBER
)) {
1163 AdjustOptionValue(QuestionId
, Value
);
1171 Create a menu entry by given menu type.
1173 @param MenuType The Menu type to be created.
1175 @retval NULL If failed to create the menu.
1176 @return the new menu entry.
1184 LEGACY_MENU_ENTRY
*MenuEntry
;
1187 // Create new menu entry
1189 MenuEntry
= AllocateZeroPool (sizeof (LEGACY_MENU_ENTRY
));
1190 if (MenuEntry
== NULL
) {
1194 MenuEntry
->VariableContext
= AllocateZeroPool (sizeof (LEGACY_DEVICE_CONTEXT
));
1195 if (MenuEntry
->VariableContext
== NULL
) {
1196 FreePool (MenuEntry
);
1200 MenuEntry
->Signature
= LEGACY_MENU_ENTRY_SIGNATURE
;
1206 Base on the L"LegacyDevOrder" variable to build the current order data.
1210 GetLegacyOptionsOrder (
1217 LEGACY_DEV_ORDER_ENTRY
*DevOrder
;
1220 LEGACY_MENU_OPTION
*OptionMenu
;
1230 DisMap
= ZeroMem (mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
, sizeof (mLegacyBootOptionPrivate
->MaintainMapData
->DisableMap
));
1233 // Get Device Order from variable
1235 GetVariable2 (VAR_LEGACY_DEV_ORDER
, &gEfiLegacyDevOrderVariableGuid
, (VOID
**) &VarData
, &VarSize
);
1237 if (NULL
!= VarData
) {
1238 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1239 while (VarData
< VarTmp
+ VarSize
) {
1240 switch (DevOrder
->BbsType
) {
1242 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyFD
;
1243 OptionMenu
= &LegacyFDMenu
;
1247 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyHD
;
1248 OptionMenu
= &LegacyHDMenu
;
1252 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyCD
;
1253 OptionMenu
= &LegacyCDMenu
;
1256 case BBS_EMBED_NETWORK
:
1257 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyNET
;
1258 OptionMenu
= &LegacyNETMenu
;
1261 case BBS_BEV_DEVICE
:
1262 LegacyDev
= mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
.LegacyBEV
;
1263 OptionMenu
= &LegacyBEVMenu
;
1269 DEBUG ((DEBUG_ERROR
, "Unsupported device type found!\n"));
1274 // Create oneof tag here for FD/HD/CD #1 #2
1276 for (Index
= 0; Index
< OptionMenu
->MenuNumber
; Index
++) {
1277 TotalLength
= sizeof (BBS_TYPE
) + sizeof (UINT16
) + Index
* sizeof (UINT16
);
1278 VarDevOrder
= *(UINT16
*) ((UINT8
*) DevOrder
+ TotalLength
);
1280 if (0xFF00 == (VarDevOrder
& 0xFF00)) {
1281 LegacyDev
[Index
] = 0xFF;
1282 Pos
= (VarDevOrder
& 0xFF) / 8;
1283 Bit
= 7 - ((VarDevOrder
& 0xFF) % 8);
1284 DisMap
[Pos
] = (UINT8
) (DisMap
[Pos
] | (UINT8
) (1 << Bit
));
1286 LegacyDev
[Index
] = VarDevOrder
& 0xFF;
1291 VarData
+= *(UINT16
*) VarData
;
1292 DevOrder
= (LEGACY_DEV_ORDER_ENTRY
*) VarData
;
1296 CopyMem (&mLegacyBootOptionPrivate
->MaintainMapData
->LastTimeNvData
, &mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
, sizeof (LEGACY_BOOT_NV_DATA
));
1297 CopyMem (&mLegacyBootOptionPrivate
->MaintainMapData
->CurrentNvData
, &mLegacyBootOptionPrivate
->MaintainMapData
->InitialNvData
, sizeof (LEGACY_BOOT_NV_DATA
));
1302 Build the LegacyFDMenu LegacyHDMenu LegacyCDMenu according to LegacyBios.GetBbsInfo().
1310 LEGACY_MENU_ENTRY
*NewMenuEntry
;
1311 LEGACY_DEVICE_CONTEXT
*NewLegacyDevContext
;
1312 EFI_BOOT_MANAGER_LOAD_OPTION
*BootOption
;
1313 UINTN BootOptionCount
;
1322 // Initialize Bbs Table Context from BBS info data
1324 InitializeListHead (&LegacyFDMenu
.Head
);
1325 InitializeListHead (&LegacyHDMenu
.Head
);
1326 InitializeListHead (&LegacyCDMenu
.Head
);
1327 InitializeListHead (&LegacyNETMenu
.Head
);
1328 InitializeListHead (&LegacyBEVMenu
.Head
);
1336 EfiBootManagerConnectAll ();
1339 // for better user experience
1340 // 1. User changes HD configuration (e.g.: unplug HDD), here we have a chance to remove the HDD boot option
1341 // 2. User enables/disables UEFI PXE, here we have a chance to add/remove EFI Network boot option
1343 EfiBootManagerRefreshAllBootOption ();
1345 BootOption
= EfiBootManagerGetLoadOptions (&BootOptionCount
, LoadOptionTypeBoot
);
1346 for (Index
= 0; Index
< BootOptionCount
; Index
++) {
1347 if ((DevicePathType (BootOption
[Index
].FilePath
) != BBS_DEVICE_PATH
) ||
1348 (DevicePathSubType (BootOption
[Index
].FilePath
) != BBS_BBS_DP
)
1352 ASSERT (BootOption
[Index
].OptionalDataSize
== sizeof (LEGACY_BOOT_OPTION_BBS_DATA
));
1353 NewMenuEntry
= CreateMenuEntry ();
1354 ASSERT (NewMenuEntry
!= NULL
);
1356 NewLegacyDevContext
= (LEGACY_DEVICE_CONTEXT
*) NewMenuEntry
->VariableContext
;
1357 NewLegacyDevContext
->BbsIndex
= ((LEGACY_BOOT_OPTION_BBS_DATA
*) BootOption
[Index
].OptionalData
)->BbsIndex
;
1358 NewLegacyDevContext
->Description
= AllocateCopyPool (StrSize (BootOption
[Index
].Description
), BootOption
[Index
].Description
);
1359 ASSERT (NewLegacyDevContext
->Description
!= NULL
);
1361 NewMenuEntry
->DisplayString
= NewLegacyDevContext
->Description
;
1362 NewMenuEntry
->HelpString
= NULL
;
1364 switch (((BBS_BBS_DEVICE_PATH
*) BootOption
[Index
].FilePath
)->DeviceType
) {
1365 case BBS_TYPE_FLOPPY
:
1366 InsertTailList (&LegacyFDMenu
.Head
, &NewMenuEntry
->Link
);
1370 case BBS_TYPE_HARDDRIVE
:
1371 InsertTailList (&LegacyHDMenu
.Head
, &NewMenuEntry
->Link
);
1375 case BBS_TYPE_CDROM
:
1376 InsertTailList (&LegacyCDMenu
.Head
, &NewMenuEntry
->Link
);
1380 case BBS_TYPE_EMBEDDED_NETWORK
:
1381 InsertTailList (&LegacyNETMenu
.Head
, &NewMenuEntry
->Link
);
1386 InsertTailList (&LegacyBEVMenu
.Head
, &NewMenuEntry
->Link
);
1392 EfiBootManagerFreeLoadOptions (BootOption
, BootOptionCount
);
1394 LegacyFDMenu
.MenuNumber
= FDNum
;
1395 LegacyHDMenu
.MenuNumber
= HDNum
;
1396 LegacyCDMenu
.MenuNumber
= CDNum
;
1397 LegacyNETMenu
.MenuNumber
= NETNum
;
1398 LegacyBEVMenu
.MenuNumber
= BEVNum
;
1404 Install Boot Manager Menu driver.
1406 @param ImageHandle The image handle.
1407 @param SystemTable The system table.
1409 @retval EFI_SUCEESS Install Boot manager menu success.
1410 @retval Other Return error status.
1415 LegacyBootMaintUiLibConstructor (
1416 IN EFI_HANDLE ImageHandle
,
1417 IN EFI_SYSTEM_TABLE
*SystemTable
1421 EFI_LEGACY_BIOS_PROTOCOL
*LegacyBios
;
1422 LEGACY_BOOT_OPTION_CALLBACK_DATA
*LegacyBootOptionData
;
1424 Status
= gBS
->LocateProtocol (&gEfiLegacyBiosProtocolGuid
, NULL
, (VOID
**) &LegacyBios
);
1425 if (!EFI_ERROR (Status
)) {
1427 // Create LegacyBootOptionData structures for Driver Callback
1429 LegacyBootOptionData
= AllocateZeroPool (sizeof (LEGACY_BOOT_OPTION_CALLBACK_DATA
));
1430 ASSERT (LegacyBootOptionData
!= NULL
);
1432 LegacyBootOptionData
->MaintainMapData
= AllocateZeroPool (sizeof (LEGACY_BOOT_MAINTAIN_DATA
));
1433 ASSERT (LegacyBootOptionData
->MaintainMapData
!= NULL
);
1435 LegacyBootOptionData
->ConfigAccess
.ExtractConfig
= LegacyBootOptionExtractConfig
;
1436 LegacyBootOptionData
->ConfigAccess
.RouteConfig
= LegacyBootOptionRouteConfig
;
1437 LegacyBootOptionData
->ConfigAccess
.Callback
= LegacyBootOptionCallback
;
1440 // Install Device Path Protocol and Config Access protocol to driver handle
1442 Status
= gBS
->InstallMultipleProtocolInterfaces (
1443 &LegacyBootOptionData
->DriverHandle
,
1444 &gEfiDevicePathProtocolGuid
,
1445 &mLegacyBootOptionHiiVendorDevicePath
,
1446 &gEfiHiiConfigAccessProtocolGuid
,
1447 &LegacyBootOptionData
->ConfigAccess
,
1450 ASSERT_EFI_ERROR (Status
);
1453 // Publish our HII data
1455 LegacyBootOptionData
->HiiHandle
= HiiAddPackages (
1456 &mLegacyBootOptionGuid
,
1457 LegacyBootOptionData
->DriverHandle
,
1458 LegacyBootMaintUiVfrBin
,
1459 LegacyBootMaintUiLibStrings
,
1462 ASSERT (LegacyBootOptionData
->HiiHandle
!= NULL
);
1464 mLegacyBootOptionPrivate
= LegacyBootOptionData
;
1471 Destructor of Customized Display Library Instance.
1473 @param ImageHandle The firmware allocated handle for the EFI image.
1474 @param SystemTable A pointer to the EFI System Table.
1476 @retval EFI_SUCCESS The destructor completed successfully.
1477 @retval Other value The destructor did not complete successfully.
1482 LegacyBootMaintUiLibDestructor (
1483 IN EFI_HANDLE ImageHandle
,
1484 IN EFI_SYSTEM_TABLE
*SystemTable
1489 if (mLegacyBootOptionPrivate
!= NULL
&& mLegacyBootOptionPrivate
->DriverHandle
!= NULL
) {
1490 Status
= gBS
->UninstallMultipleProtocolInterfaces (
1491 mLegacyBootOptionPrivate
->DriverHandle
,
1492 &gEfiDevicePathProtocolGuid
,
1493 &mLegacyBootOptionHiiVendorDevicePath
,
1494 &gEfiHiiConfigAccessProtocolGuid
,
1495 &mLegacyBootOptionPrivate
->ConfigAccess
,
1498 ASSERT_EFI_ERROR (Status
);
1500 HiiRemovePackages (mLegacyBootOptionPrivate
->HiiHandle
);
1502 FreePool (mLegacyBootOptionPrivate
->MaintainMapData
);
1503 FreePool (mLegacyBootOptionPrivate
);