X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FHiiDatabaseDxe%2FConfigRouting.c;h=2cad6d29f45529bdfc228bae0284cae2200ec798;hb=HEAD;hp=2934ab383acf67d6f959209e213df7237df00a94;hpb=2573712e0132deac7591f9ed5e2423c5e61e5af6;p=mirror_edk2.git
diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
index 2934ab383a..5ae6189a28 100644
--- a/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
+++ b/MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
@@ -1,20 +1,13 @@
/** @file
Implementation of interfaces function for EFI_HII_CONFIG_ROUTING_PROTOCOL.
-Copyright (c) 2007 - 2010, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
+SPDX-License-Identifier: BSD-2-Clause-Patent
**/
-
#include "HiiDatabase.h"
-extern HII_DATABASE_PRIVATE_DATA mPrivate;
+extern HII_DATABASE_PRIVATE_DATA mPrivate;
/**
Calculate the number of Unicode characters of the incoming Configuration string,
@@ -30,7 +23,7 @@ extern HII_DATABASE_PRIVATE_DATA mPrivate;
**/
UINTN
CalculateConfigStringLen (
- IN EFI_STRING String
+ IN EFI_STRING String
)
{
EFI_STRING TmpPtr;
@@ -44,7 +37,7 @@ CalculateConfigStringLen (
//
// The beginning of next / should be "&GUID=".
// Will meet '\0' if there is only one /.
- //
+ //
TmpPtr = StrStr (String, L"&GUID=");
if (TmpPtr == NULL) {
return StrLen (String);
@@ -53,7 +46,6 @@ CalculateConfigStringLen (
return (TmpPtr - String);
}
-
/**
Convert the hex UNICODE %02x encoding of a UEFI device path to binary
from of .
@@ -65,37 +57,39 @@ CalculateConfigStringLen (
@retval EFI_NOT_FOUND The device path is not invalid.
@retval EFI_INVALID_PARAMETER Any incoming parameter is invalid.
- @retval EFI_OUT_OF_RESOURCES Lake of resources to store neccesary structures.
+ @retval EFI_OUT_OF_RESOURCES Lake of resources to store necessary structures.
@retval EFI_SUCCESS The device path is retrieved and translated to
binary format.
**/
EFI_STATUS
GetDevicePath (
- IN EFI_STRING String,
- OUT UINT8 **DevicePathData
+ IN EFI_STRING String,
+ OUT UINT8 **DevicePathData
)
{
- UINTN Length;
- EFI_STRING PathHdr;
- UINT8 *DevicePathBuffer;
- CHAR16 TemStr[2];
- UINTN Index;
- UINT8 DigitUint8;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
-
-
- if (String == NULL || DevicePathData == NULL) {
+ UINTN Length;
+ EFI_STRING PathHdr;
+ UINT8 *DevicePathBuffer;
+ CHAR16 TemStr[2];
+ UINTN Index;
+ UINT8 DigitUint8;
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;
+
+ if ((String == NULL) || (DevicePathData == NULL)) {
return EFI_INVALID_PARAMETER;
}
//
// Find the 'PATH=' of and skip it.
//
- for (; (*String != 0 && StrnCmp (String, L"PATH=", StrLen (L"PATH=")) != 0); String++);
+ for ( ; (*String != 0 && StrnCmp (String, L"PATH=", StrLen (L"PATH=")) != 0); String++) {
+ }
+
if (*String == 0) {
return EFI_INVALID_PARAMETER;
}
+
//
// Check whether path data does exist.
//
@@ -103,6 +97,7 @@ GetDevicePath (
if (*String == 0) {
return EFI_INVALID_PARAMETER;
}
+
PathHdr = String;
//
@@ -110,42 +105,44 @@ GetDevicePath (
// or '\0' (end of configuration string) is the UNICODE %02x bytes encoding
// of UEFI device path.
//
- for (Length = 0; *String != 0 && *String != L'&'; String++, Length++);
+ for (Length = 0; *String != 0 && *String != L'&'; String++, Length++) {
+ }
+
//
// Check DevicePath Length
//
if (((Length + 1) / 2) < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
return EFI_NOT_FOUND;
}
-
+
//
// The data in is encoded as hex UNICODE %02x bytes in the same order
// as the device path resides in RAM memory.
// Translate the data into binary.
//
- DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);
+ DevicePathBuffer = (UINT8 *)AllocateZeroPool ((Length + 1) / 2);
if (DevicePathBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
-
+
//
// Convert DevicePath
//
ZeroMem (TemStr, sizeof (TemStr));
- for (Index = 0; Index < Length; Index ++) {
- TemStr[0] = PathHdr[Index];
- DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
+ for (Index = 0; Index < Length; Index++) {
+ TemStr[0] = PathHdr[Index];
+ DigitUint8 = (UINT8)StrHexToUint64 (TemStr);
if ((Index & 1) == 0) {
- DevicePathBuffer [Index/2] = DigitUint8;
+ DevicePathBuffer[Index/2] = DigitUint8;
} else {
- DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
+ DevicePathBuffer[Index/2] = (UINT8)((DevicePathBuffer[Index/2] << 4) + DigitUint8);
}
}
-
+
//
// Validate DevicePath
//
- DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DevicePathBuffer;
+ DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)DevicePathBuffer;
while (!IsDevicePathEnd (DevicePath)) {
if ((DevicePath->Type == 0) || (DevicePath->SubType == 0) || (DevicePathNodeLength (DevicePath) < sizeof (EFI_DEVICE_PATH_PROTOCOL))) {
//
@@ -154,6 +151,7 @@ GetDevicePath (
FreePool (DevicePathBuffer);
return EFI_NOT_FOUND;
}
+
DevicePath = NextDevicePathNode (DevicePath);
}
@@ -190,8 +188,8 @@ HiiToLower (
Lower = TRUE;
} else if (*String == L'&') {
Lower = FALSE;
- } else if (Lower && *String >= L'A' && *String <= L'F') {
- *String = (CHAR16) (*String - L'A' + L'a');
+ } else if (Lower && (*String >= L'A') && (*String <= L'F')) {
+ *String = (CHAR16)(*String - L'A' + L'a');
}
}
@@ -208,10 +206,10 @@ HiiToLower (
@param BufferLen The length of the Buffer in bytes.
- @param Buffer Points to a buffer which will be converted to be the
+ @param Buffer Points to a buffer which will be converted to be the
content of the generated string.
- @param Flag If 1, the buffer contains data for the value of GUID or PATH stored in
+ @param Flag If 1, the buffer contains data for the value of GUID or PATH stored in
UINT8 *; if 2, the buffer contains unicode string for the value of NAME;
if 3, the buffer contains other data.
@@ -222,11 +220,11 @@ HiiToLower (
**/
VOID
GenerateSubStr (
- IN CONST EFI_STRING String,
- IN UINTN BufferLen,
- IN VOID *Buffer,
- IN UINT8 Flag,
- OUT EFI_STRING *SubStr
+ IN CONST EFI_STRING String,
+ IN UINTN BufferLen,
+ IN VOID *Buffer,
+ IN UINT8 Flag,
+ OUT EFI_STRING *SubStr
)
{
UINTN Length;
@@ -242,9 +240,9 @@ GenerateSubStr (
if (Buffer == NULL) {
*SubStr = AllocateCopyPool (StrSize (String), String);
ASSERT (*SubStr != NULL);
- return ;
+ return;
}
-
+
//
// Header + Data + '&' + '\0'
//
@@ -252,58 +250,80 @@ GenerateSubStr (
Str = AllocateZeroPool (Length * sizeof (CHAR16));
ASSERT (Str != NULL);
- StrCpy (Str, String);
- Length = (BufferLen * 2 + 1) * sizeof (CHAR16);
+ StrCpyS (Str, Length, String);
StringHeader = Str + StrLen (String);
- TemString = (CHAR16 *) StringHeader;
+ TemString = (CHAR16 *)StringHeader;
switch (Flag) {
- case 1:
- //
- // Convert Buffer to Hex String in reverse order
- //
- TemBuffer = ((UINT8 *) Buffer);
- for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) {
- TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
- }
- break;
- case 2:
- //
- // Check buffer is enough
- //
- TemName = (CHAR16 *) Buffer;
- ASSERT ((BufferLen * 2 + 1) >= (StrLen (TemName) * 4 + 1));
- //
- // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
- //
- for (; *TemName != L'\0'; TemName++) {
- TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
- }
- break;
- case 3:
- //
- // Convert Buffer to Hex String
- //
- TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1;
- for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) {
- TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
- }
- break;
- default:
- break;
+ case 1:
+ //
+ // Convert Buffer to Hex String in reverse order
+ //
+ TemBuffer = ((UINT8 *)Buffer);
+ for (Index = 0; Index < BufferLen; Index++, TemBuffer++) {
+ UnicodeValueToStringS (
+ TemString,
+ sizeof (CHAR16) * (Length - StrnLenS (Str, Length)),
+ PREFIX_ZERO | RADIX_HEX,
+ *TemBuffer,
+ 2
+ );
+ TemString += StrnLenS (TemString, Length - StrnLenS (Str, Length));
+ }
+
+ break;
+ case 2:
+ //
+ // Check buffer is enough
+ //
+ TemName = (CHAR16 *)Buffer;
+ ASSERT ((BufferLen * 2 + 1) >= (StrLen (TemName) * 4 + 1));
+ //
+ // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
+ //
+ for ( ; *TemName != L'\0'; TemName++) {
+ UnicodeValueToStringS (
+ TemString,
+ sizeof (CHAR16) * (Length - StrnLenS (Str, Length)),
+ PREFIX_ZERO | RADIX_HEX,
+ *TemName,
+ 4
+ );
+ TemString += StrnLenS (TemString, Length - StrnLenS (Str, Length));
+ }
+
+ break;
+ case 3:
+ //
+ // Convert Buffer to Hex String
+ //
+ TemBuffer = ((UINT8 *)Buffer) + BufferLen - 1;
+ for (Index = 0; Index < BufferLen; Index++, TemBuffer--) {
+ UnicodeValueToStringS (
+ TemString,
+ sizeof (CHAR16) * (Length - StrnLenS (Str, Length)),
+ PREFIX_ZERO | RADIX_HEX,
+ *TemBuffer,
+ 2
+ );
+ TemString += StrnLenS (TemString, Length - StrnLenS (Str, Length));
+ }
+
+ break;
+ default:
+ break;
}
//
// Convert the uppercase to lowercase since is defined in lowercase format.
//
- StrCat (Str, L"&");
+ StrCatS (Str, Length, L"&");
HiiToLower (Str);
*SubStr = Str;
}
-
/**
Retrieve the from String then output it.
@@ -321,18 +341,18 @@ GenerateSubStr (
**/
EFI_STATUS
OutputConfigBody (
- IN EFI_STRING String,
- OUT EFI_STRING *ConfigBody
+ IN EFI_STRING String,
+ OUT EFI_STRING *ConfigBody
)
{
EFI_STRING TmpPtr;
EFI_STRING Result;
UINTN Length;
- if (String == NULL || ConfigBody == NULL) {
+ if ((String == NULL) || (ConfigBody == NULL)) {
return EFI_INVALID_PARAMETER;
}
-
+
//
// The setting information should start OFFSET, not ALTCFG.
//
@@ -355,13 +375,17 @@ OutputConfigBody (
}
Length = TmpPtr - String;
+ if (Length == 0) {
+ return EFI_NOT_FOUND;
+ }
+
Result = AllocateCopyPool (Length * sizeof (CHAR16), String);
if (Result == NULL) {
return EFI_OUT_OF_RESOURCES;
}
*(Result + Length - 1) = 0;
- *ConfigBody = Result;
+ *ConfigBody = Result;
return EFI_SUCCESS;
}
@@ -383,41 +407,45 @@ OutputConfigBody (
**/
EFI_STATUS
AppendToMultiString (
- IN OUT EFI_STRING *MultiString,
- IN EFI_STRING AppendString
+ IN OUT EFI_STRING *MultiString,
+ IN EFI_STRING AppendString
)
{
- UINTN AppendStringSize;
- UINTN MultiStringSize;
+ UINTN AppendStringSize;
+ UINTN MultiStringSize;
+ UINTN MaxLen;
- if (MultiString == NULL || *MultiString == NULL || AppendString == NULL) {
+ if ((MultiString == NULL) || (*MultiString == NULL) || (AppendString == NULL)) {
return EFI_INVALID_PARAMETER;
}
AppendStringSize = StrSize (AppendString);
MultiStringSize = StrSize (*MultiString);
+ MaxLen = MAX_STRING_LENGTH / sizeof (CHAR16);
//
// Enlarge the buffer each time when length exceeds MAX_STRING_LENGTH.
//
- if (MultiStringSize + AppendStringSize > MAX_STRING_LENGTH ||
- MultiStringSize > MAX_STRING_LENGTH) {
- *MultiString = (EFI_STRING) ReallocatePool (
- MultiStringSize,
- MultiStringSize + AppendStringSize,
- (VOID *) (*MultiString)
- );
+ if ((MultiStringSize + AppendStringSize > MAX_STRING_LENGTH) ||
+ (MultiStringSize > MAX_STRING_LENGTH))
+ {
+ *MultiString = (EFI_STRING)ReallocatePool (
+ MultiStringSize,
+ MultiStringSize + AppendStringSize,
+ (VOID *)(*MultiString)
+ );
+ MaxLen = (MultiStringSize + AppendStringSize) / sizeof (CHAR16);
ASSERT (*MultiString != NULL);
}
+
//
// Append the incoming string
//
- StrCat (*MultiString, AppendString);
+ StrCatS (*MultiString, MaxLen, AppendString);
return EFI_SUCCESS;
}
-
/**
Get the value of in format, i.e. the value of OFFSET
or WIDTH or VALUE.
@@ -431,7 +459,7 @@ AppendToMultiString (
to free memory.
@param Len Length of the , in characters.
- @retval EFI_OUT_OF_RESOURCES Insufficient resources to store neccessary
+ @retval EFI_OUT_OF_RESOURCES Insufficient resources to store necessary
structures.
@retval EFI_SUCCESS Value of is outputted in Number
successfully.
@@ -439,22 +467,23 @@ AppendToMultiString (
**/
EFI_STATUS
GetValueOfNumber (
- IN EFI_STRING StringPtr,
- OUT UINT8 **Number,
- OUT UINTN *Len
+ IN EFI_STRING StringPtr,
+ OUT UINT8 **Number,
+ OUT UINTN *Len
)
{
- EFI_STRING TmpPtr;
- UINTN Length;
- EFI_STRING Str;
- UINT8 *Buf;
- EFI_STATUS Status;
- UINT8 DigitUint8;
- UINTN Index;
- CHAR16 TemStr[2];
-
- ASSERT (StringPtr != NULL && Number != NULL && Len != NULL);
- ASSERT (*StringPtr != L'\0');
+ EFI_STRING TmpPtr;
+ UINTN Length;
+ EFI_STRING Str;
+ UINT8 *Buf;
+ EFI_STATUS Status;
+ UINT8 DigitUint8;
+ UINTN Index;
+ CHAR16 TemStr[2];
+
+ if ((StringPtr == NULL) || (*StringPtr == L'\0') || (Number == NULL) || (Len == NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
Buf = NULL;
@@ -462,33 +491,35 @@ GetValueOfNumber (
while (*StringPtr != L'\0' && *StringPtr != L'&') {
StringPtr++;
}
+
*Len = StringPtr - TmpPtr;
Length = *Len + 1;
- Str = (EFI_STRING) AllocateZeroPool (Length * sizeof (CHAR16));
+ Str = (EFI_STRING)AllocateZeroPool (Length * sizeof (CHAR16));
if (Str == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Exit;
}
+
CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));
*(Str + *Len) = L'\0';
Length = (Length + 1) / 2;
- Buf = (UINT8 *) AllocateZeroPool (Length);
+ Buf = (UINT8 *)AllocateZeroPool (Length);
if (Buf == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Exit;
}
-
+
Length = *Len;
ZeroMem (TemStr, sizeof (TemStr));
- for (Index = 0; Index < Length; Index ++) {
- TemStr[0] = Str[Length - Index - 1];
- DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
+ for (Index = 0; Index < Length; Index++) {
+ TemStr[0] = Str[Length - Index - 1];
+ DigitUint8 = (UINT8)StrHexToUint64 (TemStr);
if ((Index & 1) == 0) {
- Buf [Index/2] = DigitUint8;
+ Buf[Index/2] = DigitUint8;
} else {
- Buf [Index/2] = (UINT8) ((DigitUint8 << 4) + Buf [Index/2]);
+ Buf[Index/2] = (UINT8)((DigitUint8 << 4) + Buf[Index/2]);
}
}
@@ -504,226 +535,711 @@ Exit:
}
/**
- This function merges DefaultAltCfgResp string into AltCfgResp string for
- the missing AltCfgId in AltCfgResq.
+ To find the BlockName in the string with same value.
+
+ @param String Pointer to a Null-terminated Unicode string.
+ @param BlockName Pointer to a Null-terminated Unicode string to search for.
+ @param Buffer Pointer to the value correspond to the BlockName.
+ @param Found The Block whether has been found.
+ @param BufferLen The length of the buffer.
+
+ @retval EFI_OUT_OF_RESOURCES Insufficient resources to store necessary structures.
+ @retval EFI_SUCCESS The function finishes successfully.
+
+**/
+EFI_STATUS
+FindSameBlockElement (
+ IN EFI_STRING String,
+ IN EFI_STRING BlockName,
+ IN UINT8 *Buffer,
+ OUT BOOLEAN *Found,
+ IN UINTN BufferLen
+ )
+{
+ EFI_STRING BlockPtr;
+ UINTN Length;
+ UINT8 *TempBuffer;
+ EFI_STATUS Status;
+
+ TempBuffer = NULL;
+ *Found = FALSE;
+ BlockPtr = StrStr (String, BlockName);
+
+ while (BlockPtr != NULL) {
+ BlockPtr += StrLen (BlockName);
+ Status = GetValueOfNumber (BlockPtr, &TempBuffer, &Length);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ ASSERT (TempBuffer != NULL);
+ if ((BufferLen == Length) && (0 == CompareMem (Buffer, TempBuffer, Length))) {
+ *Found = TRUE;
+ FreePool (TempBuffer);
+ TempBuffer = NULL;
+ return EFI_SUCCESS;
+ } else {
+ FreePool (TempBuffer);
+ TempBuffer = NULL;
+ BlockPtr = StrStr (BlockPtr + 1, BlockName);
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Compare the in ConfigAltResp and DefaultAltCfgResp, if the
+ in DefaultAltCfgResp but not in ConfigAltResp,add it to the ConfigAltResp.
- @param AltCfgResp Pointer to a null-terminated Unicode string in
- format. The default value string
- will be merged into it.
@param DefaultAltCfgResp Pointer to a null-terminated Unicode string in
- format. The default value
+ format. The default value
string may contain more than one ConfigAltResp
string for the different varstore buffer.
+ @param ConfigAltResp Pointer to a null-terminated Unicode string in
+ format.
+ @param AltConfigHdr Pointer to a Unicode string in format.
+ @param ConfigAltRespChanged Whether the ConfigAltResp has been changed.
+
+ @retval EFI_OUT_OF_RESOURCES Insufficient resources to store necessary structures.
+ @retval EFI_SUCCESS The function finishes successfully.
- @retval EFI_SUCCESS The merged string returns.
- @retval EFI_INVALID_PARAMETER *AltCfgResp is to NULL.
**/
EFI_STATUS
-EFIAPI
-MergeDefaultString (
- IN OUT EFI_STRING *AltCfgResp,
- IN EFI_STRING DefaultAltCfgResp
+CompareBlockElementDefault (
+ IN EFI_STRING DefaultAltCfgResp,
+ IN OUT EFI_STRING *ConfigAltResp,
+ IN EFI_STRING AltConfigHdr,
+ IN OUT BOOLEAN *ConfigAltRespChanged
)
{
- EFI_STRING StringPtrDefault;
- EFI_STRING StringPtrEnd;
- CHAR16 TempChar;
- EFI_STRING StringPtr;
- EFI_STRING AltConfigHdr;
- UINTN HeaderLength;
- UINTN SizeAltCfgResp;
-
- if (*AltCfgResp == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
+ EFI_STATUS Status;
+ EFI_STRING BlockPtr;
+ EFI_STRING BlockPtrStart;
+ EFI_STRING StringPtr;
+ EFI_STRING AppendString;
+ EFI_STRING AltConfigHdrPtr;
+ UINT8 *TempBuffer;
+ UINTN OffsetLength;
+ UINTN AppendSize;
+ UINTN TotalSize;
+ BOOLEAN FoundOffset;
+
+ AppendString = NULL;
+ TempBuffer = NULL;
//
- // Get the requestr ConfigHdr
+ // Make BlockPtr point to the first with AltConfigHdr in DefaultAltCfgResp.
//
- SizeAltCfgResp = 0;
- StringPtr = *AltCfgResp;
-
+ AltConfigHdrPtr = StrStr (DefaultAltCfgResp, AltConfigHdr);
+ ASSERT (AltConfigHdrPtr != NULL);
+ BlockPtr = StrStr (AltConfigHdrPtr, L"&OFFSET=");
//
- // Find GUID=...&NAME=...&PATH=...
+ // Make StringPtr point to the AltConfigHdr in ConfigAltResp.
//
- if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
- return EFI_INVALID_PARAMETER;
- }
- while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&NAME=", StrLen (L"&NAME=")) != 0) {
- StringPtr++;
- }
- while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&PATH=", StrLen (L"&PATH=")) != 0) {
- StringPtr++;
- }
- if (*StringPtr == L'\0') {
- return EFI_INVALID_PARAMETER;
- }
- StringPtr += StrLen (L"&PATH=");
- while (*StringPtr != L'\0' && *StringPtr != L'&') {
- StringPtr ++;
- }
- HeaderLength = StringPtr - *AltCfgResp;
+ StringPtr = StrStr (*ConfigAltResp, AltConfigHdr);
+ ASSERT (StringPtr != NULL);
- //
- // Construct AltConfigHdr string "&&ALTCFG=XXXX\0"
- // |1| StrLen (ConfigHdr) | 8 | 4 | 1 |
- //
- AltConfigHdr = AllocateZeroPool ((1 + HeaderLength + 8 + 4 + 1) * sizeof (CHAR16));
- if (AltConfigHdr == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- StrCpy (AltConfigHdr, L"&");
- StrnCat (AltConfigHdr, *AltCfgResp, HeaderLength);
- StrCat (AltConfigHdr, L"&ALTCFG=");
- HeaderLength = StrLen (AltConfigHdr);
-
- StringPtrDefault = StrStr (DefaultAltCfgResp, AltConfigHdr);
- while (StringPtrDefault != NULL) {
+ while (BlockPtr != NULL) {
//
- // Get AltCfg Name
+ // Find the "&OFFSET=" block and get the value of the Number with AltConfigHdr in DefaultAltCfgResp.
+ //
+ BlockPtrStart = BlockPtr;
+ BlockPtr += StrLen (L"&OFFSET=");
+ Status = GetValueOfNumber (BlockPtr, &TempBuffer, &OffsetLength);
+ if (EFI_ERROR (Status)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
+ }
+
//
- StrnCat (AltConfigHdr, StringPtrDefault + HeaderLength, 4);
- StringPtr = StrStr (*AltCfgResp, AltConfigHdr);
-
+ // To find the same "&OFFSET=" block in ConfigAltResp.
//
- // Append the found default value string to the input AltCfgResp
- //
- if (StringPtr == NULL) {
- StringPtrEnd = StrStr (StringPtrDefault + 1, L"&GUID");
- SizeAltCfgResp = StrSize (*AltCfgResp);
- if (StringPtrEnd == NULL) {
- //
- // No more default string is found.
- //
- *AltCfgResp = (EFI_STRING) ReallocatePool (
- SizeAltCfgResp,
- SizeAltCfgResp + StrSize (StringPtrDefault),
- (VOID *) (*AltCfgResp)
- );
- if (*AltCfgResp == NULL) {
- FreePool (AltConfigHdr);
- return EFI_OUT_OF_RESOURCES;
- }
- StrCat (*AltCfgResp, StringPtrDefault);
- break;
+ Status = FindSameBlockElement (StringPtr, L"&OFFSET=", TempBuffer, &FoundOffset, OffsetLength);
+ if (TempBuffer != NULL) {
+ FreePool (TempBuffer);
+ TempBuffer = NULL;
+ }
+
+ if (EFI_ERROR (Status)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
+ }
+
+ if (!FoundOffset) {
+ //
+ // Don't find the same "&OFFSET=" block in ConfigAltResp.
+ // Calculate the size of .
+ // ::='OFFSET=''&WIDTH=''&VALUE='.
+ //
+ BlockPtr = StrStr (BlockPtr + 1, L"&OFFSET=");
+ if (BlockPtr != NULL) {
+ AppendSize = (BlockPtr - BlockPtrStart) * sizeof (CHAR16);
} else {
- TempChar = *StringPtrEnd;
- *StringPtrEnd = L'\0';
- *AltCfgResp = (EFI_STRING) ReallocatePool (
- SizeAltCfgResp,
- SizeAltCfgResp + StrSize (StringPtrDefault),
- (VOID *) (*AltCfgResp)
+ AppendSize = StrSize (BlockPtrStart);
+ }
+
+ //
+ // Copy the to AppendString.
+ //
+ if (AppendString == NULL) {
+ AppendString = (EFI_STRING)AllocateZeroPool (AppendSize + sizeof (CHAR16));
+ StrnCatS (AppendString, AppendSize / sizeof (CHAR16) + 1, BlockPtrStart, AppendSize / sizeof (CHAR16));
+ } else {
+ TotalSize = StrSize (AppendString) + AppendSize + sizeof (CHAR16);
+ AppendString = (EFI_STRING)ReallocatePool (
+ StrSize (AppendString),
+ TotalSize,
+ AppendString
);
- if (*AltCfgResp == NULL) {
- FreePool (AltConfigHdr);
- return EFI_OUT_OF_RESOURCES;
+ if (AppendString == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
}
- StrCat (*AltCfgResp, StringPtrDefault);
- *StringPtrEnd = TempChar;
+
+ StrnCatS (AppendString, TotalSize / sizeof (CHAR16), BlockPtrStart, AppendSize / sizeof (CHAR16));
}
+ } else {
+ //
+ // To find next "&OFFSET=" block with AltConfigHdr in DefaultAltCfgResp.
+ //
+ BlockPtr = StrStr (BlockPtr + 1, L"&OFFSET=");
}
-
+ }
+
+ if (AppendString != NULL) {
//
- // Find next AltCfg String
+ // Reallocate ConfigAltResp to copy the AppendString.
//
- *(AltConfigHdr + HeaderLength) = L'\0';
- StringPtrDefault = StrStr (StringPtrDefault + 1, AltConfigHdr);
+ TotalSize = StrSize (*ConfigAltResp) + StrSize (AppendString) + sizeof (CHAR16);
+ *ConfigAltResp = (EFI_STRING)ReallocatePool (
+ StrSize (*ConfigAltResp),
+ TotalSize,
+ *ConfigAltResp
+ );
+ if (*ConfigAltResp == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Exit;
+ }
+
+ StrCatS (*ConfigAltResp, TotalSize / sizeof (CHAR16), AppendString);
+ *ConfigAltRespChanged = TRUE;
}
-
- FreePool (AltConfigHdr);
- return EFI_SUCCESS;
-}
-/**
- This function finds the matched DefaultName for the input DefaultId
-
- @param DefaultIdArray Array stores the map table between DefaultId and DefaultName.
- @param VarDefaultId Default Id
- @param VarDefaultName Default Name string ID for the input default ID.
-
- @retval EFI_SUCCESS The mapped default name string ID is found.
- @retval EFI_NOT_FOUND The mapped default name string ID is not found.
-**/
-EFI_STATUS
-FindDefaultName (
- IN IFR_DEFAULT_DATA *DefaultIdArray,
- IN UINT16 VarDefaultId,
- OUT EFI_STRING_ID *VarDefaultName
- )
-{
- LIST_ENTRY *Link;
- IFR_DEFAULT_DATA *DefaultData;
+ Status = EFI_SUCCESS;
- for (Link = DefaultIdArray->Entry.ForwardLink; Link != &DefaultIdArray->Entry; Link = Link->ForwardLink) {
- DefaultData = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);
- if (DefaultData->DefaultId == VarDefaultId) {
- *VarDefaultName = DefaultData->DefaultName;
- return EFI_SUCCESS;
- }
+Exit:
+ if (AppendString != NULL) {
+ FreePool (AppendString);
}
-
- return EFI_NOT_FOUND;
+
+ return Status;
}
/**
- This function inserts new DefaultValueData into the BlockData DefaultValue array.
+ Compare the in ConfigAltResp and DefaultAltCfgResp, if the
+ in DefaultAltCfgResp but not in ConfigAltResp,add it to the ConfigAltResp.
- @param BlockData The BlockData is updated to add new default value.
- @param DefaultValueData The DefaultValue is added.
+ @param DefaultAltCfgResp Pointer to a null-terminated Unicode string in
+ format. The default value
+ string may contain more than one ConfigAltResp
+ string for the different varstore buffer.
+ @param ConfigAltResp Pointer to a null-terminated Unicode string in
+ format.
+ @param AltConfigHdr Pointer to a Unicode string in format.
+ @param ConfigAltRespChanged Whether the ConfigAltResp has been changed.
+
+ @retval EFI_OUT_OF_RESOURCES Insufficient resources to store necessary structures.
+ @retval EFI_SUCCESS The function finishes successfully.
**/
-VOID
-InsertDefaultValue (
- IN IFR_BLOCK_DATA *BlockData,
- IN IFR_DEFAULT_DATA *DefaultValueData
+EFI_STATUS
+CompareNameElementDefault (
+ IN EFI_STRING DefaultAltCfgResp,
+ IN OUT EFI_STRING *ConfigAltResp,
+ IN EFI_STRING AltConfigHdr,
+ IN OUT BOOLEAN *ConfigAltRespChanged
)
{
- LIST_ENTRY *Link;
- IFR_DEFAULT_DATA *DefaultValueArray;
+ EFI_STATUS Status;
+ EFI_STRING NvConfigPtr;
+ EFI_STRING NvConfigStart;
+ EFI_STRING NvConfigValuePtr;
+ EFI_STRING StringPtr;
+ EFI_STRING NvConfigExist;
+ EFI_STRING AppendString;
+ CHAR16 TempChar;
+ UINTN AppendSize;
+ UINTN TotalSize;
+
+ AppendString = NULL;
+ NvConfigExist = NULL;
+ //
+ // Make NvConfigPtr point to the first with AltConfigHdr in DefaultAltCfgResp.
+ //
+ NvConfigPtr = StrStr (DefaultAltCfgResp, AltConfigHdr);
+ ASSERT (NvConfigPtr != NULL);
+ NvConfigPtr = StrStr (NvConfigPtr + StrLen (AltConfigHdr), L"&");
+ //
+ // Make StringPtr point to the first with AltConfigHdr in ConfigAltResp.
+ //
+ StringPtr = StrStr (*ConfigAltResp, AltConfigHdr);
+ ASSERT (StringPtr != NULL);
+ StringPtr = StrStr (StringPtr + StrLen (AltConfigHdr), L"&");
+ ASSERT (StringPtr != NULL);
- for (Link = BlockData->DefaultValueEntry.ForwardLink; Link != &BlockData->DefaultValueEntry; Link = Link->ForwardLink) {
- DefaultValueArray = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);
- if (DefaultValueArray->DefaultId == DefaultValueData->DefaultId) {
- if (DefaultValueData->OpCode == EFI_IFR_DEFAULT_OP) {
- //
- // Update the default value array in BlockData.
- //
- DefaultValueArray->Value = DefaultValueData->Value;
- } else if (DefaultValueArray->OpCode != EFI_IFR_DEFAULT_OP) {
- //
- // Update the default value array in BlockData.
- //
- DefaultValueArray->Value = DefaultValueData->Value;
+ while (NvConfigPtr != NULL) {
+ //
+ // ::=