+++ /dev/null
-/** @file\r
- Common Library Routines to assist handle HII elements.\r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "LibraryInternal.h"\r
-\r
-\r
-//\r
-// Hii relative protocols\r
-//\r
-\r
-EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;\r
-EFI_HII_STRING_PROTOCOL *gIfrLibHiiString;\r
-\r
-/**\r
- ExtendedIfrSupportLib's constructor. It locates the required protocol:\r
- gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- \r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS This function always completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ExtendedIfrSupportLibConstructor (\r
- IN EFI_HANDLE ImageHandle,\r
- IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Extract formset class for given HII handle.\r
-\r
-\r
- @param Handle The HII handle.\r
- @param Class Class of the formset.\r
- @param FormSetTitle Formset title string.\r
- @param FormSetHelp Formset help string.\r
-\r
- @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.\r
- @return Other values if failed to export packages for the given HII handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibExtractClassFromHiiHandle (\r
- IN EFI_HII_HANDLE Handle,\r
- OUT UINT16 *Class,\r
- OUT EFI_STRING_ID *FormSetTitle,\r
- OUT EFI_STRING_ID *FormSetHelp\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINT8 *Package;\r
- UINT8 *OpCodeData;\r
- UINT32 Offset;\r
- UINT32 Offset2;\r
- UINT32 PackageListLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
-\r
- ASSERT (Handle != NULL);\r
- ASSERT (Class != NULL); \r
- ASSERT (FormSetTitle != NULL);\r
- ASSERT (FormSetHelp != NULL);\r
-\r
- *Class = EFI_NON_DEVICE_CLASS;\r
- *FormSetTitle = 0;\r
- *FormSetHelp = 0;\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- //\r
- // Handle is a invalid handle. Check if Handle is corrupted.\r
- //\r
- ASSERT (Status != EFI_NOT_FOUND);\r
- //\r
- // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
- //\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
- \r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Get Form package from this HII package List\r
- //\r
- Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
- Offset2 = 0;\r
- PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
-\r
- while (Offset < PackageListLength) {\r
- Package = ((UINT8 *) HiiPackageList) + Offset;\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
- if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
- //\r
- // Search Class Opcode in this Form Package\r
- //\r
- Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
- while (Offset2 < PackageHeader.Length) {\r
- OpCodeData = Package + Offset2;\r
-\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
- //\r
- // Find FormSet OpCode\r
- //\r
- CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
- CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
- }\r
-\r
- if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&\r
- CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&\r
- (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)\r
- ) {\r
- //\r
- // Find GUIDed Class OpCode\r
- //\r
- CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
-\r
- //\r
- // Till now, we ought to have found the formset Opcode\r
- //\r
- break;\r
- }\r
-\r
- Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
- }\r
-\r
- if (Offset2 < PackageHeader.Length) {\r
- //\r
- // Target formset found\r
- //\r
- break;\r
- }\r
- }\r
-\r
- Offset += PackageHeader.Length;\r
- }\r
-\r
- FreePool (HiiPackageList);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
+++ /dev/null
-#/** @file\r
-# Library instance for ExtendedIfrSupportLib.\r
-#\r
-# This library instance implements the API which is\r
-# related to IFR operations but reference data structures \r
-# that are not defined in UEFI specification, for example EFI_IFR_GUID_LABEL.\r
-# \r
-# Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
-# All rights reserved. This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-# \r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-# \r
-#**/\r
-\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = ExtendedIfrSupportLib\r
- FILE_GUID = A47B68BA-5177-4b2d-891E-4722FA5323F8\r
- MODULE_TYPE = DXE_DRIVER\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = ExtendedIfrSupportLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
- EFI_SPECIFICATION_VERSION = 0x00020000\r
- CONSTRUCTOR = ExtendedIfrSupportLibConstructor\r
-\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources.common]\r
- Common.c\r
- Form.c\r
- LibraryInternal.h\r
- IfrOpCodeCreation.c\r
-\r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
-\r
-\r
-[LibraryClasses]\r
- MemoryAllocationLib\r
- DevicePathLib\r
- BaseLib\r
- UefiBootServicesTableLib\r
- UefiRuntimeServicesTableLib\r
- BaseMemoryLib\r
- DebugLib\r
- PcdLib\r
-\r
-[Guids]\r
- gEfiIfrTianoGuid ## CONSUMES ## GUID\r
-\r
-[Protocols]\r
- gEfiHiiDatabaseProtocolGuid ## CONSUMES\r
- gEfiHiiStringProtocolGuid ## CONSUMES\r
-\r
-[Depex]\r
- gEfiHiiDatabaseProtocolGuid AND\r
- gEfiHiiStringProtocolGuid\r
+++ /dev/null
-/** @file\r
- Common Library Routines to assist handle HII elements.\r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "LibraryInternal.h"\r
-\r
-extern EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;\r
-\r
-/**\r
- Get the specified package from a package list based on an index.\r
- The Buffer on output is updated to point to a package header in\r
- the HiiPackageList. This is an internal function.\r
-\r
- @param HiiPackageList The Package List Header.\r
- @param PackageIndex The index of the package to get.\r
- @param BufferLen The length of the package.\r
- @param Buffer The starting address of package.\r
-\r
- @retval EFI_SUCCESS This function completes successfully.\r
- @retval EFI_NOT_FOUND The package is not found.\r
-\r
-**/\r
-EFI_STATUS\r
-GetPackageDataFromPackageList (\r
- IN EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,\r
- IN UINT32 PackageIndex,\r
- OUT UINT32 *BufferLen,\r
- OUT EFI_HII_PACKAGE_HEADER **Buffer\r
- )\r
-{\r
- UINT32 Index;\r
- EFI_HII_PACKAGE_HEADER *Package;\r
- UINT32 Offset;\r
- UINT32 PackageListLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
-\r
- PackageHeader.Length = 0;\r
- PackageHeader.Type = 0;\r
-\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- if ((BufferLen == NULL) || (Buffer == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Package = NULL;\r
- Index = 0;\r
- Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
- PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
- while (Offset < PackageListLength) {\r
- Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- if (Index == PackageIndex) {\r
- break;\r
- }\r
- Offset += PackageHeader.Length;\r
- Index++;\r
- }\r
- if (Offset >= PackageListLength) {\r
- //\r
- // no package found in this Package List\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- *BufferLen = PackageHeader.Length;\r
- *Buffer = Package;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This is the internal worker function to update the data in\r
- a form specified by FormSetGuid, FormId and Label.\r
-\r
- @param FormSetGuid The optional Formset GUID.\r
- @param FormId The Form ID.\r
- @param Package The package header.\r
- @param PackageLength The package length.\r
- @param Label The label for the update.\r
- @param Insert True if inserting opcode to the form.\r
- @param Data The data payload.\r
- @param TempBuffer The resultant package.\r
- @param TempBufferSize The length of the resultant package.\r
-\r
- @retval EFI_OUT_OF_RESOURCES If there is not enough memory to complete the operation.\r
- @retval EFI_INVALID_PARAMETER If TempBuffer or TempBufferSize is NULL.\r
- @retval EFI_SUCCESS The function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UpdateFormPackageData (\r
- IN EFI_GUID *FormSetGuid, OPTIONAL\r
- IN EFI_FORM_ID FormId,\r
- IN EFI_HII_PACKAGE_HEADER *Package,\r
- IN UINT32 PackageLength,\r
- IN UINT16 Label,\r
- IN BOOLEAN Insert,\r
- IN EFI_HII_UPDATE_DATA *Data,\r
- OUT UINT8 **TempBuffer,\r
- OUT UINT32 *TempBufferSize\r
- )\r
-{\r
- UINTN AddSize;\r
- UINT8 *BufferPos;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- UINTN Offset;\r
- EFI_IFR_OP_HEADER *IfrOpHdr;\r
- BOOLEAN GetFormSet;\r
- BOOLEAN GetForm;\r
- UINT8 ExtendOpCode;\r
- UINT16 LabelNumber;\r
- BOOLEAN Updated;\r
- EFI_IFR_OP_HEADER *AddOpCode;\r
-\r
- if ((TempBuffer == NULL) || (TempBufferSize == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- *TempBufferSize = PackageLength;\r
- if (Data != NULL) {\r
- *TempBufferSize += Data->Offset;\r
- }\r
- *TempBuffer = AllocateZeroPool (*TempBufferSize);\r
- if (*TempBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- CopyMem (*TempBuffer, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- *TempBufferSize = sizeof (EFI_HII_PACKAGE_HEADER);\r
- BufferPos = *TempBuffer + sizeof (EFI_HII_PACKAGE_HEADER);\r
-\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER));\r
- Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
- GetFormSet = (BOOLEAN) ((FormSetGuid == NULL) ? TRUE : FALSE);\r
- GetForm = FALSE;\r
- Updated = FALSE;\r
-\r
- while (Offset < PackageHeader.Length) {\r
- CopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length);\r
- BufferPos += IfrOpHdr->Length;\r
- *TempBufferSize += IfrOpHdr->Length;\r
-\r
- switch (IfrOpHdr->OpCode) {\r
- case EFI_IFR_FORM_SET_OP :\r
- if (FormSetGuid != NULL) {\r
- if (CompareGuid((GUID *)(VOID *)&((EFI_IFR_FORM_SET *) IfrOpHdr)->Guid, FormSetGuid)) {\r
- GetFormSet = TRUE;\r
- }\r
- }\r
- break;\r
-\r
- case EFI_IFR_FORM_OP:\r
- if (CompareMem (&((EFI_IFR_FORM *) IfrOpHdr)->FormId, &FormId, sizeof (EFI_FORM_ID)) == 0) {\r
- GetForm = TRUE;\r
- }\r
- break;\r
-\r
- case EFI_IFR_GUID_OP :\r
- if (!GetFormSet || !GetForm || Updated) {\r
- //\r
- // Go to the next Op-Code\r
- //\r
- Offset += IfrOpHdr->Length;\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
- continue;\r
- }\r
-\r
- ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode;\r
- LabelNumber = ReadUnaligned16 ((UINT16 *)(VOID *)&((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Number);\r
- if ((ExtendOpCode != EFI_IFR_EXTEND_OP_LABEL) || (LabelNumber != Label) \r
- || !CompareGuid ((EFI_GUID *)(UINTN)(&((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Guid), &gEfiIfrTianoGuid)) {\r
- //\r
- // Go to the next Op-Code\r
- //\r
- Offset += IfrOpHdr->Length;\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
- continue;\r
- }\r
-\r
- if (Insert && (Data != NULL)) {\r
- //\r
- // insert the DataCount amount of opcodes to TempBuffer if Data is NULL remove\r
- // DataCount amount of opcodes unless runing into a label.\r
- //\r
- AddOpCode = (EFI_IFR_OP_HEADER *)Data->Data;\r
- AddSize = 0;\r
- while (AddSize < Data->Offset) {\r
- CopyMem (BufferPos, AddOpCode, AddOpCode->Length);\r
- BufferPos += AddOpCode->Length;\r
- *TempBufferSize += AddOpCode->Length;\r
-\r
- AddSize += AddOpCode->Length;\r
- AddOpCode = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (AddOpCode) + AddOpCode->Length);\r
- }\r
- } else {\r
- //\r
- // Search the next Label.\r
- //\r
- while (TRUE) {\r
- Offset += IfrOpHdr->Length;\r
- //\r
- // Search the next label and Fail if not label found.\r
- //\r
- if (Offset >= PackageHeader.Length) {\r
- goto Fail;\r
- }\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
- if (IfrOpHdr->OpCode == EFI_IFR_GUID_OP) {\r
- ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode;\r
- if ((ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) && CompareGuid ((EFI_GUID *)(UINTN)(&((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Guid), &gEfiIfrTianoGuid)) {\r
- break;\r
- }\r
- }\r
- }\r
-\r
- if (Data != NULL) {\r
- AddOpCode = (EFI_IFR_OP_HEADER *)Data->Data;\r
- AddSize = 0;\r
- while (AddSize < Data->Offset) {\r
- CopyMem (BufferPos, AddOpCode, AddOpCode->Length);\r
- BufferPos += AddOpCode->Length;\r
- *TempBufferSize += AddOpCode->Length;\r
-\r
- AddSize += AddOpCode->Length;\r
- AddOpCode = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (AddOpCode) + AddOpCode->Length);\r
- }\r
- }\r
-\r
- //\r
- // copy the next label\r
- //\r
- CopyMem (BufferPos, IfrOpHdr, IfrOpHdr->Length);\r
- BufferPos += IfrOpHdr->Length;\r
- *TempBufferSize += IfrOpHdr->Length;\r
- }\r
-\r
- Updated = TRUE;\r
- break;\r
- default :\r
- break;\r
- }\r
-\r
- //\r
- // Go to the next Op-Code\r
- //\r
- Offset += IfrOpHdr->Length;\r
- IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
- }\r
-\r
- //\r
- // Update the package length.\r
- //\r
- PackageHeader.Length = *TempBufferSize;\r
- CopyMem (*TempBuffer, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
-Fail:\r
- if (!Updated) {\r
- FreePool (*TempBuffer);\r
- *TempBufferSize = 0;\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- This function initialize the data structure for dynamic opcode.\r
-\r
- @param UpdateData The adding data;\r
- @param BufferSize Length of the buffer to fill dynamic opcodes.\r
-\r
- @retval EFI_SUCCESS Update data is initialized.\r
- @retval EFI_INVALID_PARAMETER UpdateData is NULL.\r
- @retval EFI_OUT_OF_RESOURCES No enough memory to allocate.\r
-\r
-**/\r
-EFI_STATUS\r
-IfrLibInitUpdateData (\r
- IN OUT EFI_HII_UPDATE_DATA *UpdateData,\r
- IN UINT32 BufferSize\r
- )\r
-{\r
- ASSERT (UpdateData != NULL);\r
-\r
- UpdateData->BufferSize = BufferSize;\r
- UpdateData->Offset = 0;\r
- UpdateData->Data = AllocatePool (BufferSize);\r
-\r
- return (UpdateData->Data != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;\r
-}\r
-\r
-/**\r
-\r
- This function free the resource of update data.\r
-\r
- @param UpdateData The adding data;\r
-\r
-**/\r
-VOID\r
-IfrLibFreeUpdateData (\r
- IN EFI_HII_UPDATE_DATA *UpdateData\r
- )\r
-{\r
- ASSERT (UpdateData != NULL);\r
- \r
- FreePool (UpdateData->Data);\r
- UpdateData->Data = NULL;\r
-\r
-}\r
-\r
-/**\r
- This function allows the caller to update a form that has\r
- previously been registered with the EFI HII database.\r
-\r
- @param Handle Hii Handle\r
- @param FormSetGuid The formset should be updated.\r
- @param FormId The form should be updated.\r
- @param Label Update information starting immediately after this\r
- label in the IFR\r
- @param Insert If TRUE and Data is not NULL, insert data after\r
- Label. If FALSE, replace opcodes between two\r
- labels with Data\r
- @param Data The adding data; If NULL, remove opcodes between\r
- two Label.\r
-\r
- @retval EFI_SUCCESS Update success.\r
- @retval Other Update fail.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibUpdateForm (\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_GUID *FormSetGuid, OPTIONAL\r
- IN EFI_FORM_ID FormId,\r
- IN UINT16 Label,\r
- IN BOOLEAN Insert,\r
- IN EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINT32 Index;\r
- EFI_HII_PACKAGE_LIST_HEADER *UpdateBuffer;\r
- UINTN BufferSize;\r
- UINT8 *UpdateBufferPos;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- EFI_HII_PACKAGE_HEADER *Package;\r
- UINT32 PackageLength;\r
- EFI_HII_PACKAGE_HEADER *TempBuffer;\r
- UINT32 TempBufferSize;\r
- BOOLEAN Updated;\r
-\r
- if (Data == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- HiiDatabase = gIfrLibHiiDatabase;\r
-\r
- //\r
- // Get the orginal package list\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- //\r
- // Handle is a invalid handle. Check if Handle is corrupted.\r
- //\r
- ASSERT (Status != EFI_NOT_FOUND);\r
- //\r
- // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
- //\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (HiiPackageList);\r
- return Status;\r
- }\r
-\r
- //\r
- // Calculate and allocate space for retrieval of IFR data\r
- //\r
- BufferSize += Data->Offset;\r
- UpdateBuffer = AllocateZeroPool (BufferSize);\r
- if (UpdateBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- UpdateBufferPos = (UINT8 *) UpdateBuffer;\r
-\r
- //\r
- // copy the package list header\r
- //\r
- CopyMem (UpdateBufferPos, HiiPackageList, sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
- UpdateBufferPos += sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-\r
- Updated = FALSE;\r
- for (Index = 0; ; Index++) {\r
- Status = GetPackageDataFromPackageList (HiiPackageList, Index, &PackageLength, &Package);\r
- if (Status == EFI_SUCCESS) {\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- if ((PackageHeader.Type == EFI_HII_PACKAGE_FORMS) && !Updated) {\r
- Status = UpdateFormPackageData (FormSetGuid, FormId, Package, PackageLength, Label, Insert, Data, (UINT8 **)&TempBuffer, &TempBufferSize);\r
- if (!EFI_ERROR(Status)) {\r
- if (FormSetGuid == NULL) {\r
- Updated = TRUE;\r
- }\r
- CopyMem (UpdateBufferPos, TempBuffer, TempBufferSize);\r
- UpdateBufferPos += TempBufferSize;\r
- FreePool (TempBuffer);\r
- continue;\r
- }\r
- }\r
-\r
- CopyMem (UpdateBufferPos, Package, PackageLength);\r
- UpdateBufferPos += PackageLength;\r
- } else if (Status == EFI_NOT_FOUND) {\r
- break;\r
- } else {\r
- FreePool (HiiPackageList);\r
- return Status;\r
- }\r
- }\r
-\r
- //\r
- // Update package list length\r
- //\r
- BufferSize = UpdateBufferPos - (UINT8 *) UpdateBuffer;\r
- WriteUnaligned32 (&UpdateBuffer->PackageLength, (UINT32)BufferSize);\r
-\r
- FreePool (HiiPackageList);\r
-\r
- return HiiDatabase->UpdatePackageList (HiiDatabase, Handle, UpdateBuffer);\r
-}\r
-\r
-\r
-/**\r
- Configure the buffer accrording to ConfigBody strings in the format of\r
- <Length:4 bytes>, <Offset: 2 bytes>, <Width:2 bytes>, <Data:n bytes>.\r
- This ConfigBody strings is generated by UEFI VfrCompiler for the default\r
- values in a Form Set. The name of the ConfigBody strings is VfrMyIfrNVDataDefault0000\r
- constructed following this rule: \r
- "Vfr" + varstore.name + "Default" + defaultstore.attributes.\r
- Check the generated C file in Output for details.\r
-\r
- @param Buffer The start address of buffer.\r
- @param BufferSize The size of buffer.\r
- @param Number The number of the strings.\r
- @param ... Variable argument list for default value in <AltResp> format \r
- generated by the tool.\r
-\r
- @retval EFI_BUFFER_TOO_SMALL the BufferSize is too small to operate.\r
- @retval EFI_INVALID_PARAMETER Buffer is NULL or BufferSize is 0.\r
- @retval EFI_SUCCESS Operation successful.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibExtractDefault(\r
- IN VOID *Buffer,\r
- IN UINTN *BufferSize,\r
- UINTN Number,\r
- ...\r
- )\r
-{\r
- VA_LIST Args;\r
- UINTN Index;\r
- UINT32 TotalLen;\r
- UINT8 *BufCfgArray;\r
- UINT8 *BufferPos;\r
- UINT16 Offset;\r
- UINT16 Width;\r
- UINT8 *Value;\r
-\r
- if ((Buffer == NULL) || (BufferSize == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Offset = 0;\r
- Width = 0;\r
- Value = NULL;\r
-\r
- VA_START (Args, Number);\r
- for (Index = 0; Index < Number; Index++) {\r
- BufCfgArray = (UINT8 *) VA_ARG (Args, VOID *);\r
- TotalLen = ReadUnaligned32 ((UINT32 *)BufCfgArray);\r
- BufferPos = BufCfgArray + sizeof (UINT32);\r
-\r
- while ((UINT32)(BufferPos - BufCfgArray) < TotalLen) {\r
- Offset = ReadUnaligned16 ((UINT16 *)BufferPos);\r
- BufferPos += sizeof (UINT16);\r
- Width = ReadUnaligned16 ((UINT16 *)BufferPos);\r
- BufferPos += sizeof (UINT16);\r
- Value = BufferPos;\r
- BufferPos += Width;\r
-\r
- if ((UINTN)(Offset + Width) > *BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- CopyMem ((UINT8 *)Buffer + Offset, Value, Width);\r
- }\r
- }\r
- VA_END (Args);\r
-\r
- *BufferSize = (UINTN)Offset;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
+++ /dev/null
-/** @file\r
- Library Routines to create IFR independent of string data - assume tokens already exist\r
- Primarily to be used for exporting op-codes at a label in pre-defined forms.\r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "LibraryInternal.h"\r
-\r
-/**\r
- Create GUIDed opcode for banner. Banner opcode\r
- EFI_IFR_EXTEND_OP_BANNER is extended opcode specific\r
- to Intel's implementation.\r
-\r
- @param Title String ID for title\r
- @param LineNumber Line number for this banner\r
- @param Alignment Alignment for this banner, left, center or right\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode create success\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateBannerOpCode (\r
- IN EFI_STRING_ID Title,\r
- IN UINT16 LineNumber,\r
- IN UINT8 Alignment,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_GUID_BANNER Banner;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_GUID_BANNER) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Banner.Header.OpCode = EFI_IFR_GUID_OP;\r
- Banner.Header.Length = sizeof (EFI_IFR_GUID_BANNER);\r
- Banner.Header.Scope = 0;\r
- CopyMem (&Banner.Guid, &gEfiIfrTianoGuid, sizeof (EFI_IFR_GUID));\r
- Banner.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
- Banner.Title = Title;\r
- Banner.LineNumber = LineNumber;\r
- Banner.Alignment = Alignment;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- CopyMem (LocalBuffer, &Banner, sizeof (EFI_IFR_GUID_BANNER));\r
- Data->Offset += sizeof (EFI_IFR_GUID_BANNER);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
+++ /dev/null
-/** @file\r
- The file contain all library function for Ifr Operations.\r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef _IFRLIBRARY_INTERNAL_H_\r
-#define _IFRLIBRARY_INTERNAL_H_\r
-\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Protocol/DevicePath.h>\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/IfrSupportLib.h>\r
-#include <Library/PcdLib.h>\r
-\r
-#include <Guid/MdeModuleHii.h>\r
-\r
-extern CONST EFI_GUID mIfrVendorGuid;\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
-Utility functions which helps in opcode creation, HII configuration string manipulations, \r
-pop up window creations, setup browser persistence data set and get.\r
-\r
-Copyright (c) 2007- 2009, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "UefiIfrLibraryInternal.h"\r
-\r
-CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2 = NULL;\r
-CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mIfrSupportLibHiiConfigRouting = NULL;\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mIfrSupportLibHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
-\r
-//\r
-// Fake <ConfigHdr>\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";\r
-\r
-/**\r
- This function locate FormBrowser2 protocols for later usage.\r
-\r
- @return Status the status to locate protocol.\r
-**/\r
-EFI_STATUS\r
-LocateFormBrowser2Protocols (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- //\r
- // Locate protocols for later usage\r
- //\r
- if (mFormBrowser2 == NULL) {\r
- Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &mFormBrowser2);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- \r
- if (mIfrSupportLibHiiConfigRouting == NULL) {\r
- Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &mIfrSupportLibHiiConfigRouting);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Draw a dialog and return the selected key.\r
-\r
- @param NumberOfLines The number of lines for the dialog box\r
- @param KeyValue The EFI_KEY value returned if HotKey is TRUE..\r
- @param String The first String to be displayed in the Pop-Up.\r
- @param Marker A series of (quantity == NumberOfLines - 1) text\r
- strings which will be used to construct the dialog\r
- box\r
-\r
- @retval EFI_SUCCESS Displayed dialog and received user interaction\r
- @retval EFI_INVALID_PARAMETER One of the parameters was invalid.\r
- @retval EFI_OUT_OF_RESOURCES There is no enough available memory space.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibCreatePopUp2 (\r
- IN UINTN NumberOfLines,\r
- OUT EFI_INPUT_KEY *KeyValue,\r
- IN CHAR16 *String,\r
- IN VA_LIST Marker\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Count;\r
- UINTN Start;\r
- UINTN Top;\r
- CHAR16 *StringPtr;\r
- UINTN LeftColumn;\r
- UINTN RightColumn;\r
- UINTN TopRow;\r
- UINTN BottomRow;\r
- UINTN DimensionsWidth;\r
- UINTN DimensionsHeight;\r
- EFI_INPUT_KEY Key;\r
- UINTN LargestString;\r
- CHAR16 *StackString;\r
- EFI_STATUS Status;\r
- UINTN StringLen;\r
- CHAR16 *LineBuffer;\r
- CHAR16 **StringArray;\r
- EFI_EVENT TimerEvent;\r
- EFI_EVENT WaitList[2];\r
- UINTN CurrentAttribute;\r
- EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;\r
-\r
- if ((KeyValue == NULL) || (String == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- TopRow = 0;\r
- BottomRow = 0;\r
- LeftColumn = 0;\r
- RightColumn = 0;\r
-\r
- ConOut = gST->ConOut;\r
- ConOut->QueryMode (ConOut, ConOut->Mode->Mode, &RightColumn, &BottomRow);\r
-\r
- DimensionsWidth = RightColumn - LeftColumn;\r
- DimensionsHeight = BottomRow - TopRow;\r
-\r
- CurrentAttribute = ConOut->Mode->Attribute;\r
-\r
- LineBuffer = AllocateZeroPool (DimensionsWidth * sizeof (CHAR16));\r
- if (LineBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- //\r
- // Determine the largest string in the dialog box\r
- // Notice we are starting with 1 since String is the first string\r
- //\r
- StringArray = AllocateZeroPool (NumberOfLines * sizeof (CHAR16 *));\r
- if (StringArray == NULL) {\r
- FreePool (LineBuffer);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- LargestString = StrLen (String);\r
- StringArray[0] = String;\r
-\r
- for (Index = 1; Index < NumberOfLines; Index++) {\r
- StackString = VA_ARG (Marker, CHAR16 *);\r
-\r
- if (StackString == NULL) {\r
- FreePool (LineBuffer);\r
- FreePool (StringArray);\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- StringArray[Index] = StackString;\r
- StringLen = StrLen (StackString);\r
- if (StringLen > LargestString) {\r
- LargestString = StringLen;\r
- }\r
- }\r
-\r
- if ((LargestString + 2) > DimensionsWidth) {\r
- LargestString = DimensionsWidth - 2;\r
- }\r
-\r
- //\r
- // Subtract the PopUp width from total Columns, allow for one space extra on\r
- // each end plus a border.\r
- //\r
- Start = (DimensionsWidth - LargestString - 2) / 2 + LeftColumn + 1;\r
-\r
- Top = ((DimensionsHeight - NumberOfLines - 2) / 2) + TopRow - 1;\r
-\r
- //\r
- // Disable cursor\r
- //\r
- ConOut->EnableCursor (ConOut, FALSE);\r
- ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);\r
-\r
- StringPtr = &LineBuffer[0];\r
- *StringPtr++ = BOXDRAW_DOWN_RIGHT;\r
- for (Index = 0; Index < LargestString; Index++) {\r
- *StringPtr++ = BOXDRAW_HORIZONTAL;\r
- }\r
- *StringPtr++ = BOXDRAW_DOWN_LEFT;\r
- *StringPtr = L'\0';\r
-\r
- ConOut->SetCursorPosition (ConOut, Start, Top);\r
- ConOut->OutputString (ConOut, LineBuffer);\r
-\r
- for (Index = 0; Index < NumberOfLines; Index++) {\r
- StringPtr = &LineBuffer[0];\r
- *StringPtr++ = BOXDRAW_VERTICAL;\r
-\r
- for (Count = 0; Count < LargestString; Count++) {\r
- StringPtr[Count] = L' ';\r
- }\r
-\r
- StringLen = StrLen (StringArray[Index]);\r
- if (StringLen > LargestString) {\r
- StringLen = LargestString;\r
- }\r
- CopyMem (\r
- StringPtr + ((LargestString - StringLen) / 2),\r
- StringArray[Index],\r
- StringLen * sizeof (CHAR16)\r
- );\r
- StringPtr += LargestString;\r
-\r
- *StringPtr++ = BOXDRAW_VERTICAL;\r
- *StringPtr = L'\0';\r
-\r
- ConOut->SetCursorPosition (ConOut, Start, Top + 1 + Index);\r
- ConOut->OutputString (ConOut, LineBuffer);\r
- }\r
-\r
- StringPtr = &LineBuffer[0];\r
- *StringPtr++ = BOXDRAW_UP_RIGHT;\r
- for (Index = 0; Index < LargestString; Index++) {\r
- *StringPtr++ = BOXDRAW_HORIZONTAL;\r
- }\r
- *StringPtr++ = BOXDRAW_UP_LEFT;\r
- *StringPtr = L'\0';\r
-\r
- ConOut->SetCursorPosition (ConOut, Start, Top + NumberOfLines + 1);\r
- ConOut->OutputString (ConOut, LineBuffer);\r
-\r
- do {\r
- Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
-\r
- //\r
- // Set a timer event of 1 second expiration\r
- //\r
- gBS->SetTimer (\r
- TimerEvent,\r
- TimerRelative,\r
- 10000000\r
- );\r
-\r
- //\r
- // Wait for the keystroke event or the timer\r
- //\r
- WaitList[0] = gST->ConIn->WaitForKey;\r
- WaitList[1] = TimerEvent;\r
- Status = gBS->WaitForEvent (2, WaitList, &Index);\r
-\r
- //\r
- // Check for the timer expiration\r
- //\r
- if (!EFI_ERROR (Status) && Index == 1) {\r
- Status = EFI_TIMEOUT;\r
- }\r
-\r
- gBS->CloseEvent (TimerEvent);\r
- } while (Status == EFI_TIMEOUT);\r
-\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
- CopyMem (KeyValue, &Key, sizeof (EFI_INPUT_KEY));\r
-\r
- ConOut->SetAttribute (ConOut, CurrentAttribute);\r
- ConOut->EnableCursor (ConOut, TRUE);\r
-\r
- FreePool (LineBuffer);\r
- FreePool (StringArray);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Draw a dialog and return the selected key.\r
-\r
- @param NumberOfLines The number of lines for the dialog box\r
- @param KeyValue The EFI_KEY value returned if HotKey is TRUE..\r
- @param String Pointer to the first string in the list\r
- @param ... A series of (quantity == NumberOfLines - 1) text\r
- strings which will be used to construct the dialog\r
- box\r
-\r
- @retval EFI_SUCCESS Displayed dialog and received user interaction\r
- @retval EFI_INVALID_PARAMETER One of the parameters was invalid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IfrLibCreatePopUp (\r
- IN UINTN NumberOfLines,\r
- OUT EFI_INPUT_KEY *KeyValue,\r
- IN CHAR16 *String,\r
- ...\r
- )\r
-{\r
- EFI_STATUS Status;\r
- VA_LIST Marker;\r
-\r
- VA_START (Marker, String);\r
-\r
- Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, String, Marker);\r
-\r
- VA_END (Marker);\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Extract block name from the array generated by VFR compiler. The name of\r
- this array is "Vfr + <StorageName> + BlockName", e.g. "VfrMyIfrNVDataBlockName".\r
- Format of this array is:\r
- Array length | 4-bytes\r
- Offset | 2-bytes\r
- Width | 2-bytes\r
- Offset | 2-bytes\r
- Width | 2-bytes\r
- ... ...\r
-\r
- @param Buffer Array generated by VFR compiler.\r
- @param BlockName The returned <BlockName>\r
-\r
- @retval EFI_OUT_OF_RESOURCES Run out of memory resource.\r
- @retval EFI_INVALID_PARAMETER Buffer is NULL or BlockName is NULL.\r
- @retval EFI_SUCCESS Operation successful.\r
-\r
-**/\r
-EFI_STATUS\r
-ExtractBlockName (\r
- IN UINT8 *Buffer,\r
- OUT CHAR16 **BlockName\r
- )\r
-\r
-{\r
- UINTN Index;\r
- UINT32 Length;\r
- UINT32 BlockNameNumber;\r
- UINTN HexStringBufferLen;\r
- CHAR16 *StringPtr;\r
-\r
- if ((Buffer == NULL) || (BlockName == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Calculate number of Offset/Width pair\r
- //\r
- CopyMem (&Length, Buffer, sizeof (UINT32));\r
- BlockNameNumber = (Length - sizeof (UINT32)) / (sizeof (UINT16) * 2);\r
-\r
- //\r
- // <BlockName> ::= &OFFSET=1234&WIDTH=1234\r
- // | 8 | 4 | 7 | 4 |\r
- //\r
- StringPtr = AllocateZeroPool ((BlockNameNumber * (8 + 4 + 7 + 4) + 1) * sizeof (CHAR16));\r
- if (StringPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- *BlockName = StringPtr;\r
-\r
- Buffer += sizeof (UINT32);\r
- for (Index = 0; Index < BlockNameNumber; Index++) {\r
- StrCpy (StringPtr, L"&OFFSET=");\r
- StringPtr += 8;\r
-\r
- HexStringBufferLen = 5;\r
- BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16));\r
- Buffer += sizeof (UINT16);\r
- StringPtr += 4;\r
-\r
- StrCpy (StringPtr, L"&WIDTH=");\r
- StringPtr += 7;\r
-\r
- HexStringBufferLen = 5;\r
- BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16));\r
- Buffer += sizeof (UINT16);\r
- StringPtr += 4;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-\r
- Extract block config from the array generated by VFR compiler. The name of\r
- this array is "Vfr + <StorageName> + Default<HexCh>4", e.g. "VfrMyIfrNVDataDefault0000".\r
-\r
- @param Buffer - Array generated by VFR compiler.\r
- @param BlockConfig - The returned <BlockConfig>\r
-\r
- @retval EFI_OUT_OF_RESOURCES - Run out of memory resource.\r
- @retval EFI_INVALID_PARAMETER - Buffer is NULL or BlockConfig is NULL.\r
- @retval EFI_SUCCESS - Operation successful.\r
-\r
-**/\r
-EFI_STATUS\r
-ExtractBlockConfig (\r
- IN UINT8 *Buffer,\r
- OUT CHAR16 **BlockConfig\r
- )\r
-{\r
- UINT32 Length;\r
- UINT16 Width;\r
- UINTN HexStringBufferLen;\r
- CHAR16 *StringPtr;\r
- UINT8 *BufferEnd;\r
- CHAR16 *StringEnd;\r
- EFI_STATUS Status;\r
-\r
- if ((Buffer == NULL) || (BlockConfig == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // Calculate length of AltResp string\r
- // Format of Default value array is:\r
- // Array length | 4-bytes\r
- // Offset | 2-bytes\r
- // Width | 2-bytes\r
- // Value | Variable length\r
- // Offset | 2-bytes\r
- // Width | 2-bytes\r
- // Value | Variable length\r
- // ... ...\r
- // When value is 1 byte in length, overhead of AltResp string will be maximum,\r
- // BlockConfig ::= <&OFFSET=1234&WIDTH=1234&VALUE=12>+\r
- // | 8 | 4 | 7 | 4 | 7 |2|\r
- // so the maximum length of BlockConfig could be calculated as:\r
- // (ArrayLength / 5) * (8 + 4 + 7 + 4 + 7 + 2) = ArrayLength * 6.4 < ArrayLength * 7\r
- //\r
- CopyMem (&Length, Buffer, sizeof (UINT32));\r
- BufferEnd = Buffer + Length;\r
- StringPtr = AllocatePool (Length * 7 * sizeof (CHAR16));\r
- *BlockConfig = StringPtr;\r
- if (StringPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- StringEnd = StringPtr + (Length * 7);\r
-\r
- Buffer += sizeof (UINT32);\r
- while (Buffer < BufferEnd) {\r
- StrCpy (StringPtr, L"&OFFSET=");\r
- StringPtr += 8;\r
-\r
- HexStringBufferLen = 5;\r
- BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16));\r
- Buffer += sizeof (UINT16);\r
- StringPtr += 4;\r
-\r
- StrCpy (StringPtr, L"&WIDTH=");\r
- StringPtr += 7;\r
-\r
- HexStringBufferLen = 5;\r
- BufToHexString (StringPtr, &HexStringBufferLen, Buffer, sizeof (UINT16));\r
- CopyMem (&Width, Buffer, sizeof (UINT16));\r
- Buffer += sizeof (UINT16);\r
- StringPtr += 4;\r
-\r
- StrCpy (StringPtr, L"&VALUE=");\r
- StringPtr += 7;\r
-\r
- HexStringBufferLen = StringEnd - StringPtr;\r
- Status = BufToHexString (StringPtr, &HexStringBufferLen, Buffer, Width);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- Buffer += Width;\r
- StringPtr += (Width * 2);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Construct <ConfigAltResp> for a buffer storage.\r
-\r
- @param ConfigRequest The Config request string. If set to NULL, all the\r
- configurable elements will be extracted from BlockNameArray.\r
- @param ConfigAltResp The returned <ConfigAltResp>.\r
- @param Progress On return, points to a character in the Request.\r
- @param Guid GUID of the buffer storage.\r
- @param Name Name of the buffer storage.\r
- @param DriverHandle The DriverHandle which is used to invoke HiiDatabase\r
- protocol interface NewPackageList().\r
- @param BufferStorage Content of the buffer storage.\r
- @param BufferStorageSize Length in bytes of the buffer storage.\r
- @param BlockNameArray Array generated by VFR compiler.\r
- @param NumberAltCfg Number of Default value array generated by VFR compiler.\r
- The sequential input parameters will be number of\r
- AltCfgId and DefaultValueArray pairs. When set to 0,\r
- there will be no <AltResp>.\r
-\r
- retval EFI_OUT_OF_RESOURCES Run out of memory resource.\r
- retval EFI_INVALID_PARAMETER ConfigAltResp is NULL.\r
- retval EFI_SUCCESS Operation successful.\r
-\r
-**/\r
-EFI_STATUS\r
-ConstructConfigAltResp (\r
- IN EFI_STRING ConfigRequest, OPTIONAL\r
- OUT EFI_STRING *Progress,\r
- OUT EFI_STRING *ConfigAltResp,\r
- IN EFI_GUID *Guid,\r
- IN CHAR16 *Name,\r
- IN EFI_HANDLE *DriverHandle,\r
- IN VOID *BufferStorage,\r
- IN UINTN BufferStorageSize,\r
- IN VOID *BlockNameArray, OPTIONAL\r
- IN UINTN NumberAltCfg,\r
- ...\r
-//IN UINT16 AltCfgId,\r
-//IN VOID *DefaultValueArray,\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 *ConfigHdr;\r
- CHAR16 *BlockName;\r
- CHAR16 *DescHdr;\r
- CHAR16 *StringPtr;\r
- CHAR16 **AltCfg;\r
- UINT16 AltCfgId;\r
- VOID *DefaultValueArray;\r
- UINTN StrBufferLen;\r
- EFI_STRING ConfigResp;\r
- EFI_STRING TempStr;\r
- VA_LIST Args;\r
- UINTN AltRespLen;\r
- UINTN Index;\r
- BOOLEAN NeedFreeConfigRequest;\r
- EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
- UINTN Len;\r
-\r
- if (ConfigAltResp == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- \r
- DescHdr = NULL;\r
- StringPtr = NULL;\r
- AltCfg = NULL;\r
- ConfigResp = NULL;\r
- BlockName = NULL;\r
- NeedFreeConfigRequest = FALSE;\r
-\r
- //\r
- // Construct <ConfigHdr> : "GUID=...&NAME=...&PATH=..."\r
- //\r
- ConfigHdr = NULL;\r
- StrBufferLen = 0;\r
- Status = ConstructConfigHdr (\r
- ConfigHdr,\r
- &StrBufferLen,\r
- Guid,\r
- Name,\r
- DriverHandle\r
- );\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
- ConfigHdr = AllocateZeroPool (StrBufferLen);\r
- if (ConfigHdr == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- Status = ConstructConfigHdr (\r
- ConfigHdr,\r
- &StrBufferLen,\r
- Guid,\r
- Name,\r
- DriverHandle\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
- }\r
-\r
- //\r
- // Construct <ConfigResp>\r
- //\r
- if (ConfigRequest == NULL) {\r
- //\r
- // If ConfigRequest is set to NULL, export all configurable elements in BlockNameArray\r
- //\r
- Status = ExtractBlockName (BlockNameArray, &BlockName);\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
- }\r
- \r
- Len = StrSize (ConfigHdr);\r
- ConfigRequest = AllocateZeroPool (Len + StrSize (BlockName) - sizeof (CHAR16));\r
- if (ConfigRequest == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- \r
- StrCpy (ConfigRequest, ConfigHdr);\r
- StrCat (ConfigRequest, BlockName);\r
- NeedFreeConfigRequest = TRUE;\r
-\r
- }\r
-\r
- Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = HiiConfigRouting->BlockToConfig (\r
- HiiConfigRouting,\r
- ConfigRequest,\r
- BufferStorage,\r
- BufferStorageSize,\r
- &ConfigResp,\r
- (Progress == NULL) ? &TempStr : Progress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- AltRespLen = 0;\r
- //\r
- // Construct <AltResp>\r
- //\r
- if (NumberAltCfg > 0) {\r
- DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
- if (DescHdr == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
- \r
- StringPtr = DescHdr;\r
- AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
- if (AltCfg == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Exit;\r
- }\r
-\r
- VA_START (Args, NumberAltCfg);\r
- for (Index = 0; Index < NumberAltCfg; Index++) {\r
- AltCfgId = (UINT16) VA_ARG (Args, UINT16);\r
- DefaultValueArray = (UINT8 *) VA_ARG (Args, VOID *);\r
- \r
- //\r
- // '&' <ConfigHdr>\r
- //\r
- AltRespLen += (StrLen (ConfigHdr) + 1);\r
- \r
- StringPtr = DescHdr + Index * 16;\r
- StrCpy (StringPtr, L"&ALTCFG=");\r
- AltRespLen += (8 + sizeof (UINT16) * 2);\r
- \r
- StrBufferLen = 5;\r
- BufToHexString (StringPtr + 8, &StrBufferLen, (UINT8 *) &AltCfgId, sizeof (UINT16));\r
- Status = ExtractBlockConfig (DefaultValueArray, &AltCfg[Index]);\r
- if (EFI_ERROR (Status)) {\r
- goto Exit;\r
- }\r
- AltRespLen += StrLen (AltCfg[Index]);\r
- }\r
- VA_END (Args);\r
- }\r
-\r
- //\r
- // Generate the final <ConfigAltResp>\r
- //\r
- StrBufferLen = (StrLen ((CHAR16 *) ConfigResp) + AltRespLen + 1) * sizeof (CHAR16);\r
- TempStr = AllocateZeroPool (StrBufferLen);\r
- *ConfigAltResp = TempStr;\r
- if (TempStr == NULL) {\r
- goto Exit;\r
- }\r
-\r
- //\r
- // <ConfigAltResp> ::= <ConfigResp> ['&' <AltResp>]*\r
- //\r
- StrCpy (TempStr, ConfigResp);\r
- for (Index = 0; Index < NumberAltCfg; Index++) {\r
- StrCat (TempStr, L"&");\r
- StrCat (TempStr, ConfigHdr);\r
- StrCat (TempStr, DescHdr + Index * 16);\r
- StrCat (TempStr, AltCfg[Index]);\r
-\r
- FreePool (AltCfg[Index]);\r
- }\r
-\r
-Exit:\r
- if (NeedFreeConfigRequest) {\r
- FreePool (ConfigRequest);\r
- }\r
- FreePool (ConfigHdr);\r
- if (ConfigResp != NULL) {\r
- FreePool (ConfigResp);\r
- }\r
-\r
- if (BlockName != NULL) {\r
- FreePool (BlockName);\r
- }\r
-\r
- if (NumberAltCfg > 0) {\r
- FreePool (DescHdr);\r
- FreePool (AltCfg);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Swap bytes in the buffer. This is a internal function.\r
-\r
- @param Buffer Binary buffer.\r
- @param BufferSize Size of the buffer in bytes.\r
-\r
- @return None.\r
-\r
-**/\r
-VOID\r
-SwapBuffer (\r
- IN OUT UINT8 *Buffer,\r
- IN UINTN BufferSize\r
- )\r
-{\r
- UINTN Index;\r
- UINT8 Temp;\r
- UINTN SwapCount;\r
-\r
- SwapCount = BufferSize / 2;\r
- for (Index = 0; Index < SwapCount; Index++) {\r
- Temp = Buffer[Index];\r
- Buffer[Index] = Buffer[BufferSize - 1 - Index];\r
- Buffer[BufferSize - 1 - Index] = Temp;\r
- }\r
-}\r
-\r
-/**\r
- Converts the unicode character of the string from uppercase to lowercase.\r
- This is a internal function.\r
-\r
- @param Str String to be converted\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-ToLower (\r
- IN OUT CHAR16 *Str\r
- )\r
-{\r
- CHAR16 *Ptr;\r
- \r
- for (Ptr = Str; *Ptr != L'\0'; Ptr++) {\r
- if (*Ptr >= L'A' && *Ptr <= L'Z') {\r
- *Ptr = (CHAR16) (*Ptr - L'A' + L'a');\r
- }\r
- }\r
-}\r
-\r
-\r
-/**\r
- Converts binary buffer to Unicode string in reversed byte order from BufToHexString().\r
-\r
- @param Str String for output\r
- @param Buffer Binary buffer.\r
- @param BufferSize Size of the buffer in bytes.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval EFI_OUT_OF_RESOURCES There is no enough available memory space.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-BufInReverseOrderToHexString (\r
- IN OUT CHAR16 *Str,\r
- IN UINT8 *Buffer,\r
- IN UINTN BufferSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *NewBuffer;\r
- UINTN StrBufferLen;\r
-\r
- NewBuffer = AllocateCopyPool (BufferSize, Buffer);\r
- if (NewBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- SwapBuffer (NewBuffer, BufferSize);\r
-\r
- StrBufferLen = BufferSize * sizeof (CHAR16) + 1;\r
- Status = BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);\r
-\r
- FreePool (NewBuffer);\r
- //\r
- // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
- //\r
- ToLower (Str);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Converts Hex String to binary buffer in reversed byte order from HexStringToBuf().\r
-\r
- @param Buffer Pointer to buffer that receives the data.\r
- @param BufferSize Length in bytes of the buffer to hold converted\r
- data. If routine return with EFI_SUCCESS,\r
- containing length of converted data. If routine\r
- return with EFI_BUFFER_TOO_SMALL, containg length\r
- of buffer desired.\r
- @param Str String to be converted from.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval RETURN_BUFFER_TOO_SMALL The input BufferSize is too small to hold the output. BufferSize\r
- will be updated to the size required for the converstion.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HexStringToBufInReverseOrder (\r
- IN OUT UINT8 *Buffer,\r
- IN OUT UINTN *BufferSize,\r
- IN CHAR16 *Str\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN ConvertedStrLen;\r
-\r
- ConvertedStrLen = 0;\r
- Status = HexStringToBuf (Buffer, BufferSize, Str, &ConvertedStrLen);\r
- if (!EFI_ERROR (Status)) {\r
- SwapBuffer (Buffer, (ConvertedStrLen + 1) / 2);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Convert binary representation Config string (e.g. "0041004200430044") to the\r
- original string (e.g. "ABCD"). Config string appears in <ConfigHdr> (i.e.\r
- "&NAME=<string>"), or Name/Value pair in <ConfigBody> (i.e. "label=<string>").\r
-\r
- @param UnicodeString Original Unicode string.\r
- @param StrBufferLen On input: Length in bytes of buffer to hold the Unicode string.\r
- Includes tailing '\0' character.\r
- On output:\r
- If return EFI_SUCCESS, containing length of Unicode string buffer.\r
- If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired.\r
- @param ConfigString Binary representation of Unicode String, <string> := (<HexCh>4)+\r
-\r
- @retval EFI_SUCCESS Operation completes successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The string buffer is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConfigStringToUnicode (\r
- IN OUT CHAR16 *UnicodeString,\r
- IN OUT UINTN *StrBufferLen,\r
- IN CHAR16 *ConfigString\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Len;\r
- UINTN BufferSize;\r
- CHAR16 BackupChar;\r
-\r
- Len = StrLen (ConfigString) / 4;\r
- BufferSize = (Len + 1) * sizeof (CHAR16);\r
-\r
- if (*StrBufferLen < BufferSize) {\r
- *StrBufferLen = BufferSize;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *StrBufferLen = BufferSize;\r
-\r
- for (Index = 0; Index < Len; Index++) {\r
- BackupChar = ConfigString[4];\r
- ConfigString[4] = L'\0';\r
-\r
- HexStringToBuf ((UINT8 *) UnicodeString, &BufferSize, ConfigString, NULL);\r
-\r
- ConfigString[4] = BackupChar;\r
-\r
- ConfigString += 4;\r
- UnicodeString += 1;\r
- }\r
-\r
- //\r
- // Add tailing '\0' character\r
- //\r
- *UnicodeString = L'\0';\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Convert Unicode string to binary representation Config string, e.g.\r
- "ABCD" => "0041004200430044". Config string appears in <ConfigHdr> (i.e.\r
- "&NAME=<string>"), or Name/Value pair in <ConfigBody> (i.e. "label=<string>").\r
-\r
- @param ConfigString Binary representation of Unicode String, <string> := (<HexCh>4)+\r
- @param StrBufferLen On input: Length in bytes of buffer to hold the Unicode string.\r
- Includes tailing '\0' character.\r
- On output:\r
- If return EFI_SUCCESS, containing length of Unicode string buffer.\r
- If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired.\r
- @param UnicodeString Original Unicode string.\r
-\r
- @retval EFI_SUCCESS Operation completes successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The string buffer is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UnicodeToConfigString (\r
- IN OUT CHAR16 *ConfigString,\r
- IN OUT UINTN *StrBufferLen,\r
- IN CHAR16 *UnicodeString\r
- )\r
-{\r
- UINTN Index;\r
- UINTN Len;\r
- UINTN BufferSize;\r
- CHAR16 *String;\r
-\r
- Len = StrLen (UnicodeString);\r
- BufferSize = (Len * 4 + 1) * sizeof (CHAR16);\r
-\r
- if (*StrBufferLen < BufferSize) {\r
- *StrBufferLen = BufferSize;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *StrBufferLen = BufferSize;\r
- String = ConfigString;\r
-\r
- for (Index = 0; Index < Len; Index++) {\r
- BufToHexString (ConfigString, &BufferSize, (UINT8 *) UnicodeString, 2);\r
-\r
- ConfigString += 4;\r
- UnicodeString += 1;\r
- }\r
-\r
- //\r
- // Add tailing '\0' character\r
- //\r
- *ConfigString = L'\0';\r
-\r
- //\r
- // Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.\r
- //\r
- ToLower (String); \r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Construct <ConfigHdr> using routing information GUID/NAME/PATH.\r
-\r
- @param ConfigHdr Pointer to the ConfigHdr string.\r
- @param StrBufferLen On input: Length in bytes of buffer to hold the\r
- ConfigHdr string. Includes tailing '\0' character.\r
- On output: If return EFI_SUCCESS, containing\r
- length of ConfigHdr string buffer. If return\r
- EFI_BUFFER_TOO_SMALL, containg length of string\r
- buffer desired.\r
- @param Guid Routing information: GUID.\r
- @param Name Routing information: NAME.\r
- @param DriverHandle Driver handle which contains the routing\r
- information: PATH.\r
-\r
- @retval EFI_SUCCESS Operation completes successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The ConfigHdr string buffer is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConstructConfigHdr (\r
- IN OUT CHAR16 *ConfigHdr,\r
- IN OUT UINTN *StrBufferLen,\r
- IN CONST EFI_GUID *Guid,\r
- IN CHAR16 *Name, OPTIONAL\r
- IN EFI_HANDLE *DriverHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN NameStrLen;\r
- UINTN DevicePathSize;\r
- UINTN BufferSize;\r
- CHAR16 *StrPtr;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-\r
- //\r
- // Make sure when ConfigHdr is NULL, StrBufferlen must be 0\r
- //\r
- ASSERT (!(ConfigHdr == NULL && *StrBufferLen != 0));\r
-\r
- if (Name == NULL) {\r
- //\r
- // There will be no "NAME" in <ConfigHdr> for Name/Value storage\r
- //\r
- NameStrLen = 0;\r
- } else {\r
- //\r
- // For buffer storage\r
- //\r
- NameStrLen = StrLen (Name);\r
- }\r
-\r
- //\r
- // Retrieve DevicePath Protocol associated with this HiiPackageList\r
- //\r
- Status = gBS->HandleProtocol (\r
- DriverHandle,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &DevicePath\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- DevicePathSize = GetDevicePathSize (DevicePath);\r
-\r
- //\r
- // GUID=<HexCh>32&NAME=<Char>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL>\r
- // | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 |\r
- //\r
- BufferSize = (5 + 32 + 6 + NameStrLen * 4 + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16);\r
- if ((*StrBufferLen == 0) || *StrBufferLen < BufferSize) {\r
- *StrBufferLen = BufferSize;\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *StrBufferLen = BufferSize;\r
-\r
- StrPtr = ConfigHdr;\r
-\r
- StrCpy (StrPtr, L"GUID=");\r
- StrPtr += 5;\r
- BufInReverseOrderToHexString (StrPtr, (UINT8 *) Guid, sizeof (EFI_GUID));\r
- StrPtr += 32;\r
-\r
- //\r
- // Convert name string, e.g. name "ABCD" => "&NAME=0041004200430044"\r
- //\r
- StrCpy (StrPtr, L"&NAME=");\r
- StrPtr += 6;\r
- if (Name != NULL) {\r
- BufferSize = (NameStrLen * 4 + 1) * sizeof (CHAR16);\r
- UnicodeToConfigString (StrPtr, &BufferSize, Name);\r
- StrPtr += (NameStrLen * 4);\r
- }\r
-\r
- StrCpy (StrPtr, L"&PATH=");\r
- StrPtr += 6;\r
- BufInReverseOrderToHexString (StrPtr, (UINT8 *) DevicePath, DevicePathSize);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Determines if the Routing data (Guid and Name) is correct in <ConfigHdr>.\r
-\r
- @param ConfigString Either <ConfigRequest> or <ConfigResp>.\r
- @param StorageGuid GUID of the storage.\r
- @param StorageName Name of the stoarge.\r
-\r
- @retval TRUE Routing information is correct in ConfigString.\r
- @retval FALSE Routing information is incorrect in ConfigString.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsConfigHdrMatch (\r
- IN EFI_STRING ConfigString,\r
- IN EFI_GUID *StorageGuid, OPTIONAL\r
- IN CHAR16 *StorageName OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- BOOLEAN Match;\r
- EFI_GUID Guid;\r
- CHAR16 *Name;\r
- CHAR16 *StrPtr;\r
- UINTN BufferSize;\r
-\r
- //\r
- // <ConfigHdr> ::=\r
- // GUID=<HexCh>32&NAME=<Char>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL>\r
- // | 5 | 32 | 6 | NameStrLen*4 | 6 | DevicePathStrLen | 1 |\r
- //\r
- if (StrLen (ConfigString) <= (5 + 32 + 6)) {\r
- return FALSE;\r
- }\r
-\r
- //\r
- // Compare GUID\r
- //\r
- if (StorageGuid != NULL) {\r
-\r
- StrPtr = ConfigString + 5 + 32;\r
- if (*StrPtr != L'&') {\r
- return FALSE;\r
- }\r
- *StrPtr = L'\0';\r
-\r
- BufferSize = sizeof (EFI_GUID);\r
- Status = HexStringToBufInReverseOrder (\r
- (UINT8 *) &Guid,\r
- &BufferSize,\r
- ConfigString + 5\r
- );\r
- *StrPtr = L'&';\r
-\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
-\r
- if (!CompareGuid (&Guid, StorageGuid)) {\r
- return FALSE;\r
- }\r
- }\r
-\r
- //\r
- // Compare Name\r
- //\r
- Match = TRUE;\r
- if (StorageName != NULL) {\r
- StrPtr = ConfigString + 5 + 32 + 6;\r
- while (*StrPtr != L'\0' && *StrPtr != L'&') {\r
- StrPtr++;\r
- }\r
- if (*StrPtr != L'&') {\r
- return FALSE;\r
- }\r
-\r
- *StrPtr = L'\0';\r
- BufferSize = (((UINTN) StrPtr) - ((UINTN) &ConfigString[5 + 32 + 6])) / 4 + sizeof (CHAR16);\r
- Name = AllocatePool (BufferSize);\r
- ASSERT (Name != NULL);\r
- Status = ConfigStringToUnicode (\r
- Name,\r
- &BufferSize,\r
- ConfigString + 5 + 32 + 6\r
- );\r
- *StrPtr = L'&';\r
-\r
- if (EFI_ERROR (Status) || (StrCmp (Name, StorageName) != 0)) {\r
- Match = FALSE;\r
- }\r
- FreePool (Name);\r
- }\r
-\r
- return Match;\r
-}\r
-\r
-/**\r
- Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.\r
-\r
- @param String The string to be searched in.\r
- @param Offset Offset in BlockName.\r
- @param Width Width in BlockName.\r
-\r
- @retval TRUE Block name found.\r
- @retval FALSE Block name not found.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-FindBlockName (\r
- IN OUT CHAR16 *String,\r
- IN UINTN Offset,\r
- IN UINTN Width\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Data;\r
- UINTN BufferSize;\r
- UINTN ConvertedStrLen;\r
-\r
- while ((String = StrStr (String, L"&OFFSET=")) != NULL) {\r
- //\r
- // Skip '&OFFSET='\r
- //\r
- String = String + 8;\r
-\r
- Data = 0;\r
- BufferSize = sizeof (UINTN);\r
- Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
- String = String + ConvertedStrLen;\r
-\r
- if (Data != Offset) {\r
- continue;\r
- }\r
-\r
- if (StrnCmp (String, L"&WIDTH=", 7) != 0) {\r
- return FALSE;\r
- }\r
- String = String + 7;\r
-\r
- Data = 0;\r
- BufferSize = sizeof (UINTN);\r
- Status = HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
- if (Data == Width) {\r
- return TRUE;\r
- }\r
-\r
- String = String + ConvertedStrLen;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-\r
-/**\r
- This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.\r
-\r
- @param VariableGuid An optional field to indicate the target variable\r
- GUID name to use.\r
- @param VariableName An optional field to indicate the target\r
- human-readable variable name.\r
- @param BufferSize On input: Length in bytes of buffer to hold\r
- retrived data. On output: If return\r
- EFI_BUFFER_TOO_SMALL, containg length of buffer\r
- desired.\r
- @param Buffer Buffer to hold retrived data.\r
-\r
- @retval EFI_SUCCESS Operation completes successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The intput buffer is too small.\r
- @retval EFI_OUT_OF_RESOURCES There is no enough available memory space.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-GetBrowserData (\r
- IN CONST EFI_GUID *VariableGuid, OPTIONAL\r
- IN CONST CHAR16 *VariableName, OPTIONAL\r
- IN OUT UINTN *BufferSize,\r
- IN OUT UINT8 *Buffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CONST CHAR16 *ConfigHdr;\r
- CHAR16 *ConfigResp;\r
- CHAR16 *StringPtr;\r
- UINTN HeaderLen;\r
- UINTN BufferLen;\r
- CHAR16 *Progress;\r
-\r
- //\r
- // Locate protocols for use\r
- //\r
- Status = LocateFormBrowser2Protocols ();\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Retrive formset storage data from Form Browser\r
- //\r
- ConfigHdr = mFakeConfigHdr;\r
- HeaderLen = StrLen (ConfigHdr);\r
- \r
- //\r
- // First try allocate 0x4000 buffer for the formet storage data.\r
- //\r
- BufferLen = 0x4000;\r
- ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
- if (ConfigResp == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- StringPtr = ConfigResp + HeaderLen;\r
- *StringPtr = L'&';\r
- StringPtr++;\r
-\r
- Status = mFormBrowser2->BrowserCallback (\r
- mFormBrowser2,\r
- &BufferLen,\r
- StringPtr,\r
- TRUE,\r
- VariableGuid,\r
- VariableName\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (ConfigResp);\r
-\r
- ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);\r
- if (ConfigResp == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- StringPtr = ConfigResp + HeaderLen;\r
- *StringPtr = L'&';\r
- StringPtr++;\r
-\r
- Status = mFormBrowser2->BrowserCallback (\r
- mFormBrowser2,\r
- &BufferLen,\r
- StringPtr,\r
- TRUE,\r
- VariableGuid,\r
- VariableName\r
- );\r
- }\r
- if (EFI_ERROR (Status)) {\r
- FreePool (ConfigResp);\r
- return Status;\r
- }\r
- CopyMem (ConfigResp, ConfigHdr, HeaderLen * sizeof (UINT16));\r
-\r
- //\r
- // Convert <ConfigResp> to buffer data\r
- //\r
- Status = mIfrSupportLibHiiConfigRouting->ConfigToBlock (\r
- mIfrSupportLibHiiConfigRouting,\r
- ConfigResp,\r
- Buffer,\r
- BufferSize,\r
- &Progress\r
- );\r
- FreePool (ConfigResp);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser.\r
-\r
- @param VariableGuid An optional field to indicate the target variable\r
- GUID name to use.\r
- @param VariableName An optional field to indicate the target\r
- human-readable variable name.\r
- @param BufferSize Length in bytes of buffer to hold retrived data.\r
- @param Buffer Buffer to hold retrived data.\r
- @param RequestElement An optional field to specify which part of the\r
- buffer data will be send back to Browser. If NULL,\r
- the whole buffer of data will be committed to\r
- Browser. <RequestElement> ::=\r
- &OFFSET=<Number>&WIDTH=<Number>*\r
-\r
- @retval EFI_SUCCESS Operation completes successfully.\r
- @retval EFI_OUT_OF_RESOURCES There is no enough available memory space.\r
- @retval Other Updating Browser uncommitted data failed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SetBrowserData (\r
- IN CONST EFI_GUID *VariableGuid, OPTIONAL\r
- IN CONST CHAR16 *VariableName, OPTIONAL\r
- IN UINTN BufferSize,\r
- IN CONST UINT8 *Buffer,\r
- IN CONST CHAR16 *RequestElement OPTIONAL\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CONST CHAR16 *ConfigHdr;\r
- CHAR16 *ConfigResp;\r
- CHAR16 *StringPtr;\r
- UINTN HeaderLen;\r
- UINTN BufferLen;\r
- CHAR16 *Progress;\r
- CHAR16 BlockName[33];\r
- CHAR16 *ConfigRequest;\r
- CONST CHAR16 *Request;\r
-\r
- //\r
- // Locate protocols for use\r
- //\r
- Status = LocateFormBrowser2Protocols ();\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Prepare <ConfigRequest>\r
- //\r
- ConfigHdr = mFakeConfigHdr;\r
- HeaderLen = StrLen (ConfigHdr);\r
-\r
- if (RequestElement == NULL) {\r
- //\r
- // RequestElement not specified, use "&OFFSET=0&WIDTH=<BufferSize>" as <BlockName>\r
- //\r
- BlockName[0] = L'\0';\r
- StrCpy (BlockName, L"&OFFSET=0&WIDTH=");\r
-\r
- //\r
- // String lenghth of L"&OFFSET=0&WIDTH=" is 16\r
- //\r
- StringPtr = BlockName + 16;\r
- BufferLen = sizeof (BlockName) - (16 * sizeof (CHAR16));\r
- BufToHexString (StringPtr, &BufferLen, (UINT8 *) &BufferSize, sizeof (UINTN));\r
-\r
- Request = BlockName;\r
- } else {\r
- Request = RequestElement;\r
- }\r
-\r
- BufferLen = HeaderLen * sizeof (CHAR16) + StrSize (Request);\r
- ConfigRequest = AllocateZeroPool (BufferLen);\r
- if (ConfigRequest == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- CopyMem (ConfigRequest, ConfigHdr, HeaderLen * sizeof (CHAR16));\r
- StringPtr = ConfigRequest + HeaderLen;\r
- StrCpy (StringPtr, Request);\r
-\r
- //\r
- // Convert buffer to <ConfigResp>\r
- //\r
- Status = mIfrSupportLibHiiConfigRouting->BlockToConfig (\r
- mIfrSupportLibHiiConfigRouting,\r
- ConfigRequest,\r
- Buffer,\r
- BufferSize,\r
- &ConfigResp,\r
- &Progress\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreePool (ConfigRequest);\r
- return Status;\r
- }\r
-\r
- //\r
- // Skip <ConfigHdr> and '&'\r
- //\r
- StringPtr = ConfigResp + HeaderLen + 1;\r
-\r
- //\r
- // Change uncommitted data in Browser\r
- //\r
- Status = mFormBrowser2->BrowserCallback (\r
- mFormBrowser2,\r
- &BufferSize,\r
- StringPtr,\r
- FALSE,\r
- VariableGuid,\r
- VariableName\r
- );\r
- FreePool (ConfigRequest);\r
- return Status;\r
-}\r
-\r
-/**\r
- Test if a Unicode character is a hexadecimal digit. If true, the input\r
- Unicode character is converted to a byte. \r
-\r
- This function tests if a Unicode character is a hexadecimal digit. If true, the input\r
- Unicode character is converted to a byte. For example, Unicode character\r
- L'A' will be converted to 0x0A. \r
-\r
- If Digit is NULL, then ASSERT.\r
-\r
- @param Digit The output hexadecimal digit.\r
-\r
- @param Char The input Unicode character.\r
-\r
- @retval TRUE Char is in the range of Hexadecimal number. Digit is updated\r
- to the byte value of the number.\r
- @retval FALSE Char is not in the range of Hexadecimal number. Digit is keep\r
- intact.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsHexDigit (\r
- OUT UINT8 *Digit,\r
- IN CHAR16 Char\r
- )\r
-{\r
- ASSERT (Digit != NULL);\r
- \r
- if ((Char >= L'0') && (Char <= L'9')) {\r
- *Digit = (UINT8) (Char - L'0');\r
- return TRUE;\r
- }\r
-\r
- if ((Char >= L'A') && (Char <= L'F')) {\r
- *Digit = (UINT8) (Char - L'A' + 0x0A);\r
- return TRUE;\r
- }\r
-\r
- if ((Char >= L'a') && (Char <= L'f')) {\r
- *Digit = (UINT8) (Char - L'a' + 0x0A);\r
- return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-/** \r
- Convert binary buffer to a Unicode String in a specified sequence. \r
-\r
- This function converts bytes in the memory block pointed by Buffer to a Unicode String Str. \r
- Each byte will be represented by two Unicode characters. For example, byte 0xA1 will \r
- be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character \r
- for the Most Significant Nibble will be put before the Unicode Character for the Least Significant\r
- Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". \r
- For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the \r
- the last character in the output string. The one next to first byte will be put into the\r
- character before the last character. This rules applies to the rest of the bytes. The Unicode\r
- character by the last byte will be put into the first character in the output string. For example,\r
- the input buffer for a 64-bits unsigned integer 0x12345678abcdef1234 will be converted to\r
- a Unicode string equal to L"12345678abcdef1234".\r
-\r
- @param String On input, String is pointed to the buffer allocated for the convertion.\r
- @param StringLen The Length of String buffer to hold the output String. The length must include the tailing '\0' character.\r
- The StringLen required to convert a N bytes Buffer will be a least equal to or greater \r
- than 2*N + 1.\r
- @param Buffer The pointer to a input buffer.\r
- @param BufferSizeInBytes Length in bytes of the input buffer.\r
-\r
-\r
- @retval EFI_SUCCESS The convertion is successful. All bytes in Buffer has been convert to the corresponding\r
- Unicode character and placed into the right place in String.\r
- @retval EFI_BUFFER_TOO_SMALL StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to\r
- complete the convertion. \r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-BufToHexString (\r
- IN OUT CHAR16 *String,\r
- IN OUT UINTN *StringLen,\r
- IN CONST UINT8 *Buffer,\r
- IN UINTN BufferSizeInBytes\r
- )\r
-{\r
- UINTN Idx;\r
- UINT8 Byte;\r
- UINTN StrLen;\r
-\r
- //\r
- // Make sure string is either passed or allocate enough.\r
- // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
- // Plus the Unicode termination character.\r
- //\r
- StrLen = BufferSizeInBytes * 2;\r
- if (StrLen > ((*StringLen) - 1)) {\r
- *StringLen = StrLen + 1;\r
- return RETURN_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *StringLen = StrLen + 1;\r
- //\r
- // Ends the string.\r
- //\r
- String[StrLen] = L'\0'; \r
-\r
- for (Idx = 0; Idx < BufferSizeInBytes; Idx++) {\r
- Byte = Buffer[Idx];\r
- String[StrLen - 1 - Idx * 2] = mIfrSupportLibHexStr [Byte & 0xF];\r
- String[StrLen - 2 - Idx * 2] = mIfrSupportLibHexStr [Byte >> 4];\r
- }\r
-\r
- return RETURN_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.\r
-\r
- This function converts a Unicode string consisting of characters in the range of Hexadecimal\r
- character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop\r
- at the first non-hexadecimal character or the NULL character. The convertion process can be\r
- simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be \r
- converted into one byte. The first Unicode character represents the Most Significant Nibble and the\r
- second Unicode character represents the Least Significant Nibble in the output byte. \r
- The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode \r
- characters represent the the byte preceding the last byte. This rule applies to the rest pairs of bytes. \r
- The last pair represent the first byte in the output buffer. \r
-\r
- For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes \r
- (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".\r
-\r
- If String has N valid hexadecimal characters for conversion, the caller must make sure Buffer is at least \r
- N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. \r
-\r
- If either Buffer, BufferSizeInBytes or String is NULL, then ASSERT ().\r
-\r
- @param Buffer The output buffer allocated by the caller.\r
- @param BufferSizeInBytes On input, the size in bytes of Buffer. On output, it is updated to \r
- contain the size of the Buffer which is actually used for the converstion.\r
- For Unicode string with 2*N hexadecimal characters (not including the \r
- tailing NULL character), N bytes of Buffer will be used for the output.\r
- @param String The input hexadecimal string.\r
- @param ConvertedStrLen The number of hexadecimal characters used to produce content in output\r
- buffer Buffer.\r
-\r
- @retval RETURN_BUFFER_TOO_SMALL The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes\r
- will be updated to the size required for the converstion.\r
- @retval RETURN_SUCCESS The convertion is successful or the first Unicode character from String\r
- is hexadecimal. If ConvertedStrLen is not NULL, it is updated\r
- to the number of hexadecimal character used for the converstion.\r
-**/\r
-RETURN_STATUS\r
-EFIAPI\r
-HexStringToBuf (\r
- OUT UINT8 *Buffer, \r
- IN OUT UINTN *BufferSizeInBytes,\r
- IN CONST CHAR16 *String,\r
- OUT UINTN *ConvertedStrLen OPTIONAL\r
- )\r
-{\r
- UINTN HexCnt;\r
- UINTN Idx;\r
- UINTN BufferLength;\r
- UINT8 Digit;\r
- UINT8 Byte;\r
-\r
- ASSERT (Buffer != NULL);\r
- ASSERT (BufferSizeInBytes != NULL);\r
- ASSERT (String != NULL);\r
-\r
- //\r
- // Find out how many hex characters the string has.\r
- //\r
- for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, String[Idx]); Idx++, HexCnt++);\r
-\r
- if (HexCnt == 0) {\r
- *ConvertedStrLen = 0;\r
- return RETURN_SUCCESS;\r
- }\r
- //\r
- // Two Unicode characters make up 1 buffer byte. Round up.\r
- //\r
- BufferLength = (HexCnt + 1) / 2; \r
-\r
- //\r
- // Test if buffer is passed enough.\r
- //\r
- if (BufferLength > (*BufferSizeInBytes)) {\r
- *BufferSizeInBytes = BufferLength;\r
- return RETURN_BUFFER_TOO_SMALL;\r
- }\r
-\r
- *BufferSizeInBytes = BufferLength;\r
-\r
- for (Idx = 0; Idx < HexCnt; Idx++) {\r
-\r
- IsHexDigit (&Digit, String[HexCnt - 1 - Idx]);\r
-\r
- //\r
- // For odd charaters, write the lower nibble for each buffer byte,\r
- // and for even characters, the upper nibble.\r
- //\r
- if ((Idx & 1) == 0) {\r
- Byte = Digit;\r
- } else {\r
- Byte = Buffer[Idx / 2];\r
- Byte &= 0x0F;\r
- Byte = (UINT8) (Byte | Digit << 4);\r
- }\r
-\r
- Buffer[Idx / 2] = Byte;\r
- }\r
-\r
- if (ConvertedStrLen != NULL) {\r
- *ConvertedStrLen = HexCnt;\r
- }\r
-\r
- return RETURN_SUCCESS;\r
-}\r
+++ /dev/null
-/** @file\r
-Utility functions which helps in opcode creation, HII configuration string manipulations, \r
-pop up window creations, setup browser persistence data set and get.\r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#ifndef _IFRLIBRARY_INTERNAL_H_\r
-#define _IFRLIBRARY_INTERNAL_H_\r
-\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Protocol/DevicePath.h>\r
-#include <Protocol/HiiConfigRouting.h>\r
-#include <Protocol/FormBrowser2.h>\r
-\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/IfrSupportLib.h>\r
-\r
-#define INVALID_VARSTORE_ID 0\r
-\r
-#define QUESTION_FLAGS (EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY)\r
-#define QUESTION_FLAGS_MASK (~QUESTION_FLAGS)\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
- Library Routines to create IFR independent of string data - assume tokens already exist\r
- Primarily to be used for exporting op-codes at a label in pre-defined forms.\r
-\r
-\r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-\r
-**/\r
-\r
-#include "UefiIfrLibraryInternal.h"\r
-\r
-/**\r
- Check if the input question flags is a valid value.\r
- The valid combination of question flags includes\r
- EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY.\r
-\r
- @param Flags The question flags to check.\r
-\r
- @retval TRUE If the question flag is a valid combination.\r
- @retval FALSE If the question flag is an invalid combination.\r
- \r
-**/\r
-BOOLEAN\r
-IsValidQuestionFlags (\r
- IN UINT8 Flags\r
- )\r
-{\r
- return (BOOLEAN) (((Flags & QUESTION_FLAGS_MASK) != 0) ? FALSE : TRUE);\r
-}\r
-\r
-/**\r
- Check if the input value type is a valid type.\r
- The valid value type is smaller or equal than EFI_IFR_TYPE_OTHER.\r
-\r
- @param Type The value type to check.\r
-\r
- @retval TRUE If the value type is valid.\r
- @retval FALSE If the value type is invalid.\r
- \r
-**/\r
-BOOLEAN\r
-IsValidValueType (\r
- IN UINT8 Type\r
- )\r
-{\r
- return (BOOLEAN) ((Type <= EFI_IFR_TYPE_OTHER) ? TRUE : FALSE);\r
-}\r
-\r
-/**\r
- Check if the input numeric flags is a valid value.\r
-\r
- @param Flags The numeric flags to check.\r
-\r
- @retval TRUE If the numeric flags is valid.\r
- @retval FALSE If the numeric flags is invalid.\r
- \r
-**/\r
-BOOLEAN\r
-IsValidNumricFlags (\r
- IN UINT8 Flags\r
- )\r
-{\r
- if ((Flags & ~(EFI_IFR_NUMERIC_SIZE | EFI_IFR_DISPLAY)) != 0) {\r
- return FALSE;\r
- }\r
-\r
- if ((Flags & EFI_IFR_DISPLAY) > EFI_IFR_DISPLAY_UINT_HEX) {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Check if the checkbox flags is a valid value.\r
-\r
- @param Flags The checkbox flags to check.\r
-\r
- @retval TRUE If the checkbox flags is valid.\r
- @retval FALSE If the checkbox flags is invalid.\r
- \r
-**/\r
-BOOLEAN\r
-IsValidCheckboxFlags (\r
- IN UINT8 Flags\r
- )\r
-{\r
- return (BOOLEAN) ((Flags <= EFI_IFR_CHECKBOX_DEFAULT_MFG) ? TRUE : FALSE);\r
-}\r
-\r
-/**\r
- Create EFI_IFR_END_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateEndOpCode (\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_END End;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_END) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- End.Header.Length = sizeof (EFI_IFR_END);\r
- End.Header.OpCode = EFI_IFR_END_OP;\r
- End.Header.Scope = 0;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_END to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &End, sizeof (EFI_IFR_END));\r
- Data->Offset += sizeof (EFI_IFR_END);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_DEFAULT_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param Value Value for the default\r
- @param Type Type for the default\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER The type is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateDefaultOpCode (\r
- IN EFI_IFR_TYPE_VALUE *Value,\r
- IN UINT8 Type,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_DEFAULT Default;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if ((Value == NULL) || !IsValidValueType (Type)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_DEFAULT) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Default.Header.OpCode = EFI_IFR_DEFAULT_OP;\r
- Default.Header.Length = sizeof (EFI_IFR_DEFAULT);\r
- Default.Header.Scope = 0;\r
- Default.Type = Type;\r
- Default.DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
- CopyMem (&Default.Value, Value, sizeof(EFI_IFR_TYPE_VALUE));\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_DEFAULT to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Default, sizeof (EFI_IFR_DEFAULT));\r
- Data->Offset += sizeof (EFI_IFR_DEFAULT);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_ACTION_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param QuestionConfig String ID for configuration\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateActionOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN EFI_STRING_ID QuestionConfig,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_ACTION Action;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_ACTION) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Action.Header.OpCode = EFI_IFR_ACTION_OP;\r
- Action.Header.Length = sizeof (EFI_IFR_ACTION);\r
- Action.Header.Scope = 0;\r
- Action.Question.QuestionId = QuestionId;\r
- Action.Question.Header.Prompt = Prompt;\r
- Action.Question.Header.Help = Help;\r
- Action.Question.VarStoreId = INVALID_VARSTORE_ID;\r
- Action.Question.Flags = QuestionFlags;\r
- Action.QuestionConfig = QuestionConfig;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_ACTION to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Action, sizeof (EFI_IFR_ACTION));\r
- Data->Offset += sizeof (EFI_IFR_ACTION);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_SUBTITLE_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param Flags Subtitle opcode flags\r
- @param Scope Subtitle Scope bit\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- \r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateSubTitleOpCode (\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 Flags,\r
- IN UINT8 Scope,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_SUBTITLE Subtitle;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_SUBTITLE) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Subtitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
- Subtitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
- Subtitle.Header.Scope = Scope;\r
- Subtitle.Statement.Prompt = Prompt;\r
- Subtitle.Statement.Help = Help;\r
- Subtitle.Flags = Flags;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_SUBTITLE to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE));\r
- Data->Offset += sizeof (EFI_IFR_SUBTITLE);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Create EFI_IFR_TEXT_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param TextTwo String ID for text two\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateTextOpCode (\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN EFI_STRING_ID TextTwo,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_TEXT Text;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_TEXT) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Text.Header.OpCode = EFI_IFR_TEXT_OP;\r
- Text.Header.Length = sizeof (EFI_IFR_TEXT);\r
- Text.Header.Scope = 0;\r
- Text.Statement.Prompt = Prompt;\r
- Text.Statement.Help = Help;\r
- Text.TextTwo = TextTwo;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_TEXT to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Text, sizeof (EFI_IFR_TEXT));\r
- Data->Offset += sizeof (EFI_IFR_TEXT);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_REF_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param FormId Destination Form ID\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param QuestionId Question ID\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateGotoOpCode (\r
- IN EFI_FORM_ID FormId,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_REF Goto;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_REF) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Goto.Header.OpCode = EFI_IFR_REF_OP;\r
- Goto.Header.Length = sizeof (EFI_IFR_REF);\r
- Goto.Header.Scope = 0;\r
- Goto.Question.Header.Prompt = Prompt;\r
- Goto.Question.Header.Help = Help;\r
- Goto.Question.VarStoreId = INVALID_VARSTORE_ID;\r
- Goto.Question.QuestionId = QuestionId;\r
- Goto.Question.Flags = QuestionFlags;\r
- Goto.FormId = FormId;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_REF to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Goto, sizeof (EFI_IFR_REF));\r
- Data->Offset += sizeof (EFI_IFR_REF);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_ONE_OF_OPTION_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param OptionCount The number of options.\r
- @param OptionsList The list of Options.\r
- @param Type The data type.\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If OptionCount is not zero but OptionsList is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOneOfOptionOpCode (\r
- IN UINTN OptionCount,\r
- IN IFR_OPTION *OptionsList,\r
- IN UINT8 Type,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- UINTN Index;\r
- UINT8 *LocalBuffer;\r
- EFI_IFR_ONE_OF_OPTION OneOfOption;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if ((OptionCount != 0) && (OptionsList == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- for (Index = 0; Index < OptionCount; Index++) {\r
- OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;\r
- OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);\r
- OneOfOption.Header.Scope = 0;\r
-\r
- OneOfOption.Option = OptionsList[Index].StringToken;\r
- OneOfOption.Value = OptionsList[Index].Value;\r
- OneOfOption.Flags = (UINT8) (OptionsList[Index].Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
- OneOfOption.Type = Type;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_ONF_OF_OPTION to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION));\r
- Data->Offset += sizeof (EFI_IFR_ONE_OF_OPTION);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_ONE_OF_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param VarStoreId Storage ID\r
- @param VarOffset Offset in Storage\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param OneOfFlags Flags for oneof opcode\r
- @param OptionsList List of options\r
- @param OptionCount Number of options in option list\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOneOfOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_VARSTORE_ID VarStoreId,\r
- IN UINT16 VarOffset,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN UINT8 OneOfFlags,\r
- IN IFR_OPTION *OptionsList,\r
- IN UINTN OptionCount,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- UINTN Length;\r
- EFI_IFR_ONE_OF OneOf;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidNumricFlags (OneOfFlags) ||\r
- !IsValidQuestionFlags (QuestionFlags) ||\r
- ((OptionCount != 0) && (OptionsList == NULL))) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Length = sizeof (EFI_IFR_ONE_OF) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);\r
- if (Data->Offset + Length > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- OneOf.Header.OpCode = EFI_IFR_ONE_OF_OP;\r
- OneOf.Header.Length = sizeof (EFI_IFR_ONE_OF);\r
- OneOf.Header.Scope = 1;\r
- OneOf.Question.Header.Prompt = Prompt;\r
- OneOf.Question.Header.Help = Help;\r
- OneOf.Question.QuestionId = QuestionId;\r
- OneOf.Question.VarStoreId = VarStoreId;\r
- OneOf.Question.VarStoreInfo.VarOffset = VarOffset;\r
- OneOf.Question.Flags = QuestionFlags;\r
- OneOf.Flags = OneOfFlags;\r
- ZeroMem ((VOID *) &OneOf.data, sizeof (MINMAXSTEP_DATA));\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_ONF_OF to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF));\r
- Data->Offset += sizeof (EFI_IFR_ONE_OF);\r
-\r
- CreateOneOfOptionOpCode (OptionCount, OptionsList, (UINT8) (OneOfFlags & EFI_IFR_NUMERIC_SIZE), Data);\r
-\r
- CreateEndOpCode (Data);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_ORDERED_LIST_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param VarStoreId Storage ID\r
- @param VarOffset Offset in Storage\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param OrderedListFlags Flags for ordered list opcode\r
- @param DataType Type for option value\r
- @param MaxContainers Maximum count for options in this ordered list\r
- @param OptionsList List of options\r
- @param OptionCount Number of options in option list\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateOrderedListOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_VARSTORE_ID VarStoreId,\r
- IN UINT16 VarOffset,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN UINT8 OrderedListFlags,\r
- IN UINT8 DataType,\r
- IN UINT8 MaxContainers,\r
- IN IFR_OPTION *OptionsList,\r
- IN UINTN OptionCount,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- UINTN Length;\r
- EFI_IFR_ORDERED_LIST OrderedList;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags) ||\r
- ((OptionCount != 0) && (OptionsList == NULL))) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if ((OrderedListFlags != 0) &&\r
- (OrderedListFlags != EFI_IFR_UNIQUE_SET) &&\r
- (OrderedListFlags != EFI_IFR_NO_EMPTY_SET)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);\r
- if (Data->Offset + Length > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- OrderedList.Header.OpCode = EFI_IFR_ORDERED_LIST_OP;\r
- OrderedList.Header.Length = sizeof (EFI_IFR_ORDERED_LIST);\r
- OrderedList.Header.Scope = 1;\r
- OrderedList.Question.Header.Prompt = Prompt;\r
- OrderedList.Question.Header.Help = Help;\r
- OrderedList.Question.QuestionId = QuestionId;\r
- OrderedList.Question.VarStoreId = VarStoreId;\r
- OrderedList.Question.VarStoreInfo.VarOffset = VarOffset;\r
- OrderedList.Question.Flags = QuestionFlags;\r
- OrderedList.MaxContainers = MaxContainers;\r
- OrderedList.Flags = OrderedListFlags;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_ORDERED_LIST to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST));\r
- Data->Offset += sizeof (EFI_IFR_ORDERED_LIST);\r
-\r
- CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data);\r
-\r
- CreateEndOpCode (Data);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_CHECKBOX_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param VarStoreId Storage ID\r
- @param VarOffset Offset in Storage\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param CheckBoxFlags Flags for checkbox opcode\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateCheckBoxOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_VARSTORE_ID VarStoreId,\r
- IN UINT16 VarOffset,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN UINT8 CheckBoxFlags,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_CHECKBOX CheckBox;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- CheckBox.Header.OpCode = EFI_IFR_CHECKBOX_OP;\r
- CheckBox.Header.Length = sizeof (EFI_IFR_CHECKBOX);\r
- CheckBox.Header.Scope = 0;\r
- CheckBox.Question.QuestionId = QuestionId;\r
- CheckBox.Question.VarStoreId = VarStoreId;\r
- CheckBox.Question.VarStoreInfo.VarOffset = VarOffset;\r
- CheckBox.Question.Header.Prompt = Prompt;\r
- CheckBox.Question.Header.Help = Help;\r
- CheckBox.Question.Flags = QuestionFlags;\r
- CheckBox.Flags = CheckBoxFlags;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_CHECKBOX to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX));\r
- Data->Offset += sizeof (EFI_IFR_CHECKBOX);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_NUMERIC_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param VarStoreId Storage ID\r
- @param VarOffset Offset in Storage\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param NumericFlags Flags for numeric opcode\r
- @param Minimum Numeric minimum value\r
- @param Maximum Numeric maximum value\r
- @param Step Numeric step for edit\r
- @param Default Numeric default value\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateNumericOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_VARSTORE_ID VarStoreId,\r
- IN UINT16 VarOffset,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN UINT8 NumericFlags,\r
- IN UINT64 Minimum,\r
- IN UINT64 Maximum,\r
- IN UINT64 Step,\r
- IN UINT64 Default,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_IFR_NUMERIC Numeric;\r
- MINMAXSTEP_DATA MinMaxStep;\r
- EFI_IFR_TYPE_VALUE DefaultValue;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- Numeric.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
- Numeric.Header.Length = sizeof (EFI_IFR_NUMERIC);\r
- Numeric.Header.Scope = 1;\r
- Numeric.Question.QuestionId = QuestionId;\r
- Numeric.Question.VarStoreId = VarStoreId;\r
- Numeric.Question.VarStoreInfo.VarOffset = VarOffset;\r
- Numeric.Question.Header.Prompt = Prompt;\r
- Numeric.Question.Header.Help = Help;\r
- Numeric.Question.Flags = QuestionFlags;\r
- Numeric.Flags = NumericFlags;\r
-\r
- switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) {\r
- case EFI_IFR_NUMERIC_SIZE_1:\r
- MinMaxStep.u8.MinValue = (UINT8) Minimum;\r
- MinMaxStep.u8.MaxValue = (UINT8) Maximum;\r
- MinMaxStep.u8.Step = (UINT8) Step;\r
- break;\r
-\r
- case EFI_IFR_NUMERIC_SIZE_2:\r
- MinMaxStep.u16.MinValue = (UINT16) Minimum;\r
- MinMaxStep.u16.MaxValue = (UINT16) Maximum;\r
- MinMaxStep.u16.Step = (UINT16) Step;\r
- break;\r
-\r
- case EFI_IFR_NUMERIC_SIZE_4:\r
- MinMaxStep.u32.MinValue = (UINT32) Minimum;\r
- MinMaxStep.u32.MaxValue = (UINT32) Maximum;\r
- MinMaxStep.u32.Step = (UINT32) Step;\r
- break;\r
-\r
- case EFI_IFR_NUMERIC_SIZE_8:\r
- MinMaxStep.u64.MinValue = Minimum;\r
- MinMaxStep.u64.MaxValue = Maximum;\r
- MinMaxStep.u64.Step = Step;\r
- break;\r
- }\r
-\r
- CopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA));\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_NUMERIC to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC));\r
- Data->Offset += sizeof (EFI_IFR_NUMERIC);\r
-\r
- DefaultValue.u64 = Default;\r
- Status = CreateDefaultOpCode (&DefaultValue, (UINT8) (NumericFlags & EFI_IFR_NUMERIC_SIZE), Data);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
-\r
- CreateEndOpCode (Data);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create EFI_IFR_STRING_OP opcode.\r
-\r
- If Data is NULL or Data->Data is NULL, then ASSERT.\r
-\r
- @param QuestionId Question ID\r
- @param VarStoreId Storage ID\r
- @param VarOffset Offset in Storage\r
- @param Prompt String ID for Prompt\r
- @param Help String ID for Help\r
- @param QuestionFlags Flags in Question Header\r
- @param StringFlags Flags for string opcode\r
- @param MinSize String minimum length\r
- @param MaxSize String maximum length\r
- @param Data Destination for the created opcode binary\r
-\r
- @retval EFI_SUCCESS Opcode is created successfully.\r
- @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
- @retval EFI_INVALID_PARAMETER If QuestionFlags is not valid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateStringOpCode (\r
- IN EFI_QUESTION_ID QuestionId,\r
- IN EFI_VARSTORE_ID VarStoreId,\r
- IN UINT16 VarOffset,\r
- IN EFI_STRING_ID Prompt,\r
- IN EFI_STRING_ID Help,\r
- IN UINT8 QuestionFlags,\r
- IN UINT8 StringFlags,\r
- IN UINT8 MinSize,\r
- IN UINT8 MaxSize,\r
- IN OUT EFI_HII_UPDATE_DATA *Data\r
- )\r
-{\r
- EFI_IFR_STRING String;\r
- UINT8 *LocalBuffer;\r
-\r
- ASSERT (Data != NULL && Data->Data != NULL);\r
-\r
- if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & ~EFI_IFR_STRING_MULTI_LINE) != 0) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) {\r
- return EFI_BUFFER_TOO_SMALL;\r
- }\r
-\r
- String.Header.OpCode = EFI_IFR_STRING_OP;\r
- String.Header.Length = sizeof (EFI_IFR_STRING);\r
- String.Header.Scope = 0;\r
- String.Question.Header.Prompt = Prompt;\r
- String.Question.Header.Help = Help;\r
- String.Question.QuestionId = QuestionId;\r
- String.Question.VarStoreId = VarStoreId;\r
- String.Question.VarStoreInfo.VarOffset = VarOffset;\r
- String.Question.Flags = QuestionFlags;\r
- String.MinSize = MinSize;\r
- String.MaxSize = MaxSize;\r
- String.Flags = StringFlags;\r
-\r
- LocalBuffer = (UINT8 *) Data->Data + Data->Offset;\r
- //\r
- // CopyMem is used for EFI_IFR_STRING to cover the unaligned address access.\r
- //\r
- CopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING));\r
- Data->Offset += sizeof (EFI_IFR_STRING);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
+++ /dev/null
-#/** @file\r
-#\r
-# Instance of IFR Support Library.\r
-#\r
-# This library contains functions to do IFR opcode creation and utility\r
-# functions to help module to interact with a UEFI Form Browser.\r
-#\r
-# Copyright (c) 2007 - 2008, Intel Corporation.\r
-#\r
-# All rights reserved. This program and the accompanying materials\r
-# are licensed and made available under the terms and conditions of the BSD License\r
-# which accompanies this distribution. The full text of the license may be found at\r
-# http://opensource.org/licenses/bsd-license.php\r
-# \r
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-#\r
-#\r
-#**/\r
-\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = UefiIfrSupportLib\r
- FILE_GUID = bf38668e-e231-4baa-99e4-8c0e4c35dca6\r
- MODULE_TYPE = UEFI_DRIVER\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = IfrSupportLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
- EFI_SPECIFICATION_VERSION = 0x00020000\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources.common]\r
- UefiIfrForm.c\r
- UefiIfrLibraryInternal.h\r
- UefiIfrOpCodeCreation.c\r
-\r
-\r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
-\r
-[LibraryClasses]\r
- MemoryAllocationLib\r
- DevicePathLib\r
- BaseLib\r
- UefiBootServicesTableLib\r
- BaseMemoryLib\r
- DebugLib\r
-\r
-[Protocols]\r
- gEfiDevicePathProtocolGuid ## CONSUMES\r
- gEfiHiiConfigRoutingProtocolGuid ## CONSUMES\r
- gEfiFormBrowser2ProtocolGuid ## CONSUMES\r
- \r
\r
## @libraryclass Provides HII related functions.\r
HiiLib|Include/Library/HiiLib.h\r
-\r
- ## @libraryclass Provides a set of interfaces to do IFR opcode creation and interact with a UEFI Form Browser.\r
- IfrSupportLib|Include/Library/IfrSupportLib.h\r
- \r
- ## @libraryclass Defines APIs that is related to IFR operations but specific to EDK II\r
- # implementation.\r
- ##\r
- ExtendedIfrSupportLib|Include/Library/ExtendedIfrSupportLib.h\r
- \r
+ \r
## @libraryclass Defines a set of interfaces on how to process capusle image update.\r
CapsuleLib|Include/Library/CapsuleLib.h\r
\r