+++ /dev/null
-/** @file\r
-\r
- This file contains the keyboard processing code to the HII database.\r
-\r
-Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>\r
-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 "HiiDatabase.h"\r
-#include "HiiHandle.h"\r
-#include <Library/DebugLib.h>\r
-#include <Guid/ZeroGuid.h>\r
-\r
-CONST CHAR16 FrameworkReservedVarstoreName[] = FRAMEWORK_RESERVED_VARSTORE_NAME;\r
-\r
-/**\r
- \r
- This function returns a list of the package handles of the \r
- specified type that are currently active in the HII database. The \r
- pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package \r
- handles to be listed.\r
-\r
- If HandleBufferLength is NULL, then ASSERT.\r
- If HandleBuffer is NULL, the ASSERT.\r
- If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is\r
- NULL, then ASSERT.\r
- If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not\r
- NULL, then ASSERT.\r
- \r
- \r
- @param PackageType Specifies the package type of the packages\r
- to list or EFI_HII_PACKAGE_TYPE_ALL for\r
- all packages to be listed.\r
- \r
- @param PackageGuid If PackageType is\r
- EFI_HII_PACKAGE_TYPE_GUID, then this is\r
- the pointer to the GUID which must match\r
- the Guid field of\r
- EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it\r
- must be NULL.\r
- \r
- @param HandleBufferLength On output, the length of the handle buffer\r
- that is required for the handles found.\r
-\r
- @param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.\r
- The caller is responcible to free this pointer allocated.\r
-\r
- @retval EFI_SUCCESS The matching handles are outputted successfully.\r
- HandleBufferLength is updated with the actual length.\r
- @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.\r
- @retval EFI_NOT_FOUND No matching handle could not be found in database.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ListPackageLists (\r
- IN UINT8 PackageType,\r
- IN CONST EFI_GUID *PackageGuid,\r
- IN OUT UINTN *HandleBufferLength,\r
- OUT EFI_HII_HANDLE **HandleBuffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- \r
- ASSERT (HandleBufferLength != NULL);\r
- ASSERT (HandleBuffer != NULL);\r
- \r
- *HandleBufferLength = 0;\r
- *HandleBuffer = NULL;\r
-\r
- if (PackageType == EFI_HII_PACKAGE_TYPE_GUID) {\r
- ASSERT (PackageGuid != NULL);\r
- } else {\r
- ASSERT (PackageGuid == NULL);\r
- }\r
-\r
- Status = mHiiDatabase->ListPackageLists (\r
- mHiiDatabase,\r
- PackageType,\r
- PackageGuid,\r
- HandleBufferLength,\r
- *HandleBuffer\r
- );\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- //\r
- // No packages is registered to UEFI HII Database, just return.\r
- // \r
- //\r
- return Status;\r
- }\r
-\r
- *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
- \r
- if (*HandleBuffer == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- return mHiiDatabase->ListPackageLists (\r
- mHiiDatabase,\r
- PackageType,\r
- PackageGuid,\r
- HandleBufferLength,\r
- *HandleBuffer\r
- );\r
- \r
-}\r
-\r
-/**\r
- Exports the contents of one or all package lists in the HII database into a buffer.\r
-\r
- If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
- then ASSERT.\r
- If PackageListHeader is NULL, then ASSERT.\r
- If PackageListSize is NULL, then ASSERT.\r
-\r
- @param Handle The HII Handle.\r
- @param PackageListHeader A pointer to a buffer that will contain the results of \r
- the export function.\r
- @param PackageListSize On output, the length of the buffer that is required for the exported data.\r
-\r
- @retval EFI_SUCCESS Package exported.\r
-\r
- @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.\r
-\r
-**/\r
-EFI_STATUS \r
-EFIAPI\r
-ExportPackageLists (\r
- IN EFI_HII_HANDLE Handle,\r
- OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
- OUT UINTN *PackageListSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Size;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
-\r
- ASSERT (PackageListSize != NULL);\r
- ASSERT (PackageListHeader != NULL);\r
-\r
- Size = 0;\r
- PackageListHdr = NULL;\r
- Status = mHiiDatabase->ExportPackageLists (\r
- mHiiDatabase,\r
- Handle,\r
- &Size,\r
- PackageListHdr\r
- );\r
- ASSERT (Status != EFI_BUFFER_TOO_SMALL);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- PackageListHdr = AllocateZeroPool (Size);\r
- \r
- if (PackageListHeader == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- } else {\r
- Status = mHiiDatabase->ExportPackageLists (\r
- mHiiDatabase,\r
- Handle,\r
- &Size,\r
- PackageListHdr\r
- );\r
- }\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
- *PackageListHeader = PackageListHdr;\r
- *PackageListSize = Size;\r
- } else {\r
- FreePool (PackageListHdr);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Extract Hii package list GUID for given HII handle.\r
-\r
- If HiiHandle could not be found in the HII database, then ASSERT.\r
- If Guid is NULL, then ASSERT.\r
-\r
- @param Handle Hii handle\r
- @param Guid Package list GUID\r
-\r
- @retval EFI_SUCCESS Successfully extract GUID from Hii database.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ExtractGuidFromHiiHandle (\r
- IN EFI_HII_HANDLE Handle,\r
- OUT EFI_GUID *Guid\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
-\r
- ASSERT (Guid != NULL);\r
- ASSERT (Handle != NULL);\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
-\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- ASSERT (Status != EFI_NOT_FOUND);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- }\r
- if (EFI_ERROR (Status)) {\r
- FreePool (HiiPackageList);\r
- return Status;\r
- }\r
-\r
- //\r
- // Extract GUID\r
- //\r
- CopyGuid (Guid, &HiiPackageList->PackageListGuid);\r
-\r
- FreePool (HiiPackageList);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Find the corressponding UEFI HII Handle from a Framework HII Handle given.\r
-\r
- @param Private The HII Thunk Module Private context.\r
- @param FwHiiHandle The Framemwork HII Handle.\r
-\r
- @return NULL If Framework HII Handle is invalid.\r
- @return The corresponding UEFI HII Handle.\r
-**/\r
-EFI_HII_HANDLE\r
-FwHiiHandleToUefiHiiHandle (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
- )\r
-{\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
- ASSERT (Private != NULL);\r
-\r
- ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
-\r
- if (ThunkContext != NULL) {\r
- return ThunkContext->UefiHiiHandle;\r
- }\r
- \r
- return (EFI_HII_HANDLE) NULL;\r
-}\r
-\r
-\r
-/**\r
- Find the corressponding HII Thunk Context from a Framework HII Handle given.\r
-\r
- @param Private The HII Thunk Module Private context.\r
- @param FwHiiHandle The Framemwork HII Handle.\r
-\r
- @return NULL If Framework HII Handle is invalid.\r
- @return The corresponding HII Thunk Context.\r
-**/\r
-HII_THUNK_CONTEXT *\r
-FwHiiHandleToThunkContext (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
- IN FRAMEWORK_EFI_HII_HANDLE FwHiiHandle\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
-\r
- Link = GetFirstNode (&Private->ThunkContextListHead);\r
-\r
- while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
- ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
-\r
- if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
- return ThunkContext;\r
- }\r
-\r
- Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Find the corressponding HII Thunk Context from a UEFI HII Handle given.\r
-\r
- @param Private The HII Thunk Module Private context.\r
- @param UefiHiiHandle The UEFI HII Handle.\r
-\r
- @return NULL If UEFI HII Handle is invalid.\r
- @return The corresponding HII Thunk Context.\r
-**/\r
-HII_THUNK_CONTEXT *\r
-UefiHiiHandleToThunkContext (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
- IN EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- Link = GetFirstNode (&Private->ThunkContextListHead);\r
-\r
- while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
- ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
-\r
- if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
- return ThunkContext;\r
- }\r
- Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Find the corressponding HII Thunk Context from a Tag GUID.\r
-\r
- @param Private The HII Thunk Module Private context.\r
- @param Guid The Tag GUID.\r
-\r
- @return NULL No HII Thunk Context matched the Tag GUID.\r
- @return The corresponding HII Thunk Context.\r
-**/\r
-HII_THUNK_CONTEXT *\r
-TagGuidToIfrPackThunkContext (\r
- IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
- IN CONST EFI_GUID *Guid\r
- )\r
-{\r
- LIST_ENTRY *Link;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- Link = GetFirstNode (&Private->ThunkContextListHead);\r
-\r
- while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
- ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
-\r
- if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
- return ThunkContext;\r
- }\r
-\r
- Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
- }\r
-\r
- return NULL;\r
- \r
-}\r
-\r
-/**\r
- Clean up the HII Thunk Context for a UEFI HII Handle.\r
-\r
- @param Private The HII Thunk Module Private context.\r
- @param UefiHiiHandle The UEFI HII Handle.\r
-\r
-**/\r
-VOID\r
-DestroyThunkContextForUefiHiiHandle (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
- IN EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
- ASSERT (ThunkContext != NULL);\r
-\r
- DestroyThunkContext (ThunkContext);\r
-}\r
-\r
-\r
-/**\r
- This function create a HII_THUNK_CONTEXT for the input UEFI HiiHandle\r
- that is created when a package list registered by a module calling \r
- EFI_HII_DATABASE_PROTOCOL.NewPackageList. \r
- This function records the PackageListGuid of EFI_HII_PACKAGE_LIST_HEADER \r
- into the TagGuid of the created HII_THUNK_CONTEXT.\r
-\r
- @param UefiHiiHandle The UEFI HII Handle.\r
- \r
- @return the new created Hii thunk context.\r
-\r
-**/\r
-HII_THUNK_CONTEXT *\r
-CreateThunkContextForUefiHiiHandle (\r
- IN EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_GUID PackageGuid;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
- ASSERT (ThunkContext != NULL);\r
- \r
- ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
-\r
- Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
- \r
- ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
- \r
- Status = ExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
- ASSERT_EFI_ERROR (Status);\r
- \r
- CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
-\r
- return ThunkContext;\r
-}\r
-\r
-\r
-/**\r
- Get the number of HII Package for a Package type.\r
-\r
- @param PackageListHeader The Package List.\r
- @param PackageType The Package Type.\r
-\r
- @return The number of Package for given type.\r
-**/\r
-UINTN\r
-GetPackageCountByType (\r
- IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader,\r
- IN UINT8 PackageType\r
- )\r
-{\r
- UINTN Count;\r
- EFI_HII_PACKAGE_HEADER *PackageHeader;\r
-\r
- PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
- Count = 0;\r
- \r
- while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
- if (PackageHeader->Type == PackageType ) {\r
- Count++;\r
- }\r
- PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
- }\r
- \r
- \r
- return Count;\r
-}\r
-\r
-/**\r
- Get the Form Package from a Framework Package List.\r
-\r
- @param Packages Framework Package List.\r
-\r
- @return The Form Package Header found.\r
-**/\r
-EFI_HII_PACKAGE_HEADER *\r
-GetIfrPackage (\r
- IN CONST EFI_HII_PACKAGES *Packages\r
- )\r
-{\r
- UINTN Index;\r
- TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
-\r
- ASSERT (Packages != NULL);\r
-\r
- TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
- \r
- for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
- //\r
- // The current UEFI HII build tool generate a binary in the format defined by \r
- // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
- // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
- // may not be the exact number of valid package number in the binary generated \r
- // by HII Build tool.\r
- //\r
- switch (TianoAutogenPackageHdrArray[Index]->FrameworkPackageHeader.Type) {\r
- case EFI_HII_IFR:\r
- return &TianoAutogenPackageHdrArray[Index]->PackageHeader;\r
- break;\r
- case EFI_HII_STRING:\r
- case EFI_HII_FONT:\r
- break;\r
-\r
- default:\r
- ASSERT (FALSE);\r
- return NULL;\r
- break;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-/**\r
- Get FormSet GUID.\r
-\r
- ASSERT if no FormSet Opcode is found.\r
-\r
- @param Packages Form Framework Package.\r
- @param FormSetGuid Return the FormSet Guid.\r
-\r
-**/\r
-VOID\r
-GetFormSetGuid (\r
- IN EFI_HII_PACKAGE_HEADER *Package,\r
- OUT EFI_GUID *FormSetGuid\r
- )\r
-{\r
- UINTN Offset;\r
- EFI_IFR_OP_HEADER *OpCode;\r
- EFI_IFR_FORM_SET *FormSet;\r
-\r
- Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
- while (Offset < Package->Length) {\r
- OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
-\r
- switch (OpCode->OpCode) {\r
- case EFI_IFR_FORM_SET_OP:\r
- FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
- CopyGuid (FormSetGuid, (EFI_GUID *)(VOID *)&FormSet->Guid);\r
- return;\r
- \r
- default:\r
- break;\r
- \r
- }\r
- Offset += OpCode->Length;\r
- }\r
-\r
- //\r
- // A proper IFR must have a formset opcode.\r
- //\r
- ASSERT (FALSE);\r
-\r
-}\r
-\r
-/**\r
- Creat a Thunk Context.\r
-\r
- ASSERT if no FormSet Opcode is found.\r
-\r
- @param Private The HII Thunk Private Context.\r
- @param StringPackageCount The String package count.\r
- @param IfrPackageCount The IFR Package count.\r
-\r
- @return A newly created Thunk Context.\r
- @retval NULL No resource to create a new Thunk Context.\r
-**/\r
-HII_THUNK_CONTEXT *\r
-CreateThunkContext (\r
- IN HII_THUNK_PRIVATE_DATA *Private,\r
- IN UINTN StringPackageCount,\r
- IN UINTN IfrPackageCount\r
- )\r
-{\r
- EFI_STATUS Status;\r
- HII_THUNK_CONTEXT *ThunkContext;\r
-\r
- ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
- ASSERT (ThunkContext != NULL);\r
- \r
- ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
- ThunkContext->IfrPackageCount = IfrPackageCount;\r
- ThunkContext->StringPackageCount = StringPackageCount;\r
- Status = AllocateHiiHandle (&ThunkContext->FwHiiHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- return ThunkContext;\r
- \r
-}\r
-\r
-/**\r
- Destroy the Thunk Context and free up all resource.\r
-\r
- @param ThunkContext The HII Thunk Private Context to be freed.\r
-\r
-**/\r
-VOID\r
-DestroyThunkContext (\r
- IN HII_THUNK_CONTEXT *ThunkContext\r
- )\r
-{\r
- ASSERT (ThunkContext != NULL);\r
-\r
- FreeHiiHandle (ThunkContext->FwHiiHandle);\r
-\r
- RemoveEntryList (&ThunkContext->Link);\r
-\r
- if (ThunkContext->FormSet != NULL) {\r
- DestroyFormSet (ThunkContext->FormSet);\r
- }\r
-\r
- FreePool (ThunkContext);\r
-}\r
-\r
-/**\r
- Get the FormSet's Default Varstore ID based on the rule (Descending Priority):\r
-\r
- 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.\r
- 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used \r
- as the default Var Store ID.\r
-\r
- @param FormSet The Form Set. The Default Varstore ID is updated if found.\r
- \r
-**/\r
-VOID\r
-GetFormsetDefaultVarstoreId (\r
- IN OUT FORM_BROWSER_FORMSET * FormSet\r
- )\r
-{\r
- LIST_ENTRY *StorageList;\r
- FORMSET_STORAGE *Storage;\r
-\r
- //\r
- // VarStoreId 0 is invalid in UEFI IFR.\r
- //\r
- FormSet->DefaultVarStoreId = 0;\r
- StorageList = GetFirstNode (&FormSet->StorageListHead);\r
-\r
- while (!IsNull (&FormSet->StorageListHead, StorageList)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK (StorageList);\r
-\r
- DEBUG ((EFI_D_INFO, "FormSet %g: Found Varstore ID %x Name %s Size 0x%x\n", &FormSet->Guid, Storage->VarStoreId, Storage->Name, Storage->Size));\r
-\r
- if (Storage->VarStoreId == FRAMEWORK_RESERVED_VARSTORE_ID) {\r
- //\r
- // 1) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID (0x01) is found, Var Store ID is used.\r
- //\r
- FormSet->DefaultVarStoreId = FRAMEWORK_RESERVED_VARSTORE_ID;\r
- break;\r
- }\r
-\r
- StorageList = GetNextNode (&FormSet->StorageListHead, StorageList);\r
- }\r
-\r
- if (FormSet->DefaultVarStoreId != FRAMEWORK_RESERVED_VARSTORE_ID) {\r
- //\r
- // \r
- // 2) If VarStore ID of FRAMEWORK_RESERVED_VARSTORE_ID is not found, First Var Store ID is used \r
- // as the default Var Store ID.\r
- //\r
- StorageList = GetFirstNode (&FormSet->StorageListHead);\r
- if (!IsNull (&FormSet->StorageListHead, StorageList)) {\r
- Storage = FORMSET_STORAGE_FROM_LINK (StorageList);\r
- FormSet->DefaultVarStoreId = Storage->VarStoreId;\r
- }\r
- \r
- }\r
-\r
- if (FormSet->DefaultVarStoreId == 0) {\r
- DEBUG ((EFI_D_INFO, "FormSet %g: No Varstore Found\n", &FormSet->Guid));\r
- } \r
- \r
- return;\r
-}\r
-\r
-/**\r
- Fetch the Ifr binary data of a FormSet.\r
-\r
- @param Handle PackageList Handle\r
- @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
- GUID), take the first FormSet found in package\r
- list.\r
- @param BinaryLength The length of the FormSet IFR binary.\r
- @param BinaryData The buffer designed to receive the FormSet.\r
-\r
- @retval EFI_SUCCESS Buffer filled with the requested FormSet.\r
- BufferLength was updated.\r
- @retval EFI_INVALID_PARAMETER The handle is unknown.\r
- @retval EFI_NOT_FOUND A form or FormSet on the requested handle cannot\r
- be found with the requested FormId.\r
-\r
-**/\r
-EFI_STATUS\r
-GetIfrBinaryData (\r
- IN EFI_HII_HANDLE Handle,\r
- IN OUT EFI_GUID *FormSetGuid,\r
- OUT UINTN *BinaryLength,\r
- OUT UINT8 **BinaryData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINTN BufferSize;\r
- UINT8 *Package;\r
- UINT8 *OpCodeData;\r
- UINT32 Offset;\r
- UINT32 Offset2;\r
- BOOLEAN ReturnDefault;\r
- UINT32 PackageListLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
-\r
- OpCodeData = NULL;\r
- Package = NULL;\r
- ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;\r
-\r
- //\r
- // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list\r
- //\r
- if (FormSetGuid == NULL || CompareGuid (FormSetGuid, &gZeroGuid)) {\r
- ReturnDefault = TRUE;\r
- } else {\r
- ReturnDefault = FALSE;\r
- }\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- }\r
- if (EFI_ERROR (Status) || HiiPackageList == NULL) {\r
- return EFI_NOT_FOUND;\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
- CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\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 FormSet 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
- // Check whether return default FormSet\r
- //\r
- if (ReturnDefault) {\r
- break;\r
- }\r
-\r
- //\r
- // FormSet GUID is specified, check it\r
- //\r
- if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
- break;\r
- }\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
- if (Offset >= PackageListLength) {\r
- //\r
- // Form package not found in this Package List\r
- //\r
- gBS->FreePool (HiiPackageList);\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- if (ReturnDefault && FormSetGuid != NULL) {\r
- //\r
- // Return the default FormSet GUID\r
- //\r
- CopyMem (FormSetGuid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
- }\r
-\r
- //\r
- // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes\r
- // in this FormSet; So, here just simply copy the data from start of a FormSet to the end\r
- // of the Form Package.\r
- //\r
- *BinaryLength = PackageHeader.Length - Offset2;\r
- *BinaryData = AllocateCopyPool (*BinaryLength, OpCodeData);\r
-\r
- gBS->FreePool (HiiPackageList);\r
-\r
- if (*BinaryData == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Initialize the internal data structure of a FormSet.\r
-\r
- @param Handle PackageList Handle\r
- @param FormSetGuid GUID of a formset. If not specified (NULL or zero\r
- GUID), take the first FormSet found in package\r
- list.\r
- @param FormSet FormSet data structure.\r
-\r
- @retval EFI_SUCCESS The function completed successfully.\r
- @retval EFI_NOT_FOUND The specified FormSet could not be found.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeFormSet (\r
- IN EFI_HII_HANDLE Handle,\r
- IN OUT EFI_GUID *FormSetGuid,\r
- OUT FORM_BROWSER_FORMSET *FormSet\r
- )\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = GetIfrBinaryData (Handle, FormSetGuid, &FormSet->IfrBinaryLength, &FormSet->IfrBinaryData);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- FormSet->HiiHandle = Handle;\r
- CopyMem (&FormSet->Guid, FormSetGuid, sizeof (EFI_GUID));\r
-\r
- //\r
- // Parse the IFR binary OpCodes\r
- //\r
- Status = ParseOpCodes (FormSet);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- GetFormsetDefaultVarstoreId (FormSet);\r
- return Status;\r
-}\r
-\r
-/**\r
- Parse the Form Package and build a FORM_BROWSER_FORMSET structure.\r
-\r
- @param UefiHiiHandle PackageList Handle\r
-\r
- @return A pointer to FORM_BROWSER_FORMSET.\r
-\r
-**/\r
-FORM_BROWSER_FORMSET *\r
-ParseFormSet (\r
- IN EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
- FORM_BROWSER_FORMSET *FormSet;\r
- EFI_GUID FormSetGuid;\r
- EFI_STATUS Status;\r
- \r
- FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET)); \r
- ASSERT (FormSet != NULL);\r
-\r
- CopyGuid (&FormSetGuid, &gZeroGuid);\r
- Status = InitializeFormSet (UefiHiiHandle, &FormSetGuid, FormSet);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (FormSet);\r
- return NULL;\r
- }\r
-\r
- return FormSet;\r
-}\r
-\r