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) { + // + // ::=