| /** @file | |
| Parse the INI configuration file and pass the information to the recovery driver | |
| so that the driver can perform recovery accordingly. | |
| Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include "RecoveryModuleLoadPei.h" | |
| #include <Library/IniParsingLib.h> | |
| #include <Library/PrintLib.h> | |
| #define MAX_LINE_LENGTH 512 | |
| /** | |
| Parse Config data file to get the updated data array. | |
| @param[in] DataBuffer Config raw file buffer. | |
| @param[in] BufferSize Size of raw buffer. | |
| @param[in, out] ConfigHeader Pointer to the config header. | |
| @param[in, out] RecoveryArray Pointer to the config of recovery data. | |
| @retval EFI_NOT_FOUND No config data is found. | |
| @retval EFI_OUT_OF_RESOURCES No enough memory is allocated. | |
| @retval EFI_SUCCESS Parse the config file successfully. | |
| **/ | |
| EFI_STATUS | |
| ParseRecoveryDataFile ( | |
| IN UINT8 *DataBuffer, | |
| IN UINTN BufferSize, | |
| IN OUT CONFIG_HEADER *ConfigHeader, | |
| IN OUT RECOVERY_CONFIG_DATA **RecoveryArray | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| CHAR8 *SectionName; | |
| CHAR8 Entry[MAX_LINE_LENGTH]; | |
| UINTN Num; | |
| UINTN Index; | |
| EFI_GUID FileGuid; | |
| VOID *Context; | |
| // | |
| // First process the data buffer and get all sections and entries | |
| // | |
| Context = OpenIniFile (DataBuffer, BufferSize); | |
| if (Context == NULL) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| // | |
| // Now get NumOfUpdate | |
| // | |
| Status = GetDecimalUintnFromDataFile ( | |
| Context, | |
| "Head", | |
| "NumOfRecovery", | |
| &Num | |
| ); | |
| if (EFI_ERROR (Status) || (Num == 0)) { | |
| DEBUG ((DEBUG_ERROR, "NumOfRecovery not found\n")); | |
| CloseIniFile (Context); | |
| return EFI_NOT_FOUND; | |
| } | |
| ConfigHeader->NumOfRecovery = Num; | |
| *RecoveryArray = AllocateZeroPool ((sizeof (RECOVERY_CONFIG_DATA) * Num)); | |
| if (*RecoveryArray == NULL) { | |
| CloseIniFile (Context); | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| for (Index = 0; Index < ConfigHeader->NumOfRecovery; Index++) { | |
| // | |
| // Get the section name of each update | |
| // | |
| AsciiStrCpyS (Entry, MAX_LINE_LENGTH, "Recovery"); | |
| AsciiValueToStringS ( | |
| Entry + AsciiStrnLenS (Entry, MAX_LINE_LENGTH), | |
| MAX_LINE_LENGTH - AsciiStrnLenS (Entry, MAX_LINE_LENGTH), | |
| 0, | |
| Index, | |
| 0 | |
| ); | |
| Status = GetStringFromDataFile ( | |
| Context, | |
| "Head", | |
| Entry, | |
| &SectionName | |
| ); | |
| if (EFI_ERROR (Status) || (SectionName == NULL)) { | |
| DEBUG ((DEBUG_ERROR, "[%d] %a not found\n", Index, Entry)); | |
| CloseIniFile (Context); | |
| return EFI_NOT_FOUND; | |
| } | |
| // | |
| // The section name of this update has been found. | |
| // Now looks for all the config data of this update | |
| // | |
| // | |
| // FileGuid | |
| // | |
| Status = GetGuidFromDataFile ( | |
| Context, | |
| SectionName, | |
| "FileGuid", | |
| &FileGuid | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| CloseIniFile (Context); | |
| DEBUG ((DEBUG_ERROR, "[%d] FileGuid not found\n", Index)); | |
| return EFI_NOT_FOUND; | |
| } | |
| CopyGuid (&((*RecoveryArray)[Index].FileGuid), &FileGuid); | |
| // | |
| // Length | |
| // | |
| Status = GetHexUintnFromDataFile ( | |
| Context, | |
| SectionName, | |
| "Length", | |
| &Num | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| CloseIniFile (Context); | |
| DEBUG ((DEBUG_ERROR, "[%d] Length not found\n", Index)); | |
| return EFI_NOT_FOUND; | |
| } | |
| (*RecoveryArray)[Index].Length = Num; | |
| // | |
| // ImageOffset | |
| // | |
| Status = GetHexUintnFromDataFile ( | |
| Context, | |
| SectionName, | |
| "ImageOffset", | |
| &Num | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| CloseIniFile (Context); | |
| DEBUG ((DEBUG_ERROR, "[%d] ImageOffset not found\n", Index)); | |
| return EFI_NOT_FOUND; | |
| } | |
| (*RecoveryArray)[Index].ImageOffset = Num; | |
| } | |
| // | |
| // Now all configuration data got. Free those temporary buffers | |
| // | |
| CloseIniFile (Context); | |
| return EFI_SUCCESS; | |
| } |