4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Library implementation that uses DXE protocols and services.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "InternalHiiLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define GUID_CONFIG_STRING_TYPE 0x00
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NAME_CONFIG_STRING_TYPE 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define PATH_CONFIG_STRING_TYPE 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ACTION_SET_DEFAUTL_VALUE 0x01
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ACTION_VALIDATE_SETTING 0x02
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define HII_LIB_DEFAULT_VARSTORE_SIZE 0x200
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY Entry; // Link to Block array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} IFR_BLOCK_DATA;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// <ConfigHdr> Template
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR16 mConfigHdrTemplate[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=00";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FORM_BROWSER2_PROTOCOL *mUefiFormBrowser2 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Template used to mark the end of a list of packages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_HII_PACKAGE_HEADER mEndOfPakageList = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_HII_PACKAGE_HEADER),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_END
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Extract Hii package list GUID for given HII handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle could not be found in the HII database, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Guid is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Handle Hii handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Guid Package list GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Successfully extract GUID from Hii database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiExtractGuidFromHiiHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GUID *Guid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Guid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Handle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get HII PackageList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Status != EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiPackageList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Extract GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid (Guid, &HiiPackageList->PackageListGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers a list of packages in the HII Database and returns the HII Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync associated with that registration. If an HII Handle has already been registered
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with the same PackageListGuid and DeviceHandle, then NULL is returned. If there
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are not enough resources to perform the registration, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If an empty list of packages is passed in, then NULL is returned. If the size of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the list of package is 0, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The variable arguments are pointers which point to package header that defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by UEFI VFR compiler and StringGather tool.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #pragma pack (push, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync typedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 BinaryLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER PackageHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } EDKII_AUTOGEN_PACKAGES_HEADER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync #pragma pack (pop)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PackageListGuid The GUID of the package list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DeviceHandle If not NULL, the Device Handle on which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an instance of DEVICE_PATH_PROTOCOL is installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This Device Handle uniquely defines the device that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the added packages are associated with.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ... The variable argument list that contains pointers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to packages terminated by a NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL A HII Handle has already been registered in the HII Database with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the same PackageListGuid and DeviceHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The HII Handle could not be created.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL An empty list of packages was passed in.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL All packages are empty.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other The HII Handle associated with the newly registered package list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiAddPackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *PackageListGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE DeviceHandle OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Args;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 *Package;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (PackageListGuid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate the length of all the packages in the variable argument list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Length = 0, VA_START (Args, DeviceHandle); (Package = VA_ARG (Args, UINT32 *)) != NULL; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += (ReadUnaligned32 (Package) - sizeof (UINT32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Args);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there are no packages in the variable argument list or all the packages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // are empty, then return a NULL HII Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add the length of the Package List Header and the terminating Package Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += sizeof (EFI_HII_PACKAGE_LIST_HEADER) + sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate the storage for the entire Package List
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListHeader = AllocateZeroPool (Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Package List can not be allocated, then return a NULL HII Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PackageListHeader == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in the GUID and Length of the Package List Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid (&PackageListHeader->PackageListGuid, PackageListGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListHeader->PackageLength = Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize a pointer to the beginning if the Package List data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (UINT8 *)(PackageListHeader + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the data from each package in the variable argument list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (VA_START (Args, DeviceHandle); (Package = VA_ARG (Args, UINT32 *)) != NULL; ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = ReadUnaligned32 (Package) - sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Data, Package + 1, Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Args);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append a package of type EFI_HII_PACKAGE_END to mark the end of the package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Data, &mEndOfPakageList, sizeof (mEndOfPakageList));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Register the package list with the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->NewPackageList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListHeader,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (PackageListHeader);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the new HII Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes a package list from the HII database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle is not a valid EFI_HII_HANDLE in the HII database, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle The handle that was previously registered in the HII database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiRemovePackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->RemovePackageList (gHiiDatabase, HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves the array of all the HII Handles or the HII handles of a specific
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync package list GUID in the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This array is terminated with a NULL HII Handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allocates the returned array using AllocatePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The caller is responsible for freeing the array with FreePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PackageListGuid An optional parameter that is used to request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Handles associated with a specific
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Package List GUID. If this parameter is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then all the HII Handles in the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are returned. If this parameter is not NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then zero or more HII Handles associated with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListGuid are returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL No HII handles were found in the HII database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The array of HII Handles could not be retrieved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the NULL terminated array of HII Handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HII_HANDLE *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiGetHiiHandles (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *PackageListGuid OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleBufferLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE TempHiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE *HiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID Guid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the size required for the buffer of all HII handles.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleBufferLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ListPackageLists (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_TYPE_ALL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HandleBufferLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempHiiHandleBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If ListPackageLists() returns EFI_SUCCESS for a zero size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // then there are no HII handles in the HII database. If ListPackageLists()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // returns an error other than EFI_BUFFER_TOO_SMALL, then there are no HII
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // handles in the HII database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return NULL if the size can not be retrieved, or if there are no HII
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // handles in the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate the array of HII handles to hold all the HII Handles and a NULL terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer = AllocateZeroPool (HandleBufferLength + sizeof (EFI_HII_HANDLE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandleBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return NULL if allocation fails.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the array of HII Handles in the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ListPackageLists (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiDatabase,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_TYPE_ALL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HandleBufferLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the buffer and return NULL if the HII handles can not be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandleBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PackageListGuid == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the NULL terminated array of HII handles in the HII Database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0, Index2 = 0; HiiHandleBuffer[Index1] != NULL; Index1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalHiiExtractGuidFromHiiHandle (HiiHandleBuffer[Index1], &Guid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid (&Guid, PackageListGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer[Index2++] = HiiHandleBuffer[Index1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index2 > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer[Index2] = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandleBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts all hex dtring characters in range ['A'..'F'] to ['a'..'f'] for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hex digits that appear between a '=' and a '&' in a config string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ConfigString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ConfigString Pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the Null-terminated Unicode result string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiLowerConfigString (
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 ConfigString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uses the BlockToConfig() service of the Config Routing Protocol to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync convert <ConfigRequest> and a buffer to a <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ConfigRequest is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Block is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ConfigRequest Pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Block Pointer to a block of data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BlockSize The zie, in bytes, of Block.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The <ConfigResp> string could not be generated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other Pointer to the Null-terminated Unicode <ConfigResp> string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiBlockToConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT8 *Block,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BlockSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ConfigRequest != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Block != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert <ConfigRequest> to <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->BlockToConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Block,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uses the BrowserCallback() service of the Form Browser Protocol to retrieve
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or set uncommitted data. If sata i being retrieved, then the buffer is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allocated using AllocatePool(). The caller is then responsible for freeing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the buffer using FreePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableGuid Pointer to an EFI_GUID structure. This is an optional
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableName Pointer to a Null-terminated Unicode string. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SetResultsData If not NULL, then this parameter specified the buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of uncommited data to set. If this parameter is NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then the caller is requesting to get the uncommited data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the Form Browser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The uncommitted data could not be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to a buffer containing the uncommitted data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiBrowserCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *VariableGuid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *VariableName, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING SetResultsData OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ResultsDataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TempResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mUefiFormBrowser2 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mUefiFormBrowser2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || mUefiFormBrowser2 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsDataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SetResultsData != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Request to to set data in the uncommitted browser state information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData = SetResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the length of the buffer required ResultsData from the Browser Callback
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUefiFormBrowser2->BrowserCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mUefiFormBrowser2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ResultsDataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TempResultsData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No Resluts Data, only allocate one char for '\0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData = AllocateZeroPool (sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate the ResultsData buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData = AllocateZeroPool (ResultsDataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ResultsData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve or set the ResultsData from the Browser Callback
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mUefiFormBrowser2->BrowserCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mUefiFormBrowser2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ResultsDataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (BOOLEAN)(SetResultsData == NULL),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocates and returns a Null-terminated Unicode <ConfigHdr> string using routing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync information that includes a GUID, an optional Unicode string name, and a device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path. The string returned is allocated with AllocatePool(). The caller is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync responsible for freeing the allocated string with FreePool().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The format of a <ConfigHdr> is as follows:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GUID=<HexCh>32&NAME=<Char>NameLength&PATH=<HexChar>DevicePathSize<Null>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Guid Pointer to an EFI_GUID that is the routing information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GUID. Each of the 16 bytes in Guid is converted to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a 2 Unicode character hexidecimal string. This is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name Pointer to a Null-terminated Unicode string that is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the routing information NAME. This is an optional
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter that may be NULL. Each 16-bit Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync character in Name is converted to a 4 character Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hexidecimal string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DriverHandle The driver handle which supports a Device Path Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that is the routing information PATH. Each byte of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the Device Path associated with DriverHandle is converted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to a 2 Unicode character hexidecimal string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL DriverHandle does not support the Device Path Protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the Null-terminate Unicode <ConfigHdr> string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiConstructConfigHdr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *Guid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NameLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DevicePathSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ReturnString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the length of Name in Unicode characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Name is NULL, then the length is 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NameLength = StrLen (Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve DevicePath Protocol associated with DriverHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevicePathFromHandle (DriverHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the size of the device path in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathSize = GetDevicePathSize (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // GUID=<HexCh>32&NAME=<Char>NameLength&PATH=<HexChar>DevicePathSize <Null>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // | 5 | sizeof (EFI_GUID) * 2 | 6 | NameStrLen*4 | 6 | DevicePathSize * 2 | 1 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start with L"GUID="
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnString = StrCpy (String, L"GUID=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Guid != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append Guid converted to <HexCh>32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, *(Buffer++), 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append L"&NAME="
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (String, L"&NAME=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append Name converted to <Char>NameLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; *Name != L'\0'; Name++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, *Name, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append L"&PATH="
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (String, L"&PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append the device path associated with DriverHandle converted to <HexChar>DevicePathSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0, Buffer = (UINT8 *)DevicePath; Index < DevicePathSize; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, *(Buffer++), 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Null terminate the Unicode string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert all hex digits in range [A-F] in the configuration header to [a-f]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiLowerConfigString (ReturnString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the hex UNICODE encoding string of UEFI GUID, NAME or device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to binary buffer from <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a internal function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param String UEFI configuration string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Flag Flag specifies what type buffer will be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer Binary of Guid, Name or Device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 buffer data is retrieved and translated to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync binary format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiGetBufferFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flag,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 **Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *DataBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemStr[5];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL || Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr = String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The content between 'GUID', 'NAME', 'PATH' of <ConfigHdr> and '&' of next element
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // or '\0' (end of configuration string) is the UNICODE %02x bytes encoding string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Length = 0; *String != 0 && *String != L'&'; String++, Length++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Flag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case GUID_CONFIG_STRING_TYPE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case PATH_CONFIG_STRING_TYPE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The data in <ConfigHdr> is encoded as hex UNICODE %02x bytes in the same order
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // as the device path and Guid resides in RAM memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Translate the data into binary.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBuffer = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert binary byte one by one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = ConfigHdr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DigitUint8 = (UINT8) StrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBuffer [Index/2] = DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBuffer [Index/2] = (UINT8) ((DataBuffer [Index/2] << 4) + DigitUint8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Buffer = DataBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case NAME_CONFIG_STRING_TYPE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert Config String to Unicode String, e.g. "0041004200430044" => "ABCD"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add the tailling char L'\0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataBuffer = (UINT8 *) AllocateZeroPool ((Length/4 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert character one by one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = (CHAR16 *) DataBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index += 4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCpy (TemStr, ConfigHdr + Index, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add tailing L'\0' character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr[Index/4] = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Buffer = DataBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function checks VarOffset and VarWidth is in the block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BlockArray 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 *BlockArray,
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 (BlockArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the input var is in the request block range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = BlockArray->Entry.ForwardLink; Link != &BlockArray->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 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 @param ValueString String in <BlockConfig> format and points to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first character of <Number>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ValueData The output value. Caller takes the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to free memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ValueLength 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiGetValueOfNumber (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING ValueString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 **ValueData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *ValueLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 DigitUint8;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ValueString != NULL && ValueData != NULL && ValueLength != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (*ValueString != L'\0');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the length of value string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = ValueString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = StringPtr - ValueString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffer to store the value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf = (UINT8 *) AllocateZeroPool ((Length + 1) / 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buf == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert character one by one to the value buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = ValueString[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 //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the converted value and string length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ValueData = Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ValueLength = Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal function parses IFR data to validate current setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ConfigResp ConfigResp string contains the current setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param HiiPackageList Point to Hii package list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param PackageListLength The length of the pacakge.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VarGuid Guid of the buffer storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param VarName Name of the buffer storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The current setting is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The memory is not enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The config string or the Hii package is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiValidateCurrentSetting (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN PackageListLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VarGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VarName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *CurrentBlockArray;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *BlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA *NewBlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR_BLOCK_DATA VarBlockData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TmpBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 VarValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *VarBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MaxBufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER PacakgeHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PackageOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *PackageData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN IfrOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_VARSTORE *IfrVarStore;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF *IfrOneOf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_NUMERIC *IfrNumeric;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF_OPTION *IfrOneOfOption;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_CHECKBOX *IfrCheckBox;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_STRING *IfrString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *VarStoreName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Get the current setting to current block data array and Convert them into VarBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip ConfigHdr string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (ConfigResp, L"&OFFSET");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No ConfigBlock value is required to be validated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // EFI_SUCCESS directly return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the local variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBlockData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxBufferSize = HII_LIB_DEFAULT_VARSTORE_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBuffer = AllocateZeroPool (MaxBufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Init CurrentBlockArray
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentBlockArray = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentBlockArray == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&CurrentBlockArray->Entry);
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 StringPtr += StrLen (L"&OFFSET=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalHiiGetValueOfNumber (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 TmpBuffer = NULL;
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 = InternalHiiGetValueOfNumber (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 TmpBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr != 0 && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr += StrLen (L"&VALUE=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalHiiGetValueOfNumber (StringPtr, &TmpBuffer, &Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
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 // Check whether VarBuffer is enough
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN) (Offset + Width) > MaxBufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBuffer = ReallocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxBufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset + Width + HII_LIB_DEFAULT_VARSTORE_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxBufferSize = Offset + Width + HII_LIB_DEFAULT_VARSTORE_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the Block with configuration info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (VarBuffer + Offset, TmpBuffer, Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TmpBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set new Block Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewBlockData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBlockData->Offset = Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBlockData->Width = Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert the new block data into the block data array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = CurrentBlockArray->Entry.ForwardLink; Link != &CurrentBlockArray->Entry; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewBlockData->Offset == BlockData->Offset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewBlockData->Width > BlockData->Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = NewBlockData->Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NewBlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (NewBlockData->Offset < BlockData->Offset) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert new block data as the previous one of this link.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &NewBlockData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert new block data into the array tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Link == &CurrentBlockArray->Entry) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (Link, &NewBlockData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If '\0', parsing is finished.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to next ConfigBlock
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Merge the aligned block data into the single block data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = CurrentBlockArray->Entry.ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Link != &CurrentBlockArray->Entry) && (Link->ForwardLink != &CurrentBlockArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (Link, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBlockData = BASE_CR (Link->ForwardLink, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NewBlockData->Offset >= BlockData->Offset) && (NewBlockData->Offset <= (BlockData->Offset + BlockData->Width))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NewBlockData->Offset + NewBlockData->Width) > (BlockData->Offset + BlockData->Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData->Width = (UINT16) (NewBlockData->Offset + NewBlockData->Width - BlockData->Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (Link->ForwardLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (NewBlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link = Link->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (&CurrentBlockArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Check IFR value is in block data, then Validate Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&VarBlockData, sizeof (VarBlockData));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrVarStore = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageOffset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (PackageOffset < PackageListLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PacakgeHeader, (UINT8 *) HiiPackageList + PackageOffset, sizeof (PacakgeHeader));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse IFR opcode from the form package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PacakgeHeader.Type == EFI_HII_PACKAGE_FORMS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset = sizeof (PacakgeHeader);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageData = (UINT8 *) HiiPackageList + PackageOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (IfrOffset < PacakgeHeader.Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) (PackageData + IfrOffset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate current setting to the value built in IFR opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (IfrOpHdr->OpCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_VARSTORE_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // VarStoreId has been found. No further found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the matched VarStoreId to the input VarGuid and VarName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid ((EFI_GUID *) (VOID *) &IfrVarStore->Guid, VarGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarStoreName = (CHAR8 *) IfrVarStore->Name;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; VarStoreName[Index] != 0; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CHAR16) VarStoreName[Index] != VarName[Index]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The matched VarStore is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarStoreName[Index] != 0) || (VarName[Index] != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrVarStore = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrVarStore = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FORM_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_FORM_MAP_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the matched VarStoreId is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OF_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether current value is the one of option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OneOf question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore == NULL) {
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 != IfrVarStore->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset by Question header and Width by DataType Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = IfrOneOf->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) (1 << (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in current block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (CurrentBlockArray, Offset, Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the current configuration string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Offset + Width) > IfrVarStore->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question exceeds the var store size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the current value for oneof opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&VarValue, VarBuffer + Offset, Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Block Data, to be checked in the following Oneof option opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.Offset = Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.Width = Width;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.OpCode = IfrOpHdr->OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.Scope = IfrOpHdr->Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the current value is in the numeric range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Numeric question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNumeric = (EFI_IFR_NUMERIC *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrNumeric->Question.VarStoreId != IfrVarStore->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset by Question header and Width by DataType Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = IfrNumeric->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) (1 << (IfrNumeric->Flags & EFI_IFR_NUMERIC_SIZE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in current block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (CurrentBlockArray, Offset, Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the current configuration string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Offset + Width) > IfrVarStore->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question exceeds the var store size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the current value is in the numeric range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&VarValue, VarBuffer + Offset, Width);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (IfrNumeric->Flags & EFI_IFR_NUMERIC_SIZE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINT8) VarValue < IfrNumeric->data.u8.MinValue || (UINT8) VarValue > IfrNumeric->data.u8.MaxValue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not in the valid range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINT16) VarValue < IfrNumeric->data.u16.MinValue || (UINT16) VarValue > IfrNumeric->data.u16.MaxValue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not in the valid range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINT32) VarValue < IfrNumeric->data.u32.MinValue || (UINT32) VarValue > IfrNumeric->data.u32.MaxValue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not in the valid range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINT64) VarValue < IfrNumeric->data.u64.MinValue || (UINT64) VarValue > IfrNumeric->data.u64.MaxValue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not in the valid range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_CHECKBOX_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check value is BOOLEAN type, only 0 and 1 is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CheckBox question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrCheckBox = (EFI_IFR_CHECKBOX *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrCheckBox->Question.VarStoreId != IfrVarStore->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset by Question header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = IfrCheckBox->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) sizeof (BOOLEAN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in current block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (CurrentBlockArray, Offset, Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the current configuration string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Offset + Width) > IfrVarStore->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question exceeds the var store size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Boolean type, only 1 and 0 is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(VarBuffer + Offset) > 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_STRING_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check current string length is less than maxsize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CheckBox question is not in IFR Form. This IFR form is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrVarStore == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is for the requested varstore.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrString = (EFI_IFR_STRING *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrString->Question.VarStoreId != IfrVarStore->VarStoreId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Offset/Width by Question header and OneOf Flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = IfrString->Question.VarStoreInfo.VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Width = (UINT16) (IfrString->MaxSize * sizeof (UINT16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this question is in current block array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!BlockArrayCheck (CurrentBlockArray, Offset, Width)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question is not in the current configuration string. Skip it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this var question is in the var storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Offset + Width) > IfrVarStore->Size) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This question exceeds the var store size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check current string length is less than maxsize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrSize ((CHAR16 *) (VarBuffer + Offset)) > Width) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_ONE_OF_OPTION_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Opcode Scope is zero. This one of option is not to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBlockData.Scope == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only check for OneOf and OrderList opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOneOfOption = (EFI_IFR_ONE_OF_OPTION *) IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBlockData.OpCode == EFI_IFR_ONE_OF_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check current value is the value of one of option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarValue == IfrOneOfOption->Value.u64) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The value is one of option value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set OpCode to Zero, don't need check again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.OpCode = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_END_OP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Decrease opcode scope for the validated opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBlockData.Scope > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.Scope --;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OneOf value doesn't belong to one of option value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((VarBlockData.Scope == 0) && (VarBlockData.OpCode == EFI_IFR_ONE_OF_OP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Increase Scope for the validated opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBlockData.Scope > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarBlockData.Scope = (UINT8) (VarBlockData.Scope + IfrOpHdr->Scope);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to the next opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOffset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only one form is in a package list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to next package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageOffset += PacakgeHeader.Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarBuffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentBlockArray != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free Link Array CurrentBlockArray
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&CurrentBlockArray->Entry)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlockData = BASE_CR (CurrentBlockArray->Entry.ForwardLink, IFR_BLOCK_DATA, Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&BlockData->Entry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (BlockData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (CurrentBlockArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function parses the input ConfigRequest string and its matched IFR code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string for setting default value and validating current setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1. For setting default action, Reset the default value specified by DefaultId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the driver configuration got by Request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2. For validating current setting, Validate the current configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by parsing HII form IFR opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL request string support depends on the ExportConfig interface of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiConfigRouting protocol in UEFI specification.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format. It can be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL, all current configuration for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entirety of the current HII database will be validated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL, all configuration for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entirety of the current HII database will be reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DefaultId Specifies the type of defaults to retrieve only for setting default action.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ActionType Action supports setting defaults and validate current setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TURE Action runs successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Action is not valid or Action can't be executed successfully..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiIfrValueAction (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Request, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 DefaultId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 ActionType
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigAltResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigAltHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING StringHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE TempDriverHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE *HiiHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID *VarGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING VarName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN PackageListLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAltResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarGuid = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAltHdr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDriverHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only support set default and validate setting action.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ActionType != ACTION_SET_DEFAUTL_VALUE) && (ActionType != ACTION_VALIDATE_SETTING)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the full requested value and deault value string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Request != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->ExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Progress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ConfigAltResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->ExportConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ConfigAltResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = ConfigAltResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (StringPtr != L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Find <ConfigHdr> GUID=...&NAME=...&PATH=...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringHdr = StringPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Guid value
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 Status = InternalHiiGetBufferFromString (StringPtr, GUID_CONFIG_STRING_TYPE, (UINT8 **) &VarGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Name value VarName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
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 Status = InternalHiiGetBufferFromString (StringPtr, NAME_CONFIG_STRING_TYPE, (UINT8 **) &VarName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Path value DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
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 Status = InternalHiiGetBufferFromString (StringPtr, PATH_CONFIG_STRING_TYPE, (UINT8 **) &DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the Driver handle by the got device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &TempDevicePath, &DriverHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the matched Hii Handle for the found Driver handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandleBuffer = HiiGetHiiHandles (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandleBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; HiiHandleBuffer[Index] != NULL; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiDatabase->GetPackageListHandle (gHiiDatabase, HiiHandleBuffer[Index], &TempDriverHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempDriverHandle == DriverHandle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = HiiHandleBuffer[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiHandleBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This request string has no its Hii package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Its default value and validating can't execute by parsing IFR data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Directly jump into the next ConfigAltResp string for another pair Guid, Name, and Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto NextConfigAltResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 2. Get HiiPackage by HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, HiiHandle, &PackageListLength, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = AllocatePool (PackageListLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiPackageList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get PackageList on HiiHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, HiiHandle, &PackageListLength, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 3. Call ConfigRouting GetAltCfg(ConfigRoute, <ConfigResponse>, Guid, Name, DevicePath, AltCfgId, AltCfgResp)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the default configuration string according to the default ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->GetAltConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAltResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (ActionType == ACTION_SET_DEFAUTL_VALUE) ? &DefaultId:NULL, // it can be NULL to get the current setting.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ConfigResp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The required setting can't be found. So, it is not required to be validated and set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto NextConfigAltResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only the ConfigHdr is found. Not any block data is found. No data is required to be validated and set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr (ConfigResp, L"&OFFSET=") == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto NextConfigAltResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 4. Set the default configuration information or Validate current setting by parse IFR code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Current Setting is in ConfigResp, will be set into buffer, then check it again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ActionType == ACTION_SET_DEFAUTL_VALUE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the default configuration information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->RouteConfig (gHiiConfigRouting, ConfigResp, &Progress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Current Setting is in ConfigResp, will be set into buffer, then check it again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalHiiValidateCurrentSetting (ConfigResp, HiiPackageList, PackageListLength, VarGuid, VarName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNextConfigAltResp:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated pacakge buffer and the got ConfigResp string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiPackageList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarGuid = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 5. Jump to next ConfigAltResp for another Guid, Name, Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get and Skip ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*StringPtr != L'\0' && *StringPtr != L'&') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct ConfigAltHdr string "&<ConfigHdr>&ALTCFG=\0"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // | 1 | StrLen (ConfigHdr) | 8 | 1 |
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAltHdr = AllocateZeroPool ((1 + StringPtr - StringHdr + 8 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigAltHdr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (ConfigAltHdr, L"&");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat (ConfigAltHdr, StringHdr, StringPtr - StringHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (ConfigAltHdr, L"&ALTCFG=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip all AltResp (AltConfigHdr ConfigBody) for the same ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((StringHdr = StrStr (StringPtr, ConfigAltHdr)) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StringHdr + StrLen (ConfigAltHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated ConfigAltHdr string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigAltHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StringPtr == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find &GUID as the next ConfigHdr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr = StrStr (StringPtr, L"&GUID");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringPtr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip char '&'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringPtr ++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDone:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarGuid != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VarName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VarName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigAltResp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigAltResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiPackageList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Validate the current configuration by parsing HII form IFR opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL request string support depends on the ExportConfig interface of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiConfigRouting protocol in UEFI specification.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format. It can be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL, all current configuration for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entirety of the current HII database will be validated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Current configuration is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Current configuration is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiValidateSettings (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Request OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiIfrValueAction (Request, 0, ACTION_VALIDATE_SETTING);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Reset the default value specified by DefaultId to the driver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration got by Request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL request string support depends on the ExportConfig interface of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiConfigRouting protocol in UEFI specification.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Request A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format. It can be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL, all configuration for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entirety of the current HII database will be reset.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DefaultId Specifies the type of defaults to retrieve.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TURE The default value is set successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The default value can't be found and set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiSetToDefaults (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Request, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 DefaultId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiIfrValueAction (Request, DefaultId, ACTION_SET_DEFAUTL_VALUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if two values in config strings match.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compares the substring between StartSearchString and StopSearchString in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstString to the substring between StartSearchString and StopSearchString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in SecondString. If the two substrings match, then TRUE is returned. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync two substrings do not match, then FALSE is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FirstString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If SecondString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartSearchString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StopSearchString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FirstString Pointer to the first Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SecondString Pointer to the second Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StartSearchString Pointer to the Null-terminated Unicode string that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync marks the start of the value string to compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param StopSearchString Pointer to the Null-terminated Unicode string that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync marks the end of the value string to compare.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE StartSearchString is not present in FirstString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE StartSearchString is not present in SecondString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE StopSearchString is not present in FirstString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE StopSearchString is not present in SecondString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The length of the substring in FirstString is not the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync same length as the substring in SecondString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The value string in FirstString does not matche the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync value string in SecondString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The value string in FirstString matches the value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string in SecondString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiCompareSubString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *FirstString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *SecondString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *StartSearchString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *StopSearchString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *EndFirstString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *EndSecondString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FirstString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (SecondString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StartSearchString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StopSearchString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FirstString = StrStr (FirstString, StartSearchString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FirstString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SecondString = StrStr (SecondString, StartSearchString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SecondString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndFirstString = StrStr (FirstString, StopSearchString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EndFirstString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndSecondString = StrStr (SecondString, StopSearchString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EndSecondString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((EndFirstString - FirstString) != (EndSecondString - SecondString)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN)(StrnCmp (FirstString, SecondString, EndFirstString - FirstString) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if the routing data specified by GUID and NAME match a <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ConfigHdr is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ConfigHdr Either <ConfigRequest> or <ConfigResp>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Guid GUID of the storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name NAME of the storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Routing information matches <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Routing information does not match <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiIsConfigHdrMatch (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING ConfigHdr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *Guid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING CompareConfigHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ConfigHdr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Use Guid and Name to generate a <ConfigHdr> string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareConfigHdr = HiiConstructConfigHdr (Guid, Name, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareConfigHdr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Guid != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compare GUID value strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = InternalHiiCompareSubString (ConfigHdr, CompareConfigHdr, L"GUID=", L"&NAME=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Result && Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compare NAME value strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = InternalHiiCompareSubString (ConfigHdr, CompareConfigHdr, L"&NAME=", L"&PATH=");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the <ConfigHdr> string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (CompareConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves uncommitted data from the Form Browser and converts it to a binary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableGuid Pointer to an EFI_GUID structure. This is an optional
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableName Pointer to a Null-terminated Unicode string. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BufferSize Length in bytes of buffer to hold retrieved data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Buffer of data to be updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The uncommitted data could not be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The uncommitted data was retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiGetBrowserData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *VariableGuid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *VariableName, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Progress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve the results data from the Browser Callback
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData = InternalHiiBrowserCallback (VariableGuid, VariableName, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ResultsData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct <ConfigResp> mConfigHdrTemplate L'&' ResultsData L'\0'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = (StrLen (mConfigHdrTemplate) + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Size + (StrLen (ResultsData) + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = AllocateZeroPool (Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (ConfigResp, Size, L"%s&%s", mConfigHdrTemplate, ResultsData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ResultsData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert <ConfigResp> to a buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->ConfigToBlock (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Updates uncommitted data in the Form Browser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Buffer is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableGuid Pointer to an EFI_GUID structure. This is an optional
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableName Pointer to a Null-terminated Unicode string. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BufferSize Length, in bytes, of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Buffer of data to commit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RequestElement An optional field to specify which part of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer data will be send back to Browser. If NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the whole buffer of data will be committed to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Browser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <RequestElement> ::= &OFFSET=<Number>&WIDTH=<Number>*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The uncommitted data could not be updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The uncommitted data was updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiSetBrowserData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *VariableGuid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *VariableName, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT8 *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *RequestElement OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ResultsData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct <ConfigRequest>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RequestElement == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = (StrLen (mConfigHdrTemplate) + 32 + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = AllocateZeroPool (Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", mConfigHdrTemplate, (UINT64)BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // followed by <RequestElement> followed by a Null-terminator
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrLen (mConfigHdrTemplate) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Size + (StrLen (RequestElement) + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = AllocateZeroPool (Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (ConfigRequest, Size, L"%s%s", mConfigHdrTemplate, RequestElement);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigRequest == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert <ConfigRequest> to <ConfigResp>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = InternalHiiBlockToConfig (ConfigRequest, Buffer, BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set data in the uncommitted browser state information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResultsData = InternalHiiBrowserCallback (VariableGuid, VariableName, ConfigResp + StrLen(mConfigHdrTemplate) + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN)(ResultsData != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// IFR Functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/////////////////////////////////////////
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define HII_LIB_OPCODE_ALLOCATION_SIZE 0x200
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} HII_LIB_OPCODE_BUFFER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Lookup table that converts EFI_IFR_TYPE_X enum values to a width in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 mHiiDefaultTypeToWidth[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1, // EFI_IFR_TYPE_NUM_SIZE_8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2, // EFI_IFR_TYPE_NUM_SIZE_16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 4, // EFI_IFR_TYPE_NUM_SIZE_32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8, // EFI_IFR_TYPE_NUM_SIZE_64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1, // EFI_IFR_TYPE_BOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3, // EFI_IFR_TYPE_TIME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 4, // EFI_IFR_TYPE_DATE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2 // EFI_IFR_TYPE_STRING
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocates and returns a new OpCode Handle. OpCode Handles must be freed with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFreeOpCodeHandle().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There are not enough resources to allocate a new OpCode Handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A new OpCode handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiAllocateOpCodeHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *OpCodeBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)AllocatePool (sizeof (HII_LIB_OPCODE_BUFFER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->Buffer = (UINT8 *)AllocatePool (HII_LIB_OPCODE_ALLOCATION_SIZE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBuffer->Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OpCodeBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->BufferSize = HII_LIB_OPCODE_ALLOCATION_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->Position = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (VOID *)OpCodeBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees an OpCode Handle that was previously allocated with HiiAllocateOpCodeHandle().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When an OpCode Handle is freed, all of the opcodes associated with the OpCode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle are also freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiFreeOpCodeHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *OpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *OpCodeBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)OpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBuffer->Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OpCodeBuffer->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OpCodeBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function gets the current position of opcode buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Current position of opcode buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiOpCodeHandlePosition (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((HII_LIB_OPCODE_BUFFER *)OpCodeHandle)->Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function gets the start pointer of opcode buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the opcode buffer base.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiOpCodeHandleBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((HII_LIB_OPCODE_BUFFER *)OpCodeHandle)->Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function reserves the enough buffer for current opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When the buffer is not enough, Opcode buffer will be extended.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Size Size of current opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the current opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiGrowOpCodeHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *OpCodeBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)OpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBuffer->Position + Size > OpCodeBuffer->BufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = ReallocatePool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->BufferSize + (Size + HII_LIB_OPCODE_ALLOCATION_SIZE),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->Buffer = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->BufferSize += (Size + HII_LIB_OPCODE_ALLOCATION_SIZE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = OpCodeBuffer->Buffer + OpCodeBuffer->Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBuffer->Position += Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function creates opcode based on the template opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeTemplate Pointer to the template buffer of opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCode OpCode IFR value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeSize Size of opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ExtensionSize Size of extended opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Scope Scope bit of opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the current opcode with opcode data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiCreateOpCodeExtended (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeTemplate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OpCode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN OpCodeSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN ExtensionSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *Header;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OpCodeTemplate != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((OpCodeSize + ExtensionSize) <= 0x7F);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header = (EFI_IFR_OP_HEADER *)OpCodeTemplate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header->OpCode = OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header->Scope = Scope;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Header->Length = (UINT8)(OpCodeSize + ExtensionSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = InternalHiiGrowOpCodeHandle (OpCodeHandle, Header->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8 *)CopyMem (Buffer, Header, OpCodeSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function creates opcode based on the template opcode for the normal opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeTemplate Pointer to the template buffer of opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCode OpCode IFR value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeSize Size of opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the current opcode with opcode data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiCreateOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeTemplate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OpCode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN OpCodeSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCodeExtended (OpCodeHandle, OpCodeTemplate, OpCode, OpCodeSize, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Append raw opcodes to an OpCodeHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If RawBuffer is NULL, then ASSERT();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RawBuffer Buffer of opcodes to append.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RawBufferSize The size, in bytes, of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the appended opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateRawOpCodes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *RawBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN RawBufferSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (RawBuffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = InternalHiiGrowOpCodeHandle (OpCodeHandle, RawBufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8 *)CopyMem (Buffer, RawBuffer, RawBufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Append opcodes from one OpCode Handle to another OpCode handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If RawOpCodeHandle is NULL, then ASSERT();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RawOpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the appended opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiAppendOpCodes (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *RawOpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *RawOpCodeBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (RawOpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RawOpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)RawOpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return HiiCreateRawOpCodes (OpCodeHandle, RawOpCodeBuffer->Buffer, RawOpCodeBuffer->Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_END_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateEndOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_END OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_END_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_ONE_OF_OPTION_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Type is invalid, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Flags is invalid, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StringId StringId for the option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Flags Flags for the option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Type Type for the option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Value Value for the option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateOneOfOptionOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 StringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF_OPTION OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Type < EFI_IFR_TYPE_OTHER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Option = StringId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = (UINT8) (Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Type = Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&OpCode.Value, &Value, mHiiDefaultTypeToWidth[Type]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_ONE_OF_OPTION_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_DEFAULT_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Type is invalid, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultId DefaultId for the default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Type Type for the default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Value Value for the default
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateDefaultOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 DefaultId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_DEFAULT OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Type < EFI_IFR_TYPE_OTHER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Type = Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.DefaultId = DefaultId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&OpCode.Value, &Value, mHiiDefaultTypeToWidth[Type]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_DEFAULT_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_GUID opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Guid is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeSize < sizeof (EFI_IFR_GUID), then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Guid Pointer to EFI_GUID of this guided opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] GuidOpCode Pointer to an EFI_IFR_GUID opcode. This is an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync optional parameter that may be NULL. If this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter is NULL, then the GUID extension
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync region of the created opcode is filled with zeros.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If this parameter is not NULL, then the GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extension region of GuidData will be copied to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the GUID extension region of the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeSize The size, in bytes, of created opcode. This value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must be >= sizeof(EFI_IFR_GUID).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateGuidOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_GUID *Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *GuidOpCode, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN OpCodeSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID *OpCodePointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Guid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OpCodeSize >= sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid ((EFI_GUID *)(VOID *)&OpCode.Guid, Guid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodePointer = (EFI_IFR_GUID *)InternalHiiCreateOpCodeExtended (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpCode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID_OP,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (OpCode),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeSize - sizeof (OpCode),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodePointer != NULL && GuidOpCode != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (OpCodePointer + 1, (EFI_IFR_GUID *)GuidOpCode + 1, OpCodeSize - sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8 *)OpCodePointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_ACTION_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionConfig String ID for configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateActionOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID QuestionConfig
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ACTION OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.QuestionConfig = QuestionConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_ACTION_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_SUBTITLE_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in Flags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Scope > 1, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Flags Subtitle opcode flags
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Scope 1 if this opcpde is the beginning of a new scope.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0 if this opcode is within the current scope.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateSubTitleOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Flags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_SUBTITLE OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Scope <= 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Flags & (~(EFI_IFR_FLAGS_HORIZONTAL))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Statement.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Statement.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = Flags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCodeExtended (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpCode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_SUBTITLE_OP,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (OpCode),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Scope
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_REF_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FormId Destination Form ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateGotoOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FORM_ID FormId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_REF OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.FormId = FormId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_REF_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_CHECKBOX_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in CheckBoxFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckBoxFlags Flags for checkbox opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateCheckBoxOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 CheckBoxFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_CHECKBOX OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = CheckBoxFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_CHECKBOX_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_CHECKBOX_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_NUMERIC_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in NumericFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NumericFlags Flags for numeric opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Minimum Numeric minimum value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Maximum Numeric maximum value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Step Numeric step for edit
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateNumericOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 NumericFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Minimum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Maximum,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Step,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_NUMERIC OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = NumericFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_1:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u8.MinValue = (UINT8)Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u8.MaxValue = (UINT8)Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u8.Step = (UINT8)Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_2:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u16.MinValue = (UINT16)Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u16.MaxValue = (UINT16)Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u16.Step = (UINT16)Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_4:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u32.MinValue = (UINT32)Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u32.MaxValue = (UINT32)Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u32.Step = (UINT32)Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case EFI_IFR_NUMERIC_SIZE_8:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u64.MinValue = Minimum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u64.MaxValue = Maximum;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.data.u64.Step = Step;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_STRING_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in StringFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StringFlags Flags for string opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] MinSize String minimum length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] MaxSize String maximum length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateStringOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 StringFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 MinSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 MaxSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_STRING OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.MinSize = MinSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.MaxSize = MaxSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = (UINT8) (StringFlags & EFI_IFR_STRING_MULTI_LINE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_STRING_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_STRING_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_ONE_OF_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in OneOfFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OneOfFlags Flags for oneof opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OptionsOpCodeHandle Handle for a buffer of ONE_OF_OPTION opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateOneOfOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OneOfFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OptionsOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ONE_OF OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OptionsOpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = OneOfFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_ONE_OF_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, OptionsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_ORDERED_LIST_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in OrderedListFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OrderedListFlags Flags for ordered list opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataType Type for option value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] MaxContainers Maximum count for options in this ordered list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OptionsOpCodeHandle Handle for a buffer of ONE_OF_OPTION opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateOrderedListOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 OrderedListFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 MaxContainers,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OptionsOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_ORDERED_LIST OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (OptionsOpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.MaxContainers = MaxContainers;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = OrderedListFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_ORDERED_LIST_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, OptionsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_TEXT_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TextTwo String ID for TextTwo.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateTextOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID TextTwo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_TEXT OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Statement.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Statement.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.TextTwo = TextTwo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_TEXT_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_DATE_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in DateFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID, optional. If DateFlags is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QF_DATE_STORAGE_NORMAL, this parameter is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage, optional. If DateFlags is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QF_DATE_STORAGE_NORMAL, this parameter is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DateFlags Flags for date opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateDateOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 DateFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_DATE OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((DateFlags & (~(EFI_QF_DATE_YEAR_SUPPRESS | EFI_QF_DATE_MONTH_SUPPRESS | EFI_QF_DATE_DAY_SUPPRESS | EFI_QF_DATE_STORAGE))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = DateFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_DATE_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_DATE_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create EFI_IFR_TIME_OP opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If OpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in QuestionFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If any reserved bits are set in TimeFlags, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeHandle Handle to the buffer of opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId Question ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarStoreId Storage ID, optional. If TimeFlags is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QF_TIME_STORAGE_NORMAL, this parameter is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarOffset Offset in Storage, optional. If TimeFlags is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync QF_TIME_STORAGE_NORMAL, this parameter is ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Prompt String ID for Prompt
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Help String ID for Help
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionFlags Flags in Question Header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TimeFlags Flags for time opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DefaultsOpCodeHandle Handle for a buffer of DEFAULT opcodes. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There is not enough space left in Buffer to add the opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Other A pointer to the created opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiCreateTimeOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *OpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_VARSTORE_ID VarStoreId, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VarOffset, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Prompt,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_STRING_ID Help,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 QuestionFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 TimeFlags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *DefaultsOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_TIME OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((TimeFlags & (~(QF_TIME_HOUR_SUPPRESS | QF_TIME_MINUTE_SUPPRESS | QF_TIME_SECOND_SUPPRESS | QF_TIME_STORAGE))) == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Prompt = Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Header.Help = Help;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.QuestionId = QuestionId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreId = VarStoreId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.VarStoreInfo.VarOffset = VarOffset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Question.Flags = QuestionFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode.Flags = TimeFlags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultsOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_TIME_OP, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_TIME_OP, sizeof (OpCode), 0, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateEndOpCode (OpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is the internal worker function to update the data in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a form specified by FormSetGuid, FormId and Label.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FormSetGuid The optional Formset GUID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FormId The Form ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Package The package header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeBufferStart An OpCode buffer that contains the set of IFR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opcodes to be inserted or replaced in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpCodeBufferEnd An OpCcode buffer that contains the IFR opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that marks the end of a replace operation in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] TempPackage The resultant package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The function completes successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The updated opcode or endopcode is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalHiiUpdateFormPackageData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FORM_ID FormId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_PACKAGE_HEADER *Package,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN HII_LIB_OPCODE_BUFFER *OpCodeBufferStart,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN HII_LIB_OPCODE_BUFFER *OpCodeBufferEnd, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HII_PACKAGE_HEADER *TempPackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AddSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *BufferPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER PackageHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *IfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_OP_HEADER *UpdateIfrOpHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN GetFormSet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN GetForm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Updated;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN UpdatePackageLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempPackage, Package, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageLength = sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferPos = (UINT8 *) (TempPackage + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = sizeof (EFI_HII_PACKAGE_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetFormSet = (BOOLEAN) ((FormSetGuid == NULL) ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetForm = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Updated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Offset < PackageHeader.Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferPos += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageLength += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the matched FormSet and Form
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrOpHdr->OpCode == EFI_IFR_FORM_SET_OP) && (FormSetGuid != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid((GUID *)(VOID *)&((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, FormSetGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetFormSet = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetFormSet = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrOpHdr->OpCode == EFI_IFR_FORM_OP || IfrOpHdr->OpCode == EFI_IFR_FORM_MAP_OP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (&((EFI_IFR_FORM *) IfrOpHdr)->FormId, &FormId, sizeof (EFI_FORM_ID)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetForm = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetForm = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The matched Form is found, and Update data in this form
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetFormSet && GetForm) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateIfrOpHdr = (EFI_IFR_OP_HEADER *) OpCodeBufferStart->Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UpdateIfrOpHdr->Length == IfrOpHdr->Length) && \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CompareMem (IfrOpHdr, UpdateIfrOpHdr, UpdateIfrOpHdr->Length) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the original data when End OpCode buffer exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBufferEnd != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) ((UINT8 *) (IfrOpHdr) + IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateIfrOpHdr = (EFI_IFR_OP_HEADER *) OpCodeBufferEnd->Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Offset < PackageHeader.Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search the matched end opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UpdateIfrOpHdr->Length == IfrOpHdr->Length) && \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CompareMem (IfrOpHdr, UpdateIfrOpHdr, UpdateIfrOpHdr->Length) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to the next Op-Code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) ((UINT8 *) (IfrOpHdr) + IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset >= PackageHeader.Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The end opcode is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert the updated data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddSize = ((EFI_IFR_OP_HEADER *) OpCodeBufferStart->Buffer)->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BufferPos, OpCodeBufferStart->Buffer + AddSize, OpCodeBufferStart->Position - AddSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferPos += OpCodeBufferStart->Position - AddSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageLength += OpCodeBufferStart->Position - AddSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCodeBufferEnd != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add the end opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferPos += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageLength += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the left package data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (BufferPos, (UINT8 *) Package + Offset, PackageHeader.Length - Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageLength += PackageHeader.Length - Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set update flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Updated = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to the next Op-Code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += IfrOpHdr->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Updated) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The updated opcode buffer is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the package length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageHeader.Length = (UINT32) UpdatePackageLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempPackage, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function updates a form that has previously been registered with the HII
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Database. This function will perform at most one update operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The form to update is specified by Handle, FormSetGuid, and FormId. Binary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync comparisons of IFR opcodes are performed from the beginning of the form being
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync updated until an IFR opcode is found that exactly matches the first IFR opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by StartOpCodeHandle. The following rules are used to determine if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an insert, replace, or delete operation is performed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1) If no matches are found, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2) If a match is found, and EndOpCodeHandle is NULL, then all of the IFR opcodes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from StartOpCodeHandle except the first opcode are inserted immediately after
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the matching IFR opcode in the form to be updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3) If a match is found, and EndOpCodeHandle is not NULL, then a search is made
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the matching IFR opcode until an IFR opcode exactly matches the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR opcode specified by EndOpCodeHandle. If no match is found for the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR opcode specified by EndOpCodeHandle, then NULL is returned. If a match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is found, then all of the IFR opcodes between the start match and the end
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync match are deleted from the form being updated and all of the IFR opcodes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from StartOpCodeHandle except the first opcode are inserted immediately after
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the matching start IFR opcode. If StartOpCcodeHandle only contains one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR instruction, then the result of this operation will delete all of the IFR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opcodes between the start end matches.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If HiiHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If StartOpCodeHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle The HII Handle of the form to update.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FormSetGuid The Formset GUID of the form to update. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If it is NULL, all FormSet will be updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FormId The ID of the form to update.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StartOpCodeHandle An OpCode Handle that contains the set of IFR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opcodes to be inserted or replaced in the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The first IFR instruction in StartOpCodeHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is used to find matching IFR opcode in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] EndOpCodeHandle An OpCcode Handle that contains the IFR opcode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that marks the end of a replace operation in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the form. This is an optional parameter that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync may be NULL. If it is NULL, then an the IFR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opcodes specified by StartOpCodeHandle are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inserted into the form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES No enough memory resource is allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The following cases will return EFI_NOT_FOUND.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1) The form specified by HiiHandle, FormSetGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and FormId could not be found in the HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2) No IFR opcodes in the target form match the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IFR opcode in StartOpCodeHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3) EndOpCOde is not NULL, and no IFR opcodes in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync target form following a matching start opcode match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the first IFR opcode in EndOpCodeHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The matched form is updated by StartOpcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHiiUpdateForm (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *FormSetGuid, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FORM_ID FormId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *StartOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *EndOpCodeHandle OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 PackageListLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_LIST_HEADER *UpdatePackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *UpdateBufferPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER *Package;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER *TempPacakge;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_PACKAGE_HEADER PackageHeader;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Updated;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *OpCodeBufferStart;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII_LIB_OPCODE_BUFFER *OpCodeBufferEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Input update data can't be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (HiiHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (StartOpCodeHandle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPacakge = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve buffer data from Opcode Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBufferStart = (HII_LIB_OPCODE_BUFFER *) StartOpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCodeBufferEnd = (HII_LIB_OPCODE_BUFFER *) EndOpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the original package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiPackageList = AllocatePool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiPackageList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Finish;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, HiiHandle, &BufferSize, HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Finish;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate and allocate space for retrieval of IFR data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize += OpCodeBufferStart->Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdatePackageList = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UpdatePackageList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Finish;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate temp buffer to store the temp updated package buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPacakge = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempPacakge == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Finish;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateBufferPos = (UINT8 *) UpdatePackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the package list header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (UpdateBufferPos, HiiPackageList, sizeof (EFI_HII_PACKAGE_LIST_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateBufferPos += sizeof (EFI_HII_PACKAGE_LIST_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through each package to find the matched package and update one by one
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Updated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (Offset < PackageListLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset += Package->Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Package->Type == EFI_HII_PACKAGE_FORMS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check this package is the matched package.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalHiiUpdateFormPackageData (FormSetGuid, FormId, Package, OpCodeBufferStart, OpCodeBufferEnd, TempPacakge);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The matched package is found. Its package buffer will be updated by the input new data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Update Flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Updated = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add updated package buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Package = TempPacakge;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add pacakge buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (UpdateBufferPos, Package, PackageHeader.Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UpdateBufferPos += PackageHeader.Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Updated) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update package list length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = UpdateBufferPos - (UINT8 *) UpdatePackageList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WriteUnaligned32 (&UpdatePackageList->PackageLength, (UINT32) BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update Package to show form
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiDatabase->UpdatePackageList (gHiiDatabase, HiiHandle, UpdatePackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Not matched form is found and updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFinish:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HiiPackageList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (HiiPackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UpdatePackageList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (UpdatePackageList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempPacakge != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempPacakge);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}