]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Replace BufToHexString by UnicodeValueToString
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 8 Apr 2009 00:56:51 +0000 (00:56 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 8 Apr 2009 00:56:51 +0000 (00:56 +0000)
Replace HexStringToBuf by StrHexToUint64

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8034 6f19259b-4bc3-4df7-8a09-765794883524

12 files changed:
MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c [deleted file]
MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h [deleted file]
MdeModulePkg/Universal/HiiDatabaseDxe/String.c
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c

index d55fdf436671511e688f2bbbb6b8ca81d237a800..4b8a70629d099122701b197c5d4e59abe6071482 100644 (file)
@@ -80,6 +80,10 @@ GetDevicePath (
   UINTN      Length;\r
   EFI_STRING PathHdr;\r
   EFI_STRING DevicePathString;\r
+  UINT8      *DevicePathBuffer;\r
+  CHAR16     TemStr[2];\r
+  UINTN      Index;\r
+  UINT8      DigitUint8;\r
 \r
   if (String == NULL || DevicePath == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -114,21 +118,52 @@ GetDevicePath (
   // as the device path resides in RAM memory.\r
   // Translate the data into binary.\r
   //\r
-  Length /= 2;\r
-  *DevicePath = (UINT8 *) AllocateZeroPool (Length);\r
-  if (*DevicePath == NULL) {\r
+  DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);\r
+  if (DevicePathBuffer == NULL) {\r
     FreePool (DevicePathString);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  HexStringToBufInReverseOrder (*DevicePath, &Length, DevicePathString);\r
+  ZeroMem (TemStr, sizeof (TemStr));\r
+  for (Index = 0; DevicePathString[Index] != L'\0'; Index ++) {\r
+    TemStr[0] = DevicePathString[Index];\r
+    DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+    if ((Index & 1) == 0) {\r
+      DevicePathBuffer [Index/2] = DigitUint8;\r
+    } else {\r
+      DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
+    }\r
+  }\r
 \r
   FreePool (DevicePathString);\r
+  \r
+  *DevicePath = DevicePathBuffer;\r
 \r
   return EFI_SUCCESS;\r
 \r
 }\r
 \r
+/**\r
+  Converts the unicode character of the string from uppercase to lowercase.\r
+  This is a internal function.\r
+\r
+  @param Str     String to be converted\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HiiToLower (\r
+  IN OUT CHAR16    *Str\r
+  )\r
+{\r
+  CHAR16      *Ptr;\r
+  \r
+  for (Ptr = Str; *Ptr != L'\0'; Ptr++) {\r
+    if (*Ptr >= L'A' && *Ptr <= L'Z') {\r
+      *Ptr = (CHAR16) (*Ptr - L'A' + L'a');\r
+    }\r
+  }\r
+}\r
 \r
 /**\r
   Generate a sub string then output it.\r
@@ -159,8 +194,11 @@ GenerateSubStr (
 {\r
   UINTN       Length;\r
   EFI_STRING  Str;\r
-  EFI_STATUS  Status;\r
   EFI_STRING  StringHeader;\r
+  CHAR16      *TemString;\r
+  CHAR16      *TemName;\r
+  UINT8       *TemBuffer;\r
+  UINTN       Index;\r
 \r
   ASSERT (String != NULL && SubStr != NULL);\r
 \r
@@ -171,34 +209,55 @@ GenerateSubStr (
   }\r
 \r
   Length = StrLen (String) + BufferLen * 2 + 1 + 1;\r
-  Str = AllocateZeroPool (Length * sizeof (CHAR16));\r
+  Str    = AllocateZeroPool (Length * sizeof (CHAR16));\r
   ASSERT (Str != NULL);\r
 \r
   StrCpy (Str, String);\r
   Length = (BufferLen * 2 + 1) * sizeof (CHAR16);\r
 \r
-  Status       = EFI_SUCCESS;\r
   StringHeader = Str + StrLen (String);\r
+  TemString    = (CHAR16 *) StringHeader;\r
 \r
   switch (Flag) {\r
   case 1:\r
-    Status = BufInReverseOrderToHexString (StringHeader, (UINT8 *) Buffer, BufferLen);\r
+    //\r
+    // Convert Buffer to Hex String in reverse order\r
+    //\r
+    TemBuffer = ((UINT8 *) Buffer);\r
+    for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) {\r
+      TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+    }\r
     break;\r
   case 2:\r
-    Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer);\r
+    //\r
+    // Check buffer is enough\r
+    //\r
+    TemName = (CHAR16 *) Buffer;\r
+    ASSERT (Length < ((StrLen (TemName) * 4 + 1) * sizeof (CHAR16)));\r
+    //\r
+    // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+    //\r
+    for (; *TemName != L'\0'; TemName++) {\r
+      TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+    }\r
     break;\r
   case 3:\r
-    Status = BufToHexString (StringHeader, &Length, (UINT8 *) Buffer, BufferLen);\r
     //\r
-    // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
+    // Convert Buffer to Hex String\r
     //\r
-    ToLower (StringHeader);\r
+    TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1;\r
+    for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) {\r
+      TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+    }\r
     break;\r
   default:\r
     break;\r
   }\r
 \r
-  ASSERT_EFI_ERROR (Status);\r
+  //\r
+  // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
+  //\r
+  HiiToLower (StringHeader);\r
   StrCat (Str, L"&");\r
 \r
   *SubStr = Str;\r
@@ -344,14 +403,17 @@ GetValueOfNumber (
   EFI_STRING               Str;\r
   UINT8                    *Buf;\r
   EFI_STATUS               Status;\r
+  UINT8                    DigitUint8;\r
+  UINTN                    Index;\r
+  CHAR16                   TemStr[2];\r
 \r
   ASSERT (StringPtr != NULL && Number != NULL && Len != NULL);\r
-  ASSERT (*StringPtr != 0);\r
+  ASSERT (*StringPtr != L'\0');\r
 \r
   Buf = NULL;\r
 \r
   TmpPtr = StringPtr;\r
-  while (*StringPtr != 0 && *StringPtr != L'&') {\r
+  while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
     StringPtr++;\r
   }\r
   *Len   = StringPtr - TmpPtr;\r
@@ -363,7 +425,7 @@ GetValueOfNumber (
     goto Exit;\r
   }\r
   CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));\r
-  *(Str + *Len) = 0;\r
+  *(Str + *Len) = L'\0';\r
 \r
   Length = (Length + 1) / 2;\r
   Buf = (UINT8 *) AllocateZeroPool (Length);\r
@@ -371,10 +433,17 @@ GetValueOfNumber (
     Status = EFI_OUT_OF_RESOURCES;\r
     goto Exit;\r
   }\r
-\r
-  Status = HexStringToBuf (Buf, &Length, Str, NULL);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Exit;\r
+  \r
+  Length = *Len;\r
+  ZeroMem (TemStr, sizeof (TemStr));\r
+  for (Index = 0; Index < Length; Index ++) {\r
+    TemStr[0] = Str[Length - Index - 1];\r
+    DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+    if ((Index & 1) == 0) {\r
+      Buf [Index/2] = DigitUint8;\r
+    } else {\r
+      Buf [Index/2] = (UINT8) ((Buf [Index/2] << 4) + DigitUint8);\r
+    }\r
   }\r
 \r
   *Number = Buf;\r
@@ -384,6 +453,7 @@ Exit:
   if (Str != NULL) {\r
     FreePool (Str);\r
   }\r
+\r
   return Status;\r
 }\r
 \r
@@ -959,6 +1029,9 @@ HiiBlockToConfig (
   UINT8                               *Value;\r
   EFI_STRING                          ValueStr;\r
   EFI_STRING                          ConfigElement;\r
+  UINTN                               Index;\r
+  UINT8                               *TemBuffer;\r
+  CHAR16                              *TemString;\r
 \r
   if (This == NULL || Progress == NULL || Config == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1107,10 +1180,13 @@ HiiBlockToConfig (
       Status = EFI_OUT_OF_RESOURCES;\r
       goto Exit;\r
     }\r
-\r
-    Status = BufToHexString (ValueStr, &Length, Value, Width);\r
-    ASSERT_EFI_ERROR (Status);\r
-    ToLower (ValueStr);\r
+    \r
+    TemString = ValueStr;\r
+    TemBuffer = Value + Width - 1;\r
+    for (Index = 0; Index < Width; Index ++, TemBuffer --) {\r
+      TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+    }\r
+    HiiToLower (ValueStr);\r
 \r
     FreePool (Value);\r
     Value = NULL;\r
index b1a3374991ecadc58a5361d5694f7c4fa1c4648b..1721d2f5e496a357de2a003481b4483b15a4e834 100644 (file)
@@ -809,7 +809,7 @@ InsertStringPackage (
   AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);\r
   for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {\r
     StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {\r
+    if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {\r
       FreePool (Language);\r
       return EFI_UNSUPPORTED;\r
     }\r
index 04dbdc81f086727a16574bacdfdb2b9f2b6ef6db..636db50f61d9330fb01023c31154db861171b1b8 100644 (file)
@@ -41,6 +41,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiLib.h>\r
 #include <Library/PcdLib.h>\r
 #include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/PrintLib.h>\r
 \r
 \r
 #define HII_DATABASE_NOTIFY_GUID \\r
@@ -1688,11 +1689,25 @@ HiiGetAltCfg (
   );\r
 \r
 \r
+/**\r
+  Compare whether two names of languages are identical.\r
+\r
+  @param  Language1              Name of language 1\r
+  @param  Language2              Name of language 2\r
+\r
+  @retval TRUE                   same\r
+  @retval FALSE                  not same\r
+\r
+**/\r
+BOOLEAN\r
+HiiCompareLanguage (\r
+  IN  CHAR8  *Language1,\r
+  IN  CHAR8  *Language2\r
+  )\r
+;\r
+\r
 //\r
 // Global variables\r
 //\r
 extern EFI_EVENT gHiiKeyboardLayoutChanged;\r
-\r
-#include "R8Lib.h"\r
-\r
 #endif\r
index ae584cca1bb3fe3cbbfd99b7551bbf2032f22bf4..cdb84d592f673825207e402c4ff90b3546f843bd 100644 (file)
@@ -36,9 +36,6 @@
   String.c\r
   Database.c\r
   Font.c\r
-  R8Lib.h\r
-  R8Lib.c\r
-\r
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
@@ -57,6 +54,7 @@
   UefiLib\r
   PcdLib\r
   UefiRuntimeServicesTableLib\r
+  PrintLib\r
 \r
 [Protocols]\r
   gEfiDevicePathProtocolGuid                                            ## SOMETIMES_CONSUMES\r
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.c
deleted file mode 100644 (file)
index 7c3e9b8..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/** @file\r
-Implement a utility function named R8_EfiLibCompareLanguage.\r
-\r
-  Copyright (c) 2007 - 2008, Intel Corporation\r
-\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#include "HiiDatabase.h"\r
-\r
-\r
-/**\r
-  Compare whether two names of languages are identical.\r
-\r
-  @param  Language1              Name of language 1\r
-  @param  Language2              Name of language 2\r
-\r
-  @retval TRUE                   same\r
-  @retval FALSE                  not same\r
-\r
-**/\r
-BOOLEAN\r
-R8_EfiLibCompareLanguage (\r
-  IN  CHAR8  *Language1,\r
-  IN  CHAR8  *Language2\r
-  )\r
-{\r
-  //\r
-  // Porting Guide:\r
-  // This library interface is simply obsolete.\r
-  // Include the source code to user code.\r
-  //\r
-  UINTN Index;\r
-\r
-  for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {\r
-    if (Language1[Index] != Language2[Index]) {\r
-      return FALSE;\r
-    }\r
-  }\r
-\r
-  if (((Language1[Index] == 0) && (Language2[Index] == 0))   || \r
-         ((Language1[Index] == 0) && (Language2[Index] != ';')) ||\r
-         ((Language1[Index] == ';') && (Language2[Index] != 0)) ||\r
-         ((Language1[Index] == ';') && (Language2[Index] != ';'))) {\r
-    return TRUE;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-\r
-\r
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h b/MdeModulePkg/Universal/HiiDatabaseDxe/R8Lib.h
deleted file mode 100644 (file)
index 22b2bc9..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/** @file\r
-Implement a utility function named R8_EfiLibCompareLanguage.\r
-\r
-  Copyright (c) 2007 - 2008, Intel Corporation\r
-\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#ifndef __R8_LIB_H__\r
-#define __R8_LIB_H__\r
-\r
-/**\r
-  Compare whether two names of languages are identical.\r
-\r
-  @param  Language1              Name of language 1\r
-  @param  Language2              Name of language 2\r
-\r
-  @retval TRUE                   same\r
-  @retval FALSE                  not same\r
-\r
-**/\r
-BOOLEAN\r
-R8_EfiLibCompareLanguage (\r
-  IN  CHAR8  *Language1,\r
-  IN  CHAR8  *Language2\r
-  )\r
-;\r
-\r
-#endif\r
-\r
-\r
index c6edd87cfd0f37a4845c76882374e6330c595c42..00ff6ce78614ed3815a5ba46ae92c597865aa4fc 100644 (file)
@@ -1014,7 +1014,7 @@ HiiNewString (
        Link = Link->ForwardLink\r
       ) {\r
     StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+    if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
       Matched = TRUE;\r
       break;\r
     }\r
@@ -1353,7 +1353,7 @@ HiiGetString (
          Link =  Link->ForwardLink\r
         ) {\r
         StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-        if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+        if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
           Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);\r
           if (Status != EFI_NOT_FOUND) {\r
             return Status;\r
@@ -1446,7 +1446,7 @@ HiiSetString (
          Link =  Link->ForwardLink\r
         ) {\r
       StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-      if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+      if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
         OldPackageLen = StringPackage->StringPkgHdr->Header.Length;\r
         Status = SetStringWorker (\r
                    Private,\r
@@ -1635,7 +1635,7 @@ HiiGetSecondaryLanguages (
          Link1 = Link1->ForwardLink\r
         ) {\r
     StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {\r
+    if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {\r
       Languages = StringPackage->StringPkgHdr->Language;\r
       //\r
       // Language is a series of ';' terminated strings, first one is primary\r
@@ -1663,3 +1663,41 @@ HiiGetSecondaryLanguages (
   return EFI_INVALID_LANGUAGE;\r
 }\r
 \r
+/**\r
+  Compare whether two names of languages are identical.\r
+\r
+  @param  Language1              Name of language 1\r
+  @param  Language2              Name of language 2\r
+\r
+  @retval TRUE                   same\r
+  @retval FALSE                  not same\r
+\r
+**/\r
+BOOLEAN\r
+HiiCompareLanguage (\r
+  IN  CHAR8  *Language1,\r
+  IN  CHAR8  *Language2\r
+  )\r
+{\r
+  //\r
+  // Porting Guide:\r
+  // This library interface is simply obsolete.\r
+  // Include the source code to user code.\r
+  //\r
+  UINTN Index;\r
+\r
+  for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {\r
+    if (Language1[Index] != Language2[Index]) {\r
+      return FALSE;\r
+    }\r
+  }\r
+\r
+  if (((Language1[Index] == 0) && (Language2[Index] == 0))   || \r
+         ((Language1[Index] == 0) && (Language2[Index] != ';')) ||\r
+         ((Language1[Index] == ';') && (Language2[Index] != 0)) ||\r
+         ((Language1[Index] == ';') && (Language2[Index] != ';'))) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
index 2bb0ba3df1046adbe975aaafb2e61155a75c9cab..34942f752a05030f0eec3768599f53ade77c8732 100644 (file)
@@ -64,21 +64,6 @@ IScsiIpToStr (
   UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);\r
 }\r
 \r
-/**\r
-  Pop up an invalid notify which displays the message in Warning.\r
-\r
-  @param[in]  Warning  The warning message.\r
-**/\r
-VOID\r
-PopUpInvalidNotify (\r
-  IN CHAR16 *Warning\r
-  )\r
-{\r
-  EFI_INPUT_KEY             Key;\r
-\r
-  IfrLibCreatePopUp (1, &Key, Warning);\r
-}\r
-\r
 /**\r
   Update the list of iSCSI devices the iSCSI driver is controlling.\r
   \r
@@ -512,6 +497,7 @@ IScsiFormCallback (
   EFI_IP_ADDRESS            SubnetMask;\r
   EFI_IP_ADDRESS            Gateway;\r
   EFI_STATUS                Status;\r
+  EFI_INPUT_KEY             Key;\r
 \r
   Private   = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
 \r
@@ -534,7 +520,7 @@ IScsiFormCallback (
 \r
     Status      = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
     }\r
 \r
     break;\r
@@ -543,7 +529,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
     if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-      PopUpInvalidNotify (L"Invalid IP address!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
@@ -555,7 +541,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);\r
     if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {\r
-      PopUpInvalidNotify (L"Invalid Subnet Mask!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
@@ -567,7 +553,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);\r
     if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {\r
-      PopUpInvalidNotify (L"Invalid Gateway!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
@@ -579,7 +565,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);\r
     Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
     if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-      PopUpInvalidNotify (L"Invalid IP address!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
       Status = EFI_INVALID_PARAMETER;\r
     } else {\r
       CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));\r
@@ -591,7 +577,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);\r
     Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
     } else {\r
       AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);\r
     }\r
@@ -609,7 +595,7 @@ IScsiFormCallback (
     IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);\r
     Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);\r
     if (EFI_ERROR (Status)) {\r
-      PopUpInvalidNotify (L"Invalid LUN string!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);\r
     } else {\r
       CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));\r
     }\r
@@ -661,11 +647,11 @@ IScsiFormCallback (
 \r
         if ((Gateway.Addr[0] != 0)) {\r
           if (SubnetMask.Addr[0] == 0) {\r
-            PopUpInvalidNotify (L"Gateway address is set but subnet mask is zero.");\r
+            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);\r
             Status = EFI_INVALID_PARAMETER;\r
             break;\r
           } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {\r
-            PopUpInvalidNotify (L"Local IP and Gateway are not in the same subnet.");\r
+            CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);\r
             Status = EFI_INVALID_PARAMETER;\r
             break;\r
           }\r
@@ -677,7 +663,7 @@ IScsiFormCallback (
       if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {\r
         CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));\r
         if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
-          PopUpInvalidNotify (L"Target IP is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
@@ -685,7 +671,7 @@ IScsiFormCallback (
 \r
       if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {\r
         if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {\r
-          PopUpInvalidNotify (L"CHAP Name or CHAP Secret is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
@@ -693,7 +679,7 @@ IScsiFormCallback (
         if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&\r
             ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))\r
             ) {\r
-          PopUpInvalidNotify (L"Reverse CHAP Name or Reverse CHAP Secret is invalid!");\r
+          CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);\r
           Status = EFI_INVALID_PARAMETER;\r
           break;\r
         }\r
index dd110dfb3055b9a6e71fee8e5041946a2242130d..5275638d1336a28bb85641e222a84bd3bfe450ea 100644 (file)
@@ -123,55 +123,64 @@ IScsiAsciiStrToLun (
   OUT UINT8  *Lun\r
   )\r
 {\r
-  UINT32  Index;\r
-  CHAR8   *LunUnitStr[4];\r
-  CHAR8   Digit;\r
-  UINTN   Temp;\r
-\r
+  UINTN   Index, IndexValue, IndexNum, SizeStr;\r
+  CHAR8   TemStr[2];\r
+  UINT8   TemValue;\r
+  UINT16  Value [4];\r
+  \r
   ZeroMem (Lun, 8);\r
-  ZeroMem (LunUnitStr, sizeof (LunUnitStr));\r
-\r
-  Index         = 0;\r
-  LunUnitStr[0] = Str;\r
-\r
-  if (!IsHexDigit ((UINT8 *) &Digit, *Str)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  while (*Str != '\0') {\r
-    //\r
-    // Legal representations of LUN:\r
-    //   4752-3A4F-6b7e-2F99,\r
-    //   6734-9-156f-127,\r
-    //   4186-9\r
-    //\r
-    if (*Str == '-') {\r
-      *Str = '\0';\r
-      Index++;\r
-\r
-      if (*(Str + 1) != '\0') {\r
-        if (!IsHexDigit ((UINT8 *) &Digit, *(Str + 1))) {\r
-          return EFI_INVALID_PARAMETER;\r
-        }\r
-\r
-        LunUnitStr[Index] = Str + 1;\r
+  ZeroMem (TemStr, 2);\r
+  ZeroMem ((UINT8 *) Value, sizeof (Value));\r
+  SizeStr    = AsciiStrLen (Str);  \r
+  IndexValue = 0;\r
+  IndexNum   = 0;\r
+\r
+  for (Index = 0; Index < SizeStr; Index ++) {\r
+    TemStr[0] = Str[Index];\r
+    TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);\r
+    if (TemValue == 0 && TemStr[0] != '0') {\r
+      if ((TemStr[0] != '-') || (IndexNum == 0)) {\r
+        //\r
+        // Invalid Lun Char\r
+        //\r
+        return EFI_INVALID_PARAMETER;\r
       }\r
-    } else if (!IsHexDigit ((UINT8 *) &Digit, *Str)) {\r
-      return EFI_INVALID_PARAMETER;\r
     }\r
-\r
-    Str++;\r
-  }\r
-\r
-  for (Index = 0; (Index < 4) && (LunUnitStr[Index] != NULL); Index++) {\r
-    if (AsciiStrLen (LunUnitStr[Index]) > 4) {\r
+    \r
+    if ((TemValue == 0) && (TemStr[0] == '-')) {\r
+      //\r
+      // Next Lun value\r
+      //\r
+      if (++IndexValue >= 4) {\r
+        //\r
+        // Max 4 Lun value\r
+        //\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      //\r
+      // Restart str index for the next lun value\r
+      //\r
+      IndexNum = 0;\r
+      continue;\r
+    }\r
+    \r
+    if (++IndexNum > 4) {\r
+      //     \r
+      // Each Lun Str can't exceed size 4, because it will be as UINT16 value\r
+      //\r
       return EFI_INVALID_PARAMETER;\r
     }\r
-\r
-    Temp = AsciiStrHexToUintn (LunUnitStr[Index]);\r
-    *((UINT16 *) &Lun[Index * 2]) = HTONS (Temp);\r
+    \r
+    //\r
+    // Combine UINT16 value\r
+    //\r
+    Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);\r
   }\r
-\r
\r
+  for (Index = 0; Index <= IndexValue; Index ++) {\r
+    *((UINT16 *) &Lun[Index * 2]) =  HTONS (Value[Index]);\r
+  }\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -434,52 +443,38 @@ IScsiHexToBin (
   )\r
 {\r
   UINTN   Index;\r
-  UINT32  HexCount;\r
-  CHAR8   *HexBuf;\r
+  UINTN   Length;\r
   UINT8   Digit;\r
-  UINT8   Byte;\r
-\r
-  Digit = 0;\r
+  CHAR8   TemStr[2];\r
+  \r
+  ZeroMem (TemStr, sizeof (TemStr));\r
 \r
   //\r
   // Find out how many hex characters the string has.\r
   //\r
-  HexBuf = HexStr;\r
-  if ((HexBuf[0] == '0') && ((HexBuf[1] == 'x') || (HexBuf[1] == 'X'))) {\r
-    HexBuf += 2;\r
-  }\r
-\r
-  for (Index = 0, HexCount = 0; IsHexDigit (&Digit, HexBuf[Index]); Index++, HexCount++)\r
-    ;\r
-\r
-  if (HexCount == 0) {\r
-    *BinLength = 0;\r
-    return EFI_SUCCESS;\r
-  }\r
-  //\r
-  // Test if buffer is passed enough.\r
-  //\r
-  if (((HexCount + 1) / 2) > *BinLength) {\r
-    *BinLength = (HexCount + 1) / 2;\r
-    return EFI_BUFFER_TOO_SMALL;\r
+  if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {\r
+    HexStr += 2;\r
   }\r
+  \r
+  Length = AsciiStrLen (HexStr);\r
 \r
-  *BinLength = (HexCount + 1) / 2;\r
-\r
-  for (Index = 0; Index < HexCount; Index++) {\r
-\r
-    IsHexDigit (&Digit, HexBuf[HexCount - 1 - Index]);\r
-\r
+  for (Index = 0; Index < Length; Index ++) {\r
+    TemStr[0] = HexStr[Index];\r
+    Digit = (UINT8) AsciiStrHexToUint64 (TemStr);\r
+    if (Digit == 0 && TemStr[0] != '0') {\r
+      //\r
+      // Invalid Lun Char\r
+      //\r
+      break;\r
+    }\r
     if ((Index & 1) == 0) {\r
-      Byte = Digit;\r
+      BinBuffer [Index/2] = Digit;\r
     } else {\r
-      Byte = BinBuffer[*BinLength - 1 - Index / 2];\r
-      Byte &= 0x0F;\r
-      Byte = (UINT8) (Byte | (Digit << 4));\r
+      BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);\r
     }\r
-\r
-    BinBuffer[*BinLength - 1 - Index / 2] = Byte;\r
   }\r
+  \r
+  *BinLength = (UINT32) ((Index + 1)/2);\r
 \r
   return EFI_SUCCESS;\r
 }\r
index 48f5815e4360de4660e5784389e7a1478c2e9e09..3006d0597d3e5b0ac9aceb465cebc8dceb2484ac 100644 (file)
@@ -605,7 +605,13 @@ EnterCarriageReturn:
     default:\r
       if (ManualInput) {\r
         if (HexInput) {\r
-          if (!IsHexDigit (&Digital, Key.UnicodeChar)) {\r
+          if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'0');\r
+          } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);\r
+          } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {\r
+            Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);\r
+          } else {\r
             UpdateStatusBar (INPUT_ERROR, Question->QuestionFlags, TRUE);\r
             break;\r
           }\r
index 7e948b305892ba1b4a4a5f22356646378d388550..e617f2f367b12c39cc3ca2132b7b2a2ad7bb2de3 100644 (file)
@@ -1018,8 +1018,12 @@ GetQuestionValue (
   CHAR16              *Value;\r
   CHAR16              *StringPtr;\r
   UINTN               Length;\r
+  UINTN               Index;\r
+  UINTN               LengthStr;\r
   BOOLEAN             IsBufferStorage;\r
   BOOLEAN             IsString;\r
+  CHAR16              TemStr[5];\r
+  UINT8               DigitUint8;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -1141,15 +1145,44 @@ GetQuestionValue (
       if (EFI_ERROR (Status)) {\r
         return Status;\r
       }\r
-\r
+      \r
+      LengthStr = StrLen (Value);\r
+      Status    = EFI_SUCCESS;\r
       if (IsString) {\r
         //\r
         // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+        // Add string tail char L'\0' into Length\r
         //\r
-        Length = StorageWidth + sizeof (CHAR16);\r
-        Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);\r
+        Length    = StorageWidth + sizeof (CHAR16);\r
+        if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+          Status = EFI_BUFFER_TOO_SMALL;\r
+        } else {\r
+          StringPtr = (CHAR16 *) Dst;\r
+          ZeroMem (TemStr, sizeof (TemStr));\r
+          for (Index = 0; Index < LengthStr; Index += 4) {\r
+            StrnCpy (TemStr, Value + Index, 4);\r
+            StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+          }\r
+          //\r
+          // Add tailing L'\0' character\r
+          //\r
+          StringPtr[Index/4] = L'\0';\r
+        }\r
       } else {\r
-        Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);\r
+        if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+          Status = EFI_BUFFER_TOO_SMALL;\r
+        } else {\r
+          ZeroMem (TemStr, sizeof (TemStr));\r
+          for (Index = 0; Index < LengthStr; Index ++) {\r
+            TemStr[0] = Value[LengthStr - Index - 1];\r
+            DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+            if ((Index & 1) == 0) {\r
+              Dst [Index/2] = DigitUint8;\r
+            } else {\r
+              Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);\r
+            }\r
+          }\r
+        }\r
       }\r
 \r
       FreePool (Value);\r
@@ -1222,20 +1255,50 @@ GetQuestionValue (
     }\r
     *StringPtr = L'\0';\r
 \r
+    LengthStr = StrLen (Value);\r
+    Status    = EFI_SUCCESS;\r
     if (!IsBufferStorage && IsString) {\r
       //\r
       // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+      // Add string tail char L'\0' into Length\r
       //\r
-      Length = StorageWidth + sizeof (CHAR16);\r
-      Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);\r
+      Length    = StorageWidth + sizeof (CHAR16);\r
+      if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      } else {\r
+        StringPtr = (CHAR16 *) Dst;\r
+        ZeroMem (TemStr, sizeof (TemStr));\r
+        for (Index = 0; Index < LengthStr; Index += 4) {\r
+          StrnCpy (TemStr, Value + Index, 4);\r
+          StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+        }\r
+        //\r
+        // Add tailing L'\0' character\r
+        //\r
+        StringPtr[Index/4] = L'\0';\r
+      }\r
     } else {\r
-      Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);\r
-      if (EFI_ERROR (Status)) {\r
-        FreePool (Result);\r
-        return Status;\r
+      if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      } else {\r
+        ZeroMem (TemStr, sizeof (TemStr));\r
+        for (Index = 0; Index < LengthStr; Index ++) {\r
+          TemStr[0] = Value[LengthStr - Index - 1];\r
+          DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+          if ((Index & 1) == 0) {\r
+            Dst [Index/2] = DigitUint8;\r
+          } else {\r
+            Dst [Index/2] = (UINT8) ((Dst [Index/2] << 4) + DigitUint8);\r
+          }\r
+        }\r
       }\r
     }\r
 \r
+    if (EFI_ERROR (Status)) {\r
+      FreePool (Result);\r
+      return Status;\r
+    }\r
+\r
     //\r
     // Synchronize Edit Buffer\r
     //\r
@@ -1244,6 +1307,7 @@ GetQuestionValue (
     } else {\r
       SetValueByName (Storage, Question->VariableName, Value);\r
     }\r
+\r
     FreePool (Result);\r
   }\r
 \r
@@ -1286,6 +1350,10 @@ SetQuestionValue (
   UINTN               Length;\r
   BOOLEAN             IsBufferStorage;\r
   BOOLEAN             IsString;\r
+  UINT8               *TemBuffer;\r
+  CHAR16              *TemName;\r
+  CHAR16              *TemString;\r
+  UINTN               Index;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -1397,20 +1465,32 @@ SetQuestionValue (
   } else {\r
     if (IsString) {\r
       //\r
-      // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+      // Allocate enough string buffer.\r
       //\r
       Value = NULL;\r
       BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);\r
       Value = AllocateZeroPool (BufferLen);\r
       ASSERT (Value != NULL);\r
-      Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);\r
-      ASSERT_EFI_ERROR (Status);\r
+      //\r
+      // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+      //\r
+      TemName = (CHAR16 *) Src;\r
+      TemString = Value;\r
+      for (; *TemName != L'\0'; TemName++) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+      }\r
     } else {\r
       BufferLen = StorageWidth * 2 + 1;\r
       Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));\r
       ASSERT (Value != NULL);\r
-      BufToHexString (Value, &BufferLen, Src, StorageWidth);\r
-      ToLower (Value);\r
+      //\r
+      // Convert Buffer to Hex String\r
+      //\r
+      TemBuffer = Src + StorageWidth - 1;\r
+      TemString = Value;\r
+      for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+      }\r
     }\r
 \r
     Status = SetValueByName (Storage, Question->VariableName, Value);\r
@@ -1446,17 +1526,34 @@ SetQuestionValue (
     }\r
 \r
     Value = ConfigResp + StrLen (ConfigResp);\r
+\r
     if (!IsBufferStorage && IsString) {\r
       //\r
       // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
       //\r
-      BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);\r
-      Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);\r
-      ASSERT_EFI_ERROR (Status);\r
+      TemName = (CHAR16 *) Src;\r
+      TemString = Value;\r
+      for (; *TemName != L'\0'; TemName++) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+      }\r
     } else {\r
-      BufferLen = StorageWidth * 2 + 1;\r
-      BufToHexString (Value, &BufferLen, Src, StorageWidth);\r
-      ToLower (Value);\r
+      //\r
+      // Convert Buffer to Hex String\r
+      //\r
+      TemBuffer = Src + StorageWidth - 1;\r
+      TemString = Value;\r
+      for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+      }\r
+    }\r
+    \r
+    //\r
+    // Convert to lower char.\r
+    //\r
+    for (TemString = Value; *Value != L'\0'; Value++) {\r
+      if (*Value >= L'A' && *Value <= L'Z') {\r
+        *Value = (CHAR16) (*Value - L'A' + L'a');\r
+      }\r
     }\r
 \r
     //\r
index ae8d9a62d790505ae0f7f1f1d782354873dba7dd..42074ca32b2c69b055055680ccd8908a85a04fa5 100644 (file)
@@ -1506,6 +1506,9 @@ UiDisplayMenu (
   UINT16                          DefaultId;\r
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
   FORM_BROWSER_STATEMENT          *Statement;\r
+  CHAR16                          TemStr[2];\r
+  UINT8                           *DevicePathBuffer;\r
+  UINT8                           DigitUint8;\r
 \r
   CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
 \r
@@ -2358,8 +2361,27 @@ UiDisplayMenu (
           }\r
           BufferSize = StrLen (StringPtr) / 2;\r
           DevicePath = AllocatePool (BufferSize);\r
+          \r
+          //\r
+          // Convert from Device Path String to DevicePath Buffer in the reverse order.\r
+          //\r
+          DevicePathBuffer = (UINT8 *) DevicePath;\r
+          for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {\r
+            TemStr[0] = StringPtr[Index];\r
+            DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+            if (DigitUint8 == 0 && TemStr[0] != L'0') {\r
+              //\r
+              // Invalid Hex Char as the tail.\r
+              //\r
+              break;\r
+            }\r
+            if ((Index & 1) == 0) {\r
+              DevicePathBuffer [Index/2] = DigitUint8;\r
+            } else {\r
+              DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
+            }\r
+          }\r
 \r
-          HexStringToBufInReverseOrder ((UINT8 *) DevicePath, &BufferSize, StringPtr);\r
           Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath);\r
           if (Selection->Handle == NULL) {\r
             //\r