+++ /dev/null
-/** @file\r
- Language related HII Library implementation.\r
-\r
- Copyright (c) 2006 - 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
-\r
-#include "InternalHiiLib.h"\r
-\r
-/**\r
- Get next language from language code list (with separator ';').\r
-\r
- If LangCode is NULL, then ASSERT.\r
- If Lang is NULL, then ASSERT.\r
-\r
- @param LangCode On input: point to first language in the list. On\r
- output: point to next language in the list, or\r
- NULL if no more language in the list.\r
- @param Lang The first language in the list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-HiiLibGetNextLanguage (\r
- IN OUT CHAR8 **LangCode,\r
- OUT CHAR8 *Lang\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *StringPtr;\r
-\r
- ASSERT (LangCode != NULL);\r
- ASSERT (*LangCode != NULL);\r
- ASSERT (Lang != NULL);\r
-\r
- Index = 0;\r
- StringPtr = *LangCode;\r
- while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
- Index++;\r
- }\r
-\r
- CopyMem (Lang, StringPtr, Index);\r
- Lang[Index] = 0;\r
-\r
- if (StringPtr[Index] == ';') {\r
- Index++;\r
- }\r
- *LangCode = StringPtr + Index;\r
-}\r
-\r
-\r
-/**\r
- This function returns the list of supported languages, in the format specified\r
- in UEFI specification Appendix M.\r
-\r
- If HiiHandle is not a valid Handle in the default HII database, then ASSERT.\r
-\r
- @param HiiHandle The HII package list handle.\r
-\r
- @retval !NULL The supported languages.\r
- @retval NULL If Supported Languages can not be retrived.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-HiiLibGetSupportedLanguages (\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- CHAR8 *LanguageString;\r
-\r
- ASSERT (IsHiiHandleRegistered (HiiHandle));\r
- //\r
- // Collect current supported Languages for given HII handle\r
- // First try allocate 4K buffer to store the current supported languages.\r
- //\r
- BufferSize = 0x1000;\r
- LanguageString = AllocateZeroPool (BufferSize);\r
- if (LanguageString == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (LanguageString);\r
- LanguageString = AllocateZeroPool (BufferSize);\r
- if (LanguageString == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- LanguageString = NULL;\r
- }\r
-\r
- return LanguageString;\r
-}\r
-\r
-\r
-/**\r
- This function returns the number of supported languages on HiiHandle.\r
-\r
- If HiiHandle is not a valid Handle in the default HII database, then ASSERT.\r
- If not enough resource to complete the operation, then ASSERT.\r
-\r
- @param HiiHandle The HII package list handle.\r
-\r
- @return The number of supported languages.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-HiiLibGetSupportedLanguageNumber (\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- CHAR8 *Languages;\r
- CHAR8 *LanguageString;\r
- UINT16 LangNumber;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
-\r
- Languages = HiiLibGetSupportedLanguages (HiiHandle);\r
- if (Languages == NULL) {\r
- return 0;\r
- }\r
-\r
- LangNumber = 0;\r
- LanguageString = Languages;\r
- while (*LanguageString != 0) {\r
- HiiLibGetNextLanguage (&LanguageString, Lang);\r
- LangNumber++;\r
- }\r
- FreePool (Languages);\r
-\r
- return LangNumber;\r
-}\r
-\r
-/**\r
- This function returns the list of supported 2nd languages, in the format specified\r
- in UEFI specification Appendix M.\r
-\r
- If HiiHandle is not a valid Handle in the default HII database, then ASSERT.\r
- If not enough resource to complete the operation, then ASSERT.\r
-\r
- @param HiiHandle The HII package list handle.\r
- @param FirstLanguage Pointer to language name buffer.\r
- \r
- @return The supported languages.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-HiiLibGetSupportedSecondaryLanguages (\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN CONST CHAR8 *FirstLanguage\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- CHAR8 *LanguageString;\r
-\r
- ASSERT (HiiHandle != NULL);\r
- ASSERT (IsHiiHandleRegistered (HiiHandle));\r
- //\r
- // Collect current supported 2nd Languages for given HII handle\r
- // First try allocate 4K buffer to store the current supported 2nd languages.\r
- //\r
- BufferSize = 0x1000;\r
- LanguageString = AllocateZeroPool (BufferSize);\r
- if (LanguageString == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = mHiiStringProt->GetSecondaryLanguages (mHiiStringProt, HiiHandle, FirstLanguage, LanguageString, &BufferSize);\r
- \r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (LanguageString);\r
- LanguageString = AllocateZeroPool (BufferSize);\r
- if (LanguageString == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = mHiiStringProt->GetSecondaryLanguages (mHiiStringProt, HiiHandle, FirstLanguage, LanguageString, &BufferSize);\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- LanguageString = NULL;\r
- }\r
-\r
- return LanguageString;\r
-}\r
-\r
-\r
+++ /dev/null
-/** @file\r
- HII Library implementation that uses DXE protocols and services.\r
-\r
- Copyright (c) 2006 - 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 "InternalHiiLib.h"\r
-\r
-CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt = NULL;\r
-CONST EFI_HII_STRING_PROTOCOL *mHiiStringProt = NULL;\r
-\r
-/**\r
- This function locate Hii relative protocols for later usage.\r
- \r
- The constructor function caches the protocol pointer of HII Database Protocol\r
- and Hii String Protocol.\r
- \r
- It will ASSERT() if either of the protocol can't be located.\r
-\r
- @param ImageHandle The firmware allocated handle for the EFI image.\r
- @param SystemTable A pointer to the EFI System Table.\r
-\r
- @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibConstructor (\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 **) &mHiiDatabaseProt);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &mHiiStringProt);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-\r
-/**\r
- This funciton build the package list based on the package number,\r
- the GUID of the package list and the list of pointer which point to\r
- package header that defined by UEFI VFR compiler and StringGather\r
- tool.\r
-\r
- #pragma pack (push, 1)\r
- typedef struct {\r
- UINT32 BinaryLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- } EDKII_AUTOGEN_PACKAGES_HEADER;\r
- #pragma pack (pop)\r
-\r
- If there is not enough resource for the new package list,\r
- the function will ASSERT.\r
-\r
- @param NumberOfPackages The number of packages be \r
- @param GuidId The GUID for the package list to be generated.\r
- @param Marker The variable argument list. Each entry represent a specific package header that is\r
- generated by VFR compiler and StrGather tool. The first 4 bytes is a UINT32 value\r
- that indicate the overall length of the package.\r
-\r
- @return The pointer to the package list header.\r
-\r
-**/\r
-EFI_HII_PACKAGE_LIST_HEADER *\r
-InternalHiiLibPreparePackages (\r
- IN UINTN NumberOfPackages,\r
- IN CONST EFI_GUID *GuidId,\r
- IN VA_LIST Marker\r
- )\r
-{\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
- UINT8 *PackageListData;\r
- UINT32 PackageListLength;\r
- UINT32 PackageLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- UINT8 *PackageArray;\r
- UINTN Index;\r
- VA_LIST MarkerBackup;\r
-\r
- PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-\r
- MarkerBackup = Marker;\r
-\r
- //\r
- // Count the lenth of the final package list.\r
- //\r
- for (Index = 0; Index < NumberOfPackages; Index++) {\r
- CopyMem (&PackageLength, VA_ARG (Marker, VOID *), sizeof (UINT32));\r
- //\r
- // Do not count the BinaryLength field.\r
- //\r
- PackageListLength += (PackageLength - sizeof (UINT32));\r
- }\r
-\r
- //\r
- // Include the lenght of EFI_HII_PACKAGE_END\r
- //\r
- PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
- PackageListHeader = AllocateZeroPool (PackageListLength);\r
- ASSERT (PackageListHeader != NULL);\r
- \r
- CopyGuid (&PackageListHeader->PackageListGuid, GuidId);\r
- PackageListHeader->PackageLength = PackageListLength;\r
-\r
- PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-\r
- Marker = MarkerBackup;\r
- //\r
- // Prepare the final package list.\r
- //\r
- for (Index = 0; Index < NumberOfPackages; Index++) {\r
- PackageArray = (UINT8 *) VA_ARG (Marker, VOID *);\r
- //\r
- // CopyMem is used for UINT32 to cover the unaligned address access.\r
- //\r
- CopyMem (&PackageLength, PackageArray, sizeof (UINT32));\r
- PackageLength -= sizeof (UINT32);\r
- PackageArray += sizeof (UINT32);\r
- CopyMem (PackageListData, PackageArray, PackageLength);\r
- PackageListData += PackageLength;\r
- }\r
-\r
- //\r
- // Append EFI_HII_PACKAGE_END\r
- //\r
- PackageHeader.Type = EFI_HII_PACKAGE_END;\r
- PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
- CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
-\r
- return PackageListHeader;\r
-}\r
-\r
-/**\r
- Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
-\r
- If GuidId is NULL, then ASSERT.\r
- If not enough resource to complete the operation, then ASSERT.\r
-\r
- @param NumberOfPackages Number of packages.\r
- @param GuidId Package GUID.\r
- @param ... Variable argument list for packages to be assembled.\r
-\r
- @return Pointer of EFI_HII_PACKAGE_LIST_HEADER.\r
-\r
-**/\r
-EFI_HII_PACKAGE_LIST_HEADER *\r
-EFIAPI\r
-HiiLibPreparePackageList (\r
- IN UINTN NumberOfPackages,\r
- IN CONST EFI_GUID *GuidId,\r
- ...\r
- )\r
-{\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
- VA_LIST Marker;\r
-\r
- ASSERT (GuidId != NULL);\r
-\r
- VA_START (Marker, GuidId);\r
- PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
- VA_END (Marker);\r
-\r
- return PackageListHeader;\r
-}\r
-\r
-\r
-/**\r
- This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
- with additional space that is big enough to host all packages described by the variable \r
- argument list of package pointers. The allocated structure is initialized using NumberOfPackages, \r
- GuidId, and the variable length argument list of package pointers.\r
-\r
- Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
- Handle to the newly registered Package List is returned throught HiiHandle.\r
-\r
- If HiiHandle is NULL, then ASSERT.\r
-\r
- @param NumberOfPackages The number of HII packages to register.\r
- @param GuidId Package List GUID ID.\r
- @param DriverHandle Optional. If not NULL, the DriverHandle on which an instance of DEVICE_PATH_PROTOCOL is installed.\r
- This DriverHandle uniquely defines the device that the added packages are associated with.\r
- @param HiiHandle On output, the HiiHandle is update with the handle which can be used to retrieve the Package \r
- List later. If the functions failed to add the package to the default HII database, this value will\r
- be set to NULL.\r
- @param ... The variable argument list describing all HII Package.\r
-\r
- @return EFI_SUCCESS If the packages are successfully added to the default HII database.\r
- @return EFI_OUT_OF_RESOURCE Not enough resource to complete the operation.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibAddPackages (\r
- IN UINTN NumberOfPackages,\r
- IN CONST EFI_GUID *GuidId,\r
- IN EFI_HANDLE DriverHandle, OPTIONAL\r
- OUT EFI_HII_HANDLE *HiiHandle,\r
- ...\r
- )\r
-{\r
- VA_LIST Args;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
- EFI_STATUS Status;\r
-\r
- ASSERT (HiiHandle != NULL);\r
-\r
- VA_START (Args, HiiHandle);\r
- PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
-\r
- Status = mHiiDatabaseProt->NewPackageList (mHiiDatabaseProt, PackageListHeader, DriverHandle, HiiHandle);\r
- if (HiiHandle != NULL) {\r
- if (EFI_ERROR (Status)) {\r
- *HiiHandle = NULL;\r
- }\r
- }\r
-\r
- FreePool (PackageListHeader);\r
- VA_END (Args);\r
- \r
- return Status;\r
-}\r
-\r
-/**\r
- Removes a package list from the default HII database.\r
-\r
- If HiiHandle is NULL, then ASSERT.\r
- If HiiHandle is not a valid EFI_HII_HANDLE in the default HII database, then ASSERT.\r
-\r
- @param HiiHandle The handle that was previously registered to the data base that is requested for removal.\r
- List later.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-HiiLibRemovePackages (\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- ASSERT (IsHiiHandleRegistered (HiiHandle));\r
-\r
- Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-}\r
-\r
-\r
-/**\r
- Determines the handles that are currently active in the database.\r
- It's the caller's responsibility to free handle buffer.\r
-\r
- If HandleBufferLength is NULL, then ASSERT.\r
- If HiiHandleBuffer is NULL, then ASSERT.\r
-\r
- @param HandleBufferLength On input, a pointer to the length of the handle\r
- buffer. On output, the length of the handle buffer\r
- that is required for the handles found.\r
- @param HiiHandleBuffer Pointer to an array of Hii Handles returned.\r
-\r
- @retval EFI_SUCCESS Get an array of Hii Handles successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibGetHiiHandles (\r
- IN OUT UINTN *HandleBufferLength,\r
- OUT EFI_HII_HANDLE **HiiHandleBuffer\r
- )\r
-{\r
- UINTN BufferLength;\r
- EFI_STATUS Status;\r
-\r
- ASSERT (HandleBufferLength != NULL);\r
- ASSERT (HiiHandleBuffer != NULL);\r
-\r
- BufferLength = 0;\r
-\r
- //\r
- // Try to find the actual buffer size for HiiHandle Buffer.\r
- //\r
- Status = mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferLength,\r
- *HiiHandleBuffer\r
- );\r
-\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
- ASSERT (*HiiHandleBuffer != NULL);\r
- Status = mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferLength,\r
- *HiiHandleBuffer\r
- );\r
- //\r
- // we should not fail here.\r
- //\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
- *HandleBufferLength = BufferLength;\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 default 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
-HiiLibExtractGuidFromHiiHandle (\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 (IsHiiHandleRegistered (Handle));\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
-\r
- Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, 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 = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, 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 HII Handle in the default HII database associated with given Device Path.\r
-\r
- If DevicePath is NULL, then ASSERT.\r
-\r
- @param DevicePath Device Path associated with the HII package list\r
- handle.\r
-\r
- @retval Handle HII package list Handle associated with the Device\r
- Path.\r
- @retval NULL Hii Package list handle is not found.\r
-\r
-**/\r
-EFI_HII_HANDLE\r
-EFIAPI\r
-HiiLibDevicePathToHiiHandle (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
- UINTN BufferSize;\r
- UINTN HandleCount;\r
- UINTN Index;\r
- EFI_HANDLE *Handles;\r
- EFI_HANDLE Handle;\r
- UINTN Size;\r
- EFI_HANDLE DriverHandle;\r
- EFI_HII_HANDLE *HiiHandles;\r
- EFI_HII_HANDLE HiiHandle;\r
-\r
- ASSERT (DevicePath != NULL);\r
-\r
- //\r
- // Locate Device Path Protocol handle buffer\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiDevicePathProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &Handles\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Search Driver Handle by Device Path\r
- //\r
- DriverHandle = NULL;\r
- BufferSize = GetDevicePathSize (DevicePath);\r
- for(Index = 0; Index < HandleCount; Index++) {\r
- Handle = Handles[Index];\r
- gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **) &TmpDevicePath);\r
-\r
- //\r
- // Check whether DevicePath match\r
- //\r
- Size = GetDevicePathSize (TmpDevicePath);\r
- if ((Size == BufferSize) && CompareMem (DevicePath, TmpDevicePath, Size) == 0) {\r
- DriverHandle = Handle;\r
- break;\r
- }\r
- }\r
- FreePool (Handles);\r
-\r
- if (DriverHandle == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Retrieve all Hii Handles from HII database\r
- //\r
- BufferSize = 0x1000;\r
- HiiHandles = AllocatePool (BufferSize);\r
- ASSERT (HiiHandles != NULL);\r
- Status = mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferSize,\r
- HiiHandles\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (HiiHandles);\r
- HiiHandles = AllocatePool (BufferSize);\r
- ASSERT (HiiHandles != NULL);\r
-\r
- Status = mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferSize,\r
- HiiHandles\r
- );\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- FreePool (HiiHandles);\r
- return NULL;\r
- }\r
-\r
- //\r
- // Search Hii Handle by Driver Handle\r
- //\r
- HiiHandle = NULL;\r
- HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = mHiiDatabaseProt->GetPackageListHandle (\r
- mHiiDatabaseProt,\r
- HiiHandles[Index],\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
- HiiHandle = HiiHandles[Index];\r
- break;\r
- }\r
- }\r
-\r
- FreePool (HiiHandles);\r
- return HiiHandle;\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
-HiiLibExportPackageLists (\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
- if (Handle != NULL) {\r
- ASSERT (IsHiiHandleRegistered (Handle));\r
- }\r
-\r
- Size = 0;\r
- PackageListHdr = NULL;\r
- Status = mHiiDatabaseProt->ExportPackageLists (\r
- mHiiDatabaseProt,\r
- Handle,\r
- &Size,\r
- PackageListHdr\r
- );\r
- ASSERT_EFI_ERROR (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 = mHiiDatabaseProt->ExportPackageLists (\r
- mHiiDatabaseProt,\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
- \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 outputed 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
-HiiLibListPackageLists (\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 = mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\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 mHiiDatabaseProt->ListPackageLists (\r
- mHiiDatabaseProt,\r
- PackageType,\r
- PackageGuid,\r
- HandleBufferLength,\r
- *HandleBuffer\r
- );\r
- \r
-}\r
-/**\r
- This function check if the Hii Handle is a valid handle registered\r
- in the HII database.\r
-\r
- @param HiiHandle The HII Handle.\r
-\r
- @retval TRUE If it is a valid HII handle.\r
- @retval FALSE If it is a invalid HII handle.\r
-**/\r
-BOOLEAN\r
-IsHiiHandleRegistered (\r
- EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
-\r
- ASSERT (HiiHandle != NULL);\r
-\r
- HiiPackageList = NULL;\r
- BufferSize = 0;\r
-\r
- Status = mHiiDatabaseProt->ExportPackageLists (\r
- mHiiDatabaseProt,\r
- HiiHandle,\r
- &BufferSize,\r
- HiiPackageList\r
- );\r
-\r
- return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
-}\r
-\r
+++ /dev/null
-/** @file\r
- HII Library implementation that uses DXE protocols and services.\r
-\r
- Copyright (c) 2006 - 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
-\r
-#include "InternalHiiLib.h"\r
-\r
-\r
-//\r
-// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
-// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.\r
-// The last 2 CHAR8 values are the ISO 639-1 code.\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc3066ConversionTable[] =\r
-"\\r
-aaraa\\r
-abkab\\r
-afraf\\r
-amham\\r
-araar\\r
-asmas\\r
-aymay\\r
-azeaz\\r
-bakba\\r
-belbe\\r
-benbn\\r
-bihbh\\r
-bisbi\\r
-bodbo\\r
-brebr\\r
-bulbg\\r
-catca\\r
-cescs\\r
-corkw\\r
-cosco\\r
-cymcy\\r
-danda\\r
-deude\\r
-dzodz\\r
-ellel\\r
-engen\\r
-epoeo\\r
-estet\\r
-euseu\\r
-faofo\\r
-fasfa\\r
-fijfj\\r
-finfi\\r
-frafr\\r
-fryfy\\r
-gaiga\\r
-gdhgd\\r
-glggl\\r
-grngn\\r
-gujgu\\r
-hauha\\r
-hebhe\\r
-hinhi\\r
-hrvhr\\r
-hunhu\\r
-hyehy\\r
-ikuiu\\r
-ileie\\r
-inaia\\r
-indid\\r
-ipkik\\r
-islis\\r
-itait\\r
-jawjw\\r
-jpnja\\r
-kalkl\\r
-kankn\\r
-kasks\\r
-katka\\r
-kazkk\\r
-khmkm\\r
-kinrw\\r
-kirky\\r
-korko\\r
-kurku\\r
-laolo\\r
-latla\\r
-lavlv\\r
-linln\\r
-litlt\\r
-ltzlb\\r
-malml\\r
-marmr\\r
-mkdmk\\r
-mlgmg\\r
-mltmt\\r
-molmo\\r
-monmn\\r
-mrimi\\r
-msams\\r
-myamy\\r
-nauna\\r
-nepne\\r
-nldnl\\r
-norno\\r
-ocioc\\r
-ormom\\r
-panpa\\r
-polpl\\r
-porpt\\r
-pusps\\r
-quequ\\r
-rohrm\\r
-ronro\\r
-runrn\\r
-rusru\\r
-sagsg\\r
-sansa\\r
-sinsi\\r
-slksk\\r
-slvsl\\r
-smise\\r
-smosm\\r
-snasn\\r
-sndsd\\r
-somso\\r
-sotst\\r
-spaes\\r
-sqisq\\r
-srpsr\\r
-sswss\\r
-sunsu\\r
-swasw\\r
-swesv\\r
-tamta\\r
-tattt\\r
-telte\\r
-tgktg\\r
-tgltl\\r
-thath\\r
-tsnts\\r
-tuktk\\r
-twitw\\r
-uigug\\r
-ukruk\\r
-urdur\\r
-uzbuz\\r
-vievi\\r
-volvo\\r
-wolwo\\r
-xhoxh\\r
-yidyi\\r
-zhaza\\r
-zhozh\\r
-zulzu\\r
-";\r
-\r
-\r
-\r
-/**\r
- This function adds the string into String Package of each language\r
- supported by the package list.\r
-\r
- If String is NULL, then ASSERT.\r
- If StringId is NULL, the ASSERT.\r
- If PackageList could not be found in the default HII database, then ASSERT.\r
-\r
- @param PackageList Handle of the package list where this string will\r
- be added.\r
- @param StringId On return, contains the new strings id, which is\r
- unique within PackageList.\r
- @param String Points to the new null-terminated string.\r
-\r
- @retval EFI_SUCCESS The new string was added successfully.\r
- @retval EFI_OUT_OF_RESOURCES Could not add the string due to lack of resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibNewString (\r
- IN EFI_HII_HANDLE PackageList,\r
- OUT EFI_STRING_ID *StringId,\r
- IN CONST EFI_STRING String\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR8 *Languages;\r
- CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
-\r
- ASSERT (String != NULL);\r
- ASSERT (StringId != NULL);\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- Languages = HiiLibGetSupportedLanguages (PackageList);\r
-\r
- LangStrings = Languages;\r
- while (*LangStrings != 0) {\r
- HiiLibGetNextLanguage (&LangStrings, Lang);\r
-\r
- //\r
- // For each language supported by the package,\r
- // a string token is created.\r
- //\r
- Status = mHiiStringProt->NewString (\r
- mHiiStringProt,\r
- PackageList,\r
- StringId,\r
- Lang,\r
- NULL,\r
- String,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- FreePool (Languages);\r
-\r
- return Status;\r
- \r
-}\r
-\r
-\r
-/**\r
- This function update the specified string in String Package of each language\r
- supported by the package list.\r
-\r
- If String is NULL, then ASSERT.\r
- If PackageList could not be found in the default HII database, then ASSERT.\r
- If StringId is not found in PackageList, then ASSERT.\r
-\r
- @param PackageList Handle of the package list where this string will\r
- be added.\r
- @param StringId Ths String Id to be updated.\r
- @param String Points to the new null-terminated string.\r
-\r
- @retval EFI_SUCCESS The new string was added successfully.\r
- @retval EFI_OUT_OF_RESOURCES Could not add the string due to lack of resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibSetString (\r
- IN EFI_HII_HANDLE PackageList,\r
- IN EFI_STRING_ID StringId,\r
- IN CONST EFI_STRING String\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR8 *Languages;\r
- CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
-\r
- ASSERT (IsHiiHandleRegistered (PackageList));\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- Languages = HiiLibGetSupportedLanguages (PackageList);\r
- ASSERT (Languages != NULL);\r
-\r
- LangStrings = Languages;\r
- while (*LangStrings != 0) {\r
- HiiLibGetNextLanguage (&LangStrings, Lang);\r
-\r
- //\r
- // For each language supported by the package,\r
- // the string is updated.\r
- //\r
- Status = mHiiStringProt->SetString (\r
- mHiiStringProt,\r
- PackageList,\r
- StringId,\r
- Lang,\r
- String,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- break;\r
- }\r
- }\r
-\r
- FreePool (Languages);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Get the string given the StringId and String package Producer's Guid. The caller\r
- is responsible to free the *String.\r
-\r
- If PackageList with the matching ProducerGuid is not found, then ASSERT.\r
- If PackageList with the matching ProducerGuid is found but no String is\r
- specified by StringId is found, then ASSERT.\r
-\r
- @param ProducerGuid The Guid of String package list.\r
- @param StringId The String ID.\r
- @param String The output string.\r
-\r
- @retval EFI_SUCCESS Operation is successful.\r
- @retval EFI_OUT_OF_RESOURCES There is not enought memory in the system.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibGetStringFromToken (\r
- IN EFI_GUID *ProducerGuid,\r
- IN EFI_STRING_ID StringId,\r
- OUT EFI_STRING *String\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINTN HandleBufferLen;\r
- EFI_HII_HANDLE *HiiHandleBuffer;\r
- EFI_GUID Guid;\r
-\r
- Status = HiiLibGetHiiHandles (&HandleBufferLen, &HiiHandleBuffer);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
- for (Index = 0; Index < (HandleBufferLen / sizeof (EFI_HII_HANDLE)); Index++) {\r
- Status = HiiLibExtractGuidFromHiiHandle (HiiHandleBuffer[Index], &Guid);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
- if (CompareGuid (&Guid, ProducerGuid)) {\r
- break;\r
- }\r
- }\r
-\r
- if (Index >= (HandleBufferLen / sizeof (EFI_HII_HANDLE))) {\r
- //\r
- // If PackageList with the matching ProducerGuid is not found, then ASSERT.\r
- //\r
- ASSERT (FALSE);\r
- Status = EFI_NOT_FOUND;\r
- goto Out;\r
- }\r
-\r
- Status = HiiLibGetStringFromHandle (HiiHandleBuffer[Index], StringId, String);\r
-\r
-Out:\r
- if (HiiHandleBuffer != NULL) {\r
- FreePool (HiiHandleBuffer);\r
- }\r
- return Status;\r
-}\r
-\r
-/**\r
- This function try to retrieve string from String package of current language.\r
- If fails, it try to retrieve string from String package of first language it support.\r
-\r
- If StringSize is NULL, then ASSERT.\r
- If String is NULL and *StringSize is not 0, then ASSERT.\r
- If PackageList could not be found in the default HII database, then ASSERT.\r
- If StringId is not found in PackageList, then ASSERT.\r
-\r
- @param PackageList The package list in the HII database to search for\r
- the specified string.\r
- @param StringId The string's id, which is unique within\r
- PackageList.\r
- @param String Points to the new null-terminated string.\r
- @param StringSize On entry, points to the size of the buffer pointed\r
- to by String, in bytes. On return, points to the\r
- length of the string, in bytes.\r
-\r
- @retval EFI_SUCCESS The string was returned successfully.\r
- @retval EFI_NOT_FOUND The string specified by StringId is not available.\r
- @retval EFI_BUFFER_TOO_SMALL The buffer specified by StringLength is too small\r
- to hold the string.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibGetString (\r
- IN EFI_HII_HANDLE PackageList,\r
- IN EFI_STRING_ID StringId,\r
- OUT EFI_STRING String,\r
- IN OUT UINTN *StringSize\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR8 *Languages;\r
- CHAR8 *LangStrings;\r
- CHAR8 Lang[RFC_3066_ENTRY_SIZE];\r
- CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];\r
-\r
- ASSERT (StringSize != NULL);\r
- ASSERT (!(*StringSize != 0 && String == NULL));\r
- ASSERT (IsHiiHandleRegistered (PackageList));\r
-\r
- GetCurrentLanguage (CurrentLang);\r
-\r
- Status = mHiiStringProt->GetString (\r
- mHiiStringProt,\r
- CurrentLang,\r
- PackageList,\r
- StringId,\r
- String,\r
- StringSize,\r
- NULL\r
- );\r
-\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- Languages = HiiLibGetSupportedLanguages (PackageList);\r
- ASSERT (Languages != NULL);\r
- \r
- LangStrings = Languages;\r
- HiiLibGetNextLanguage (&LangStrings, Lang);\r
- FreePool (Languages);\r
-\r
- Status = mHiiStringProt->GetString (\r
- mHiiStringProt,\r
- Lang,\r
- PackageList,\r
- StringId,\r
- String,\r
- StringSize,\r
- NULL\r
- );\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Get string specified by StringId form the HiiHandle. The caller\r
- is responsible to free the *String.\r
-\r
- If String is NULL, then ASSERT.\r
- If HiiHandle could not be found in the default HII database, then ASSERT.\r
- If StringId is not found in PackageList, then ASSERT.\r
-\r
- @param HiiHandle The HII handle of package list.\r
- @param StringId The String ID.\r
- @param String The output string.\r
-\r
- @retval EFI_NOT_FOUND String is not found.\r
- @retval EFI_SUCCESS Operation is successful.\r
- @retval EFI_OUT_OF_RESOURCES There is not enought memory in the system.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibGetStringFromHandle (\r
- IN EFI_HII_HANDLE HiiHandle,\r
- IN EFI_STRING_ID StringId,\r
- OUT EFI_STRING *String\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN StringSize;\r
-\r
- ASSERT (String != NULL);\r
-\r
- StringSize = HII_LIB_DEFAULT_STRING_SIZE;\r
- *String = AllocateZeroPool (StringSize);\r
- if (*String == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Status = HiiLibGetString (HiiHandle, StringId, *String, &StringSize);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (*String);\r
- *String = AllocateZeroPool (StringSize);\r
- if (*String == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = HiiLibGetString (HiiHandle, StringId, *String, &StringSize);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-\r
-/**\r
- Convert language code from RFC3066 to ISO639-2.\r
-\r
- @param LanguageRfc3066 RFC3066 language code.\r
- @param LanguageIso639 ISO639-2 language code.\r
-\r
- @retval EFI_SUCCESS Language code converted.\r
- @retval EFI_NOT_FOUND Language code not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertRfc3066LanguageToIso639Language (\r
- IN CHAR8 *LanguageRfc3066,\r
- OUT CHAR8 *LanguageIso639\r
- )\r
-{\r
- UINTN Index;\r
-\r
- if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {\r
- CopyMem (LanguageIso639, LanguageRfc3066, 3);\r
- return EFI_SUCCESS;\r
- }\r
-\r
- for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {\r
- CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
- Convert language code from ISO639-2 to RFC3066.\r
-\r
- LanguageIso639 contain a single ISO639-2 code such as\r
- "eng" or "fra".\r
-\r
- The LanguageRfc3066 must be a buffer large enough\r
- for RFC_3066_ENTRY_SIZE characters.\r
-\r
- If LanguageIso639 is NULL, then ASSERT.\r
- If LanguageRfc3066 is NULL, then ASSERT.\r
-\r
- @param LanguageIso639 ISO639-2 language code.\r
- @param LanguageRfc3066 RFC3066 language code.\r
-\r
- @retval EFI_SUCCESS Language code converted.\r
- @retval EFI_NOT_FOUND Language code not found.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertIso639LanguageToRfc3066Language (\r
- IN CONST CHAR8 *LanguageIso639,\r
- OUT CHAR8 *LanguageRfc3066\r
- )\r
-{\r
- UINTN Index;\r
- \r
- for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
- if (CompareMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3) == 0) {\r
- CopyMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2);\r
- return EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
- Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will\r
- be converted to "engfra".\r
-\r
- @param SupportedLanguages The RFC3066 language list.\r
-\r
- @return The ISO639-2 language list.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-Rfc3066ToIso639 (\r
- CHAR8 *SupportedLanguages\r
- )\r
-{\r
- CHAR8 *Languages;\r
- CHAR8 *ReturnValue;\r
- CHAR8 *LangCodes;\r
- CHAR8 LangRfc3066[RFC_3066_ENTRY_SIZE];\r
- CHAR8 LangIso639[ISO_639_2_ENTRY_SIZE];\r
- EFI_STATUS Status;\r
-\r
- ReturnValue = AllocateZeroPool (AsciiStrSize (SupportedLanguages));\r
- if (ReturnValue == NULL) {\r
- return ReturnValue;\r
- }\r
-\r
- Languages = ReturnValue;\r
- LangCodes = SupportedLanguages;\r
- while (*LangCodes != 0) {\r
- HiiLibGetNextLanguage (&LangCodes, LangRfc3066);\r
-\r
- Status = ConvertRfc3066LanguageToIso639Language (LangRfc3066, LangIso639);\r
- if (!EFI_ERROR (Status)) {\r
- CopyMem (Languages, LangIso639, 3);\r
- Languages = Languages + 3;\r
- }\r
- }\r
-\r
- return ReturnValue;\r
-}\r
-\r
-\r
+++ /dev/null
-/** @file\r
- Internal include file for the HII Library instance.\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
-#ifndef __INTERNAL_HII_LIB_H__\r
-#define __INTERNAL_HII_LIB_H__\r
-\r
-#include <Uefi.h>\r
-\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/DevicePath.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/UefiLib.h>\r
-\r
-#define HII_LIB_DEFAULT_STRING_SIZE 0x200\r
-\r
-\r
-extern CONST EFI_HII_DATABASE_PROTOCOL *mHiiDatabaseProt;\r
-extern CONST EFI_HII_STRING_PROTOCOL *mHiiStringProt;\r
-\r
-/**\r
- This function check if the Hii Handle is a valid handle registered\r
- in the HII database.\r
-\r
- @param HiiHandle The HII Handle.\r
-\r
- @retval TRUE If it is a valid HII handle.\r
- @retval FALSE If it is a invalid HII handle.\r
-**/\r
-BOOLEAN\r
-IsHiiHandleRegistered (\r
- EFI_HII_HANDLE HiiHandle\r
- );\r
-\r
-#endif\r
+++ /dev/null
-#/** @file\r
-# Instance of HII Library using DXE protocols and services.\r
-#\r
-# HII Library implementation that uses DXE protocols and services.\r
-#\r
-# Copyright (c) 2006 - 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
-# 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 = UefiHiiLib\r
- FILE_GUID = 3143687A-7C80-404e-B5FE-2D88980E1B1C\r
- MODULE_TYPE = UEFI_DRIVER\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = HiiLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
- EDK_RELEASE_VERSION = 0x00020000\r
-\r
- CONSTRUCTOR = HiiLibConstructor\r
-\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 IPF EBC\r
-#\r
-\r
-[Sources.common]\r
- HiiLib.c\r
- HiiString.c\r
- HiiLanguage.c\r
- InternalHiiLib.h\r
-\r
-[Packages]\r
- MdePkg/MdePkg.dec\r
-\r
-[LibraryClasses]\r
- MemoryAllocationLib\r
- BaseMemoryLib\r
- BaseLib\r
- DebugLib\r
- UefiBootServicesTableLib\r
- DevicePathLib\r
- UefiLib\r
-\r
-[Protocols]\r
- gEfiHiiDatabaseProtocolGuid # ALWAYS_CONSUMED\r
- gEfiHiiStringProtocolGuid # ALWAYS_CONSUMED\r
- gEfiDevicePathProtocolGuid \r
-\r
-[Depex]\r
- gEfiHiiDatabaseProtocolGuid AND\r
- gEfiHiiStringProtocolGuid\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
-#include "UefiIfrLibraryInternal.h"\r
-\r
-CONST EFI_FORM_BROWSER2_PROTOCOL *mFormBrowser2 = NULL;\r
-CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *mIfrSupportLibHiiConfigRouting = NULL;\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
-// Fake <ConfigHdr>\r
-//\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";\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 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 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
- CHAR16 *String;\r
-\r
- String = VA_ARG (Marker, CHAR16 *);\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, KeyValue);\r
-\r
- Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, 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
- *BlockName = StringPtr;\r
- if (StringPtr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\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
- //\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
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- ConfigHdr = AllocateZeroPool (StrBufferLen);\r
- Status = ConstructConfigHdr (\r
- ConfigHdr,\r
- &StrBufferLen,\r
- Guid,\r
- Name,\r
- DriverHandle\r
- );\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Construct <ConfigResp>\r
- //\r
- NeedFreeConfigRequest = FALSE;\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
- return Status;\r
- }\r
- \r
- Len = StrSize (ConfigHdr);\r
- ConfigRequest = AllocateZeroPool (Len + StrSize (BlockName) - sizeof (CHAR16));\r
- StrCpy (ConfigRequest, ConfigHdr);\r
- StrCat (ConfigRequest, BlockName);\r
- NeedFreeConfigRequest = TRUE;\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
- //\r
- // Construct <AltResp>\r
- //\r
- DescHdr = AllocateZeroPool (NumberAltCfg * 16 * sizeof (CHAR16));\r
- StringPtr = DescHdr;\r
- AltCfg = AllocateZeroPool (NumberAltCfg * sizeof (CHAR16 *));\r
- AltRespLen = 0;\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
- return Status;\r
- }\r
- AltRespLen += StrLen (AltCfg[Index]);\r
- }\r
- VA_END (Args);\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
- return EFI_OUT_OF_RESOURCES;\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
- gBS->FreePool (AltCfg[Index]);\r
- }\r
-\r
- if (NeedFreeConfigRequest) {\r
- gBS->FreePool (ConfigRequest);\r
- }\r
- gBS->FreePool (ConfigHdr);\r
- gBS->FreePool (ConfigResp);\r
- gBS->FreePool (DescHdr);\r
- gBS->FreePool (AltCfg);\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
- 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 < 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
-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
- gBS->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
- BufferLen = 0;\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
- if (ConfigResp != NULL) {\r
- FreePool (ConfigResp);\r
- }\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
+++ /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
-\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)) != 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
-# 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. All rights reserved.\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
- EDK_RELEASE_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
-\r
-\r
-[LibraryClasses]\r
- MemoryAllocationLib\r
- DevicePathLib\r
- BaseLib\r
- UefiBootServicesTableLib\r
- BaseMemoryLib\r
- DebugLib\r
-\r
-[Protocols]\r
- gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
- gEfiHiiConfigRoutingProtocolGuid\r
- gEfiFormBrowser2ProtocolGuid \r