alder_lake_bios/Insyde/InsydeSetupPkg/Drivers/H2OFormBrowserDxe/H2ODialog.c

720 lines
23 KiB
C

/** @file
The H2O_DIALOG_PROTOCOL is the interface to the EFI Configuration Driver.
;******************************************************************************
;* Copyright (c) 2013 - 2020, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include "InternalH2OFormBrowser.h"
/**
Display Dialog for User Requirement which dilag type is Yes/No, Yes/No/Cancel, Ok or Ok/Cancel
@param[in] DialogOperation Dialog type (Yes/No, Yes/No/Cancel, Ok or Ok/Cancel)
@param[in] HotKey HotKey information
@param[in] MaximumStringSize Maximum string length
@param[out] StringBuffer String buffer
@param[out] KeyValue Ptr to returned structure that indicates the key the user selected.
@param[in] String Ptr to null-terminated string that specifies the dialog prompt
@retval EFI_SUCCESS Process successfully.
**/
EFI_STATUS
EFIAPI
FBConfirmDialog (
IN UINT32 DialogOperation,
IN BOOLEAN HotKey,
IN UINT32 MaximumStringSize,
OUT CHAR16 *StringBuffer,
OUT EFI_INPUT_KEY *KeyValue,
IN CHAR16 *String,
...
)
{
EFI_STATUS Status;
//ButtonStringArray and ButtonHiiValueArray use {YES,NO,CANCEL,NULL}
EFI_STRING ButtonStringArray[4];
EFI_HII_VALUE ButtonHiiValueArray[4];
H2O_FORM_BROWSER_D Dialog;
UINT32 ButtonCount;
BOOLEAN ConsoleInitComplete;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
UINTN Index;
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
ConsoleInitComplete = FALSE;
Private = NULL;
FBIsConsoleInit (&ConsoleInitComplete, &Private);
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
Status = EFI_SUCCESS;
switch (DialogOperation) {
case DlgYesNo:
ButtonCount = 2;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_YES_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_NO_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionNo);
break;
case DlgYesNoCancel:
ButtonCount = 3;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_YES_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_NO_TEXT), mHiiHandle);
ButtonStringArray[2] = GetString (STRING_TOKEN (SCU_STR_CANCEL_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionNo);
CreateValueAsUint64 (ButtonHiiValueArray + 2, ButtonActionCancel);
break;
case DlgOk:
ButtonCount = 1;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_OK_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray, ButtonActionYes);
break;
case DlgOkCancel:
ButtonCount = 2;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_OK_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_CANCEL_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionCancel);
break;
default:
DEBUG ((EFI_D_INFO, "DialogOperation is error"));
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
CreateValueAsUint64 (&Dialog.ConfirmHiiValue, ButtonActionYes);
Status = CreateNewDialog (
H2O_FORM_BROWSER_D_TYPE_SELECTION | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG,
0,
NULL,
1,
0,
ButtonCount,
&String,
NULL,
ButtonStringArray,
NULL,
ButtonHiiValueArray,
&Dialog
);
if (!EFI_ERROR (Status) && Dialog.ConfirmHiiValue.Value.u8 == ButtonActionYes) {
KeyValue->ScanCode = SCAN_NULL;
KeyValue->UnicodeChar = CHAR_CARRIAGE_RETURN;
} else {
KeyValue->ScanCode = SCAN_ESC;
KeyValue->UnicodeChar = CHAR_NULL;
}
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
for (Index = 0; Index < ButtonCount; Index++) {
FreePool (ButtonStringArray[Index]);
}
return Status;
}
/**
Display Dialog for User Requirement
@param[in] HotKey HotKey information
@param[in] MaximumStringSize Maximum string size
@param[out] UserInputStringBuffer User input string buffer
@param[out] KeyValue Output key value which stand for user selection
@param[in] String Dialog question string
@retval EFI_SUCCESS Process successfully.
**/
EFI_STATUS
EFIAPI
FBPasswordDialog (
IN UINT32 NumberOfLines,
IN BOOLEAN HotKey,
IN UINT32 MaximumStringSize,
OUT CHAR16 *UserInputStringBuffer,
OUT EFI_INPUT_KEY *KeyValue,
IN CHAR16 *TitleString,
...
)
{
EFI_STATUS Status;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
H2O_FORM_BROWSER_D Dialog;
CHAR16 **BodyInputStringArray;
if ((MaximumStringSize == 0) || (UserInputStringBuffer == NULL)) {
return EFI_SUCCESS;
}
Private = &mFBPrivate;
ConsoleInitComplete = Private->ConsoleInitComplete;
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
BodyInputStringArray = AllocatePool (sizeof (CHAR16 *));
if (BodyInputStringArray == NULL) {
return EFI_OUT_OF_RESOURCES;
}
BodyInputStringArray[0] = L"";
CreateValueAsString (&Dialog.ConfirmHiiValue, (UINT16) MaximumStringSize * sizeof (CHAR16), (UINT8 *)L"");
Status = CreateNewDialog (
(H2O_FORM_BROWSER_D_TYPE_PASSWORD << 16) | H2O_FORM_BROWSER_D_TYPE_SELECTION | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG,
0,
TitleString,
0,
1,
0,
NULL,
BodyInputStringArray,
NULL,
NULL,
NULL,
&Dialog
);
if (!EFI_ERROR (Status)) {
ZeroMem (UserInputStringBuffer, sizeof (CHAR16) * MaximumStringSize);
CopyMem (UserInputStringBuffer, Dialog.ConfirmHiiValue.Buffer, StrSize ((CHAR16 *) Dialog.ConfirmHiiValue.Buffer));
FreePool (Dialog.ConfirmHiiValue.Buffer);
KeyValue->ScanCode = SCAN_NULL;
KeyValue->UnicodeChar = CHAR_CARRIAGE_RETURN;
} else if (Status == EFI_NOT_READY) {
//
// Shut Dialog
//
KeyValue->ScanCode = SCAN_ESC;
KeyValue->UnicodeChar = CHAR_NULL;
Status = EFI_SUCCESS;
}
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
return Status;
}
/**
Draw select dialog and wait user select item.
@param[in] NumberOfLines Number of display item
@param[in] HotKey If TRUE need check assign key list
If FALSE use function default key event
@param[in] KeyList Assign key list
@param[out] EventKey User input string buffer
@param[in] MaximumStringSize Maximum string length
@param[in] TitleString Title string
@param[in] SelectIndex The select index number
@param[in] String The address array of string
@param[in] Color Set display color
@retval EFI_SUCCESS Process successfully.
**/
EFI_STATUS
EFIAPI
FBOneOfOptionDialog (
IN UINT32 NumberOfLines,
IN BOOLEAN HotKey,
IN CONST EFI_INPUT_KEY *KeyList,
OUT EFI_INPUT_KEY *EventKey,
IN UINT32 MaximumStringSize,
IN CHAR16 *TitleString,
OUT UINT32 *SelectIndex,
IN CHAR16 **String,
IN UINT32 Color
)
{
EFI_STATUS Status;
H2O_FORM_BROWSER_D Dialog;
UINT32 Index;
EFI_HII_VALUE *HiiValueArray;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
Private = &mFBPrivate;
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
if (NumberOfLines == 0) {
return EFI_INVALID_PARAMETER;
}
ConsoleInitComplete = Private->ConsoleInitComplete;
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
HiiValueArray = AllocateZeroPool (sizeof (EFI_HII_VALUE) * NumberOfLines);
if (HiiValueArray == NULL) {
return EFI_OUT_OF_RESOURCES;
}
for (Index = 0; Index < NumberOfLines; Index++) {
CreateValueAsUint64 (HiiValueArray+Index, Index);
}
Index = (*SelectIndex < NumberOfLines) ? *SelectIndex : 0;
CopyMem (&Dialog.ConfirmHiiValue, &HiiValueArray[Index], sizeof (EFI_HII_VALUE));
Status = CreateNewDialog (
(H2O_FORM_BROWSER_D_TYPE_ONE_OF << 16) | H2O_FORM_BROWSER_D_TYPE_BODY_SELECTABLE | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG,
0,
TitleString,
(UINT32) NumberOfLines,
0,
0,
String,
NULL,
NULL,
HiiValueArray,
NULL,
&Dialog
);
if (!EFI_ERROR (Status)) {
*SelectIndex = (UINT32) (UINTN)Dialog.ConfirmHiiValue.Value.u64;
EventKey->ScanCode = SCAN_NULL;
EventKey->UnicodeChar = CHAR_CARRIAGE_RETURN;
} else {
EventKey->ScanCode = SCAN_ESC;
EventKey->UnicodeChar = CHAR_NULL;
}
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
FreePool (HiiValueArray);
return EFI_SUCCESS;
}
/**
To show message dialog with title.
@param[in] RequestedWidth Dialog Width.
@param[in] NumberOfLines Number of item.
@param[in] ArrayOfStrings Message strings.
@retval EFI_SUCCESS The function completed successfully.
**/
EFI_STATUS
EFIAPI
FBCreateMsgPopUp (
IN UINT32 RequestedWidth,
IN UINT32 NumberOfLines,
IN CHAR16 *ArrayOfStrings,
...
)
{
H2O_FORM_BROWSER_D Dialog;
EFI_STATUS Status;
CHAR16 **MsgString;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
Private = &mFBPrivate;
MsgString = &ArrayOfStrings;
ConsoleInitComplete = Private->ConsoleInitComplete;
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
Status = CreateSimpleDialog (
H2O_FORM_BROWSER_D_TYPE_MSG | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG,
0,
MsgString[0],
(UINT32)(NumberOfLines - 1),
&(MsgString[1]),
0,
&Dialog
);
CpuDeadLoop ();
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
return EFI_SUCCESS;
}
/**
Display page information
@param[in] TitleString Ptr to the dialog title string
@param[in] TokenHandle HII handle that specifies the information string handle
@param[in] NumOfInfoStrings Number of the information strings
@param[in] InfoStrings Unsigned integer that specifies the number of information strings in InfoStrings
@return EFI_INVALID_PARAMETER Invalid parameter
@return EFI_OUT_OF_RESOURCES BodyStringArray resource is not enough
@return EFI_SUCCESS Display page information success
**/
EFI_STATUS
EFIAPI
FBShowPageInfo (
IN CHAR16 *TitleString,
IN CHAR16 *InfoStrings
)
{
EFI_STATUS Status;
UINT32 DialogType;
UINT32 ButtonCount;
H2O_FORM_BROWSER_D Dialog;
UINT32 Attribute;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
if (TitleString == NULL || InfoStrings == NULL) {
return EFI_INVALID_PARAMETER;
}
Private = &mFBPrivate;
ConsoleInitComplete = Private->ConsoleInitComplete;
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
DialogType = H2O_FORM_BROWSER_D_TYPE_MSG | H2O_FORM_BROWSER_D_TYPE_SHOW_HELP;
ButtonCount = 0;
Attribute = 0;
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
Status = CreateSimpleDialog (
DialogType,
Attribute,
TitleString,
1,
&InfoStrings,
ButtonCount,
&Dialog
);
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
return Status;
}
/**
Display numeric dialog for user input numeric value
@param[in] TitleString The dialog title string
@param[in] Minimum Minimum value of output numeric value
@param[in] Maximum Maximum value of output numeric value
@param[in] Step Step value of numeric value
@param[in] IsHex Flag to determine if the value is hexadecimal or not
@param[out] Step Output numeric value
@retval EFI_SUCCESS Get user input value successfully
@retval EFI_INVALID_PARAMETER TitleString or NumericValue is NULL
@retval EFI_OUT_OF_RESOURCES Allocate memory fail
**/
EFI_STATUS
EFIAPI
FBNumericDialog (
IN CHAR16 *TitleString,
IN UINT64 Minimum,
IN UINT64 Maximum,
IN UINT64 Step,
IN BOOLEAN IsHex,
OUT UINT64 *NumericValue
)
{
EFI_STATUS Status;
H2O_FORM_BROWSER_D Dialog;
CHAR16 *BodyInputString;
CHAR16 **ButtonStringArray;
EFI_HII_VALUE *ButtonHiiValueArray;
H2O_FORM_BROWSER_S H2OStatement;
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
if (TitleString == NULL || NumericValue == NULL) {
return EFI_INVALID_PARAMETER;
}
Private = &mFBPrivate;
ConsoleInitComplete = Private->ConsoleInitComplete;
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
ZeroMem (&H2OStatement, sizeof (H2OStatement));
H2OStatement.Minimum = Minimum;
H2OStatement.Maximum = Maximum;
H2OStatement.Step = Step;
H2OStatement.Flags = IsHex ? EFI_IFR_DISPLAY_UINT_HEX : EFI_IFR_DISPLAY_UINT_DEC;
Dialog.H2OStatement = &H2OStatement;
Dialog.ConfirmHiiValue.Type = EFI_IFR_TYPE_NUM_SIZE_64;
ButtonStringArray = AllocatePool (sizeof (CHAR16 *) * 2);
if (ButtonStringArray == NULL) {
return EFI_OUT_OF_RESOURCES;
}
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_YES_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_NO_TEXT), mHiiHandle);
ButtonHiiValueArray = AllocateZeroPool (sizeof (EFI_HII_VALUE) * 2);
if (ButtonHiiValueArray == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CreateValueAsBoolean (ButtonHiiValueArray , TRUE);
CreateValueAsBoolean (ButtonHiiValueArray + 1, FALSE);
BodyInputString = L"";
Status = CreateNewDialog (
(H2O_FORM_BROWSER_D_TYPE_NUMERIC << 16) | H2O_FORM_BROWSER_D_TYPE_SELECTION | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG,
0,
TitleString,
0,
1,
2,
NULL,
&BodyInputString,
ButtonStringArray,
NULL,
ButtonHiiValueArray,
&Dialog
);
if (!EFI_ERROR (Status)) {
*NumericValue = Dialog.ConfirmHiiValue.Value.u64;
} else {
Status = EFI_ABORTED;
}
FreePool (ButtonStringArray[0]);
FreePool (ButtonStringArray[1]);
FreePool (ButtonStringArray);
FreePool (ButtonHiiValueArray);
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
return Status;
}
/**
Display page Dialog for User Requirement which dialog type are Yes/No, Yes/No/Cancel, Ok or Ok/Cancel
@param[in] DialogOperation Dialog type (Yes/No, Yes/No/Cancel, Ok or Ok/Cancel)
@param[in] TitleString Ptr to the dialog title string.
@param[in] ConfirmStrings Ptr to the confirm message for dialog type are Yes/No, Yes/No/Cancel, Ok or Ok/Cancel.
@param[in] ShowStringBuffer Ptr to the string buffer which will be shown in the page.
@param[out] KeyValue Ptr to returned structure that indicates the key the user selected.
@return EFI_INVALID_PARAMETER Invalid parameter
@return EFI_OUT_OF_RESOURCES BodyStringArray resource is not enough
@return EFI_SUCCESS Display page information success
**/
EFI_STATUS
EFIAPI
FBConfirmPageDialog (
IN UINT32 DialogOperation,
IN CHAR16 *TitleString,
IN CHAR16 *ConfirmStrings,
IN CHAR16 *ShowStringBuffer,
OUT EFI_INPUT_KEY *KeyValue
)
{
EFI_STATUS Status;
H2O_FORM_BROWSER_D Dialog;
UINT32 DialogType;
UINT32 ButtonCount;
EFI_STRING ButtonStringArray[4];
EFI_HII_VALUE ButtonHiiValueArray[4];
H2O_FORM_BROWSER_PRIVATE_DATA *Private;
BOOLEAN ConsoleInitComplete;
UINTN Index;
CHAR16 *BodyStringArray[2];
ZeroMem (&Dialog, sizeof (H2O_FORM_BROWSER_D));
ConsoleInitComplete = FALSE;
Private = NULL;
FBIsConsoleInit (&ConsoleInitComplete, &Private);
if (!ConsoleInitComplete) {
Status = FBInitConsoles (Private);
if (EFI_ERROR (Status)) {
return Status;
}
}
BodyStringArray[0] = ConfirmStrings;
BodyStringArray[1] = ShowStringBuffer;
switch (DialogOperation) {
case DlgYesNo:
ButtonCount = 2;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_YES_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_NO_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionNo);
break;
case DlgYesNoCancel:
ButtonCount = 3;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_YES_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_NO_TEXT), mHiiHandle);
ButtonStringArray[2] = GetString (STRING_TOKEN (SCU_STR_CANCEL_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionNo);
CreateValueAsUint64 (ButtonHiiValueArray + 2, ButtonActionCancel);
break;
case DlgOk:
ButtonCount = 1;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_OK_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray, ButtonActionYes);
break;
case DlgOkCancel:
ButtonCount = 2;
ButtonStringArray[0] = GetString (STRING_TOKEN (SCU_STR_OK_TEXT), mHiiHandle);
ButtonStringArray[1] = GetString (STRING_TOKEN (SCU_STR_CANCEL_TEXT), mHiiHandle);
CreateValueAsUint64 (ButtonHiiValueArray , ButtonActionYes);
CreateValueAsUint64 (ButtonHiiValueArray + 1, ButtonActionCancel);
break;
default:
DEBUG ((EFI_D_INFO, "DialogOperation is error"));
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
CreateValueAsUint64 (&Dialog.ConfirmHiiValue, ButtonActionYes);
DialogType = H2O_FORM_BROWSER_D_TYPE_SHOW_CONFIRM_PAGE | H2O_FORM_BROWSER_D_TYPE_FROM_H2O_DIALOG;
Status = CreateNewDialog (
DialogType,
0,
TitleString,
2,
0,
ButtonCount,
(CHAR16 **)&BodyStringArray,
NULL,
ButtonStringArray,
NULL,
ButtonHiiValueArray,
&Dialog
);
if (!EFI_ERROR (Status) && Dialog.ConfirmHiiValue.Value.u8 == ButtonActionYes) {
KeyValue->ScanCode = SCAN_NULL;
KeyValue->UnicodeChar = CHAR_CARRIAGE_RETURN;
} else {
KeyValue->ScanCode = SCAN_ESC;
KeyValue->UnicodeChar = CHAR_NULL;
}
if (!ConsoleInitComplete) {
FBDetachConsoles (Private);
}
for (Index = 0; Index < ButtonCount; Index++) {
FreePool (ButtonStringArray[Index]);
}
return Status;
}
/**
This is the routine which install the H2O dialog protocol.
@retval EFI_SUCCESS The function completed successfully.
@retval EFI_OUT_OF_RESOURCES Allocate memory fail.
@retval otherwise Install protocol interface fail
**/
EFI_STATUS
EFIAPI
InstallH2ODialogProtocol (
EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
H2O_DIALOG_PROTOCOL *H2ODialogData;
H2ODialogData = AllocateZeroPool (sizeof (H2O_DIALOG_PROTOCOL));
if (H2ODialogData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
H2ODialogData->ConfirmDialog = FBConfirmDialog;
H2ODialogData->PasswordDialog = FBPasswordDialog;
H2ODialogData->OneOfOptionDialog = FBOneOfOptionDialog;
H2ODialogData->CreateMsgPopUp = FBCreateMsgPopUp;
H2ODialogData->ShowPageInfo = FBShowPageInfo;
H2ODialogData->NumericDialog = FBNumericDialog;
H2ODialogData->ConfirmPageDialog = FBConfirmPageDialog;
Status = gBS->InstallProtocolInterface (
&ImageHandle,
&gH2ODialogProtocolGuid,
EFI_NATIVE_INTERFACE,
H2ODialogData
);
DEBUG ((EFI_D_INFO, "Install H2ODialogProtocol is fail"));
ASSERT_EFI_ERROR (Status);
return Status;
}