/** @file\r
\r
-Copyright (c) 2007, Intel Corporation\r
+Copyright (c) 2007 - 2008, Intel Corporation\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
\r
#include "HiiDatabase.h"\r
\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; R8_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
- R8_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
\r
+ This is a internal function.\r
+\r
@param String String in <MultiConfigRequest> or\r
<MultiConfigResp> format.\r
\r
@return The number of Unicode characters.\r
\r
**/\r
-STATIC\r
UINTN\r
CalculateConfigStringLen (\r
IN EFI_STRING String\r
Convert the hex UNICODE %02x encoding of a UEFI device path to binary\r
from <PathHdr> of <ConfigHdr>.\r
\r
+ This is a internal function.\r
+\r
@param String UEFI configuration string\r
@param DevicePath binary of a UEFI device path.\r
\r
binary format.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
GetDevicePath (\r
IN EFI_STRING String,\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
+ HexStringToBufInReverseOrder (*DevicePath, &Length, DevicePathString);\r
\r
SafeFreePool (DevicePathString);\r
\r
/**\r
Extract Storage from all Form Packages in current hii database.\r
\r
+ This is a internal function.\r
+\r
@param HiiDatabase EFI_HII_DATABASE_PROTOCOL instance.\r
@param StorageListHead Storage link List head.\r
\r
@retval EFI_SUCCESS All existing storage is exported.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
ExportAllStorage (\r
IN EFI_HII_DATABASE_PROTOCOL *HiiDatabase,\r
/**\r
Generate a sub string then output it.\r
\r
+ This is a internal function.\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
\r
**/\r
-STATIC\r
VOID\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 = BufInReverseOrderToHexString (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
/**\r
Retrieve the <ConfigBody> from String then output it.\r
\r
+ This is a internal function.\r
+\r
@param String A sub string of a configuration string in\r
<MultiConfigAltResp> format.\r
@param ConfigBody Points to the output string. It's caller's\r
@retval EFI_SUCCESS All existing storage is exported.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
OutputConfigBody (\r
IN EFI_STRING String,\r
}\r
\r
\r
-#endif\r
+/**\r
+ Adjusts the size of a previously allocated buffer.\r
+\r
+\r
+ @param OldPool A pointer to the buffer whose size is being adjusted.\r
+ @param OldSize The size of the current buffer.\r
+ @param NewSize The size of the new buffer.\r
+\r
+ @return The new buffer allocated.\r
\r
+**/\r
VOID *\r
ReallocatePool (\r
IN VOID *OldPool,\r
IN UINTN OldSize,\r
IN UINTN NewSize\r
)\r
-/*++\r
-\r
-Routine Description:\r
- Adjusts the size of a previously allocated buffer.\r
-\r
-Arguments:\r
- OldPool - A pointer to the buffer whose size is being adjusted.\r
- OldSize - The size of the current buffer.\r
- NewSize - The size of the new buffer.\r
-\r
-Returns:\r
- Points to the new buffer\r
-\r
---*/\r
{\r
VOID *NewPool;\r
\r
NewPool = NULL;\r
- if (NewSize) {\r
+ if (NewSize != 0) {\r
NewPool = AllocateZeroPool (NewSize);\r
}\r
\r
- if (OldPool) {\r
- if (NewPool) {\r
+ if (OldPool != NULL) {\r
+ if (NewPool != NULL) {\r
CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);\r
}\r
\r
/**\r
Append a string to a multi-string format.\r
\r
+ This is a internal function.\r
+\r
@param MultiString String in <MultiConfigRequest>,\r
<MultiConfigAltResp>, or <MultiConfigResp>. On\r
input, the buffer length of this string is\r
@retval EFI_SUCCESS AppendString is append to the end of MultiString\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
AppendToMultiString (\r
IN OUT EFI_STRING *MultiString,\r
or WIDTH or VALUE.\r
<BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE'=<Number>\r
\r
+ This is a internal function.\r
+\r
@param StringPtr String in <BlockConfig> format and points to the\r
first character of <Number>.\r
@param Number The output value. Caller takes the responsibility\r
successfully.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
GetValueOfNumber (\r
IN EFI_STRING StringPtr,\r
goto Exit;\r
}\r
\r
- Status = R8_HexStringToBuf (Buf, &Length, Str, NULL);\r
+ Status = HexStringToBuf (Buf, &Length, Str, NULL);\r
if (EFI_ERROR (Status)) {\r
goto Exit;\r
}\r
OUT EFI_STRING *Results\r
)\r
{\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
-\r
HII_DATABASE_PRIVATE_DATA *Private;\r
EFI_STRING StringPtr;\r
EFI_STRING ConfigRequest;\r
EFI_STATUS Status;\r
LIST_ENTRY *Link;\r
HII_DATABASE_RECORD *Database;\r
+ UINT8 *DevicePathPkg;\r
UINT8 *CurrentDevicePath;\r
EFI_HANDLE DriverHandle;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
UINTN RemainSize;\r
EFI_STRING TmpPtr;\r
\r
+ //\r
+ // For size reduction, please define PcdSupportFullConfigRoutingProtocol \r
+ // as FALSE. But this renders the system to not 100% compliant with\r
+ // UEFI 2.1. Use this with caution.\r
+ //\r
+ if (!FeaturePcdGet (PcdSupportFullConfigRoutingProtocol)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
if (This == NULL || Progress == NULL || Results == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
Link = Link->ForwardLink\r
) {\r
Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
- CurrentDevicePath = Database->PackageList->DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
- if (CurrentDevicePath != NULL) {\r
+ \r
+ if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
+ CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
if (CompareMem (\r
DevicePath,\r
CurrentDevicePath,\r
}\r
\r
return EFI_SUCCESS;\r
-#else\r
- return EFI_UNSUPPORTED;\r
-#endif\r
\r
}\r
\r
OUT EFI_STRING *Results\r
)\r
{\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
-\r
EFI_STATUS Status;\r
HII_DATABASE_PRIVATE_DATA *Private;\r
LIST_ENTRY StorageListHdr;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
EFI_STRING AccessProgress;\r
EFI_STRING AccessResults;\r
- UINTN TmpSize;\r
+\r
+ //\r
+ // For size reduction, please define PcdSupportFullConfigRoutingProtocol \r
+ // as FALSE. But this renders the system to not 100% compliant with\r
+ // UEFI 2.1. Use this with caution.\r
+ //\r
+ if (!FeaturePcdGet (PcdSupportFullConfigRoutingProtocol)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
\r
if (This == NULL || Results == NULL) {\r
return EFI_INVALID_PARAMETER;\r
if (PathHdr == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- Status = BufToHexStringPrivate (PathHdr, &PathHdrSize, (UINT8 *) DevicePath, Length, TRUE);\r
+ Status = BufInReverseOrderToHexString (PathHdr, (UINT8 *) DevicePath, Length);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Generate a <ConfigRequest> with one <ConfigHdr> and zero <RequestElement>.\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
- * sizeof (CHAR16) + PathHdrSize;\r
+ RequestSize = (StrLen (L"GUID=&NAME=&PATH=") + 32) * sizeof (CHAR16) + PathHdrSize;\r
+ if (Storage->Name != NULL) {\r
+ RequestSize += StrLen (Storage->Name) * 4 * sizeof (CHAR16);\r
+ }\r
+ \r
ConfigRequest = (EFI_STRING) AllocateZeroPool (RequestSize);\r
if (ConfigRequest == NULL) {\r
SafeFreePool (PathHdr);\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 = BufInReverseOrderToHexString (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
+ if (Storage->Name != NULL) {\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
+ \r
*StringPtr = L'&';\r
StringPtr++;\r
\r
}\r
\r
return EFI_SUCCESS;\r
-#else\r
- return EFI_UNSUPPORTED;\r
-#endif\r
}\r
\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
{\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
-\r
HII_DATABASE_PRIVATE_DATA *Private;\r
EFI_STRING StringPtr;\r
EFI_STRING ConfigResp;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
LIST_ENTRY *Link;\r
HII_DATABASE_RECORD *Database;\r
+ UINT8 *DevicePathPkg;\r
UINT8 *CurrentDevicePath;\r
EFI_HANDLE DriverHandle;\r
EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
UINTN RemainSize;\r
EFI_STRING TmpPtr;\r
\r
+ //\r
+ // For size reduction, please define PcdSupportFullConfigRoutingProtocol \r
+ // as FALSE. But this renders the system to not 100% compliant with\r
+ // UEFI 2.1. Use this with caution.\r
+ //\r
+ if (!FeaturePcdGet (PcdSupportFullConfigRoutingProtocol)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
if (This == NULL || Progress == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
Link = Link->ForwardLink\r
) {\r
Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
- CurrentDevicePath = Database->PackageList->DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
- if (CurrentDevicePath != NULL) {\r
+\r
+ if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
+ CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
if (CompareMem (\r
DevicePath,\r
CurrentDevicePath,\r
}\r
\r
return EFI_SUCCESS;\r
-#else\r
- return EFI_UNSUPPORTED;\r
-#endif\r
}\r
\r
\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
- while (*StringPtr++ != L'&');\r
+\r
+ while (*StringPtr != L'&' && *StringPtr != 0) {\r
+ StringPtr++;\r
+ }\r
+ if (*StringPtr == 0) {\r
+ *Progress = StringPtr;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Exit;\r
+ }\r
+ //\r
+ // Skip '&'\r
+ //\r
+ StringPtr++;\r
\r
//\r
// Copy <ConfigHdr> and an additional '&' to <ConfigResp>\r
goto Exit;\r
}\r
\r
- Status = R8_BufToHexString (ValueStr, &Length, Value, Width);\r
+ Status = BufToHexString (ValueStr, &Length, Value, Width);\r
ASSERT_EFI_ERROR (Status);\r
+ ToLower (ValueStr);\r
+\r
SafeFreePool (Value);\r
Value = NULL;\r
\r
Status = EFI_INVALID_PARAMETER;\r
goto Exit;\r
}\r
- while (*StringPtr++ != L'&');\r
+\r
+ while (*StringPtr != L'&' && *StringPtr != 0) {\r
+ StringPtr++;\r
+ }\r
+ if (*StringPtr == 0) {\r
+ *Progress = StringPtr;\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Exit;\r
+ }\r
+ //\r
+ // Skip '&'\r
+ //\r
+ StringPtr++;\r
\r
//\r
// Parse each <ConfigElement> if exists\r
OUT EFI_STRING *AltCfgResp\r
)\r
{\r
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
-\r
EFI_STATUS Status;\r
EFI_STRING StringPtr;\r
- EFI_STRING HdrStart = NULL;\r
- EFI_STRING HdrEnd = NULL;\r
+ EFI_STRING HdrStart;\r
+ EFI_STRING HdrEnd;\r
EFI_STRING TmpPtr;\r
UINTN Length;\r
- EFI_STRING GuidStr = NULL;\r
- EFI_STRING NameStr = NULL;\r
- EFI_STRING PathStr = NULL;\r
- EFI_STRING AltIdStr = NULL;\r
- EFI_STRING Result = NULL;\r
- BOOLEAN GuidFlag = FALSE;\r
- BOOLEAN NameFlag = FALSE;\r
- BOOLEAN PathFlag = FALSE;\r
+ EFI_STRING GuidStr;\r
+ EFI_STRING NameStr;\r
+ EFI_STRING PathStr;\r
+ EFI_STRING AltIdStr;\r
+ EFI_STRING Result;\r
+ BOOLEAN GuidFlag;\r
+ BOOLEAN NameFlag;\r
+ BOOLEAN PathFlag;\r
+\r
+ //\r
+ // For size reduction, please define PcdSupportFullConfigRoutingProtocol \r
+ // as FALSE. But this renders the system to not 100% compliant with\r
+ // UEFI 2.1. Use this with caution.\r
+ //\r
+ if (!FeaturePcdGet (PcdSupportFullConfigRoutingProtocol)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ HdrStart = NULL;\r
+ HdrEnd = NULL;\r
+ GuidStr = NULL;\r
+ NameStr = NULL;\r
+ PathStr = NULL;\r
+ AltIdStr = NULL;\r
+ Result = NULL;\r
+ GuidFlag = FALSE;\r
+ NameFlag = FALSE;\r
+ PathFlag = FALSE;\r
\r
if (This == NULL || Configuration == NULL || AltCfgResp == NULL) {\r
return EFI_INVALID_PARAMETER;\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
\r
return Status;\r
\r
-#else\r
- return EFI_UNSUPPORTED;\r
-#endif\r
-\r
}\r
\r
+\r