\r
#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
\r
-STATIC\r
-CHAR16\r
-NibbleToHexCharPrivate (\r
- IN UINT8 Nibble\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Converts the low nibble of a byte to hex unicode character.\r
-\r
- Arguments:\r
- Nibble - lower nibble of a byte.\r
-\r
- Returns:\r
- Hex unicode character between L'0' to L'f'.\r
-\r
---*/\r
-{\r
- Nibble &= 0x0F;\r
-\r
- if (Nibble <= 0x9) {\r
- return (CHAR16)(Nibble + L'0');\r
- }\r
-\r
- return (CHAR16)(Nibble - 0xA + L'a');\r
-}\r
-\r
-\r
-/**\r
- Converts Unicode string to binary buffer.\r
- The conversion may be partial.\r
- The first character in the string that is not hex digit stops the conversion.\r
- At a minimum, any blob of data could be represented as a hex string.\r
-\r
- @param Buf Pointer to buffer that receives the data.\r
- @param Len Length in bytes of the buffer to hold converted\r
- data. If routine return with EFI_SUCCESS,\r
- containing length of converted data. If routine\r
- return with EFI_BUFFER_TOO_SMALL, containg length\r
- of buffer desired.\r
- @param Str String to be converted from.\r
- @param ConvertedStrLen Length of the Hex String consumed.\r
-\r
- @retval EFI_SUCCESS Routine Success.\r
- @retval EFI_BUFFER_TOO_SMALL The buffer is too small to hold converted data.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-HexStringToBufPrivate (\r
- IN OUT UINT8 *Buf,\r
- IN OUT UINTN *Len,\r
- IN CHAR16 *Str,\r
- OUT UINTN *ConvertedStrLen OPTIONAL\r
- )\r
-{\r
- UINTN HexCnt;\r
- UINTN Idx;\r
- UINTN BufferLength;\r
- UINT8 Digit;\r
- UINT8 Byte;\r
-\r
- //\r
- // Find out how many hex characters the string has.\r
- //\r
- for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);\r
-\r
- if (HexCnt == 0) {\r
- *Len = 0;\r
- return EFI_SUCCESS;\r
- }\r
- //\r
- // Two Unicode characters make up 1 buffer byte. Round up.\r
- //\r
- BufferLength = (HexCnt + 1) / 2;\r
-\r
- //\r
- // Test if buffer is passed enough.\r
- //\r
- if (BufferLength > (*Len)) {\r
- *Len = BufferLength;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *Len = BufferLength;\r
-\r
- for (Idx = 0; Idx < HexCnt; Idx++) {\r
-\r
- IsHexDigit (&Digit, Str[Idx]);\r
-\r
- //\r
- // For odd charaters, write the lower nibble for each buffer byte,\r
- // and for even characters, the upper nibble.\r
- //\r
- if ((Idx & 1) == 0) {\r
- Byte = (UINT8) (Digit << 4);\r
- } else {\r
- Byte = Buf[Idx / 2];\r
- Byte &= 0xF0;\r
- Byte = (UINT8) (Byte | Digit);\r
- }\r
-\r
- Buf[Idx / 2] = Byte;\r
- }\r
-\r
- if (ConvertedStrLen != NULL) {\r
- *ConvertedStrLen = HexCnt;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Converts binary buffer to Unicode string.\r
- At a minimum, any blob of data could be represented as a hex string.\r
-\r
- @param Str Pointer to the string.\r
- @param HexStringBufferLength Length in bytes of buffer to hold the hex string.\r
- Includes tailing '\0' character. If routine return\r
- with EFI_SUCCESS, containing length of hex string\r
- buffer. If routine return with\r
- EFI_BUFFER_TOO_SMALL, containg length of hex\r
- string buffer desired.\r
- @param Buf Buffer to be converted from.\r
- @param Len Length in bytes of the buffer to be converted.\r
- @param Flag If TRUE, encode the data in the same order as the\r
- it resides in the Buf. Else encode it in the\r
- reverse direction.\r
-\r
- @retval EFI_SUCCESS Routine success.\r
- @retval EFI_BUFFER_TOO_SMALL The hex string buffer is too small.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-BufToHexStringPrivate (\r
- IN OUT CHAR16 *Str,\r
- IN OUT UINTN *HexStringBufferLength,\r
- IN UINT8 *Buf,\r
- IN UINTN Len,\r
- IN BOOLEAN Flag\r
- )\r
-{\r
- UINTN Idx;\r
- UINT8 Byte;\r
- UINTN StrLen;\r
-\r
- //\r
- // Make sure string is either passed or allocate enough.\r
- // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
- // Plus the Unicode termination character.\r
- //\r
- StrLen = Len * 2;\r
- if ((*HexStringBufferLength) < (StrLen + 1) * sizeof (CHAR16)) {\r
- *HexStringBufferLength = (StrLen + 1) * sizeof (CHAR16);\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *HexStringBufferLength = (StrLen + 1) * sizeof (CHAR16);\r
-\r
- //\r
- // Ends the string.\r
- //\r
- Str[StrLen] = 0;\r
-\r
- for (Idx = 0; Idx < Len; Idx++) {\r
-\r
- Byte = Buf[Idx];\r
- if (Flag) {\r
- Str[Idx * 2] = NibbleToHexCharPrivate ((UINT8)(Byte >> 4));\r
- Str[Idx * 2 + 1] = NibbleToHexCharPrivate (Byte);\r
- } else {\r
- Str[StrLen - 1 - Idx * 2] = NibbleToHexCharPrivate (Byte);\r
- Str[StrLen - 2 - Idx * 2] = NibbleToHexCharPrivate ((UINT8)(Byte >> 4));\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-\r
/**\r
Calculate the number of Unicode characters of the incoming Configuration string,\r
not including NULL terminator.\r
// The data in <PathHdr> is encoded as hex UNICODE %02x bytes in the same order\r
// as the device path resides in RAM memory.\r
// Translate the data into binary.\r
- // Two Unicode characters make up 1 buffer byte.\r
//\r
Length /= 2;\r
*DevicePath = (UINT8 *) AllocateZeroPool (Length);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- HexStringToBufPrivate (*DevicePath, &Length, DevicePathString, NULL);\r
+ HexStringToBuffer (*DevicePath, &Length, DevicePathString);\r
\r
SafeFreePool (DevicePathString);\r
\r
@param String A constant string which is the prefix of the to be\r
generated string, e.g. GUID=\r
@param BufferLen The length of the Buffer in bytes.\r
- @param Buffer Points to a buffer which will be converted to hex\r
- string and to be the content of the generated\r
- string.\r
- @param Flag If TRUE, convert the buffer data in the same order\r
- as the it resides in the Buffer. Else convert it\r
- in the reverse direction.\r
+ @param Buffer Points to a buffer which will be converted to be the \r
+ content of the generated string.\r
+ @param Flag If 1, the buffer contains data for the value of GUID or PATH stored in \r
+ UINT8 *; if 2, the buffer contains unicode string for the value of NAME;\r
+ if 3, the buffer contains other data.\r
@param SubStr Points to the output string. It's caller's\r
responsibility to free this buffer.\r
\r
GenerateSubStr (\r
IN CONST EFI_STRING String,\r
IN UINTN BufferLen,\r
- IN UINT8 *Buffer,\r
- IN BOOLEAN Flag,\r
+ IN VOID *Buffer,\r
+ IN UINT8 Flag,\r
OUT EFI_STRING *SubStr\r
)\r
{\r
UINTN Length;\r
EFI_STRING Str;\r
EFI_STATUS Status;\r
+ EFI_STRING StringHeader;\r
\r
ASSERT (String != NULL && SubStr != NULL);\r
\r
return ;\r
}\r
\r
- Length = BufferLen * 2 + 1 + StrLen (String) + 1;\r
+ Length = StrLen (String) + BufferLen * 2 + 1 + 1;\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 = BufToHexStringPrivate (\r
- Str + StrLen (String),\r
- &Length,\r
- Buffer,\r
- BufferLen,\r
- Flag\r
- );\r
+ Status = EFI_SUCCESS;\r
+ StringHeader = Str + StrLen (String);\r
+\r
+ switch (Flag) {\r
+ case 1:\r
+ Status = BufferToHexString (StringHeader, (UINT8 *) Buffer, BufferLen);\r
+ break;\r
+ case 2:\r
+ Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer);\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
+ //\r
+ ToLower (StringHeader);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
\r
ASSERT_EFI_ERROR (Status);\r
StrCat (Str, L"&");\r
if (PathHdr == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- Status = BufToHexStringPrivate (PathHdr, &PathHdrSize, (UINT8 *) DevicePath, Length, TRUE);\r
+ Status = BufferToHexString (PathHdr, (UINT8 *) DevicePath, Length);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
// It means extract all possible configurations from this specific driver.\r
//\r
TmpSize = StrLen (L"GUID=&NAME=&PATH=");\r
- RequestSize = (TmpSize + sizeof (EFI_GUID) * 2 + StrLen (Storage->Name))\r
+ RequestSize = (TmpSize + 32 + StrLen (Storage->Name) * 4)\r
* sizeof (CHAR16) + PathHdrSize;\r
ConfigRequest = (EFI_STRING) AllocateZeroPool (RequestSize);\r
if (ConfigRequest == NULL) {\r
//\r
// Add <GuidHdr>\r
// <GuidHdr> ::= 'GUID='<Guid>\r
+ // Convert <Guid> in the same order as it resides in RAM memory.\r
//\r
StringPtr = ConfigRequest;\r
StrnCpy (StringPtr, L"GUID=", StrLen (L"GUID="));\r
StringPtr += StrLen (L"GUID=");\r
\r
- Status = BufToHexStringPrivate (\r
- StringPtr,\r
- &RequestSize,\r
- (UINT8 *) (&Storage->Guid),\r
- sizeof (EFI_GUID),\r
- FALSE\r
- );\r
+ Status = BufferToHexString (StringPtr, (UINT8 *) (&Storage->Guid), sizeof (EFI_GUID));\r
ASSERT_EFI_ERROR (Status);\r
- StringPtr += RequestSize / 2 - 1;\r
+ \r
+ StringPtr += 32;\r
ASSERT (*StringPtr == 0);\r
*StringPtr = L'&';\r
StringPtr++;\r
//\r
StrnCpy (StringPtr, L"NAME=", StrLen (L"NAME="));\r
StringPtr += StrLen (L"NAME=");\r
- StrnCpy (StringPtr, Storage->Name, StrLen (Storage->Name));\r
- StringPtr += StrLen (Storage->Name);\r
+\r
+ Length = (StrLen (Storage->Name) * 4 + 1) * sizeof (CHAR16);\r
+ Status = UnicodeToConfigString (StringPtr, &Length, Storage->Name);\r
+ ASSERT_EFI_ERROR (Status);\r
+ StringPtr += StrLen (Storage->Name) * 4;\r
+ \r
*StringPtr = L'&';\r
StringPtr++;\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-HiiConfigRoutingRoutConfig (\r
+HiiConfigRoutingRouteConfig (\r
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,\r
IN CONST EFI_STRING Configuration,\r
OUT EFI_STRING *Progress\r
\r
Status = BufToHexString (ValueStr, &Length, Value, Width);\r
ASSERT_EFI_ERROR (Status);\r
+ ToLower (ValueStr);\r
+\r
SafeFreePool (Value);\r
Value = NULL;\r
\r
//\r
// Generate the sub string for later matching.\r
//\r
- GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (UINT8 *) Guid, FALSE, &GuidStr);\r
+ GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) Guid, 1, &GuidStr);\r
GenerateSubStr (\r
L"PATH=",\r
GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath),\r
- (UINT8 *) DevicePath,\r
- TRUE,\r
+ (VOID *) DevicePath,\r
+ 1,\r
&PathStr\r
);\r
if (AltCfgId != NULL) {\r
- GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (UINT8 *) AltCfgId, FALSE, &AltIdStr);\r
+ GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (VOID *) AltCfgId, 3, &AltIdStr); \r
}\r
if (Name != NULL) {\r
- Length = StrLen (Name);\r
- Length += StrLen (L"NAME=&") + 1;\r
- NameStr = AllocateZeroPool (Length * sizeof (CHAR16));\r
- if (NameStr == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- StrCpy (NameStr, L"NAME=");\r
- StrCat (NameStr, Name);\r
- StrCat (NameStr, L"&");\r
+ GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr); \r
} else {\r
- GenerateSubStr (L"NAME=", 0, NULL, FALSE, &NameStr);\r
+ GenerateSubStr (L"NAME=", 0, NULL, 2, &NameStr);\r
}\r
\r
while (*StringPtr != 0) {\r