4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Serialize Variables Library implementation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2004 - 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 "SerializeVariablesLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Serialization format:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The SerializeVariablesLib interface does not specify a format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the serialization of the variable data. This library uses
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a packed array of a non-uniformly sized data structure elements.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Each variable is stored (packed) as:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 VendorNameSize; // Name size in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 VendorName[?]; // The variable unicode name including the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // null terminating character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID VendorGuid; // The variable GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataSize; // The size of variable data in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Data[?]; // The variable data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Unpacks the next variable from the buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer - Buffer pointing to the next variable instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On subsequent calls, the pointer should be incremented
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the returned SizeUsed value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] MaxSize - Max allowable size for the variable data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On subsequent calls, this should be decremented
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the returned SizeUsed value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Name - Variable name string (address in Buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] NameSize - Size of Name in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Guid - GUID of variable (address in Buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Attributes - Attributes of variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Data - Buffer containing Data for variable (address in Buffer)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] DataSize - Size of Data in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] SizeUsed - Total size used for this variable instance in Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_STATUS based on the success or failure of the operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUnpackVariableFromBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MaxSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *NameSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GUID **Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *SizeUsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *BytePtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BytePtr = (UINT8*)Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *NameSize = *(UINT32*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Name = (CHAR16*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + *(UINT32*)BytePtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Guid = (EFI_GUID*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + sizeof (EFI_GUID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Attributes = *(UINT32*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DataSize = *(UINT32*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Data = (VOID*) (BytePtr + Offset);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Offset = Offset + *DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Offset > MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *SizeUsed = Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Iterates through the variables in the buffer, and calls a callback
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function for each variable found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CallbackFunction - Function called for each variable instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context - Passed to each call of CallbackFunction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer - Buffer containing serialized variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] MaxSize - Size of Buffer in bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_STATUS based on the success or failure of the operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIterateVariablesInBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *CallbackContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN MaxSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TotalSizeUsed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SizeUsed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Name;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 NameSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *AlignedName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 AlignedNameMaxSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID *Guid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Attributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeUsed = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlignedName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlignedNameMaxSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Name = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Guid = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS, TotalSizeUsed = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync !EFI_ERROR (Status) && (TotalSizeUsed < MaxSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = UnpackVariableFromBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID*) ((UINT8*) Buffer + TotalSizeUsed),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (MaxSize - TotalSizeUsed),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NameSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SizeUsed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We copy the name to a separately allocated buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to be sure it is 16-bit aligned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NameSize > AlignedNameMaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AlignedName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AlignedName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlignedName = AllocatePool (NameSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AlignedName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (AlignedName, Name, NameSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TotalSizeUsed = TotalSizeUsed + SizeUsed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Run the callback function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = (*CallbackFunction) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackContext,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlignedName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AlignedName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AlignedName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure the entire buffer was used, or else return an error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TotalSizeUsed != MaxSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG ((
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_D_ERROR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Deserialize variables error: TotalSizeUsed(%d) != MaxSize(%d)\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TotalSizeUsed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIterateVariablesCallbackNop (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIterateVariablesCallbackSetInInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = (EFI_HANDLE) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SerializeVariablesAddVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIterateVariablesCallbackSetSystemVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEnsureExtraBufferSpace (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SV_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = Instance->DataSize + Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewSize <= Instance->BufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Double the required size to lessen the need to re-allocate in the future
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = 2 * NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocatePool (NewSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->BufferPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (NewBuffer, Instance->BufferPtr, Instance->DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance->BufferPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->BufferPtr = NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->BufferSize = NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAppendToBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SV_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Instance != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Data != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = Instance->DataSize + Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Instance->DataSize + Size) <= Instance->BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID*) (((UINT8*) (Instance->BufferPtr)) + Instance->DataSize),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DataSize = NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - The variable serialization instance was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successfully created.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync create the variable serialization instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesNewInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HANDLE *Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SV_INSTANCE *New;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync New = AllocateZeroPool (sizeof (*New));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (New == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync New->Signature = SV_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Handle = (EFI_HANDLE) New;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free memory associated with a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - The variable serialization instance was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successfully freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_INVALID_PARAMETER - Handle was not a valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync variable serialization instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesFreeInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SV_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = SV_FROM_HANDLE (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Signature != SV_SIGNATURE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Signature = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->BufferPtr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance->BufferPtr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new variable serialization instance using the given
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync binary representation of the variables to fill the new instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer - A buffer with the serialized representation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the variables. Must be the same format as produced
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by SerializeVariablesToBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Size - This is the size of the binary representation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - The binary representation was successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync imported into a new variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync create the new variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesNewInstanceFromBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HANDLE *Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SerializeVariablesNewInstance (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RETURN_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IterateVariablesInBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IterateVariablesCallbackNop,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RETURN_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializeVariablesFreeInstance (*Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IterateVariablesInBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IterateVariablesCallbackSetInInstance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID*) *Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RETURN_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializeVariablesFreeInstance (*Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Iterates all variables found with RuntimeServices GetNextVariableName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CallbackFunction - Function called for each variable instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context - Passed to each call of CallbackFunction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - All variables were iterated without the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackFunction returning an error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iterate through the variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Any of RETURN_ERROR indicates an error reading the variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or an error was returned from CallbackFunction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesIterateSystemVariables (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VariableNameBufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VariableNameSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *VariableName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_GUID VendorGuid;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VariableDataBufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VariableDataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *VariableData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 VariableAttributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the variable name and data buffer variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableNameBufferSize = sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName = AllocateZeroPool (VariableNameBufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableDataBufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the next variable name and guid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableNameSize = VariableNameBufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetNextVariableName (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableNameSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VendorGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The currently allocated VariableName buffer is too small,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so we allocate a larger buffer, and copy the old buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocatePool (VariableNameSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (NewBuffer, VariableName, VariableNameBufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VariableName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName = NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableNameBufferSize = VariableNameSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to get the next variable name again with the larger buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetNextVariableName (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableNameSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VendorGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_NOT_FOUND) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the variable data and attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableDataSize = VariableDataBufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableDataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The currently allocated VariableData buffer is too small,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so we allocate a larger buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableDataBufferSize != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VariableData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableDataBufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData = AllocatePool (VariableDataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableDataBufferSize = VariableDataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to read the variable again with the larger buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VariableDataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Run the callback function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = (*CallbackFunction) (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableAttributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableDataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VariableName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VariableData != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VariableData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Iterates all variables found in the variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CallbackFunction - Function called for each variable instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context - Passed to each call of CallbackFunction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - All variables were iterated without the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackFunction returning an error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iterate through the variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Any of RETURN_ERROR indicates an error reading the variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or an error was returned from CallbackFunction
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesIterateInstanceVariables (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VARIABLE_SERIALIZATION_ITERATION_CALLBACK CallbackFunction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SV_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = SV_FROM_HANDLE (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Instance->BufferPtr != NULL) && (Instance->DataSize != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IterateVariablesInBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackFunction,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->BufferPtr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DataSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sets all variables found in the variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - All variables were set successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set all the variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Any of RETURN_ERROR indicates an error reading the variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or in attempting to set a variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesSetSerializedVariables (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SerializeVariablesIterateInstanceVariables (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IterateVariablesCallbackSetSystemVariable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Adds a variable to the variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VariableName - Refer to RuntimeServices GetVariable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VendorGuid - Refer to RuntimeServices GetVariable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Attributes - Refer to RuntimeServices GetVariable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize - Refer to RuntimeServices GetVariable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data - Refer to RuntimeServices GetVariable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - All variables were set successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync add the variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_INVALID_PARAMETER - Handle was not a valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync variable serialization instance or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName, VariableGuid or Data are NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesAddVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Attributes,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SV_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 SerializedNameSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 SerializedDataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SerializedSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = SV_FROM_HANDLE (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Instance->Signature != SV_SIGNATURE) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VariableName == NULL) || (VendorGuid == NULL) || (Data == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializedNameSize = (UINT32) StrSize (VariableName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializedSize =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (SerializedNameSize) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializedNameSize +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (*VendorGuid) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (Attributes) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (SerializedDataSize) +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EnsureExtraBufferSpace (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializedSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RETURN_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add name size (UINT32)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, (VOID*) &SerializedNameSize, sizeof (SerializedNameSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add variable unicode name string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, (VOID*) VariableName, SerializedNameSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add variable GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, (VOID*) VendorGuid, sizeof (*VendorGuid));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add variable attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, (VOID*) &Attributes, sizeof (Attributes));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add variable data size (UINT32)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SerializedDataSize = (UINT32) DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, (VOID*) &SerializedDataSize, sizeof (SerializedDataSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add variable data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AppendToBuffer (Instance, Data, DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Serializes the variables known to this instance into the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync provided buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle - Handle for a variable serialization instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer - A buffer to store the binary representation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in,out] Size - On input this is the size of the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On output this is the size of the binary representation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the variables.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS - The binary representation was successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync completed and returned in the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES - There we not enough resources to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync save the variables to the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_INVALID_PARAMETER - Handle was not a valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync variable serialization instance or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size or Buffer were NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_BUFFER_TOO_SMALL - The Buffer size as indicated by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the Size parameter was too small for the serialized
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync variable data. Size is returned with the required size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSerializeVariablesToBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SV_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = SV_FROM_HANDLE (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Size < Instance->DataSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Size = Instance->DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Size = Instance->DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Buffer, Instance->BufferPtr, Instance->DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return RETURN_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync