/** @file This file for CR SOL reference ;****************************************************************************** ;* Copyright (c) 2013, Insyde Software Corporation. 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 "SolConfigUtil.h" #include #include #include #include #include #include #include #include #include #include #include #define SOL_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE) #define IPv4_MAC_LENGTH 6 #define IPv4_IP_LENGTH 4 #define MAX_SCU_TEXT_SIZE 50 //[-start-160406-IB14090058-add]// #define LENGTH_OF_STRING 13 //[-end-160406-IB14090058-add]// #define IsDigital(c) ((c)>= '0' && (c) <= '9') #define IsAlphabet(c) (((c)>= 'A' && (c) <= 'Z') || ((c)>= 'a' && (c) <= 'z')) #define IsAfAlphabet(c) (((c)>= 'A' && (c) <= 'F') || ((c)>= 'a' && (c) <= 'f')) #define IsText(c) ((c)>= 0x20 && (c) <= 0x7E) #define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9')) typedef BOOLEAN (*VALIDATE_FUNC)(CHAR16 code); EFI_HII_HANDLE mHiiHandle; CHAR16 gMacString[30] = {0}; //CR_SOL_CONFIG gSolConfigNvData; H2O_DIALOG_PROTOCOL *gH2oDialog = NULL; //[-start-160106-IB04930000-add]// // // Store StringRefID when POST initialize, use this array to update string later in SCU. // UINT16 mSolStrId[7] = {0}; //[-end-160106-IB04930000-add]// GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 SolHexString[] = "0123456789ABCDEFabcdef"; CHAR16 *gDialogTitle [] = { L"Set IP Address", L"Invalid IP address !", L"Set Subnet mask", L"Invalid Subnet Mask !", L"Set Gateway IP address", L"Invalid Gateway IP address !" }; EFI_STATUS TextInputDialog ( IN CHAR16 *Title, IN VALIDATE_FUNC IsValidChar, IN UINTN FieldLen, IN UINTN BufferSize, OUT CHAR16 *Buffer ); VOID ShowErrorMessage ( CHAR16 *Str ) { EFI_STATUS Status; EFI_INPUT_KEY Key; if (gH2oDialog == NULL) { Status = gBS->LocateProtocol (&gH2ODialogProtocolGuid, NULL, (VOID **)&gH2oDialog); if (EFI_ERROR(Status)) { return ; } } gH2oDialog->ConfirmDialog ( 2, // NumberOfLines FALSE, // HotKey 0, // MaximumStringSize NULL, // StringBuffer &Key, // KeyValue Str // String ); } BOOLEAN VisibleCharCheckFun ( CHAR16 c ) { if (c >= 0x20 && c < 0x7f) { return TRUE; } return FALSE; } BOOLEAN Ipv4CharCheckFunc ( CHAR16 c ) { if (IsDigital(c)) { return TRUE; } if (c == '.') { return TRUE; } return FALSE; } BOOLEAN MacCharCheckFunc( CHAR16 c ) { if (IsDigital(c)) { return TRUE; } if (c == '.') { return TRUE; } if (IsAfAlphabet (c)) { return TRUE; } return FALSE; } EFI_STATUS UnicodeStrToIp ( IN CHAR16 *Str, OUT EFI_IPv4_ADDRESS *Ip ) { UINTN Index; UINTN Number; Index = 0; while (*Str) { if (Index > 3) { return EFI_INVALID_PARAMETER; } Number = 0; while (NET_IS_DIGIT (*Str)) { Number = Number * 10 + (*Str - '0'); Str++; } if (Number > 0xFF) { return EFI_INVALID_PARAMETER; } Ip->Addr[Index] = (UINT8) Number; if ((*Str != '\0') && (*Str != '.')) { // // The current character should be either the NULL terminator or // the dot delimiter. // return EFI_INVALID_PARAMETER; } if (*Str == '.') { // // Skip the delimiter. // Str++; } Index++; } if (Index != 4) { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } EFI_STATUS UnicodeStrToMac ( IN CHAR16 *Str, OUT EFI_MAC_ADDRESS *Mac ) { UINTN Index; UINTN Number; Index = 0; while (*Str) { if (Index > 5) { return EFI_INVALID_PARAMETER; } Number = 0; while (NET_IS_DIGIT (*Str) || IsAfAlphabet(*Str)) { if(NET_IS_DIGIT (*Str)) { Number = Number * 16 + (*Str - '0'); } else { if ((*Str >= 'A') && (*Str <= 'F')) { Number = Number * 16 + (*Str - 'A') + 10; } else { Number = Number * 16 + (*Str - 'a') + 10; } } Str++; } if (Number > 0xFF) { return EFI_INVALID_PARAMETER; } Mac->Addr[Index] = (UINT8) Number; if ((*Str != '\0') && (*Str != '.')) { // // The current character should be either the NULL terminator or // the dot delimiter. // return EFI_INVALID_PARAMETER; } if (*Str == '.') { // // Skip the delimiter. // Str++; } Index++; } if (Index != 6) { return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } VOID SolMacAddrToStr ( IN EFI_MAC_ADDRESS *Mac, IN UINT32 Len, OUT CHAR16 *Str ) { UINT32 Index; CHAR16 *String; for (Index = 0; Index < Len; Index++) { Str[3 * Index] = (CHAR16) SolHexString[(Mac->Addr[Index] >> 4) & 0x0F]; Str[3 * Index + 1] = (CHAR16) SolHexString[Mac->Addr[Index] & 0x0F]; Str[3 * Index + 2] = L'-'; } String = &Str[3 * Index - 1] ; *String = L'\0'; } CHAR16 * ByteToStr ( IN UINT8 Byte, OUT CHAR16 *Str ) { UINT16 *DecimalStr; BOOLEAN SkipMiddleZero; SkipMiddleZero = TRUE; DecimalStr = Str; *Str = L'0' + Byte / 100; if (*Str != L'0') { Byte = Byte % 100; Str++; SkipMiddleZero = FALSE; } *Str = L'0' + Byte / 10; if (*Str != L'0' || !SkipMiddleZero) { Byte = Byte % 10; Str++; } *Str = L'0' + Byte; Str++; *Str = 0; return Str; } VOID IpAddrToStr ( IN EFI_IPv4_ADDRESS *Ip, OUT CHAR16 *Str ) { UINTN Index; for (Index = 0; Index < IPv4_IP_LENGTH; Index++) { Str = ByteToStr (Ip->Addr[Index], Str); if (Index < IPv4_IP_LENGTH - 1) { *Str++ = L'.'; } } } VOID MacAddrToStr ( IN EFI_MAC_ADDRESS *Mac, OUT CHAR16 *Str ) { UINTN Index; for (Index = 0; Index < IPv4_MAC_LENGTH; Index++) { Str = ByteToStr (Mac->Addr[Index], Str); if (Index < IPv4_MAC_LENGTH - 1) { *Str++ = L'.'; } } } //[-start-180418-IB08400583-modify]// VOID UpdateFormSolAddr ( EFI_IPv4_ADDRESS *Address, EFI_STRING_ID StringRef ) //[-end-180418-IB08400583-modify]// { CHAR16 UniStr[MAX_SCU_TEXT_SIZE]; IpAddrToStr (Address, UniStr); HiiSetString (mHiiHandle, StringRef, UniStr, NULL); } //[-start-180418-IB08400583-modify]// VOID UpdateFormSolMacAddr ( EFI_MAC_ADDRESS *MacAddr, EFI_STRING_ID StringRef ) //[-end-180418-IB08400583-modify]// { CHAR16 UniStr[MAX_SCU_TEXT_SIZE]; SolMacAddrToStr (MacAddr, IPv4_MAC_LENGTH, UniStr); HiiSetString (mHiiHandle, StringRef, UniStr, NULL); } //[-start-180418-IB08400583-modify]// VOID UpdateFormSolStr ( CHAR16 *Str, EFI_STRING_ID StringRef ) //[-end-180418-IB08400583-modify]// { HiiSetString (mHiiHandle, StringRef, Str, NULL); } VOID SolUpdateEntrys ( SOL_CONFIGURATION *SolConfig ) { // CR_SOL_CONFIG *SolConfigNvdata; // SolConfigNvdata = &CrIfrNvdata->CrSolConfig; UpdateFormSolAddr ((EFI_IPv4_ADDRESS *)&SolConfig->LocalIp, mSolStrId[SOL_IP_ADDR_STR_INDEX]); UpdateFormSolAddr ((EFI_IPv4_ADDRESS *)&SolConfig->SubnetMask, mSolStrId[SOL_MASK_STR_INDEX]); UpdateFormSolAddr ((EFI_IPv4_ADDRESS *)&SolConfig->Gateway, mSolStrId[SOL_GATEWAY_STR_INDEX]); UpdateFormSolAddr ((EFI_IPv4_ADDRESS *)&SolConfig->AdminIp, mSolStrId[SOL_ADMIN_IP_STR_INDEX]); UpdateFormSolStr (SolConfig->UserName, mSolStrId[SOL_LOGIN_ACCOUNT_STR_INDEX]); UpdateFormSolStr (SolConfig->Password, mSolStrId[SOL_LOGIN_PASSWORD_STR_INDEX]); UpdateFormSolMacAddr ((EFI_MAC_ADDRESS *)&SolConfig->AdminMac, mSolStrId[SOL_ADMIN_MAC_STR_INDEX]); } EFI_STATUS SolConfigCallback ( EFI_QUESTION_ID QuestionId, SOL_CONFIGURATION *SolConfig ) { EFI_STATUS Status; CHAR16 StringBuffer[50]; EFI_IPv4_ADDRESS Ip; EFI_MAC_ADDRESS Mac; switch (QuestionId) { case KEY_SOL_PORT_IP : Status = TextInputDialog(L"Set IP Address", Ipv4CharCheckFunc, 15, 16, StringBuffer); if (Status == EFI_SUCCESS) { Status = UnicodeStrToIp (StringBuffer, &Ip); if (Status == EFI_SUCCESS) { // SolConfig->LocalIp = Ip; CopyMem (SolConfig->LocalIp, &Ip, sizeof (EFI_IPv4_ADDRESS)); UpdateFormSolAddr (&Ip, mSolStrId[SOL_IP_ADDR_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid IP address !"); // Status = EFI_UNSUPPORTED; } } break; case KEY_SOL_PORT_MASK : Status = TextInputDialog(L"Set Subnet mask", Ipv4CharCheckFunc, 15, 16, StringBuffer); if (Status == EFI_SUCCESS) { Status = UnicodeStrToIp (StringBuffer, &Ip); if (Status == EFI_SUCCESS) { // SolConfig->SubnetMask = Ip; CopyMem (SolConfig->SubnetMask, &Ip, sizeof (EFI_IPv4_ADDRESS)); UpdateFormSolAddr (&Ip, mSolStrId[SOL_MASK_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid Subnet Mask !"); // Status = EFI_UNSUPPORTED; } } break; case KEY_SOL_PORT_GATEWAY : Status = TextInputDialog(L"Set Gateway IP address", Ipv4CharCheckFunc, 15, 16, StringBuffer); if (Status == EFI_SUCCESS) { Status = UnicodeStrToIp (StringBuffer, &Ip); if (Status == EFI_SUCCESS) { // SolConfig->Gateway = Ip; CopyMem (SolConfig->Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS)); UpdateFormSolAddr (&Ip, mSolStrId[SOL_GATEWAY_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid Gateway IP address !"); // Status = EFI_UNSUPPORTED; } } break; case KEY_SOL_ADMIN_IP : Status = TextInputDialog(L"Set Adminstrator IP address", Ipv4CharCheckFunc, 15, 16, StringBuffer); if (Status == EFI_SUCCESS) { Status = UnicodeStrToIp (StringBuffer, &Ip); if (Status == EFI_SUCCESS) { // SolConfig->AdminIp = Ip; CopyMem (SolConfig->AdminIp, &Ip, sizeof (EFI_IPv4_ADDRESS)); UpdateFormSolAddr (&Ip, mSolStrId[SOL_ADMIN_IP_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid Adminstrator IP address !"); // Status = EFI_UNSUPPORTED; } } break; case KEY_SOL_ADMIN_MAC : Status = TextInputDialog(L"Set Adminstrator MAC address", MacCharCheckFunc, 17, 18, StringBuffer); if (Status == EFI_SUCCESS) { ZeroMem (&Mac, sizeof(EFI_MAC_ADDRESS)); Status = UnicodeStrToMac (StringBuffer, &Mac); if (Status == EFI_SUCCESS) { // SolConfig->AdminMac = Mac; CopyMem (SolConfig->AdminMac, &Mac, sizeof (EFI_MAC_ADDRESS)); UpdateFormSolMacAddr (&Mac, mSolStrId[SOL_ADMIN_MAC_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid Adminstrator MAC address !"); // Status = EFI_UNSUPPORTED; } } break; case KEY_SOL_LOGIN_NAME : Status = TextInputDialog(L"Set Login Name", VisibleCharCheckFun, 12, 13, StringBuffer); if (Status == EFI_SUCCESS) { //[-start-180820-IB08400637-modify]// StrCpyS(SolConfig->UserName, 13,StringBuffer); //[-end-180820-IB08400637-modify]// UpdateFormSolStr (StringBuffer, mSolStrId[SOL_LOGIN_ACCOUNT_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid user name !"); // Status = EFI_UNSUPPORTED; } break; case KEY_SOL_LOGIN_PASSWORD : Status = TextInputDialog(L"Set Password", VisibleCharCheckFun, 12, 13, StringBuffer); if (Status == EFI_SUCCESS) { //[-start-180820-IB08400637-modify]// StrCpyS(SolConfig->Password, 13, StringBuffer); //[-end-180820-IB08400637-modify]// UpdateFormSolStr (StringBuffer, mSolStrId[SOL_LOGIN_PASSWORD_STR_INDEX]); // Status = EFI_SUCCESS; } else { ShowErrorMessage (L"Invalid password !"); // Status = EFI_UNSUPPORTED; } break; default: break; } return EFI_SUCCESS; } //[-start-160406-IB14090058-add]// CHAR16* GetPasswordStr ( IN CONST CHAR16* StrPtr ) { while (*StrPtr != 0) { StrPtr++; }; return (CHAR16*)(++StrPtr); } //[-end-160406-IB14090058-add]// VOID SolConfigSetToDefault ( SOL_CONFIGURATION *SolConfig ) { //[-start-160406-IB14090058-modify]// SOL_CONFIGURATION *Tmp; UINTN Size; Size = sizeof (SOL_CONFIGURATION) - (sizeof (CHAR16) * LENGTH_OF_STRING * 2) - sizeof (UINT8) * 2; Tmp = PcdGetPtr (PcdH2OCrSolDefaultSetting); CopyMem (&SolConfig->PortNumber, &Tmp->PortNumber, Size); //[-start-180820-IB08400637-modify]// StrCpyS (SolConfig->UserName, 13, Tmp->UserName); StrCpyS (SolConfig->Password, 13, GetPasswordStr (Tmp->UserName)); //[-end-180820-IB08400637-modify]// //[-end-160406-IB14090058-modify]// } EFI_STATUS InitSolFormLabel ( SOL_CONFIGURATION *SolConfig ) { EFI_STATUS Status; EFI_IFR_GUID_LABEL *SolFormLabel; VOID *StartOpCodeHandle; EFI_STRING_ID StrTokenID; EFI_STRING_ID PromptStrID; EFI_STRING_ID PromptStrID2; CHAR16 *BlankStr; CHAR16 *PromptStr; CHAR16 *PromptStr2; UINTN PromptStrSize; StartOpCodeHandle = HiiAllocateOpCodeHandle (); SolFormLabel = (EFI_IFR_GUID_LABEL*) HiiCreateGuidOpCode ( StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); SolFormLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; SolFormLabel->Number = SOL_FORM_LABEL; BlankStr = L" "; StrTokenID = HiiSetString (mHiiHandle, 0, BlankStr, NULL); PromptStrSize = 0x100; PromptStr = AllocatePool (PromptStrSize); PromptStr2 = AllocatePool (PromptStrSize); // // Admin IP option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Administrator IP" ); ZeroMem (PromptStr2, PromptStrSize); IpAddrToStr ((EFI_IPv4_ADDRESS *)&SolConfig->AdminIp, PromptStr2); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, PromptStr2, NULL); mSolStrId[SOL_ADMIN_IP_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_ADMIN_IP, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); // // Admin MAC option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Administrator MAC" ); ZeroMem (PromptStr2, PromptStrSize); // MacAddrToStr ((EFI_MAC_ADDRESS *)&SolConfig->AdminMac, PromptStr2); SolMacAddrToStr ((EFI_MAC_ADDRESS *)&SolConfig->AdminMac, IPv4_MAC_LENGTH, PromptStr2); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, PromptStr2, NULL); mSolStrId[SOL_ADMIN_MAC_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_ADMIN_MAC, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); // // Login Name option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Login Name" ); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, SolConfig->UserName, NULL); mSolStrId[SOL_LOGIN_ACCOUNT_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_LOGIN_NAME, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); // // Login Password option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Password" ); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, SolConfig->Password, NULL); mSolStrId[SOL_LOGIN_PASSWORD_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_LOGIN_PASSWORD, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); Status = HiiUpdateForm ( mHiiHandle, NULL, SOL_FORM_ID, StartOpCodeHandle, NULL ); HiiFreeOpCodeHandle (StartOpCodeHandle); return Status; } EFI_STATUS InitSolStaticIpLabel ( SOL_CONFIGURATION *SolConfig ) { EFI_IFR_GUID_LABEL *SolFormLabel; VOID *StartOpCodeHandle; EFI_STRING_ID StrTokenID; EFI_STRING_ID PromptStrID; EFI_STRING_ID PromptStrID2; CHAR16 *BlankStr; CHAR16 *PromptStr; CHAR16 *PromptStr2; UINTN PromptStrSize; StartOpCodeHandle = HiiAllocateOpCodeHandle (); SolFormLabel = (EFI_IFR_GUID_LABEL*) HiiCreateGuidOpCode ( StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); SolFormLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; SolFormLabel->Number = SOL_STATIC_IP_LABEL; BlankStr = L" "; StrTokenID = HiiSetString (mHiiHandle, 0, BlankStr, NULL); PromptStrSize = 0x100; PromptStr = AllocatePool (PromptStrSize); PromptStr2 = AllocatePool (PromptStrSize); // // IP Address option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" IP Address" ); ZeroMem (PromptStr2, PromptStrSize); IpAddrToStr ((EFI_IPv4_ADDRESS *)&SolConfig->LocalIp, PromptStr2); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, PromptStr2, NULL); mSolStrId[SOL_IP_ADDR_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_PORT_IP, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); // // Subnet Mask option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Subnet Mask" ); ZeroMem (PromptStr2, PromptStrSize); IpAddrToStr ((EFI_IPv4_ADDRESS *)&SolConfig->SubnetMask, PromptStr2); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, PromptStr2, NULL); mSolStrId[SOL_MASK_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_PORT_MASK, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); // // Gateway option // ZeroMem (PromptStr, PromptStrSize); UnicodeSPrint ( PromptStr, PromptStrSize, L" Gateway" ); ZeroMem (PromptStr2, PromptStrSize); IpAddrToStr ((EFI_IPv4_ADDRESS *)&SolConfig->Gateway, PromptStr2); PromptStrID = HiiSetString (mHiiHandle, 0, PromptStr, NULL); PromptStrID2 = HiiSetString (mHiiHandle, 0, PromptStr2, NULL); mSolStrId[SOL_GATEWAY_STR_INDEX] = PromptStrID2; HiiCreateActionOpCodeEx ( StartOpCodeHandle, (EFI_QUESTION_ID) KEY_SOL_PORT_GATEWAY, PromptStrID, StrTokenID, PromptStrID2, EFI_IFR_FLAG_CALLBACK, 0 ); HiiUpdateForm ( mHiiHandle, NULL, SOL_FORM_ID, StartOpCodeHandle, NULL ); HiiFreeOpCodeHandle (StartOpCodeHandle); return EFI_SUCCESS; } EFI_STATUS SolConfigFormInit ( EFI_HII_HANDLE HiiHandle, SOL_CONFIGURATION *SolConfig ) { EFI_STATUS Status; mHiiHandle = HiiHandle; InitSolStaticIpLabel (SolConfig); Status = InitSolFormLabel (SolConfig); return Status; }