4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncImplementation of interfaces function for EFI_HII_CONFIG_ROUTING_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "HiiDatabase.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextern HII_DATABASE_PRIVATE_DATA mPrivate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Calculate the number of Unicode characters of the incoming Configuration string,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not including NULL terminator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String String in <MultiConfigRequest> or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The number of Unicode characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCalculateConfigStringLen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // "GUID=" should be the first element of incoming string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (String != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StrnCmp (String, L"GUID=", StrLen (L"GUID=")) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The beginning of next <ConfigRequest>/<ConfigResp> should be "&GUID=".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Will meet '\0' if there is only one <ConfigRequest>/<ConfigResp>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = StrStr (String, L"&GUID=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TmpPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TmpPtr - String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the hex UNICODE %02x encoding of a UEFI device path to binary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from <PathHdr> of <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String UEFI configuration string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePathData Binary of a UEFI device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The device path is not invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any incoming parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Lake of resources to store neccesary structures.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device path is retrieved and translated to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync binary format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 **DevicePathData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING PathHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DevicePathBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL || DevicePathData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the 'PATH=' of <PathHdr> and skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; (*String != 0 && StrnCmp (String, L"PATH=", StrLen (L"PATH=")) != 0); String++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*String == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether path data does exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += StrLen (L"PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*String == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathHdr = String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The content between 'PATH=' of <ConfigHdr> and '&' of next element
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // or '\0' (end of configuration string) is the UNICODE %02x bytes encoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // of UEFI device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Length = 0; *String != 0 && *String != L'&'; String++, Length++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check DevicePath Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Length + 1) / 2) < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The data in <PathHdr> is encoded as hex UNICODE %02x bytes in the same order
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // as the device path resides in RAM memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Translate the data into binary.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = PathHdr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer [Index/2] = DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DevicePathBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (DevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePath->Type == 0) || (DevicePath->SubType == 0) || (DevicePathNodeLength (DevicePath) < sizeof (EFI_DEVICE_PATH_PROTOCOL))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePathBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NextDevicePathNode (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return the device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DevicePathData = DevicePathBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts the unicode character of the string from uppercase to lowercase.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigString String to be converted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiToLower (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING ConfigString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Lower;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ConfigString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert all hex digits in range [A-F] in the configuration header to [a-f]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (String = ConfigString, Lower = FALSE; *String != L'\0'; String++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*String == L'=') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Lower = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (*String == L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Lower = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Lower && *String >= L'A' && *String <= L'F') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = (CHAR16) (*String - L'A' + L'a');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generate a sub string then output it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String A constant string which is the prefix of the to be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync generated string, e.g. GUID=
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferLen The length of the Buffer in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Points to a buffer which will be converted to be the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync content of the generated string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Flag If 1, the buffer contains data for the value of GUID or PATH stored in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *; if 2, the buffer contains unicode string for the value of NAME;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if 3, the buffer contains other data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SubStr Points to the output string. It's caller's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync responsibility to free this buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGenerateSubStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BufferLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flag,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *SubStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TemString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TemName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TemBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (String != NULL && SubStr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *SubStr = AllocateCopyPool (StrSize (String), String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (*SubStr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Header + Data + '&' + '\0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StrLen (String) + BufferLen * 2 + 1 + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Str != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (Str, String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = (BufferLen * 2 + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringHeader = Str + StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString = (CHAR16 *) StringHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Flag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Buffer to Hex String in reverse order
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemBuffer = ((UINT8 *) Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < BufferLen; Index ++, TemBuffer ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check buffer is enough
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemName = (CHAR16 *) Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((BufferLen * 2 + 1) >= (StrLen (TemName) * 4 + 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; *TemName != L'\0'; TemName++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 3:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Buffer to Hex String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemBuffer = ((UINT8 *) Buffer) + BufferLen - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < BufferLen; Index ++, TemBuffer --) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (Str, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiToLower (Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *SubStr = Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the <ConfigBody> from String then output it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String A sub string of a configuration string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigBody Points to the output string. It's caller's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync responsibility to free this buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER There is no form package in current hii database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to finish this operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS All existing storage is exported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncOutputConfigBody (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *ConfigBody
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL || ConfigBody == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The setting information should start OFFSET, not ALTCFG.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (String, L"&ALTCFG=", StrLen (L"&ALTCFG=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = StrStr (String, L"GUID=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TmpPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // It is the last <ConfigResp> of the incoming configuration string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = AllocateCopyPool (StrSize (String), String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ConfigBody = Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = TmpPtr - String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = AllocateCopyPool (Length * sizeof (CHAR16), String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Result + Length - 1) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ConfigBody = Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Append a string to a multi-string format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param MultiString String in <MultiConfigRequest>,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp>, or <MultiConfigResp>. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync input, the buffer length of this string is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MAX_STRING_LENGTH. On output, the buffer length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync might be updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AppendString NULL-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any incoming parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS AppendString is append to the end of MultiString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAppendToMultiString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_STRING *MultiString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING AppendString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AppendStringSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MultiStringSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MultiString == NULL || *MultiString == NULL || AppendString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendStringSize = StrSize (AppendString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiStringSize = StrSize (*MultiString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enlarge the buffer each time when length exceeds MAX_STRING_LENGTH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MultiStringSize + AppendStringSize > MAX_STRING_LENGTH ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiStringSize > MAX_STRING_LENGTH) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *MultiString = (EFI_STRING) ReallocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiStringSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MultiStringSize + AppendStringSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) (*MultiString)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (*MultiString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append the incoming string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (*MultiString, AppendString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the value of <Number> in <BlockConfig> format, i.e. the value of OFFSET
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or WIDTH or VALUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE'=<Number>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StringPtr String in <BlockConfig> format and points to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first character of <Number>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Number The output value. Caller takes the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to free memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Len Length of the <Number>, in characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Insufficient resources to store neccessary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync structures.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Value of <Number> is outputted in Number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetValueOfNumber (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING StringPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 **Number,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Len
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL || *StringPtr == L'\0' || Number == NULL || Len == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Len = StringPtr - TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = *Len + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = (EFI_STRING) AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Str == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Str, TmpPtr, *Len * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Str + *Len) = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = (Length + 1) / 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf = (UINT8 *) AllocateZeroPool (Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buf == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = *Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = Str[Length - Index - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf [Index/2] = DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf [Index/2] = (UINT8) ((DigitUint8 << 4) + Buf [Index/2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Number = Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Str != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function merges DefaultAltCfgResp string into AltCfgResp string for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the missing AltCfgId in AltCfgResq.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AltCfgResp Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigAltResp> format. The default value string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be merged into it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DefaultAltCfgResp Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp> format. The default value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string may contain more than one ConfigAltResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string for the different varstore buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The merged string returns.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER *AltCfgResp is to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMergeDefaultString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_STRING *AltCfgResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING DefaultAltCfgResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtrDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtrEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TempChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AltConfigHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HeaderLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SizeAltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the requestr ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = *AltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find <ConfigHdr> GUID=...&NAME=...&PATH=...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&NAME=", StrLen (L"&NAME=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&PATH=", StrLen (L"&PATH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr ++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderLength = StringPtr - *AltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct AltConfigHdr string "&<ConfigHdr>&ALTCFG=XXXX\0"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // |1| StrLen (ConfigHdr) | 8 | 4 | 1 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AltConfigHdr = AllocateZeroPool ((1 + HeaderLength + 8 + 4 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AltConfigHdr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (AltConfigHdr, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat (AltConfigHdr, *AltCfgResp, HeaderLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (AltConfigHdr, L"&ALTCFG=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HeaderLength = StrLen (AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtrDefault = StrStr (DefaultAltCfgResp, AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (StringPtrDefault != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get AltCfg Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat (AltConfigHdr, StringPtrDefault + HeaderLength, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (*AltCfgResp, AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append the found default value string to the input AltCfgResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtrEnd = StrStr (StringPtrDefault + 1, L"&GUID");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp = StrSize (*AltCfgResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtrEnd == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No more default string is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AltCfgResp = (EFI_STRING) ReallocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp + StrSize (StringPtrDefault),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) (*AltCfgResp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (*AltCfgResp, StringPtrDefault);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempChar = *StringPtrEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtrEnd = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AltCfgResp = (EFI_STRING) ReallocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeAltCfgResp + StrSize (StringPtrDefault),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) (*AltCfgResp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (*AltCfgResp, StringPtrDefault);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtrEnd = TempChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find next AltCfg String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(AltConfigHdr + HeaderLength) = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtrDefault = StrStr (StringPtrDefault + 1, AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AltConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function inserts new DefaultValueData into the BlockData DefaultValue array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockData The BlockData is updated to add new default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DefaultValueData The DefaultValue is added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInsertDefaultValue (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IFR_BLOCK_DATA *BlockData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IFR_DEFAULT_DATA *DefaultValueData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA *DefaultValueArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = BlockData->DefaultValueEntry.ForwardLink; Link != &BlockData->DefaultValueEntry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueArray = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultValueArray->DefaultId == DefaultValueData->DefaultId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // DEFAULT_VALUE_FROM_OPCODE has high priority, DEFAULT_VALUE_FROM_DEFAULT has low priority.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultValueData->Type > DefaultValueArray->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the default value array in BlockData.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultValueArray->Value, &DefaultValueData->Value, sizeof (EFI_IFR_TYPE_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueArray->Type = DefaultValueData->Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueArray->Cleaned = DefaultValueData->Cleaned;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert new default value data in tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueArray = AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (DefaultValueArray != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (DefaultValueArray, DefaultValueData, sizeof (IFR_DEFAULT_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &DefaultValueArray->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function inserts new BlockData into the block link
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockLink The list entry points to block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockData The point to BlockData is added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInsertBlockData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN LIST_ENTRY *BlockLink,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IFR_BLOCK_DATA **BlockData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockSingleData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockSingleData = *BlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert block data in its Offset and Width order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = BlockLink->ForwardLink; Link != BlockLink; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockArray = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockArray->Offset == BlockSingleData->Offset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockArray->Width > BlockSingleData->Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert this block data in the front of block array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &BlockSingleData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockArray->Width == BlockSingleData->Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The same block array has been added.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockSingleData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BlockData = BlockArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (BlockArray->Offset > BlockSingleData->Offset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert new block data in the front of block array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &BlockSingleData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add new block data into the tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &BlockSingleData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function checks VarOffset and VarWidth is in the block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestBlockArray The block array is to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VarOffset Offset of var to the structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VarWidth Width of var.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE This Var is in the block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE This Var is not in the block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBlockArrayCheck (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IFR_BLOCK_DATA *RequestBlockArray,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarWidth
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No Request Block array, all vars are got.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequestBlockArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the input var is in the request block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = RequestBlockArray->Entry.ForwardLink; Link != &RequestBlockArray->Entry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset >= BlockData->Offset) && ((VarOffset + VarWidth) <= (BlockData->Offset + BlockData->Width))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get form package data from data base.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HiiFormPackage The buffer saves the package data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PackageSize The buffer size of the package data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetFormPackageData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN HII_DATABASE_RECORD *DataBaseRecord,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 **HiiFormPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *PackageSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ResultSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataBaseRecord == NULL || HiiFormPackage == NULL || PackageSize == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 0. Get Hii Form Package by HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ExportFormPackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mPrivate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBaseRecord->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBaseRecord->PackageList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFormPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ResultSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*HiiFormPackage) = AllocatePool (ResultSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*HiiFormPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get HiiFormPackage by HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = ResultSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ExportFormPackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mPrivate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBaseRecord->Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBaseRecord->PackageList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *HiiFormPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ResultSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*HiiFormPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PackageSize = Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function parses Form Package to get the efi varstore info according to the request ConfigHdr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigHdr Request string ConfigHdr. If it is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first found varstore will be as ConfigHdr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param IsEfiVarstore Whether the request storage type is efi varstore type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EfiVarStore The efi varstore info which will return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetVarStoreType (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN HII_DATABASE_RECORD *DataBaseRecord,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING ConfigHdr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *IsEfiVarstore,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IFR_VARSTORE_EFI **EfiVarStore
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN IfrOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING GuidStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING NameStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LengthString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *HiiFormPackage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PackageSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFormPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (IfrOffset < PackageSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOpHdr->OpCode == EFI_IFR_VARSTORE_EFI_OP ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the length is small than the structure, this is from old efi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // varstore definition. Old efi varstore get config directly from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // GetVariable function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr ((CHAR8 *) IfrEfiVarStore->Name, VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &IfrEfiVarStore->Guid, 1, &GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", StrLen (VarStoreName) * sizeof (CHAR16), (VOID *) VarStoreName, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = StrLen (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = LengthString + StrLen (NameStr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (TempStr, GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempStr, NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr == NULL || StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EfiVarStore = (EFI_IFR_VARSTORE_EFI *) AllocateZeroPool (IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*EfiVarStore == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *IsEfiVarstore = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (*EfiVarStore, IfrEfiVarStore, IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free alllocated temp string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiFormPackage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiFormPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function parses Form Package to get the block array and the default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value array according to the request ConfigHdr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Package Pointer to the form package data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PackageLength Length of the pacakge.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigHdr Request string ConfigHdr. If it is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first found varstore will be as ConfigHdr.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestBlockArray The block array is retrieved from the request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VarStorageData VarStorage structure contains the got block and default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PIfrDefaultIdArray Point to the got default id and default name array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The block array and the default value array are got.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The varstore defintion in the differnt form pacakges
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are conflicted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES No enough memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncParseIfrData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Package,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 PackageLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING ConfigHdr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IFR_BLOCK_DATA *RequestBlockArray,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IFR_VARSTORAGE_DATA *VarStorageData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT IFR_DEFAULT_DATA *DefaultIdArray
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN IfrOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE *IfrVarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF *IfrOneOf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_REF4 *IfrRef;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_DEFAULT *IfrDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ORDERED_LIST *IfrOrderedList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_CHECKBOX *IfrCheckBox;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_PASSWORD *IfrPassword;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_STRING *IfrString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA DefaultData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA *DefaultDataPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VarDefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING GuidStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING NameStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LengthString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN FirstOneOfOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *LinkData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *LinkDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstOneOfOption = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DefaultData, sizeof (IFR_DEFAULT_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through the form package to parse OpCode one by one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (IfrOffset < PackageLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) (Package + IfrOffset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (IfrOpHdr->OpCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_VARSTORE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // VarStore is found. Don't need to search any more.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the requied varstore information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add varstore by Guid and Name in ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Offset is in varstore size and varstoreid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr ((CHAR8 *) IfrVarStore->Name, VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &IfrVarStore->Guid, 1, &GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", StrLen (VarStoreName) * sizeof (CHAR16), (VOID *) VarStoreName, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = StrLen (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = LengthString + StrLen (NameStr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (TempStr, GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempStr, NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr == NULL || StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the matched VarStore
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrVarStore->Guid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->VarStoreId = IfrVarStore->VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->Size = IfrVarStore->Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->Name = VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No found, free the allocated memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free alllocated temp string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_VARSTORE_EFI_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // VarStore is found. Don't need to search any more.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the requied varstore information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add varstore by Guid and Name in ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure Offset is in varstore size and varstoreid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the length is small than the structure, this is from old efi
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // varstore definition. Old efi varstore get config directly from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // GetVariable function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOpHdr->Length < sizeof (EFI_IFR_VARSTORE_EFI)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr ((CHAR8 *) IfrEfiVarStore->Name, VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &IfrEfiVarStore->Guid, 1, &GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", StrLen (VarStoreName) * sizeof (CHAR16), (VOID *) VarStoreName, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = StrLen (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LengthString = LengthString + StrLen (NameStr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = AllocateZeroPool (LengthString * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (TempStr, GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (TempStr, NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr == NULL || StrnCmp (ConfigHdr, TempStr, StrLen (TempStr)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the matched VarStore
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrEfiVarStore->Guid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->VarStoreId = IfrEfiVarStore->VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->Size = IfrEfiVarStore->Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData->Name = VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No found, free the allocated memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free alllocated temp string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DEFAULTSTORE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add new the map between default id and default name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultDataPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr->DefaultId = ((EFI_IFR_DEFAULTSTORE *) IfrOpHdr)->DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&DefaultIdArray->Entry, &DefaultDataPtr->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FORM_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FORM_MAP_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No matched varstore is found and directly return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_REF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ref question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrRef->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = (UINT16) (sizeof (EFI_HII_REF));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset + VarWidth) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrRef->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope = IfrOpHdr->Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric and OneOf has the same opcode structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric and OneOf question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOneOf = (EFI_IFR_ONE_OF *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOneOf->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrOneOf->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = (UINT16) (1 << (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset + VarWidth) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrOneOf->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope = IfrOpHdr->Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOpHdr->OpCode == EFI_IFR_ONE_OF_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set this flag to TRUE for the first oneof option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstOneOfOption = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrOpHdr->OpCode == EFI_IFR_NUMERIC_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric minimum value will be used as default value when no default is specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Value.u8 = IfrOneOf->data.u8.MinValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value.u16, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value.u32, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value.u64, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set default value base on the DefaultId list get from IFR data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = DefaultDataPtr->DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ORDERED_LIST_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // offset by question header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // width by EFI_IFR_ORDERED_LIST MaxContainers * OneofOption Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no default value and default id, how to define its default value?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OrderedList question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOrderedList = (EFI_IFR_ORDERED_LIST *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOrderedList->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrOrderedList->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = IfrOrderedList->MaxContainers;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrOrderedList->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope = IfrOpHdr->Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_CHECKBOX_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // EFI_IFR_DEFAULT_OP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // offset by question header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // width is 1 sizeof (BOOLEAN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // default id by CheckBox Flags if CheckBox flags (Default or Mau) is set, the default value is 1 to be set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // value by DefaultOption
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // default id by DeaultOption DefaultId can override CheckBox Flags and Default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CheckBox question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrCheckBox = (EFI_IFR_CHECKBOX *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrCheckBox->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrCheckBox->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = (UINT16) sizeof (BOOLEAN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset + VarWidth) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrCheckBox->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope = IfrOpHdr->Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add default value for standard ID by CheckBox Flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare new DefaultValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = VarDefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT) == EFI_IFR_CHECKBOX_DEFAULT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When flag is set, defautl value is TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When flag is not set, defautl value is FASLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add DefaultValue into current BlockData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add default value for Manufacture ID by CheckBox Flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare new DefaultValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = VarDefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrCheckBox->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) == EFI_IFR_CHECKBOX_DEFAULT_MFG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When flag is set, defautl value is TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Value.b = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // When flag is not set, defautl value is FASLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Value.b = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add DefaultValue into current BlockData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // offset by question header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // width MaxSize * sizeof (CHAR16)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no default value, only block array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // String question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrString = (EFI_IFR_STRING *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrString->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrString->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = (UINT16) (IfrString->MaxSize * sizeof (UINT16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset + VarWidth) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrString->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No default value for string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_PASSWORD_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // offset by question header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // width MaxSize * sizeof (CHAR16)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no default value, only block array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Password question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrPassword = (EFI_IFR_PASSWORD *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrPassword->Question.VarStoreId != VarStorageData->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarOffset = IfrPassword->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = (UINT16) (IfrPassword->MaxSize * sizeof (UINT16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarOffset + VarWidth) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = VarWidth;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->QuestionId = IfrPassword->Question.QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&BlockData->DefaultValueEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No default value for string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OF_OPTION_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No matched block data is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL || BlockData->Scope == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOneOfOption = (EFI_IFR_ONE_OF_OPTION *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData->OpCode == EFI_IFR_ORDERED_LIST_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get ordered list option data type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_8 || IfrOneOfOption->Type == EFI_IFR_TYPE_BOOLEAN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_16) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_32) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrOneOfOption->Type == EFI_IFR_TYPE_NUM_SIZE_64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarWidth = 8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid ordered list option data type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate Ordered list QuestionId width.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = (UINT16) (BlockData->Width * VarWidth);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in requested block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (RequestBlockArray, BlockData->Offset, BlockData->Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the requested string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((BlockData->Offset + BlockData->Width) > VarStorageData->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add Block Data into VarStorageData BlockEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&VarStorageData->BlockEntry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No default data for OrderedList.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Set default value for OneOf option when flag field has default attribute.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This flag is used to specify whether this option is the first. Set it to FALSE for the following options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The first oneof option value will be used as default value when no default value is specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstOneOfOption = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare new DefaultValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT_MFG) == EFI_IFR_OPTION_DEFAULT_MFG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Set as the default value when this is the first option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The first oneof option value will be used as default value when no default value is specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FirstOneOfOption) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This flag is used to specify whether this option is the first. Set it to FALSE for the following options.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstOneOfOption = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare new DefaultValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value.u64, &IfrOneOfOption->Value.u64, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkData = DefaultIdArray->Entry.ForwardLink; LinkData != &DefaultIdArray->Entry; LinkData = LinkData->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = BASE_CR (LinkData, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = DefaultDataPtr->DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_DEFAULT_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update Current BlockData to the default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL || BlockData->Scope == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No matched block data is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData->OpCode == EFI_IFR_ORDERED_LIST_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OrderedList Opcode is no default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the DefaultId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDefault = (EFI_IFR_DEFAULT *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarDefaultId = IfrDefault->DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare new DefaultValue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Type = DefaultValueFromOpcode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.DefaultId = VarDefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DefaultData.Value, &IfrDefault->Value, sizeof (EFI_IFR_TYPE_VALUE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the value field is expression, set the cleaned flag.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrDefault->Type == EFI_IFR_TYPE_OTHER) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Cleaned = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add DefaultValue into current BlockData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertDefaultValue (BlockData, &DefaultData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After insert the default value, reset the cleaned value for next
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // time used. If not set here, need to set the value before everytime
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // use it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultData.Cleaned = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_END_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // End Opcode is for Var question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData != NULL && BlockData->Scope > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData != NULL && BlockData->Scope > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkData = VarStorageData->BlockEntry.ForwardLink; LinkData != &VarStorageData->BlockEntry; LinkData = LinkData->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (LinkData, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkDefault = BlockData->DefaultValueEntry.ForwardLink; LinkDefault != &BlockData->DefaultValueEntry; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultDataPtr = BASE_CR (LinkDefault, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinkDefault = LinkDefault->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultDataPtr->Cleaned == TRUE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&DefaultDataPtr->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultDataPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function gets the full request string and full default value string by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parsing IFR data in HII form packages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When Request points to NULL string, the request string and default value string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for each varstore in form package will return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath Device Path which Hii Config Access Protocol is registered.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigRequest> format. When it doesn't contain
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync any RequestElement, it will be updated to return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the full RequestElement retrieved from IFR data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it points to NULL, the request string for the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync varstore in form package will be merged into a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format string and return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AltCfgResp Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigAltResp> format. When the pointer is to NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the full default value string retrieved from IFR data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will return. When the pinter is to a string, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync full default value string retrieved from IFR data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be merged into the input string and return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When Request points to NULL, the default value string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for each varstore in form package will be merged into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a <MultiConfigAltResp> format string and return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PointerProgress Optional parameter, it can be be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When it is not NULL, if Request is NULL, it returns NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On return, points to a character in the Request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string. Points to the string's null terminator if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync request was successful. Points to the most recent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync & before the first failing name / value pair (or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the beginning of the string if the failure is in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first name / value pair) if the request was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is set to the full request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync And AltCfgResp contains all default value string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory for the return string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The varstore (Guid and Name) in Request string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync can't be found in Form package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND HiiPackage can't be got on the input HiiHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Request points to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetFullStringFromHiiFormPackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN HII_DATABASE_RECORD *DataBaseRecord,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_STRING *Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_STRING *AltCfgResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *PointerProgress OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *HiiFormPackage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PackageSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *RequestBlockArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *NextBlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA *DefaultValueData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA *DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_DEFAULT_DATA *DefaultIdArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_VARSTORAGE_DATA *VarStorageData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING DefaultAltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING FullConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING GuidStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING NameStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING PathStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *LinkData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *LinkDefault;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN DataExist;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataBaseRecord == NULL || DevicePath == NULL || Request == NULL || AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the local variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequestBlockArray = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultIdArray = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultAltCfgResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFormPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataExist = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress = *Request;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Get the request block array by Request String when Request string containts the block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Request != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = *Request;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump <ConfigHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"GUID=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&NAME=", StrLen (L"&NAME=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&NAME=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&PATH=", StrLen (L"&PATH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr ++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the following string &OFFSET=
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != L'\0' && StrnCmp (StringPtr, L"&OFFSET=", StrLen (L"&OFFSET=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No request block is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Init RequestBlockArray
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RequestBlockArray = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequestBlockArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&RequestBlockArray->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the request Block array from the request string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Offset and Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse each <RequestElement> if exists
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only <BlockName> format is supported by this help function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <BlockName> ::= &'OFFSET='<Number>&'WIDTH='<Number>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"&OFFSET=", StrLen (L"&OFFSET=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the OFFSET string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&OFFSET=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINT16)) ? ((Length + 1) / 2) : sizeof (UINT16)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&WIDTH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINT16)) ? ((Length + 1) / 2) : sizeof (UINT16)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0 && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset = Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertBlockData (&RequestBlockArray->Entry, &BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip &VALUE string if &VALUE does exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&VALUE=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0 && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If '\0', parsing is finished.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Merge the requested block data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = RequestBlockArray->Entry.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Link != &RequestBlockArray->Entry) && (Link->ForwardLink != &RequestBlockArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextBlockData = BASE_CR (Link->ForwardLink, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NextBlockData->Offset >= BlockData->Offset) && (NextBlockData->Offset <= (BlockData->Offset + BlockData->Width))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NextBlockData->Offset + NextBlockData->Width) > (BlockData->Offset + BlockData->Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = (UINT16) (NextBlockData->Offset + NextBlockData->Width - BlockData->Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (Link->ForwardLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NextBlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Parse FormPackage to get BlockArray and DefaultId Array for the request BlockArray.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize DefaultIdArray to store the map between DeaultId and DefaultName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultIdArray = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultIdArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&DefaultIdArray->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize VarStorageData to store the var store Block and Default value information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStorageData = (IFR_VARSTORAGE_DATA *) AllocateZeroPool (sizeof (IFR_VARSTORAGE_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&VarStorageData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&VarStorageData->BlockEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse the opcode in form pacakge to get the default setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ParseIfrData (HiiFormPackage, (UINT32) PackageSize, *Request, RequestBlockArray, VarStorageData, DefaultIdArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No requested varstore in IFR data and directly return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData->Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 3. Construct Request Element (Block Name) for 2.1 and 2.2 case.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct <ConfigHdr> : "GUID=...&NAME=...&PATH=..." by VarStorageData Guid, Name and DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) &VarStorageData->Guid, 1, &GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", StrLen (VarStorageData->Name) * sizeof (CHAR16), (VOID *) VarStorageData->Name, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"PATH=",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &PathStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StrLen (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = Length + StrLen (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = Length + StrLen (PathStr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr = AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (ConfigHdr, GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (ConfigHdr, NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (ConfigHdr, PathStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the last character L'&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(ConfigHdr + StrLen (ConfigHdr) - 1) = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequestBlockArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append VarStorageData BlockEntry into *Request string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now support only one varstore in a form package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through all VarStorageData Entry and get BlockEntry for each one for the multiple varstore in a single form package
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Then construct them all to return MultiRequest string : ConfigHdr BlockConfig
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the length of the entire request starting with <ConfigHdr> and a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataExist = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StrLen (ConfigHdr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = VarStorageData->BlockEntry.ForwardLink; Link != &VarStorageData->BlockEntry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add <BlockName> length for each Offset/Width pair
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <BlockName> ::= &OFFSET=1234&WIDTH=1234
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // | 8 | 4 | 7 | 4 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataExist = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = Length + (8 + 4 + 7 + 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No any request block data is found. The request string can't be constructed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DataExist) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffer for the entire <ConfigRequest>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FullConfigRequest = AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FullConfigRequest == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = FullConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start with <ConfigHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringPtr, ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Loop through all the Offset/Width pairs and append them to ConfigRequest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = VarStorageData->BlockEntry.ForwardLink; Link != &VarStorageData->BlockEntry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append &OFFSET=XXXX&WIDTH=YYYY\0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (8 + 4 + 7 + 4 + 1) * sizeof (CHAR16),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"&OFFSET=%04X&WIDTH=%04X",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set to the got full request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiToLower (FullConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Request != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*Request);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Request = FullConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 4. Construct Default Value string in AltResp according to request element.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through all VarStorageData Entry and get the DefaultId array for each one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Then construct them all to : ConfigHdr AltConfigHdr ConfigBody AltConfigHdr ConfigBody
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataExist = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add length for <ConfigHdr> + '\0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StrLen (ConfigHdr) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = DefaultIdArray->Entry.ForwardLink; Link != &DefaultIdArray->Entry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add length for "&<ConfigHdr>&ALTCFG=XXXX"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // |1| StrLen (ConfigHdr) | 8 | 4 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += (1 + StrLen (ConfigHdr) + 8 + 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkData = VarStorageData->BlockEntry.ForwardLink; LinkData != &VarStorageData->BlockEntry; LinkData = LinkData->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (LinkData, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkDefault = BlockData->DefaultValueEntry.ForwardLink; LinkDefault != &BlockData->DefaultValueEntry; LinkDefault = LinkDefault->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueData = BASE_CR (LinkDefault, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultValueData->DefaultId == DefaultId->DefaultId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add length for "&OFFSET=XXXX&WIDTH=YYYY&VALUE=zzzzzzzzzzzz"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // | 8 | 4 | 7 | 4 | 7 | Width * 2 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += (8 + 4 + 7 + 4 + 7 + BlockData->Width * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataExist = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No default value is found. The default string doesn't exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DataExist) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffer for the entire <DefaultAltCfgResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultAltCfgResp = AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultAltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = DefaultAltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start with <ConfigHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (StringPtr, ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = DefaultIdArray->Entry.ForwardLink; Link != &DefaultIdArray->Entry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId = BASE_CR (Link, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add <AltConfigHdr> of the form "&<ConfigHdr>&ALTCFG=XXXX\0"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // |1| StrLen (ConfigHdr) | 8 | 4 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (1 + StrLen (ConfigHdr) + 8 + 4 + 1) * sizeof (CHAR16),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"&%s&ALTCFG=%04X",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId->DefaultId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkData = VarStorageData->BlockEntry.ForwardLink; LinkData != &VarStorageData->BlockEntry; LinkData = LinkData->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (LinkData, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LinkDefault = BlockData->DefaultValueEntry.ForwardLink; LinkDefault != &BlockData->DefaultValueEntry; LinkDefault = LinkDefault->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueData = BASE_CR (LinkDefault, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultValueData->DefaultId == DefaultId->DefaultId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add <BlockConfig>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE'=<Number>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (8 + 4 + 7 + 4 + 7 + 1) * sizeof (CHAR16),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"&OFFSET=%04X&WIDTH=%04X&VALUE=",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Value to a hex string in "%x" format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NOTE: This is in the opposite byte that GUID and PATH use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = BlockData->Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer = (UINT8 *) &(DefaultValueData->Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; Width > 0; Width--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += UnicodeValueToString (StringPtr, PREFIX_ZERO | RADIX_HEX, TmpBuffer[Width - 1], 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiToLower (DefaultAltCfgResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 5. Merge string into the input AltCfgResp if the iput *AltCfgResp is not NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*AltCfgResp != NULL && DefaultAltCfgResp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = MergeDefaultString (AltCfgResp, DefaultAltCfgResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultAltCfgResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (*AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AltCfgResp = DefaultAltCfgResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequestBlockArray != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free Link Array RequestBlockArray
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&RequestBlockArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (RequestBlockArray->Entry.ForwardLink, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&BlockData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (RequestBlockArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStorageData != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free link array VarStorageData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&VarStorageData->BlockEntry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (VarStorageData->BlockEntry.ForwardLink, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&BlockData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free default value link array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&BlockData->DefaultValueEntry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultValueData = BASE_CR (BlockData->DefaultValueEntry.ForwardLink, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&DefaultValueData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultValueData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStorageData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultIdArray != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free DefaultId Array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&DefaultIdArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultId = BASE_CR (DefaultIdArray->Entry.ForwardLink, IFR_DEFAULT_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&DefaultId->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultIdArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GuidStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NameStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PathStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (PathStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free Pacakge data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiFormPackage != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiFormPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PointerProgress != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Request == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PointerProgress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PointerProgress = Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PointerProgress = *Request + StrLen (*Request);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function gets the full request resp string by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parsing IFR data in HII form packages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EfiVarStoreInfo The efi varstore info which is save in the EFI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync varstore data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigRequest> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestResp Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AccessProgress On return, points to a character in the Request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string. Points to the string's null terminator if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync request was successful. Points to the most recent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync & before the first failing name / value pair (or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the beginning of the string if the failure is in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first name / value pair) if the request was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is set to the full request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync And AltCfgResp contains all default value string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory for the return string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Request points to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetConfigRespFromEfiVarStore (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *RequestResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *AccessProgress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *VarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStore = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr ((CHAR8 *) EfiVarStoreInfo->Name, VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStore = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (VarStore != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, VarStore);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HiiBlockToConfig(This, Request, VarStore, BufferSize, RequestResp, AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStore != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStore);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function route the full request resp string for efi varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EfiVarStoreInfo The efi varstore info which is save in the EFI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync varstore data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param RequestResp Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Result Pointer to a null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is set to the full request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync And AltCfgResp contains all default value string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory for the return string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Request points to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRouteConfigRespForEfiVarStore (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING RequestResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *VarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStore = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr ((CHAR8 *) EfiVarStoreInfo->Name, VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockSize = BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStore = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (VarStore != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (VarStoreName, &EfiVarStoreInfo->Guid, NULL, &BufferSize, VarStore);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HiiConfigToBlock(This, RequestResp, VarStore, &BlockSize, Result);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable (VarStoreName, &EfiVarStoreInfo->Guid, EfiVarStoreInfo->Attributes, BufferSize, VarStore);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStoreName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStoreName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarStore != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarStore);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allows a caller to extract the current configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for one or more named elements from one or more drivers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Progress On return, points to a character in the Request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string. Points to the string's null terminator if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync request was successful. Points to the most recent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync & before the first failing name / value pair (or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the beginning of the string if the failure is in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first name / value pair) if the request was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync not successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Results Null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp> format which has all values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync filled in for the names in the Request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String to be allocated by the called function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is filled with the values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync corresponding to all requested names.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to store the parts of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync results that must be stored awaiting possible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync future protocols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Routing data doesn't match any known driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress set to the "G" in "GUID" of the routing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync header that doesn't match. Note: There is no
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync requirement that all routing data be validated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync before any configuration extraction.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER For example, passing in a NULL for the Request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter would result in this type of error. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress parameter is set to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set to most recent &
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync before the error or the beginning of the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Unknown name. Progress points to the & before the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name in question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiConfigRoutingExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Results
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_RECORD *Database;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DevicePathPkg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *CurrentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessProgress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessResults;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING DefaultResults;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN FirstElement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IfrDataParsedFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsEfiVarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Progress == NULL || Results == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Request == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = Request;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessProgress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDataParsedFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsEfiVarStore = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiVarStoreInfo = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The first element of <MultiConfigRequest> should be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <GuidHdr>, which is in 'GUID='<Guid> syntax.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstElement = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a fix length of memory to store Results. Reallocate memory for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Results if this fix length is insufficient.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Results = (EFI_STRING) AllocateZeroPool (MAX_STRING_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Results == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If parsing error, set Progress to the beginning of the <MultiConfigRequest>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // or most recent & before the error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == Request) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Process each <ConfigRequest> of <MultiConfigRequest>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = CalculateConfigStringLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigRequest == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(ConfigRequest + Length) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the UEFI device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetDevicePath (ConfigRequest, (UINT8 **) &DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find driver which matches the routing data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = Private->DatabaseList.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link != &Private->DatabaseList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle = Database->DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = Database->Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to find driver handle by device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (DriverHandle == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Routing data does not match any known driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Progress to the 'G' in "GUID" of the routing header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether ConfigRequest contains request string OFFSET/WIDTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDataParsedFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HiiHandle != NULL) && (StrStr (ConfigRequest, L"&OFFSET=") == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the full request string from IFR when HiiPackage is registered to HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDataParsedFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults, &AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // AccessProgress indicates the parsing progress on <ConfigRequest>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Map it to the progress on <MultiConfigRequest> then return it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StrStr (StringPtr, AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not any request block is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr (ConfigRequest, L"&OFFSET=") == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults = AllocateCopyPool (StrSize (ConfigRequest), ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto NextConfigString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this ConfigRequest is search from Efi varstore type storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetVarStoreType(Database, ConfigRequest, &IsEfiVarStore, &EfiVarStoreInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsEfiVarStore) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call the GetVariable function to extract settings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetConfigRespFromEfiVarStore(This, EfiVarStoreInfo, ConfigRequest, &AccessResults, &AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (EfiVarStoreInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call corresponding ConfigAccess protocol to extract settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ConfigAccess
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ConfigAccess->ExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessProgress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessResults
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // AccessProgress indicates the parsing progress on <ConfigRequest>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Map it to the progress on <MultiConfigRequest> then return it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StrStr (StringPtr, AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Attach this <ConfigAltResp> to a <MultiConfigAltResp>. There is a '&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // which seperates the first <ConfigAltResp> and the following ones.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (*AccessProgress == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update AccessResults by getting default setting from IFR when HiiPackage is registered to HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IfrDataParsedFlag && HiiHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultResults != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = MergeDefaultString (&AccessResults, DefaultResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNextConfigString:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!FirstElement) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AppendToMultiString (Results, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AppendToMultiString (Results, AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstElement = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to next <ConfigRequest> (skip '&').
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*Results);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Results = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigRequest != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AccessResults != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultResults != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allows the caller to request the current configuration for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entirety of the current HII database and returns the data in a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Results Null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp> format which has all values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync filled in for the names in the Request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String to be allocated by the called function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync De-allocation is up to the caller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is filled with the values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync corresponding to all requested names.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to store the parts of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync results that must be stored awaiting possible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync future protocols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER For example, passing in a NULL for the Results
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter would result in this type of error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiConfigRoutingExportConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Results
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessResults;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *ConfigAccessHandles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NumberConfigAccessHandles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN FirstElement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING DefaultResults;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_RECORD *Database;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DevicePathPkg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *CurrentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IfrDataParsedFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Results == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a fix length of memory to store Results. Reallocate memory for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Results if this fix length is insufficient.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Results = (EFI_STRING) AllocateZeroPool (MAX_STRING_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Results == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NumberConfigAccessHandles = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandleBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ByProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NumberConfigAccessHandles,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ConfigAccessHandles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstElement = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < NumberConfigAccessHandles; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccessHandles[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ConfigAccess
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get DevicePath and HiiHandle for this ConfigAccess driver handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDataParsedFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevicePathFromHandle (ConfigAccessHandles[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = Private->DatabaseList.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link != &Private->DatabaseList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = Database->Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ConfigAccess->ExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Progress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessResults
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update AccessResults by getting default setting from IFR when HiiPackage is registered to HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandle != NULL && DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrDataParsedFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &ConfigRequest, &DefaultResults, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the full request string to get the Current setting again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && ConfigRequest != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ConfigAccess->ExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Progress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessResults
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update AccessResults by getting default setting from IFR when HiiPackage is registered to HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IfrDataParsedFlag && HiiHandle != NULL && DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (AccessResults, L"&GUID=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtr = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr (AccessResults, L"&OFFSET=") != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetFullStringFromHiiFormPackages (Database, DevicePath, &AccessResults, &DefaultResults, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtr = L'&';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Merge the default sting from IFR code into the got setting from driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultResults != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = MergeDefaultString (&AccessResults, DefaultResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DefaultResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Attach this <ConfigAltResp> to a <MultiConfigAltResp>. There is a '&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // which seperates the first <ConfigAltResp> and the following ones.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!FirstElement) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AppendToMultiString (Results, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = AppendToMultiString (Results, AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstElement = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigAccessHandles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function processes the results of processing forms and routes it to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync appropriate handlers or storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Configuration A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MulltiConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Progress A pointer to a string filled in with the offset of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the most recent & before the first failing name /
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value pair (or the beginning of the string if the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync failure is in the first name / value pair) or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminating NULL if all was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The results have been distributed or are awaiting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to store the parts of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync results that must be stored awaiting possible
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync future protocols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Passing in a NULL for the Configuration parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync would result in this type of error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Target for the specified routing data was not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiConfigRoutingRouteConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Configuration,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_RECORD *Database;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DevicePathPkg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *CurrentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessProgress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE_EFI *EfiVarStoreInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsEfiVarstore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Progress == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Configuration == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = Configuration;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessProgress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EfiVarStoreInfo= NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsEfiVarstore = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The first element of <MultiConfigResp> should be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <GuidHdr>, which is in 'GUID='<Guid> syntax.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If parsing error, set Progress to the beginning of the <MultiConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // or most recent & before the error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == Configuration) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Process each <ConfigResp> of <MultiConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = CalculateConfigStringLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append '\0' to the end of ConfigRequest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(ConfigResp + Length) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the UEFI device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetDevicePath (ConfigResp, (UINT8 **) &DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find driver which matches the routing data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = Private->DatabaseList.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link != &Private->DatabaseList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle = Database->DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to find driver handle by device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (DriverHandle == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Routing data does not match any known driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Progress to the 'G' in "GUID" of the routing header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this ConfigRequest is search from Efi varstore type storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetVarStoreType(Database, ConfigResp, &IsEfiVarstore, &EfiVarStoreInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsEfiVarstore) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call the SetVariable function to route settings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = RouteConfigRespForEfiVarStore(This, EfiVarStoreInfo, ConfigResp, &AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (EfiVarStoreInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call corresponding ConfigAccess protocol to route settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ConfigAccess
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ConfigAccess->RouteConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessProgress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // AccessProgress indicates the parsing progress on <ConfigResp>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Map it to the progress on <MultiConfigResp> then return it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StrStr (StringPtr, AccessProgress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to next <ConfigResp> (skip '&').
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This helper function is to be called by drivers to map configuration data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stored in byte array ("block") formats such as UEFI Variables into current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration strings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigRequest A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigRequest> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Block Array of bytes defining the block's configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockSize Length in bytes of Block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Config Filled-in configuration string. String allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the function. Returned only if call is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successful. It is <ConfigResp> string format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Progress A pointer to a string filled in with the offset of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the most recent & before the first failing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name/value pair (or the beginning of the string if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the failure is in the first name / value pair) or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the terminating NULL if all was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request succeeded. Progress points to the null
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminator at the end of the ConfigRequest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to allocate Config. Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync points to the first character of ConfigRequest.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Passing in a NULL for the ConfigRequest or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block parameter would result in this type of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error. Progress points to the first character of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Block not large enough. Progress undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Encountered non <BlockName> formatted string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block is left updated and Progress points at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the "&" preceding the first non-<BlockName>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiBlockToConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT8 *Block,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN BlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ValueStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigElement;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TemBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TemString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Progress == NULL || Config == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Block == NULL || ConfigRequest == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Private != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigElement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a fix length of memory to store Results. Reallocate memory for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Results if this fix length is insufficient.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Config = (EFI_STRING) AllocateZeroPool (MAX_STRING_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Config == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump <ConfigHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"PATH=", StrLen (L"PATH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'&' && *StringPtr != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToMultiString(Config, ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiToLower (*Config);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip '&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy <ConfigHdr> and an additional '&' to <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemChar = *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtr = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToMultiString(Config, ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StringPtr = TemChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse each <RequestElement> if exists
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only <BlockName> format is supported by this help function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <BlockName> ::= 'OFFSET='<Number>&'WIDTH='<Number>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"OFFSET=", StrLen (L"OFFSET=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Back up the header of one <BlockName>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"OFFSET=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - Length - StrLen (L"OFFSET=") - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&WIDTH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0 && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - Length - StrLen (L"&WIDTH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate Value and convert it to hex string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset + Width > BlockSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = (UINT8 *) AllocateZeroPool (Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Value, (UINT8 *) Block + Offset, Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = Width * 2 + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueStr = (EFI_STRING) AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ValueStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString = ValueStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemBuffer = Value + Width - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Width; Index ++, TemBuffer --) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build a ConfigElement
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += StringPtr - TmpPtr + 1 + StrLen (L"VALUE=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigElement = (EFI_STRING) AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigElement == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (ConfigElement, TmpPtr, (StringPtr - TmpPtr + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(ConfigElement + (StringPtr - TmpPtr)) = L'&';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(ConfigElement + (StringPtr - TmpPtr) + 1) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (ConfigElement, L"VALUE=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (ConfigElement, ValueStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToMultiString (Config, ConfigElement);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigElement);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ValueStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigElement = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If '\0', parsing is finished. Otherwise skip '&' to continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToMultiString (Config, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiToLower (*Config);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Config != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (*Config);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Config = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ValueStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ValueStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigElement != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigElement);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This helper function is to be called by drivers to map configuration strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to configurations stored in byte array ("block") formats such as UEFI Variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigResp A null-terminated Unicode string in <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Block A possibly null array of bytes representing the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current block. Only bytes referenced in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp string in the block are modified. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this parameter is null or if the *BlockSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter is (on input) shorter than required by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the Configuration string, only the BlockSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter is updated and an appropriate status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (see below) is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockSize The length of the Block in units of UINT8. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync input, this is the size of the Block. On output,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if successful, contains the index of the last
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync modified byte in the Block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Progress On return, points to an element of the ConfigResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string filled in with the offset of the most
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync recent '&' before the first failing name / value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pair (or the beginning of the string if the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync failure is in the first name / value pair) or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminating NULL if all was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request succeeded. Progress points to the null
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminator at the end of the ConfigResp string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to allocate Config. Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync points to the first character of ConfigResp.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Passing in a NULL for the ConfigResp or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block parameter would result in this type of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error. Progress points to the first character of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Encountered non <BlockName> formatted name /
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value pair. Block is left updated and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress points at the '&' preceding the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync non-<BlockName>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Block not large enough. Progress undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Target for the specified routing data was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress points to the "G" in "GUID" of the errant
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiConfigToBlock (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 *Block,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_DATABASE_PRIVATE_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MaxBlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || BlockSize == NULL || Progress == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Private != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = *BlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxBlockSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump <ConfigHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"PATH=", StrLen (L"PATH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'&' && *StringPtr != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip '&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse each <ConfigElement> if exists
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only <BlockConfig> format is supported by this help function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE='<Number>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0 && StrnCmp (StringPtr, L"OFFSET=", StrLen (L"OFFSET=")) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"OFFSET=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Offset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - Length - StrLen (L"OFFSET=") - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&WIDTH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Width
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Width,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (((Length + 1) / 2) < sizeof (UINTN)) ? ((Length + 1) / 2) : sizeof (UINTN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - Length - StrLen (L"&WIDTH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&VALUE=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetValueOfNumber (StringPtr, &Value, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0 && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - Length - 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the Block with configuration info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Block != NULL) && (Offset + Width <= BufferSize)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Block + Offset, Value, Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset + Width > MaxBlockSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxBlockSize = Offset + Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If '\0', parsing is finished. Otherwise skip '&' to continue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The input string is ConfigAltResp format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*StringPtr != 0) && (StrnCmp (StringPtr, L"&GUID=", StrLen (L"&GUID=")) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = StringPtr + StrLen (StringPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BlockSize = MaxBlockSize - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MaxBlockSize > BufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BlockSize = MaxBlockSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Block != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Block == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This helper function is to be called by drivers to extract portions of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a larger configuration string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Configuration A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigAltResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Guid A pointer to the GUID value to search for in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing portion of the ConfigResp string when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieving the requested data. If Guid is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then all GUID values will be searched for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Name A pointer to the NAME value to search for in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing portion of the ConfigResp string when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieving the requested data. If Name is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then all Name values will be searched for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to the PATH value to search for in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing portion of the ConfigResp string when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieving the requested data. If DevicePath is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, then all DevicePath values will be searched
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AltCfgId A pointer to the ALTCFG value to search for in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing portion of the ConfigResp string when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieving the requested data. If this parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL, then the current setting will be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param AltCfgResp A pointer to a buffer which will be allocated by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the function which contains the retrieved string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync as requested. This buffer is only allocated if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the call was successful. It is <ConfigResp> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The request succeeded. The requested data was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extracted and placed in the newly allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AltCfgResp buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to allocate AltCfgResp.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Target for the specified routing data was not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiGetAltCfg (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Configuration,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 *AltCfgId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *AltCfgResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING HdrStart;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING HdrEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING GuidStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING NameStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING PathStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AltIdStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN GuidFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN NameFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN PathFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HdrStart = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HdrEnd = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AltIdStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Configuration == NULL || AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = Configuration;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"GUID=", StrLen (L"GUID=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate the sub string for later matching.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) Guid, 1, &GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"PATH=",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &PathStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AltCfgId != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (VOID *) AltCfgId, 3, &AltIdStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GenerateSubStr (L"NAME=", 0, NULL, 2, &NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to match the GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!GuidFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpPtr = StrStr (StringPtr, GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TmpPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HdrStart = TmpPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump to <NameHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Guid != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = TmpPtr + StrLen (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (TmpPtr, L"NAME=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to match the NAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GuidFlag && !NameFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, NameStr, StrLen (NameStr)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump to <PathHdr>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (StringPtr, L"PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to match the DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GuidFlag && NameFlag && !PathFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, PathStr, StrLen (PathStr)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Jump to '&' before <DescHdr> or <ConfigBody>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (PathStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (StringPtr, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr ++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathFlag = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HdrEnd = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to match the AltCfgId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GuidFlag && NameFlag && PathFlag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AltCfgId == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return Current Setting when AltCfgId is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = OutputConfigBody (StringPtr, &Result);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search the <ConfigAltResp> to get the <AltResp> with AltCfgId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, AltIdStr, StrLen (AltIdStr)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GuidFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PathFlag = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip AltIdStr and &
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StringPtr + StrLen (AltIdStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = OutputConfigBody (StringPtr, &Result);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AltCfgResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && (Result != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the <ConfigHdr> and <ConfigBody>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = HdrEnd - HdrStart + StrLen (Result) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AltCfgResp = AllocateZeroPool (Length * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*AltCfgResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy (*AltCfgResp, HdrStart, HdrEnd - HdrStart);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (*AltCfgResp, Result);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GuidStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (GuidStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NameStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NameStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PathStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (PathStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AltIdStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AltIdStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Result);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync