1) Cleanup HiiLib, IfrSupportLib.
authorqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Sat, 2 Feb 2008 13:11:49 +0000 (13:11 +0000)
committerqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Sat, 2 Feb 2008 13:11:49 +0000 (13:11 +0000)
git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@4661 de2fecce-e211-0410-80a6-f3fac2684e05

17 files changed:
edk2/MdePkg/Include/Library/HiiLib.h
edk2/MdePkg/Include/Library/IfrSupportLib.h
edk2/MdePkg/Include/Uefi/UefiInternalFormRepresentation.h
edk2/MdePkg/Library/HiiLib/HiiLanguage.c [new file with mode: 0644]
edk2/MdePkg/Library/HiiLib/HiiLib.c
edk2/MdePkg/Library/HiiLib/HiiLib.inf
edk2/MdePkg/Library/HiiLib/HiiString.c [new file with mode: 0644]
edk2/MdePkg/Library/HiiLib/InternalHiiLib.h
edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.inf [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.msa [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/R8Lib.c [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/R8Lib.h [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/UefiIfrCommon.c [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/UefiIfrForm.c [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/UefiIfrLibraryInternal.h [new file with mode: 0644]
edk2/MdePkg/Library/IfrSupportLib/UefiIfrOpCodeCreation.c [new file with mode: 0644]
edk2/MdePkg/MdePkg.dsc

index dc557af..de6267b 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Public include file for the HII Library\r
 \r
-  Copyright (c) 2006, Intel Corporation                                                         \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
 #ifndef __HII_LIB_H__\r
 #define __HII_LIB_H__\r
 \r
-//#include <PiDxe.h>\r
-\r
 //\r
 // Limited buffer size recommended by RFC4646 (4.3.  Length Considerations)\r
 // (42 characters plus a NULL terminator)\r
 //\r
 #define RFC_3066_ENTRY_SIZE             (42 + 1)\r
 \r
+#define ISO_639_2_ENTRY_SIZE            3\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 EFI_HII_PACKAGE_LIST_HEADER Pointer of EFI_HII_PACKAGE_LIST_HEADER. The function will ASSERT if system has\r
+                                                                not enough resource to complete the operation.\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
+\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
   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  HiiHandle                The ID used to retrieve the Package List later.\r
+  @param  EFI_HANDLE            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\r
-  The allocated and initialized packages.\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
-\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibAddPackagesToHiiDatabase (\r
+HiiLibAddPackages (\r
   IN       UINTN               NumberOfPackages,\r
   IN CONST EFI_GUID            *GuidId,\r
   IN       EFI_HANDLE          DriverHandle, OPTIONAL\r
-  OUT      EFI_HII_HANDLE      *HiiHandle, OPTIONAL\r
+  OUT      EFI_HII_HANDLE      *HiiHandle,\r
   ...\r
   )\r
 ;\r
@@ -63,32 +91,46 @@ HiiLibAddFontPackageToHiiDatabase (
   )\r
 ;\r
 \r
-EFI_STATUS\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
+  @return  VOID\r
+\r
+**/\r
+VOID\r
 EFIAPI\r
-HiiLibRemovePackagesFromHiiDatabase (\r
+HiiLibRemovePackages (\r
   IN      EFI_HII_HANDLE      HiiHandle\r
   )\r
 ;\r
 \r
 /**\r
-  This function adds the string into String Package of each language.\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
+                                            be added.\r
   @param  StringId               On return, contains the new strings id, which is\r
-                                 unique within PackageList.\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_NOT_FOUND          The specified PackageList could not be found in\r
-                                 database.\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
-  @retval EFI_INVALID_PARAMETER  String is NULL or StringId is NULL is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibCreateString (\r
+HiiLibNewString (\r
   IN  EFI_HII_HANDLE                  PackageList,\r
   OUT EFI_STRING_ID                   *StringId,\r
   IN  CONST EFI_STRING                String\r
@@ -96,84 +138,301 @@ HiiLibCreateString (
 ;\r
 \r
 /**\r
-  This function update the specified string in String Package of each language.\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
+                                            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_NOT_FOUND          The specified PackageList could not be found in\r
-                                 database.\r
   @retval EFI_OUT_OF_RESOURCES   Could not add the string due to lack of resources.\r
-  @retval EFI_INVALID_PARAMETER  String is NULL or StringId is NULL is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibUpdateString (\r
+HiiLibSetString (\r
   IN  EFI_HII_HANDLE                  PackageList,\r
   IN  EFI_STRING_ID                   StringId,\r
   IN  CONST EFI_STRING                String\r
   )\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 String is NULL, then ASSERT.\r
+  If StringSize 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     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
+  @retval EFI_INVALID_PARAMETER  The String or StringSize was NULL.\r
 \r
+**/\r
 \r
-//\r
-// Just use the UEFI prototype\r
-//\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibGetStringFromGuidId (\r
-  IN  EFI_GUID                        *ProducerGuid,\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
+\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
+  @retval EFI_INVALID_PARAMETER  The String is NULL.\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
 \r
-//\r
-// This function is Implementation Specifc. HII_VENDOR_DEVICE_PATH\r
-// This should be moved to MdeModulepkg.\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
-HiiLibCreateHiiDriverHandle (\r
-  OUT EFI_HANDLE               *DriverHandle\r
+HiiLibGetStringFromToken (\r
+  IN  EFI_GUID                        *ProducerGuid,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      *String\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  HiiDatabase            A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                 instance.\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
-HiiLibDestroyHiiDriverHandle (\r
-  IN EFI_HANDLE                 DriverHandle\r
+HiiLibGetHiiHandles (\r
+  IN OUT UINTN                     *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE            **HiiHandleBuffer\r
   )\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  HiiHandle              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
-HiiLibExtractClassFromHiiHandle (\r
+EFIAPI\r
+HiiLibExtractGuidFromHiiHandle (\r
   IN      EFI_HII_HANDLE      Handle,\r
-  OUT     UINT16              *Class,\r
-  OUT     EFI_STRING_ID       *FormSetTitle,\r
-  OUT     EFI_STRING_ID       *FormSetHelp\r
+  OUT     EFI_GUID            *Guid\r
+  )\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
+\r
+\r
+/**\r
+  Determine what is the current language setting. The space reserved for Lang\r
+  must be at least RFC_3066_ENTRY_SIZE bytes;\r
+\r
+  If Lang is NULL, then ASSERT.\r
+\r
+  @param  Lang                   Pointer of system language. Lang will always be filled with \r
+                                         a valid RFC 3066 language string. If "PlatformLang" is not\r
+                                         set in the system, the default language specifed by PcdUefiVariableDefaultPlatformLang\r
+                                         is returned.\r
+\r
+  @return  EFI_SUCCESS     If the EFI Variable with "PlatformLang" is set and return in Lang.\r
+  @return  EFI_NOT_FOUND If the EFI Variable with "PlatformLang" is not set, but a valid default language is return in Lang.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiLibGetCurrentLanguage (\r
+  OUT     CHAR8               *Lang\r
   )\r
-/*++\r
+;\r
 \r
-Routine Description:\r
-  Extract formset class for given HII handle.\r
+/**\r
+  Get next language from language code list (with separator ';').\r
 \r
-Arguments:\r
-  HiiHandle       - Hii handle\r
-  Class           - Class of the formset\r
-  FormSetTitle    - Formset title string\r
-  FormSetHelp     - Formset help string\r
+  If LangCode is NULL, then ASSERT.\r
+  If Lang is NULL, then ASSERT.\r
 \r
-Returns:\r
-  EFI_SUCCESS     - Successfully extract Class for specified Hii handle.\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
+**/\r
+VOID\r
+EFIAPI\r
+HiiLibGetNextLanguage (\r
+  IN OUT CHAR8      **LangCode,\r
+  OUT CHAR8         *Lang\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
+  If not enough resource to complete the operation, then ASSERT.\r
+\r
+  @param  HiiHandle              The HII package list handle.\r
+\r
+  @return The supported languages.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+HiiLibGetSupportedLanguages (\r
+  IN EFI_HII_HANDLE           HiiHandle\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
+\r
+/**\r
+  Convert language code from RFC3066 to ISO639-2.\r
+\r
+  If LanguageRfc3066 is NULL, then ASSERT.\r
+  If LanguageIso639 is NULL, then ASSERT.\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
+  CHAR8   *LanguageRfc3066,\r
+  CHAR8   *LanguageIso639\r
+  )\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
+  If SupportedLanguages is NULL, then ASSERT.\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
 \r
 #endif\r
index 0b54a8e..75c7f47 100644 (file)
@@ -11,16 +11,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 Module Name:\r
 \r
-  UefiIfrLibrary.h\r
+  IfrSupportLibrary.h\r
 \r
 Abstract:\r
 \r
-  The file contain all library function for Ifr Operations.\r
+  The file contain all library functions and definitions for IFR opcode creation and \r
+  related Form Browser utility Operations.\r
 \r
 --*/\r
 \r
-#ifndef _IFRLIBRARY_H\r
-#define _IFRLIBRARY_H\r
+#ifndef _IFR_SUPPORT_LIBRARY_H\r
+#define _IFR_SUPPORT_LIBRARY_H\r
 \r
 \r
 #include <Protocol/HiiFont.h>\r
@@ -34,8 +35,6 @@ Abstract:
 \r
 #include <Guid/GlobalVariable.h>\r
 \r
-#define IFR_LIB_DEFAULT_STRING_SIZE     0x200\r
-\r
 //\r
 // The architectural variable "Lang" and "LangCodes" are deprecated in UEFI\r
 // specification. While, UEFI specification also states that these deprecated\r
@@ -94,50 +93,62 @@ typedef struct {
 } EFI_HII_UPDATE_DATA;\r
 \r
 \r
-//\r
-// Exported Library functions\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 create success\r
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
+\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 CreateEndOpCode (\r
   IN OUT EFI_HII_UPDATE_DATA *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_END_OP opcode.\r
+;\r
 \r
-Arguments:\r
-  Data            - Destination for the created opcode binary\r
+/**\r
+  Create EFI_IFR_DEFAULT_OP opcode.\r
 \r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\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
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\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
+;\r
 \r
-Routine Description:\r
-  Create EFI_IFR_DEFAULT_OP opcode.\r
+/**\r
+  Create EFI_IFR_ACTION_OP opcode.\r
 \r
-Arguments:\r
-  Value           - Value for the default\r
-  Type            - Type for the default\r
-  Data            - Destination for the created opcode binary\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
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\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
@@ -146,26 +157,23 @@ CreateActionOpCode (
   IN     EFI_STRING_ID        QuestionConfig,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_ACTION_OP opcode.\r
-\r
-Arguments:\r
-  QuestionId      - Question ID\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  QuestionConfig  - String ID for configuration\r
-  Data            - Destination for the created opcode binary\r
+;\r
 \r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
+/**\r
+  Create EFI_IFR_SUBTITLE_OP opcode.\r
 \r
---*/\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 create success\r
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
+  \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 CreateSubTitleOpCode (\r
   IN      EFI_STRING_ID       Prompt,\r
   IN      EFI_STRING_ID       Help,\r
@@ -173,49 +181,47 @@ CreateSubTitleOpCode (
   IN      UINT8               Scope,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
+;\r
 \r
-Routine Description:\r
-  Create EFI_IFR_SUBTITLE_OP opcode.\r
+/**\r
+  Create EFI_IFR_TEXT_OP opcode.\r
 \r
-Arguments:\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  Flags           - Subtitle opcode flags\r
-  Scope           - Subtitle Scope bit\r
-  Data            - Destination for the created opcode binary\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
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\r
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
 \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 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
-\r
-Routine Description:\r
-  Create EFI_IFR_TEXT_OP opcode.\r
+;\r
 \r
-Arguments:\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  TextTwo         - String ID for text two\r
-  Data            - Destination for the created opcode binary\r
+/**\r
+  Create EFI_IFR_REF_OP opcode.\r
 \r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\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
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\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
@@ -224,26 +230,22 @@ CreateGotoOpCode (
   IN      EFI_QUESTION_ID     QuestionId,\r
   IN OUT  EFI_HII_UPDATE_DATA *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_REF_OP opcode.\r
+;\r
 \r
-Arguments:\r
-  FormId          - Destination Form ID\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  QuestionId      - Question ID\r
-  Data            - Destination for the created opcode binary\r
+/**\r
+  Create EFI_IFR_ONE_OF_OPTION_OP opcode.\r
 \r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
+  @param  QuestionId             Question ID\r
+  @param  OptionList             The list of Options.\r
+  @param  Type                   The data type.\r
+  @param  Data                   Destination for the created opcode binary\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\r
+  @retval EFI_BUFFER_TOO_SMALL The space reserved in Data field is too small.\r
 \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 CreateOneOfOptionOpCode (\r
   IN     UINTN                OptionCount,\r
   IN     IFR_OPTION           *OptionsList,\r
@@ -252,7 +254,27 @@ CreateOneOfOptionOpCode (
   )\r
 ;\r
 \r
+/**\r
+  Create EFI_IFR_ONE_OF_OP opcode.\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 create success\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
@@ -265,30 +287,31 @@ CreateOneOfOpCode (
   IN     UINTN                OptionCount,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_ONE_OF_OP opcode.\r
-\r
-Arguments:\r
-  QuestionId      - Question ID\r
-  VarStoreId      - Storage ID\r
-  VarOffset       - Offset in Storage\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  OneOfFlags      - Flags for oneof opcode\r
-  OptionsList     - List of options\r
-  OptionCount     - Number of options in option list\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
 ;\r
 \r
+/**\r
+  Create EFI_IFR_ORDERED_LIST_OP opcode.\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  Flags                  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 create success\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
@@ -303,32 +326,27 @@ CreateOrderedListOpCode (
   IN     UINTN                OptionCount,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
+;\r
 \r
-Routine Description:\r
-  Create EFI_IFR_ORDERED_LIST_OP opcode.\r
+/**\r
+  Create EFI_IFR_CHECKBOX_OP opcode.\r
 \r
-Arguments:\r
-  QuestionId      - Question ID\r
-  VarStoreId      - Storage ID\r
-  VarOffset       - Offset in Storage\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  Flags           - Flags for ordered list opcode\r
-  DataType        - Type for option value\r
-  MaxContainers   - Maximum count for options in this ordered list\r
-  OptionsList     - List of options\r
-  OptionCount     - Number of options in option list\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\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
---*/\r
-;\r
+  @retval EFI_SUCCESS            Opcode create success\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
@@ -339,28 +357,31 @@ CreateCheckBoxOpCode (
   IN      UINT8               CheckBoxFlags,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_CHECKBOX_OP opcode.\r
-\r
-Arguments:\r
-  QuestionId      - Question ID\r
-  VarStoreId      - Storage ID\r
-  VarOffset       - Offset in Storage\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  CheckBoxFlags   - Flags for checkbox opcode\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
 ;\r
 \r
+/**\r
+  Create EFI_IFR_NUMERIC_OP opcode.\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 create success\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
@@ -375,32 +396,29 @@ CreateNumericOpCode (
   IN     UINT64              Default,\r
   IN OUT EFI_HII_UPDATE_DATA *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_NUMERIC_OP opcode.\r
-\r
-Arguments:\r
-  QuestionId      - Question ID\r
-  VarStoreId      - Storage ID\r
-  VarOffset       - Offset in Storage\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  NumericFlags    - Flags for numeric opcode\r
-  Minimum         - Numeric minimum value\r
-  Maximum         - Numeric maximum value\r
-  Step            - Numeric step for edit\r
-  Default         - Numeric default value\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
 ;\r
 \r
+/**\r
+  Create EFI_IFR_STRING_OP opcode.\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 create success\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
@@ -413,188 +431,71 @@ CreateStringOpCode (
   IN      UINT8               MaxSize,\r
   IN OUT EFI_HII_UPDATE_DATA  *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Create EFI_IFR_STRING_OP opcode.\r
-\r
-Arguments:\r
-  QuestionId      - Question ID\r
-  VarStoreId      - Storage ID\r
-  VarOffset       - Offset in Storage\r
-  Prompt          - String ID for Prompt\r
-  Help            - String ID for Help\r
-  QuestionFlags   - Flags in Question Header\r
-  StringFlags     - Flags for string opcode\r
-  MinSize         - String minimum length\r
-  MaxSize         - String maximum length\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
 ;\r
 \r
-EFI_STATUS\r
-CreateBannerOpCode (\r
-  IN      EFI_STRING_ID       Title,\r
-  IN      UINT16              LineNumber,\r
-  IN      UINT8               Alignment,\r
-  IN OUT  EFI_HII_UPDATE_DATA *Data\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Create GUIDed opcode for banner.\r
-\r
-Arguments:\r
-  Title           - String ID for title\r
-  LineNumber      - Line number for this banner\r
-  Alignment       - Alignment for this banner, left, center or right\r
-  Data            - Destination for the created opcode binary\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Opcode create success\r
-\r
---*/\r
-;\r
-\r
-EFI_HII_PACKAGE_LIST_HEADER *\r
-PreparePackageList (\r
-  IN UINTN                    NumberOfPackages,\r
-  IN EFI_GUID                 *GuidId,\r
-  ...\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
-\r
-Arguments:\r
-  NumberOfPackages  -  Number of packages.\r
-  GuidId            -  Package GUID.\r
-\r
-Returns:\r
-  Pointer of EFI_HII_PACKAGE_LIST_HEADER.\r
-\r
---*/\r
-;\r
-\r
-EFI_HII_HANDLE\r
-DevicePathToHiiHandle (\r
-  IN EFI_HII_DATABASE_PROTOCOL  *HiiDatabase,\r
-  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Find HII Handle associated with given Device Path.\r
-\r
-Arguments:\r
-  HiiDatabase - Point to EFI_HII_DATABASE_PROTOCOL instance.\r
-  DevicePath  - Device Path associated with the HII package list handle.\r
-\r
-Returns:\r
-  Handle - HII package list Handle associated with the Device Path.\r
-  NULL   - Hii Package list handle is not found.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-ExtractDefault(\r
-  IN VOID                         *Buffer,\r
-  IN UINTN                        *BufferSize,\r
-  UINTN                           Number,\r
-  ...\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Configure the buffer accrording to ConfigBody strings.\r
-\r
-  Arguments:\r
-    DefaultId             - the ID of default.\r
-    Buffer                - the start address of buffer.\r
-    BufferSize            - the size of buffer.\r
-    Number                - the number of the strings.\r
-\r
-  Returns:\r
-    EFI_BUFFER_TOO_SMALL  - the BufferSize is too small to operate.\r
-    EFI_INVALID_PARAMETER - Buffer is NULL or BufferSize is 0.\r
-    EFI_SUCCESS           - Operation successful.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-ExtractGuidFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle,\r
-  OUT     EFI_GUID            *Guid\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Extract Hii package list GUID for given HII handle.\r
-\r
-Arguments:\r
-  HiiHandle     - Hii handle\r
-  Guid          - Package list GUID\r
+/**\r
+  Converts binary buffer to Unicode string in reversed byte order to BufToHexString().\r
 \r
-Returns:\r
-  EFI_SUCCESS   - Successfully extract GUID from Hii database.\r
+  @param  Str                    String for output\r
+  @param  Buffer                 Binary buffer.\r
+  @param  BufferSize             Size of the buffer in bytes.\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS            The function completed successfully.\r
 \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 BufferToHexString (\r
   IN OUT CHAR16    *Str,\r
   IN UINT8         *Buffer,\r
   IN UINTN         BufferSize\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Converts binary buffer to Unicode string in reversed byte order to BufToHexString().\r
+;\r
 \r
-Arguments:\r
-  Str        -  String for output\r
-  Buffer     -  Binary buffer.\r
-  BufferSize -  Size of the buffer in bytes.\r
+/**\r
+  Converts Hex String to binary buffer in reversed byte order to HexStringToBuf().\r
 \r
-Returns:\r
-  EFI_SUCCESS    -  The function completed successfully.\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
---*/\r
-;\r
+  @retval EFI_SUCCESS            The function completed successfully.\r
 \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 HexStringToBuffer (\r
   IN OUT UINT8         *Buffer,\r
   IN OUT UINTN         *BufferSize,\r
   IN CHAR16            *Str\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Converts Hex String to binary buffer in reversed byte order to HexStringToBuf().\r
-\r
-Arguments:\r
-    Buffer     - Pointer to buffer that receives the data.\r
-    BufferSize - Length in bytes of the buffer to hold converted data.\r
-                 If routine return with EFI_SUCCESS, containing length of converted data.\r
-                 If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
-    Str        - String to be converted from.\r
-\r
-Returns:\r
-  EFI_SUCCESS    -  The function completed successfully.\r
-\r
---*/\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            Routine success.\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
@@ -602,104 +503,77 @@ ConstructConfigHdr (
   IN CHAR16                    *Name, OPTIONAL\r
   IN EFI_HANDLE                *DriverHandle\r
   )\r
-/*++\r
 \r
-Routine Description:\r
-  Construct <ConfigHdr> using routing information GUID/NAME/PATH.\r
+;\r
 \r
-Arguments:\r
-  ConfigHdr    - Pointer to the ConfigHdr string.\r
-  StrBufferLen - On input: Length in bytes of buffer to hold the ConfigHdr string. Includes tailing '\0' character.\r
-                 On output:\r
-                    If return EFI_SUCCESS, containing length of ConfigHdr string buffer.\r
-                    If return EFI_BUFFER_TOO_SMALL, containg length of string buffer desired.\r
-  Guid         - Routing information: GUID.\r
-  Name         - Routing information: NAME.\r
-  DriverHandle  - Driver handle which contains the routing information: PATH.\r
+/**\r
+  Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.\r
 \r
-Returns:\r
-  EFI_SUCCESS          - Routine success.\r
-  EFI_BUFFER_TOO_SMALL - The ConfigHdr string buffer is too small.\r
+  @param  String                 The string to be searched in.\r
+  @param  Offset                 Offset in BlockName.\r
+  @param  Width                  Width in BlockName.\r
 \r
---*/\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
   UINTN                        Offset,\r
   UINTN                        Width\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.\r
+;\r
 \r
-Arguments:\r
-  String       - The string to be searched in.\r
-  Offset       - Offset in BlockName.\r
-  Width        - Width in BlockName.\r
+/**\r
+  This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.\r
 \r
-Returns:\r
-  TRUE         - Block name found.\r
-  FALSE        - Block name not found.\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
---*/\r
-;\r
+  @retval EFI_SUCCESS            Routine success.\r
+  @retval EFI_BUFFER_TOO_SMALL   The intput buffer is too small.\r
 \r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 GetBrowserData (\r
   EFI_GUID                   *VariableGuid, OPTIONAL\r
   CHAR16                     *VariableName, OPTIONAL\r
   UINTN                      *BufferSize,\r
   UINT8                      *Buffer\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.\r
-\r
-Arguments:\r
-  VariableGuid  - An optional field to indicate the target variable GUID name to use.\r
-  VariableName  - An optional field to indicate the target human-readable variable name.\r
-  BufferSize    - On input: Length in bytes of buffer to hold retrived data.\r
-                  On output:\r
-                    If return EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
-  Buffer        - Buffer to hold retrived data.\r
-\r
-Returns:\r
-  EFI_SUCCESS          - Routine success.\r
-  EFI_BUFFER_TOO_SMALL - The intput buffer is too small.\r
-\r
---*/\r
 ;\r
 \r
-EFI_STATUS\r
-GetHiiHandles (\r
-  IN OUT UINTN                     *HandleBufferLength,\r
-  OUT    EFI_HII_HANDLE            **HiiHandleBuffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Determines the handles that are currently active in the database.\r
-  It's the caller's responsibility to free handle buffer.\r
-\r
-Arguments:\r
-  HiiDatabase           - A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
-  HandleBufferLength    - On input, a pointer to the length of the handle buffer. On output,\r
-                          the length of the handle buffer that is required for the handles found.\r
-  HiiHandleBuffer       - Pointer to an array of Hii Handles returned.\r
-\r
-Returns:\r
-  EFI_SUCCESS           - Get an array of Hii Handles successfully.\r
-  EFI_INVALID_PARAMETER - Hii is NULL.\r
-  EFI_NOT_FOUND         - Database not found.\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            Routine success.\r
+  @retval Other                  Updating Browser uncommitted data failed.\r
+\r
+**/\r
 EFI_STATUS\r
+EFIAPI\r
 SetBrowserData (\r
   EFI_GUID                   *VariableGuid, OPTIONAL\r
   CHAR16                     *VariableName, OPTIONAL\r
@@ -707,325 +581,31 @@ SetBrowserData (
   UINT8                      *Buffer,\r
   CHAR16                     *RequestElement  OPTIONAL\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser.\r
-\r
-Arguments:\r
-  VariableGuid   - An optional field to indicate the target variable GUID name to use.\r
-  VariableName   - An optional field to indicate the target human-readable variable name.\r
-  BufferSize     - Length in bytes of buffer to hold retrived data.\r
-  Buffer         - Buffer to hold retrived data.\r
-  RequestElement - An optional field to specify which part of the buffer data\r
-                   will be send back to Browser. If NULL, the whole buffer of\r
-                   data will be committed to Browser.\r
-                   <RequestElement> ::= &OFFSET=<Number>&WIDTH=<Number>*\r
-\r
-Returns:\r
-  EFI_SUCCESS  - Routine success.\r
-  Other        - Updating Browser uncommitted data failed.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-ConvertRfc3066LanguageToIso639Language (\r
-  CHAR8   *LanguageRfc3066,\r
-  CHAR8   *LanguageIso639\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Convert language code from RFC3066 to ISO639-2.\r
-\r
-Arguments:\r
-  LanguageRfc3066 - RFC3066 language code.\r
-  LanguageIso639  - ISO639-2 language code.\r
-\r
-Returns:\r
-  EFI_SUCCESS   - Language code converted.\r
-  EFI_NOT_FOUND - Language code not found.\r
-\r
---*/\r
-;\r
-\r
-CHAR8 *\r
-Rfc3066ToIso639 (\r
-  CHAR8  *SupportedLanguages\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will\r
-  be converted to "engfra".\r
-\r
-Arguments:\r
-  SupportedLanguages - The RFC3066 language list.\r
-\r
-Returns:\r
-  The ISO639-2 language list.\r
-\r
---*/\r
 ;\r
 \r
-EFI_STATUS\r
-GetCurrentLanguage (\r
-  OUT     CHAR8               *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Determine what is the current language setting\r
-\r
-Arguments:\r
-  Lang      - Pointer of system language\r
-\r
-Returns:\r
-  Status code\r
-\r
---*/\r
-;\r
-\r
-VOID\r
-GetNextLanguage (\r
-  IN OUT CHAR8      **LangCode,\r
-  OUT CHAR8         *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Get next language from language code list.\r
-\r
-Arguments:\r
-  LangCode - The language code.\r
-  Lang     - Returned language.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-;\r
-\r
-CHAR8 *\r
-GetSupportedLanguages (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the list of supported languages, in the format specified\r
-  in UEFI specification Appendix¬†M.\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The supported languages.\r
-\r
---*/\r
-;\r
-\r
-UINT16\r
-GetSupportedLanguageNumber (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the number of supported languages\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The  number of supported languages.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-GetStringFromHandle (\r
-  IN  EFI_HII_HANDLE                  HiiHandle,\r
-  IN  EFI_STRING_ID                   StringId,\r
-  OUT EFI_STRING                      *String\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Get string specified by StringId form the HiiHandle.\r
-\r
-Arguments:\r
-  HiiHandle     - The HII handle of package list.\r
-  StringId      - The String ID.\r
-  String        - The output string.\r
-\r
-Returns:\r
-  EFI_NOT_FOUND         - String is not found.\r
-  EFI_SUCCESS           - Operation is successful.\r
-  EFI_OUT_OF_RESOURCES  - There is not enought memory in the system.\r
-  EFI_INVALID_PARAMETER - The String is NULL.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-GetStringFromToken (\r
-  IN  EFI_GUID                        *ProducerGuid,\r
-  IN  EFI_STRING_ID                   StringId,\r
-  OUT EFI_STRING                      *String\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Get the string given the StringId and String package Producer's Guid.\r
-\r
-Arguments:\r
-  ProducerGuid  - The Guid of String package list.\r
-  StringId      - The String ID.\r
-  String        - The output string.\r
-\r
-Returns:\r
-  EFI_NOT_FOUND         - String is not found.\r
-  EFI_SUCCESS           - Operation is successful.\r
-  EFI_OUT_OF_RESOURCES  - There is not enought memory in the system.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-IfrLibNewString (\r
-  IN  EFI_HII_HANDLE                  PackageList,\r
-  OUT EFI_STRING_ID                   *StringId,\r
-  IN  CONST EFI_STRING                String\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    This function adds the string into String Package of each language.\r
-\r
-  Arguments:\r
-    PackageList       - Handle of the package list where this string will be added.\r
-    StringId          - On return, contains the new strings id, which is unique within PackageList.\r
-    String            - Points to the new null-terminated string.\r
-\r
-  Returns:\r
-    EFI_SUCCESS            - The new string was added successfully.\r
-    EFI_NOT_FOUND          - The specified PackageList could not be found in database.\r
-    EFI_OUT_OF_RESOURCES   - Could not add the string due to lack of resources.\r
-    EFI_INVALID_PARAMETER  - String is NULL or StringId is NULL is NULL.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-IfrLibGetString (\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
-\r
-  Routine Description:\r
-    This function try to retrieve string from String package of current language.\r
-    If fail, it try to retrieve string from String package of first language it support.\r
-\r
-  Arguments:\r
-    PackageList       - The package list in the HII database to search for the specified string.\r
-    StringId          - The string's id, which is unique within PackageList.\r
-    String            - Points to the new null-terminated string.\r
-    StringSize        - On entry, points to the size of the buffer pointed to by String, in bytes. On return,\r
-                        points to the length of the string, in bytes.\r
-\r
-  Returns:\r
-    EFI_SUCCESS            - The string was returned successfully.\r
-    EFI_NOT_FOUND          - The string specified by StringId is not available.\r
-    EFI_BUFFER_TOO_SMALL   - The buffer specified by StringLength is too small to hold the string.\r
-    EFI_INVALID_PARAMETER  - The String or StringSize was NULL.\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-IfrLibSetString (\r
-  IN EFI_HII_HANDLE                   PackageList,\r
-  IN EFI_STRING_ID                    StringId,\r
-  IN CONST EFI_STRING                 String\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    This function updates the string in String package of current language.\r
+/**\r
+  Draw a dialog and return the selected key.\r
 \r
-  Arguments:\r
-    PackageList       - The package list containing the strings.\r
-    StringId          - The string's id, which is unique within PackageList.\r
-    String            - Points to the new null-terminated string.\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) text\r
+                                 strings which will be used to construct the dialog\r
+                                 box\r
 \r
-  Returns:\r
-    EFI_SUCCESS            - The string was updated successfully.\r
-    EFI_NOT_FOUND          - The string specified by StringId is not in the database.\r
-    EFI_INVALID_PARAMETER  - The String was NULL.\r
-    EFI_OUT_OF_RESOURCES   - The system is out of resources to accomplish the task.\r
+  @retval EFI_SUCCESS            Displayed dialog and received user interaction\r
+  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid.\r
 \r
---*/\r
-;\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
-\r
-Routine Description:\r
-  Draw a dialog and return the selected key.\r
-\r
-Arguments:\r
-  NumberOfLines     - The number of lines for the dialog box\r
-  KeyValue          - The EFI_KEY value returned if HotKey is TRUE..\r
-  String            - Pointer to the first string in the list\r
-  ...               - A series of (quantity == NumberOfLines) text strings which\r
-                      will be used to construct the dialog box\r
-\r
-Returns:\r
-  EFI_SUCCESS           - Displayed dialog and received user interaction\r
-  EFI_INVALID_PARAMETER - One of the parameters was invalid.\r
-\r
---*/\r
 ;\r
 \r
-EFI_STATUS\r
-IfrLibUpdateForm (\r
-  IN EFI_HII_HANDLE            Handle,\r
-  IN EFI_GUID                  *FormSetGuid, OPTIONAL\r
-  IN EFI_FORM_ID               FormId,\r
-  IN UINT16                    Label,\r
-  IN BOOLEAN                   Insert,\r
-  IN EFI_HII_UPDATE_DATA       *Data\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function allows the caller to update a form that has\r
-  previously been registered with the EFI HII database.\r
-\r
-Arguments:\r
-  Handle       - Hii Handle\r
-  FormSetGuid  - The formset should be updated.\r
-  FormId       - The form should be updated.\r
-  Label        - Update information starting immediately after this label in the IFR\r
-  Insert       - If TRUE and Data is not NULL, insert data after Label.\r
-                 If FALSE, replace opcodes between two labels with Data.\r
-  Data         - The adding data; If NULL, remove opcodes between two Label.\r
-\r
-Returns:\r
-  EFI_SUCCESS  - Update success.\r
-  Other        - Update fail.\r
-\r
---*/\r
-;\r
 #endif\r
index d13421d..dd7247f 100644 (file)
@@ -1488,4 +1488,14 @@ typedef struct {
 \r
 \r
 \r
+//\r
+// References to string tokens must use this macro to enable scanning for\r
+// token usages.\r
+//\r
+//\r
+// STRING_TOKEN is not defined in UEFI specification. But it is placed \r
+// here for the easy access by C files and VFR source files.\r
+//\r
+#define STRING_TOKEN(t) t\r
+\r
 #endif\r
diff --git a/edk2/MdePkg/Library/HiiLib/HiiLanguage.c b/edk2/MdePkg/Library/HiiLib/HiiLanguage.c
new file mode 100644 (file)
index 0000000..9ef3a3e
--- /dev/null
@@ -0,0 +1,136 @@
+/** @file\r
+  Language related HII Library implementation.\r
+\r
+  Copyright (c) 2006, 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
+EFI_STATUS\r
+EFIAPI\r
+HiiLibGetCurrentLanguage (\r
+  OUT     CHAR8               *Lang\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       Size;\r
+\r
+  ASSERT (Lang != NULL);\r
+\r
+  //\r
+  // Get current language setting\r
+  //\r
+  Size = RFC_3066_ENTRY_SIZE;\r
+  Status = gRT->GetVariable (\r
+                  L"PlatformLang",\r
+                  &gEfiGlobalVariableGuid,\r
+                  NULL,\r
+                  &Size,\r
+                  Lang\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));\r
+  }\r
+\r
+  return Status;\r
+}\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 (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
+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 (HiiHandle != NULL);\r
+  ASSERT (IsHiiHandleRegistered (HiiHandle));\r
+  //\r
+  // Collect current supported Languages for given HII handle\r
+  //\r
+  BufferSize = 0x1000;\r
+  LanguageString = AllocatePool (BufferSize);\r
+  Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    gBS->FreePool (LanguageString);\r
+    LanguageString = AllocatePool (BufferSize);\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
+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
+  gBS->FreePool (Languages);\r
+\r
+  return LangNumber;\r
+}\r
index ef86f5d..e2153f3 100644 (file)
 \r
 **/\r
 \r
-\r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/DevicePath.h>\r
-\r
-#include <Guid/GlobalVariable.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/UefiRuntimeServicesTableLib.h>\r
-#include <Library/PcdLib.h>\r
-\r
-#include <MdeModuleHii.h>\r
-\r
 #include "InternalHiiLib.h"\r
 \r
-\r
 EFI_HII_DATABASE_PROTOCOL   *mHiiDatabaseProt;\r
 EFI_HII_STRING_PROTOCOL     *mHiiStringProt;\r
 \r
-//\r
-// Hii vendor device path template\r
-//\r
-HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePathTemplate = {\r
-  {\r
-    {\r
-      {\r
-        HARDWARE_DEVICE_PATH,\r
-        HW_VENDOR_DP,\r
-        {\r
-          (UINT8) (sizeof (HII_VENDOR_DEVICE_PATH_NODE)),\r
-          (UINT8) ((sizeof (HII_VENDOR_DEVICE_PATH_NODE)) >> 8)\r
-        }\r
-      },\r
-      EFI_IFR_TIANO_GUID\r
-    },\r
-    0\r
-  },\r
-  {\r
-    END_DEVICE_PATH_TYPE,\r
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
-      END_DEVICE_PATH_LENGTH\r
-    }\r
-  }\r
-};\r
+/**\r
+  The constructor function of Hii Library.\r
+  \r
+  The constructor function caches the value of default HII protocol instances.\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
 UefiHiiLibConstructor (\r
@@ -93,166 +56,6 @@ UefiHiiLibConstructor (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HiiLibGetCurrentLanguage (\r
-  OUT     CHAR8               *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Determine what is the current language setting\r
-\r
-Arguments:\r
-  Lang      - Pointer of system language\r
-\r
-Returns:\r
-  Status code\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       Size;\r
-\r
-  //\r
-  // Get current language setting\r
-  //\r
-  Size = RFC_3066_ENTRY_SIZE;\r
-  Status = gRT->GetVariable (\r
-                  L"PlatformLang",\r
-                  &gEfiGlobalVariableGuid,\r
-                  NULL,\r
-                  &Size,\r
-                  Lang\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-VOID\r
-HiiLibGetNextLanguage (\r
-  IN OUT CHAR8      **LangCode,\r
-  OUT CHAR8         *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Get next language from language code list (with separator ';').\r
-\r
-Arguments:\r
-  LangCode - On input: point to first language in the list. On output: point to\r
-             next language in the list, or NULL if no more language in the list.\r
-  Lang     - The first language in the list.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  UINTN  Index;\r
-  CHAR8  *StringPtr;\r
-\r
-  if (LangCode == NULL || *LangCode == NULL) {\r
-    *Lang = 0;\r
-    return;\r
-  }\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
-CHAR8 *\r
-HiiLibGetSupportedLanguages (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the list of supported languages, in the format specified\r
-  in UEFI specification Appendix M.\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The supported languages.\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       BufferSize;\r
-  CHAR8       *LanguageString;\r
-\r
-  //\r
-  // Collect current supported Languages for given HII handle\r
-  //\r
-  BufferSize = 0x1000;\r
-  LanguageString = AllocatePool (BufferSize);\r
-  Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    gBS->FreePool (LanguageString);\r
-    LanguageString = AllocatePool (BufferSize);\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
-UINT16\r
-HiiLibGetSupportedLanguageNumber (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the number of supported languages\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The  number of supported languages.\r
-\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
-  gBS->FreePool (Languages);\r
-\r
-  return LangNumber;\r
-}\r
 \r
 \r
 EFI_HII_PACKAGE_LIST_HEADER *\r
@@ -318,23 +121,12 @@ HiiLibPreparePackageList (
   IN CONST EFI_GUID           *GuidId,\r
   ...\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
-\r
-Arguments:\r
-  NumberOfPackages  -  Number of packages.\r
-  GuidId            -  Package GUID.\r
-\r
-Returns:\r
-  Pointer of EFI_HII_PACKAGE_LIST_HEADER.\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
@@ -343,28 +135,9 @@ Returns:
 }\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
-  @param  NumberOfPackages  The number of HII packages to register.\r
-  @param  GuidId                    Package List GUID ID.\r
-  @param  HiiHandle                The ID used to retrieve the Package List later.\r
-  @param  ...                          The variable argument list describing all HII Package.\r
-\r
-  @return\r
-  The allocated and initialized packages.\r
-\r
-**/\r
-\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibAddPackagesToHiiDatabase (\r
+HiiLibAddPackages (\r
   IN       UINTN               NumberOfPackages,\r
   IN CONST EFI_GUID            *GuidId,\r
   IN       EFI_HANDLE          DriverHandle, OPTIONAL\r
@@ -376,6 +149,7 @@ HiiLibAddPackagesToHiiDatabase (
   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
@@ -410,7 +184,7 @@ HiiLibAddFontPackageToHiiDatabase (
   UINT8                                *Package;\r
 \r
   //\r
-  // Add 4 bytes to the header for entire length for PreparePackageList use only.\r
+  // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.\r
   // Looks ugly. Might be updated when font tool is ready.\r
   //\r
   PackageLength   = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + FontSize + 4;\r
@@ -439,361 +213,238 @@ HiiLibAddFontPackageToHiiDatabase (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-HiiLibRemovePackagesFromHiiDatabase (\r
+HiiLibRemovePackages (\r
   IN      EFI_HII_HANDLE      HiiHandle\r
   )\r
 {\r
-  return mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
+  EFI_STATUS Status;\r
+\r
+  ASSERT (HiiHandle != NULL);\r
+  Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
+  ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
+\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibCreateString (\r
-  IN  EFI_HII_HANDLE                  PackageList,\r
-  OUT EFI_STRING_ID                   *StringId,\r
-  IN  CONST EFI_STRING                String\r
+HiiLibGetHiiHandles (\r
+  IN OUT UINTN                     *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE            **HiiHandleBuffer\r
   )\r
 {\r
+  UINTN       BufferLength;\r
   EFI_STATUS  Status;\r
-  CHAR8       *Languages;\r
-  CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
-\r
-  Status = EFI_SUCCESS;\r
 \r
-  Languages = HiiLibGetSupportedLanguages (PackageList);\r
+  ASSERT (HandleBufferLength != NULL);\r
+  ASSERT (HiiHandleBuffer != NULL);\r
 \r
-  LangStrings = Languages;\r
-  while (*LangStrings != 0) {\r
-    HiiLibGetNextLanguage (&LangStrings, Lang);\r
+  BufferLength = 0;\r
 \r
-    Status = mHiiStringProt->NewString (\r
-                                 mHiiStringProt,\r
-                                 PackageList,\r
-                                 StringId,\r
-                                 Lang,\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
-                                 String,\r
-                                 NULL\r
+                                 &BufferLength,\r
+                                 *HiiHandleBuffer\r
                                  );\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  FreePool (Languages);\r
-\r
-  return Status;\r
-  \r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibUpdateString (\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
-  Status = EFI_SUCCESS;\r
-\r
-  Languages = HiiLibGetSupportedLanguages (PackageList);\r
-\r
-  LangStrings = Languages;\r
-  while (*LangStrings != 0) {\r
-    HiiLibGetNextLanguage (&LangStrings, Lang);\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
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+      *HiiHandleBuffer = AllocateZeroPool (BufferLength);\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
-  FreePool (Languages);\r
+  *HandleBufferLength = BufferLength;\r
 \r
   return Status;\r
 }\r
 \r
-//                                                                                      //\r
-// //////////////////////////////////////////////////\r
-//                                                                                    //\r
-\r
-//\r
-// This function is Implementation Specifc. HII_VENDOR_DEVICE_PATH\r
-// This should be moved to MdeModulepkg.\r
-//\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibCreateHiiDriverHandle (\r
-  OUT EFI_HANDLE               *DriverHandle\r
+HiiLibExtractGuidFromHiiHandle (\r
+  IN      EFI_HII_HANDLE      Handle,\r
+  OUT     EFI_GUID            *Guid\r
   )\r
 {\r
   EFI_STATUS                   Status;\r
-  HII_VENDOR_DEVICE_PATH_NODE  *VendorDevicePath;\r
-  UINT64                       MonotonicCount;\r
+  UINTN                        BufferSize;\r
+  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
 \r
-  VendorDevicePath = AllocateCopyPool (sizeof (HII_VENDOR_DEVICE_PATH), &mHiiVendorDevicePathTemplate);\r
-  if (VendorDevicePath == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+  ASSERT (Guid != NULL);\r
 \r
-  gBS->GetNextMonotonicCount (&MonotonicCount);\r
-  VendorDevicePath->MonotonicCount = (UINT32) MonotonicCount;\r
+  //\r
+  // Get HII PackageList\r
+  //\r
+  BufferSize = 0;\r
+  HiiPackageList = NULL;\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
-  *DriverHandle = NULL;\r
-  Status = gBS->InstallProtocolInterface (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  VendorDevicePath\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
   }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibDestroyHiiDriverHandle (\r
-  IN EFI_HANDLE               DriverHandle\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  EFI_DEVICE_PATH_PROTOCOL     *DevicePath;\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &DevicePath\r
-                  );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  DevicePath\r
-                  );\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-HiiLibExtractDefault(\r
-  IN VOID                         *Buffer,\r
-  IN UINTN                        *BufferSize,\r
-  UINTN                           Number,\r
-  ...\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Configure the buffer accrording to ConfigBody strings.\r
-\r
-  Arguments:\r
-    DefaultId             - the ID of default.\r
-    Buffer                - the start address of buffer.\r
-    BufferSize            - the size of buffer.\r
-    Number                - the number of the strings.\r
-\r
-  Returns:\r
-    EFI_BUFFER_TOO_SMALL  - the BufferSize is too small to operate.\r
-    EFI_INVALID_PARAMETER - Buffer is NULL or BufferSize is 0.\r
-    EFI_SUCCESS           - Operation successful.\r
-\r
---*/\r
-{\r
-  VA_LIST                         Args;\r
-  UINTN                           Index;\r
-  UINT32                          TotalLen;\r
-  UINT8                           *BufCfgArray;\r
-  UINT8                           *BufferPos;\r
-  UINT16                          Offset;\r
-  UINT16                          Width;\r
-  UINT8                           *Value;\r
-\r
-  if ((Buffer == NULL) || (BufferSize == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Offset = 0;\r
-  Width  = 0;\r
-  Value  = NULL;\r
-\r
-  VA_START (Args, Number);\r
-  for (Index = 0; Index < Number; Index++) {\r
-    BufCfgArray = (UINT8 *) VA_ARG (Args, VOID *);\r
-    CopyMem (&TotalLen, BufCfgArray, sizeof (UINT32));\r
-    BufferPos = BufCfgArray + sizeof (UINT32);\r
-\r
-    while ((UINT32)(BufferPos - BufCfgArray) < TotalLen) {\r
-      CopyMem (&Offset, BufferPos, sizeof (UINT16));\r
-      BufferPos += sizeof (UINT16);\r
-      CopyMem (&Width, BufferPos, sizeof (UINT16));\r
-      BufferPos += sizeof (UINT16);\r
-      Value = BufferPos;\r
-      BufferPos += Width;\r
-\r
-      if ((UINTN)(Offset + Width) > *BufferSize) {\r
-        return EFI_BUFFER_TOO_SMALL;\r
-      }\r
-\r
-      CopyMem ((UINT8 *)Buffer + Offset, Value, Width);\r
-    }\r
-  }\r
-  VA_END (Args);\r
+  //\r
+  // Extract GUID\r
+  //\r
+  CopyMem (Guid, &HiiPackageList->PackageListGuid, sizeof (EFI_GUID));\r
 \r
-  *BufferSize = (UINTN)Offset;\r
+  gBS->FreePool (HiiPackageList);\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
-STATIC EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID;\r
-\r
-EFI_STATUS\r
-HiiLibExtractClassFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle,\r
-  OUT     UINT16              *Class,\r
-  OUT     EFI_STRING_ID       *FormSetTitle,\r
-  OUT     EFI_STRING_ID       *FormSetHelp\r
+EFI_HII_HANDLE\r
+EFIAPI\r
+HiiLibDevicePathToHiiHandle (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Extract formset class for given HII handle.\r
-\r
-Arguments:\r
-  HiiHandle       - Hii handle\r
-  Class           - Class of the formset\r
-  FormSetTitle    - Formset title string\r
-  FormSetHelp     - Formset help string\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Successfully extract Class for specified Hii handle.\r
-\r
---*/\r
 {\r
-  EFI_STATUS                   Status;\r
-  UINTN                        BufferSize;\r
-  EFI_HII_DATABASE_PROTOCOL    *HiiDatabase;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINT8                        *Package;\r
-  UINT8                        *OpCodeData;\r
-  UINT32                       Offset;\r
-  UINT32                       Offset2;\r
-  UINT32                       PackageListLength;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
+  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
-  *Class = EFI_NON_DEVICE_CLASS;\r
-  *FormSetTitle = 0;\r
-  *FormSetHelp = 0;\r
+  ASSERT (DevicePath != NULL);\r
 \r
   //\r
-  // Locate HII Database protocol\r
+  // Locate Device Path Protocol handle buffer\r
   //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiDatabaseProtocolGuid,\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiDevicePathProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &HiiDatabase\r
+                  &HandleCount,\r
+                  &Handles\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // Get HII PackageList\r
+  // Search Driver Handle by Device Path\r
   //\r
-  BufferSize = 0;\r
-  HiiPackageList = NULL;\r
-  Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocatePool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
-\r
-    Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\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
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  gBS->FreePool (Handles);\r
+\r
+  if (DriverHandle == NULL) {\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // Get Form package from this HII package List\r
+  // Retrieve all Hii Handles from HII database\r
   //\r
-  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-  Offset2 = 0;\r
-  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\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
+    gBS->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
-  while (Offset < PackageListLength) {\r
-    Package = ((UINT8 *) HiiPackageList) + Offset;\r
-    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->FreePool (HiiHandles);\r
+    return NULL;\r
+  }\r
 \r
-    if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
-      //\r
-      // Search Class Opcode in this Form Package\r
-      //\r
-      Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
-      while (Offset2 < PackageHeader.Length) {\r
-        OpCodeData = Package + Offset2;\r
-\r
-        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-          //\r
-          // Find FormSet OpCode\r
-          //\r
-          CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
-          CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
-        }\r
-\r
-        if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&\r
-             CompareGuid (&mIfrVendorGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&\r
-            (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)\r
-           ) {\r
-          //\r
-          // Find GUIDed Class OpCode\r
-          //\r
-          CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
-\r
-          //\r
-          // Till now, we ought to have found the formset Opcode\r
-          //\r
-          break;\r
-        }\r
-\r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-      }\r
-\r
-      if (Offset2 < PackageHeader.Length) {\r
-        //\r
-        // Target formset found\r
-        //\r
-        break;\r
-      }\r
+  //\r
+  // 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
-    Offset += PackageHeader.Length;\r
   }\r
 \r
-  gBS->FreePool (HiiPackageList);\r
+  gBS->FreePool (HiiHandles);\r
+  return HiiHandle;\r
+}\r
 \r
-  return EFI_SUCCESS;\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
+  Status = mHiiDatabaseProt->ExportPackageLists (\r
+             mHiiDatabaseProt,\r
+             HiiHandle,\r
+             &BufferSize,\r
+             HiiPackageList\r
+             );\r
+\r
+  return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
 }\r
 \r
index ddff1c8..30a1657 100644 (file)
 \r
 [Sources.common]\r
   HiiLib.c\r
+  HiiString.c\r
+  HiiLanguage.c\r
 \r
 \r
 [Packages]\r
   MdePkg/MdePkg.dec\r
-  #BugBug: This package dependency will be re-evaluated when the code become functional and stable.\r
-  #      : HiiLibCreateHiiDriverHandle depends on HII_VENDOR_DEVICE_PATH which is defined by this\r
-  #      : specification only. \r
-  MdeModulePkg/MdeModulePkg.dec\r
 \r
 [LibraryClasses]\r
   MemoryAllocationLib\r
   DebugLib\r
   PcdLib\r
   UefiRuntimeServicesTableLib\r
+  DevicePathLib\r
 \r
 [Protocols]\r
   gEfiHiiDatabaseProtocolGuid  # ALWAYS_CONSUMED\r
diff --git a/edk2/MdePkg/Library/HiiLib/HiiString.c b/edk2/MdePkg/Library/HiiLib/HiiString.c
new file mode 100644 (file)
index 0000000..b28a955
--- /dev/null
@@ -0,0 +1,460 @@
+/** @file\r
+  HII Library implementation that uses DXE protocols and services.\r
+\r
+  Copyright (c) 2006, 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
+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
+    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
+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
+    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
+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) == TRUE) {\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
+    gBS->FreePool (HiiHandleBuffer);\r
+  }\r
+  return Status;\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 (String != NULL);\r
+  ASSERT (StringSize != NULL);\r
+  ASSERT (IsHiiHandleRegistered (PackageList));\r
+\r
+  HiiLibGetCurrentLanguage (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
+    gBS->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
+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
+    gBS->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
+// 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
+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
+  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
+  CHAR8   *LanguageRfc3066,\r
+  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 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
index 78540a4..0303fa9 100644 (file)
 #ifndef __INTERNAL_HII_LIB_H__\r
 #define __INTERNAL_HII_LIB_H__\r
 \r
+#include <PiDxe.h>\r
 \r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiString.h>\r
+#include <Protocol/DevicePath.h>\r
+\r
+#include <Guid/GlobalVariable.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/UefiRuntimeServicesTableLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/DevicePathLib.h>\r
+\r
+#define HII_LIB_DEFAULT_STRING_SIZE     0x200\r
+\r
+\r
+extern EFI_HII_DATABASE_PROTOCOL   *mHiiDatabaseProt;\r
+extern EFI_HII_STRING_PROTOCOL     *mHiiStringProt;\r
+\r
+BOOLEAN\r
+IsHiiHandleRegistered (\r
+  EFI_HII_HANDLE    HiiHandle\r
+  )\r
+;\r
 \r
 #endif\r
diff --git a/edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.inf b/edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.inf
new file mode 100644 (file)
index 0000000..a8d5df4
--- /dev/null
@@ -0,0 +1,74 @@
+#/** @file\r
+# Component name for module UefiEfiIfrSupportLib\r
+#\r
+# FIX ME!\r
+# Copyright (c) 2007, 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                      = IfrSupportLib\r
+  FILE_GUID                      = bf38668e-e231-4baa-99e4-8c0e4c35dca6\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = IfrSupportLib\r
+  EDK_RELEASE_VERSION            = 0x00020000\r
+  EFI_SPECIFICATION_VERSION      = 0x00020000\r
+\r
+  CONSTRUCTOR                    = IfrSupportLibConstructor\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
+  UefiIfrCommon.c\r
+  UefiIfrForm.c\r
+  UefiIfrLibraryInternal.h\r
+  UefiIfrOpCodeCreation.c\r
+  R8Lib.h\r
+  R8Lib.c\r
+\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+\r
+\r
+[LibraryClasses]\r
+  MemoryAllocationLib\r
+  DevicePathLib\r
+  BaseLib\r
+  UefiBootServicesTableLib\r
+  UefiRuntimeServicesTableLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  PcdLib\r
+\r
+[Guids]\r
+  gEfiGlobalVariableGuid                        # ALWAYS_CONSUMED\r
+\r
+[Protocols]\r
+  gEfiDevicePathProtocolGuid                    # PROTOCOL ALWAYS_CONSUMED\r
+  gEfiHiiDatabaseProtocolGuid\r
+  gEfiHiiStringProtocolGuid\r
+  gEfiHiiConfigRoutingProtocolGuid\r
+  gEfiFormBrowser2ProtocolGuid   \r
+\r
+[Depex]\r
+  gEfiHiiDatabaseProtocolGuid AND gEfiHiiStringProtocolGuid\r
+\r
+[Pcd]\r
+  gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang\r
+  
\ No newline at end of file
diff --git a/edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.msa b/edk2/MdePkg/Library/IfrSupportLib/IfrSupportLib.msa
new file mode 100644 (file)
index 0000000..dc9d665
--- /dev/null
@@ -0,0 +1,74 @@
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
+  <MsaHeader>\r
+    <ModuleName>UefiEfiIfrSupportLib</ModuleName>\r
+    <ModuleType>DXE_DRIVER</ModuleType>\r
+    <GuidValue>bf38668e-e231-4baa-99e4-8c0e4c35dca6</GuidValue>\r
+    <Version>1.0</Version>\r
+    <Abstract>Component name for module UefiEfiIfrSupportLib</Abstract>\r
+    <Description>FIX ME!</Description>\r
+    <Copyright>Copyright (c) 2007, Intel Corporation. All rights reserved.</Copyright>\r
+    <License>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.</License>\r
+    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
+  </MsaHeader>\r
+  <ModuleDefinitions>\r
+    <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
+    <BinaryModule>false</BinaryModule>\r
+    <OutputFileBasename>UefiEfiIfrSupportLib</OutputFileBasename>\r
+  </ModuleDefinitions>\r
+  <LibraryClassDefinitions>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>DebugLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseMemoryLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiRuntimeServicesTableLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiBootServicesTableLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>DevicePathLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>MemoryAllocationLib</Keyword>\r
+    </LibraryClass>\r
+  </LibraryClassDefinitions>\r
+  <SourceFiles>\r
+    <Filename>R8Lib.c</Filename>\r
+    <Filename>R8Lib.h</Filename>\r
+    <Filename>UefiIfrString.c</Filename>\r
+    <Filename>UefiIfrOpCodeCreation.c</Filename>\r
+    <Filename>UefiIfrLibraryInternal.h</Filename>\r
+    <Filename>UefiIfrForm.c</Filename>\r
+    <Filename>UefiIfrCommon.c</Filename>\r
+  </SourceFiles>\r
+  <PackageDependencies>\r
+    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
+    <Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>\r
+  </PackageDependencies>\r
+  <Protocols>\r
+    <Protocol Usage="ALWAYS_CONSUMED">\r
+      <ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+  </Protocols>\r
+  <Guids>\r
+    <GuidCNames Usage="ALWAYS_CONSUMED">\r
+      <GuidCName>gEfiGlobalVariableGuid</GuidCName>\r
+    </GuidCNames>\r
+  </Guids>\r
+  <Externs>\r
+    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
+    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
+  </Externs>\r
+</ModuleSurfaceArea>
\ No newline at end of file
diff --git a/edk2/MdePkg/Library/IfrSupportLib/R8Lib.c b/edk2/MdePkg/Library/IfrSupportLib/R8Lib.c
new file mode 100644 (file)
index 0000000..634bdb6
--- /dev/null
@@ -0,0 +1,241 @@
+/**@file
+  Copyright (c) 2007, Intel Corporation
+
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "UefiIfrLibraryInternal.h"
+
+
+CHAR16
+InternalNibbleToHexChar (
+  IN UINT8      Nibble
+  )
+/*++
+
+  Routine Description:
+    Converts the low nibble of a byte  to hex unicode character.
+
+  Arguments:
+    Nibble - lower nibble of a byte.
+
+  Returns:
+    Hex unicode character.
+
+--*/
+{
+  Nibble &= 0x0F;
+  if (Nibble <= 0x9) {
+    return (CHAR16)(Nibble + L'0');
+  }
+
+  return (CHAR16)(Nibble - 0xA + L'A');
+}
+
+
+/**
+  Converts binary buffer to Unicode string.
+  At a minimum, any blob of data could be represented as a hex string.
+
+  @param  Str                    Pointer to the string.
+  @param  HexStringBufferLength  Length in bytes of buffer to hold the hex string.
+                                 Includes tailing '\0' character. If routine return
+                                 with EFI_SUCCESS, containing length of hex string
+                                 buffer. If routine return with
+                                 EFI_BUFFER_TOO_SMALL, containg length of hex
+                                 string buffer desired.
+  @param  Buf                    Buffer to be converted from.
+  @param  Len                    Length in bytes of the buffer to be converted.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The hex string buffer is too small.
+
+**/
+EFI_STATUS
+R8_BufToHexString (
+  IN OUT CHAR16                    *Str,
+  IN OUT UINTN                     *HexStringBufferLength,
+  IN     UINT8                     *Buf,
+  IN     UINTN                      Len
+  )
+{
+  //
+  // Porting Guide:
+  // This library interface is simply obsolete.
+  // Include the source code to user code.
+  //
+  UINTN       Idx;
+  UINT8       Byte;
+  UINTN       StrLen;
+
+  //
+  // Make sure string is either passed or allocate enough.
+  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
+  // Plus the Unicode termination character.
+  //
+  StrLen = Len * 2;
+  if (StrLen > ((*HexStringBufferLength) - 1)) {
+    *HexStringBufferLength = StrLen + 1;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  *HexStringBufferLength = StrLen + 1;
+  //
+  // Ends the string.
+  //
+  Str[StrLen] = L'\0';
+
+  for (Idx = 0; Idx < Len; Idx++) {
+
+    Byte = Buf[Idx];
+    Str[StrLen - 1 - Idx * 2] = InternalNibbleToHexChar (Byte);
+    Str[StrLen - 2 - Idx * 2] = InternalNibbleToHexChar ((UINT8)(Byte >> 4));
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+
+
+/**
+  Converts Unicode string to binary buffer.
+  The conversion may be partial.
+  The first character in the string that is not hex digit stops the conversion.
+  At a minimum, any blob of data could be represented as a hex string.
+
+  @param  Buf                    Pointer to buffer that receives the data.
+  @param  Len                    Length in bytes of the buffer to hold converted
+                                 data. If routine return with EFI_SUCCESS,
+                                 containing length of converted data. If routine
+                                 return with EFI_BUFFER_TOO_SMALL, containg length
+                                 of buffer desired.
+  @param  Str                    String to be converted from.
+  @param  ConvertedStrLen        Length of the Hex String consumed.
+
+  @retval EFI_SUCCESS            Routine Success.
+  @retval EFI_BUFFER_TOO_SMALL   The buffer is too small to hold converted data.
+
+**/
+EFI_STATUS
+R8_HexStringToBuf (
+  IN OUT UINT8                     *Buf,
+  IN OUT UINTN                    *Len,
+  IN     CHAR16                    *Str,
+  OUT    UINTN                     *ConvertedStrLen  OPTIONAL
+  )
+{
+  //
+  // Porting Guide:
+  // This library interface is simply obsolete.
+  // Include the source code to user code.
+  //
+
+  UINTN       HexCnt;
+  UINTN       Idx;
+  UINTN       BufferLength;
+  UINT8       Digit;
+  UINT8       Byte;
+
+  //
+  // Find out how many hex characters the string has.
+  //
+  for (Idx = 0, HexCnt = 0; R8_IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
+
+  if (HexCnt == 0) {
+    *Len = 0;
+    return EFI_SUCCESS;
+  }
+  //
+  // Two Unicode characters make up 1 buffer byte. Round up.
+  //
+  BufferLength = (HexCnt + 1) / 2;
+
+  //
+  // Test if  buffer is passed enough.
+  //
+  if (BufferLength > (*Len)) {
+    *Len = BufferLength;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  *Len = BufferLength;
+
+  for (Idx = 0; Idx < HexCnt; Idx++) {
+
+    R8_IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);
+
+    //
+    // For odd charaters, write the lower nibble for each buffer byte,
+    // and for even characters, the upper nibble.
+    //
+    if ((Idx & 1) == 0) {
+      Byte = Digit;
+    } else {
+      Byte = Buf[Idx / 2];
+      Byte &= 0x0F;
+      Byte = (UINT8) (Byte | Digit << 4);
+    }
+
+    Buf[Idx / 2] = Byte;
+  }
+
+  if (ConvertedStrLen != NULL) {
+    *ConvertedStrLen = HexCnt;
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Determines if a Unicode character is a hexadecimal digit.
+  The test is case insensitive.
+
+  @param  Digit                  Pointer to byte that receives the value of the hex
+                                 character.
+  @param  Char                   Unicode character to test.
+
+  @retval TRUE                   If the character is a hexadecimal digit.
+  @retval FALSE                  Otherwise.
+
+**/
+BOOLEAN
+R8_IsHexDigit (
+  OUT UINT8      *Digit,
+  IN  CHAR16      Char
+  )
+{
+  //
+  // Porting Guide:
+  // This library interface is simply obsolete.
+  // Include the source code to user code.
+  //
+
+  if ((Char >= L'0') && (Char <= L'9')) {
+    *Digit = (UINT8) (Char - L'0');
+    return TRUE;
+  }
+
+  if ((Char >= L'A') && (Char <= L'F')) {
+    *Digit = (UINT8) (Char - L'A' + 0x0A);
+    return TRUE;
+  }
+
+  if ((Char >= L'a') && (Char <= L'f')) {
+    *Digit = (UINT8) (Char - L'a' + 0x0A);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+
diff --git a/edk2/MdePkg/Library/IfrSupportLib/R8Lib.h b/edk2/MdePkg/Library/IfrSupportLib/R8Lib.h
new file mode 100644 (file)
index 0000000..ca9b939
--- /dev/null
@@ -0,0 +1,93 @@
+/**@file
+  Copyright (c) 2007, Intel Corporation
+
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+
+
+/**
+  Converts binary buffer to Unicode string.
+  At a minimum, any blob of data could be represented as a hex string.
+
+  @param  Str                    Pointer to the string.
+  @param  HexStringBufferLength  Length in bytes of buffer to hold the hex string.
+                                 Includes tailing '\0' character. If routine return
+                                 with EFI_SUCCESS, containing length of hex string
+                                 buffer. If routine return with
+                                 EFI_BUFFER_TOO_SMALL, containg length of hex
+                                 string buffer desired.
+  @param  Buf                    Buffer to be converted from.
+  @param  Len                    Length in bytes of the buffer to be converted.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The hex string buffer is too small.
+
+**/
+EFI_STATUS
+R8_BufToHexString (
+  IN OUT CHAR16                    *Str,
+  IN OUT UINTN                     *HexStringBufferLength,
+  IN     UINT8                     *Buf,
+  IN     UINTN                      Len
+  )
+;
+
+
+
+
+/**
+  Converts Unicode string to binary buffer.
+  The conversion may be partial.
+  The first character in the string that is not hex digit stops the conversion.
+  At a minimum, any blob of data could be represented as a hex string.
+
+  @param  Buf                    Pointer to buffer that receives the data.
+  @param  Len                    Length in bytes of the buffer to hold converted
+                                 data. If routine return with EFI_SUCCESS,
+                                 containing length of converted data. If routine
+                                 return with EFI_BUFFER_TOO_SMALL, containg length
+                                 of buffer desired.
+  @param  Str                    String to be converted from.
+  @param  ConvertedStrLen        Length of the Hex String consumed.
+
+  @retval EFI_SUCCESS            Routine Success.
+  @retval EFI_BUFFER_TOO_SMALL   The buffer is too small to hold converted data.
+
+**/
+EFI_STATUS
+R8_HexStringToBuf (
+  IN OUT UINT8                     *Buf,
+  IN OUT UINTN                    *Len,
+  IN     CHAR16                    *Str,
+  OUT    UINTN                     *ConvertedStrLen  OPTIONAL
+  )
+;
+
+/**
+  Determines if a Unicode character is a hexadecimal digit.
+  The test is case insensitive.
+
+  @param  Digit                  Pointer to byte that receives the value of the hex
+                                 character.
+  @param  Char                   Unicode character to test.
+
+  @retval TRUE                   If the character is a hexadecimal digit.
+  @retval FALSE                  Otherwise.
+
+**/
+BOOLEAN
+R8_IsHexDigit (
+  OUT UINT8      *Digit,
+  IN  CHAR16      Char
+  )
+;
+
diff --git a/edk2/MdePkg/Library/IfrSupportLib/UefiIfrCommon.c b/edk2/MdePkg/Library/IfrSupportLib/UefiIfrCommon.c
new file mode 100644 (file)
index 0000000..958400f
--- /dev/null
@@ -0,0 +1,47 @@
+/** @file
+
+Copyright (c) 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  UefiIfrCommon.c
+
+Abstract:
+
+  Common Library Routines to assist handle HII elements.
+
+
+**/
+
+#include "UefiIfrLibraryInternal.h"
+
+EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;
+EFI_HII_STRING_PROTOCOL   *gIfrLibHiiString;
+
+
+EFI_STATUS
+EFIAPI
+IfrSupportLibConstructor (
+  IN EFI_HANDLE           ImageHandle,
+  IN EFI_SYSTEM_TABLE     *SystemTable
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);
+  ASSERT_EFI_ERROR (Status);
+  
+  return EFI_SUCCESS;
+}
+
+
diff --git a/edk2/MdePkg/Library/IfrSupportLib/UefiIfrForm.c b/edk2/MdePkg/Library/IfrSupportLib/UefiIfrForm.c
new file mode 100644 (file)
index 0000000..10ca13c
--- /dev/null
@@ -0,0 +1,759 @@
+/** @file
+
+Copyright (c) 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  UefiIfrForm.c
+
+Abstract:
+
+  Common Library Routines to assist handle HII elements.
+
+
+**/
+
+#include "UefiIfrLibraryInternal.h"
+
+//
+// Fake <ConfigHdr>
+//
+UINT16 mFakeConfigHdr[] = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=0";
+
+STATIC
+EFI_STATUS
+GetPackageDataFromPackageList (
+  IN  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,
+  IN  UINT32                      PackageIndex,
+  OUT UINT32                      *BufferLen,
+  OUT EFI_HII_PACKAGE_HEADER      **Buffer
+  )
+{
+  UINT32                        Index;
+  EFI_HII_PACKAGE_HEADER        *Package;
+  UINT32                        Offset;
+  UINT32                        PackageListLength;
+  EFI_HII_PACKAGE_HEADER        PackageHeader = {0, 0};
+
+  ASSERT(HiiPackageList != NULL);
+
+  if ((BufferLen == NULL) || (Buffer == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Package = NULL;
+  Index   = 0;
+  Offset  = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
+  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
+  while (Offset < PackageListLength) {
+    Package = (EFI_HII_PACKAGE_HEADER *) (((UINT8 *) HiiPackageList) + Offset);
+    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
+    if (Index == PackageIndex) {
+      break;
+    }
+    Offset += PackageHeader.Length;
+    Index++;
+  }
+  if (Offset >= PackageListLength) {
+    //
+    // no package found in this Package List
+    //
+    return EFI_NOT_FOUND;
+  }
+
+  *BufferLen = PackageHeader.Length;
+  *Buffer    = Package;
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Draw a dialog and return the selected key.
+
+  @param  NumberOfLines          The number of lines for the dialog box
+  @param  KeyValue               The EFI_KEY value returned if HotKey is TRUE..
+  @param  String                 Pointer to the first string in the list
+  @param  ...                    A series of (quantity == NumberOfLines) text
+                                 strings which will be used to construct the dialog
+                                 box
+
+  @retval EFI_SUCCESS            Displayed dialog and received user interaction
+  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+IfrLibCreatePopUp (
+  IN  UINTN                       NumberOfLines,
+  OUT EFI_INPUT_KEY               *KeyValue,
+  IN  CHAR16                      *String,
+  ...
+  )
+{
+  UINTN                         Index;
+  UINTN                         Count;
+  UINTN                         Start;
+  UINTN                         Top;
+  CHAR16                        *StringPtr;
+  UINTN                         LeftColumn;
+  UINTN                         RightColumn;
+  UINTN                         TopRow;
+  UINTN                         BottomRow;
+  UINTN                         DimensionsWidth;
+  UINTN                         DimensionsHeight;
+  VA_LIST                       Marker;
+  EFI_INPUT_KEY                 Key;
+  UINTN                         LargestString;
+  CHAR16                        *StackString;
+  EFI_STATUS                    Status;
+  UINTN                         StringLen;
+  CHAR16                        *LineBuffer;
+  CHAR16                        **StringArray;
+  EFI_EVENT                     TimerEvent;
+  EFI_EVENT                     WaitList[2];
+  UINTN                         CurrentAttribute;
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;
+
+  if ((KeyValue == NULL) || (String == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  TopRow      = 0;
+  BottomRow   = 0;
+  LeftColumn  = 0;
+  RightColumn = 0;
+
+  ConOut = gST->ConOut;
+  ConOut->QueryMode (ConOut, ConOut->Mode->Mode, &RightColumn, &BottomRow);
+
+  DimensionsWidth  = RightColumn - LeftColumn;
+  DimensionsHeight = BottomRow - TopRow;
+
+  CurrentAttribute = ConOut->Mode->Attribute;
+
+  LineBuffer = AllocateZeroPool (DimensionsWidth * sizeof (CHAR16));
+  ASSERT (LineBuffer != NULL);
+
+  //
+  // Determine the largest string in the dialog box
+  // Notice we are starting with 1 since String is the first string
+  //
+  StringArray = AllocateZeroPool (NumberOfLines * sizeof (CHAR16 *));
+  LargestString = StrLen (String);
+  StringArray[0] = String;
+
+  VA_START (Marker, String);
+  for (Index = 1; Index < NumberOfLines; Index++) {
+    StackString = VA_ARG (Marker, CHAR16 *);
+
+    if (StackString == NULL) {
+      return EFI_INVALID_PARAMETER;
+    }
+
+    StringArray[Index] = StackString;
+    StringLen = StrLen (StackString);
+    if (StringLen > LargestString) {
+      LargestString = StringLen;
+    }
+  }
+
+  if ((LargestString + 2) > DimensionsWidth) {
+    LargestString = DimensionsWidth - 2;
+  }
+
+  //
+  // Subtract the PopUp width from total Columns, allow for one space extra on
+  // each end plus a border.
+  //
+  Start     = (DimensionsWidth - LargestString - 2) / 2 + LeftColumn + 1;
+
+  Top       = ((DimensionsHeight - NumberOfLines - 2) / 2) + TopRow - 1;
+
+  //
+  // Disable cursor
+  //
+  ConOut->EnableCursor (ConOut, FALSE);
+  ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);
+
+  StringPtr = &LineBuffer[0];
+  *StringPtr++ = BOXDRAW_DOWN_RIGHT;
+  for (Index = 0; Index < LargestString; Index++) {
+    *StringPtr++ = BOXDRAW_HORIZONTAL;
+  }
+  *StringPtr++ = BOXDRAW_DOWN_LEFT;
+  *StringPtr = L'\0';
+
+  ConOut->SetCursorPosition (ConOut, Start, Top);
+  ConOut->OutputString (ConOut, LineBuffer);
+
+  for (Index = 0; Index < NumberOfLines; Index++) {
+    StringPtr = &LineBuffer[0];
+    *StringPtr++ = BOXDRAW_VERTICAL;
+
+    for (Count = 0; Count < LargestString; Count++) {
+      StringPtr[Count] = L' ';
+    }
+
+    StringLen = StrLen (StringArray[Index]);
+    if (StringLen > LargestString) {
+      StringLen = LargestString;
+    }
+    CopyMem (
+      StringPtr + ((LargestString - StringLen) / 2),
+      StringArray[Index],
+      StringLen * sizeof (CHAR16)
+      );
+    StringPtr += LargestString;
+
+    *StringPtr++ = BOXDRAW_VERTICAL;
+    *StringPtr = L'\0';
+
+    ConOut->SetCursorPosition (ConOut, Start, Top + 1 + Index);
+    ConOut->OutputString (ConOut, LineBuffer);
+  }
+
+  StringPtr = &LineBuffer[0];
+  *StringPtr++ = BOXDRAW_UP_RIGHT;
+  for (Index = 0; Index < LargestString; Index++) {
+    *StringPtr++ = BOXDRAW_HORIZONTAL;
+  }
+  *StringPtr++ = BOXDRAW_UP_LEFT;
+  *StringPtr = L'\0';
+
+  ConOut->SetCursorPosition (ConOut, Start, Top + NumberOfLines + 1);
+  ConOut->OutputString (ConOut, LineBuffer);
+
+  do {
+    Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);
+
+    //
+    // Set a timer event of 1 second expiration
+    //
+    gBS->SetTimer (
+          TimerEvent,
+          TimerRelative,
+          10000000
+          );
+
+    //
+    // Wait for the keystroke event or the timer
+    //
+    WaitList[0] = gST->ConIn->WaitForKey;
+    WaitList[1] = TimerEvent;
+    Status      = gBS->WaitForEvent (2, WaitList, &Index);
+
+    //
+    // Check for the timer expiration
+    //
+    if (!EFI_ERROR (Status) && Index == 1) {
+      Status = EFI_TIMEOUT;
+    }
+
+    gBS->CloseEvent (TimerEvent);
+  } while (Status == EFI_TIMEOUT);
+
+  Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
+  CopyMem (KeyValue, &Key, sizeof (EFI_INPUT_KEY));
+
+  ConOut->SetAttribute (ConOut, CurrentAttribute);
+  ConOut->EnableCursor (ConOut, TRUE);
+
+  return Status;
+}
+
+
+/**
+  Swap bytes in the buffer.
+
+  @param  Buffer                 Binary buffer.
+  @param  BufferSize             Size of the buffer in bytes.
+
+  @return None.
+
+**/
+STATIC
+VOID
+SwapBuffer (
+  IN OUT UINT8     *Buffer,
+  IN UINTN         BufferSize
+  )
+{
+  UINTN  Index;
+  UINT8  Temp;
+  UINTN  SwapCount;
+
+  SwapCount = (BufferSize - 1) / 2;
+  for (Index = 0; Index < SwapCount; Index++) {
+    Temp = Buffer[Index];
+    Buffer[Index] = Buffer[BufferSize - 1 - Index];
+    Buffer[BufferSize - 1 - Index] = Temp;
+  }
+}
+
+
+/**
+  Converts binary buffer to Unicode string in reversed byte order from R8_BufToHexString().
+
+  @param  Str                    String for output
+  @param  Buffer                 Binary buffer.
+  @param  BufferSize             Size of the buffer in bytes.
+
+  @retval EFI_SUCCESS            The function completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+BufferToHexString (
+  IN OUT CHAR16    *Str,
+  IN UINT8         *Buffer,
+  IN UINTN         BufferSize
+  )
+{
+  EFI_STATUS  Status;
+  UINT8       *NewBuffer;
+  UINTN       StrBufferLen;
+
+  NewBuffer = AllocateCopyPool (BufferSize, Buffer);
+  SwapBuffer (NewBuffer, BufferSize);
+
+  StrBufferLen = (BufferSize + 1) * sizeof (CHAR16);
+  Status = R8_BufToHexString (Str, &StrBufferLen, NewBuffer, BufferSize);
+
+  gBS->FreePool (NewBuffer);
+
+  return Status;
+}
+
+
+/**
+  Converts Hex String to binary buffer in reversed byte order from R8_HexStringToBuf().
+
+  @param  Buffer                 Pointer to buffer that receives the data.
+  @param  BufferSize             Length in bytes of the buffer to hold converted
+                                 data. If routine return with EFI_SUCCESS,
+                                 containing length of converted data. If routine
+                                 return with EFI_BUFFER_TOO_SMALL, containg length
+                                 of buffer desired.
+  @param  Str                    String to be converted from.
+
+  @retval EFI_SUCCESS            The function completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+HexStringToBuffer (
+  IN OUT UINT8         *Buffer,
+  IN OUT UINTN         *BufferSize,
+  IN CHAR16            *Str
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       ConvertedStrLen;
+
+  ConvertedStrLen = 0;
+  Status = R8_HexStringToBuf (Buffer, BufferSize, Str, &ConvertedStrLen);
+  if (!EFI_ERROR (Status)) {
+    SwapBuffer (Buffer, ConvertedStrLen);
+  }
+
+  return Status;
+}
+
+
+/**
+  Construct <ConfigHdr> using routing information GUID/NAME/PATH.
+
+  @param  ConfigHdr              Pointer to the ConfigHdr string.
+  @param  StrBufferLen           On input: Length in bytes of buffer to hold the
+                                 ConfigHdr string. Includes tailing '\0' character.
+                                 On output: If return EFI_SUCCESS, containing
+                                 length of ConfigHdr string buffer. If return
+                                 EFI_BUFFER_TOO_SMALL, containg length of string
+                                 buffer desired.
+  @param  Guid                   Routing information: GUID.
+  @param  Name                   Routing information: NAME.
+  @param  DriverHandle           Driver handle which contains the routing
+                                 information: PATH.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The ConfigHdr string buffer is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+ConstructConfigHdr (
+  IN OUT CHAR16                *ConfigHdr,
+  IN OUT UINTN                 *StrBufferLen,
+  IN EFI_GUID                  *Guid,
+  IN CHAR16                    *Name, OPTIONAL
+  IN EFI_HANDLE                *DriverHandle
+  )
+{
+  EFI_STATUS                Status;
+  UINTN                     NameStrLen;
+  UINTN                     DevicePathSize;
+  UINTN                     BufferSize;
+  CHAR16                    *StrPtr;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+
+  if (Name == NULL) {
+    //
+    // There will be no "NAME" in <ConfigHdr> for  Name/Value storage
+    //
+    NameStrLen = 0;
+  } else {
+    //
+    // For buffer storage
+    //
+    NameStrLen = StrLen (Name);
+  }
+
+  //
+  // Retrieve DevicePath Protocol associated with this HiiPackageList
+  //
+  Status = gBS->HandleProtocol (
+                  DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  (VOID **) &DevicePath
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  DevicePathSize = GetDevicePathSize (DevicePath);
+
+  //
+  // GUID=<HexCh>32&NAME=<Alpha>NameStrLen&PATH=<HexChar>DevicePathStrLen <NULL>
+  // | 5  |   32   |  6  |   NameStrLen   |  6  |    DevicePathStrLen   |
+  //
+  BufferSize = (5 + 32 + 6 + NameStrLen + 6 + DevicePathSize * 2 + 1) * sizeof (CHAR16);
+  if (*StrBufferLen < BufferSize) {
+    *StrBufferLen = BufferSize;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  *StrBufferLen = BufferSize;
+
+  StrPtr = ConfigHdr;
+
+  StrCpy (StrPtr, L"GUID=");
+  StrPtr += 5;
+  BufferToHexString (StrPtr, (UINT8 *) Guid, sizeof (EFI_GUID));
+  StrPtr += 32;
+
+  StrCpy (StrPtr, L"&NAME=");
+  StrPtr += 6;
+  if (Name != NULL) {
+    StrCpy (StrPtr, Name);
+    StrPtr += NameStrLen;
+  }
+
+  StrCpy (StrPtr, L"&PATH=");
+  StrPtr += 6;
+  BufferToHexString (StrPtr, (UINT8 *) DevicePath, DevicePathSize);
+
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Search BlockName "&OFFSET=Offset&WIDTH=Width" in a string.
+
+  @param  String                 The string to be searched in.
+  @param  Offset                 Offset in BlockName.
+  @param  Width                  Width in BlockName.
+
+  @retval TRUE                   Block name found.
+  @retval FALSE                  Block name not found.
+
+**/
+BOOLEAN
+FindBlockName (
+  IN OUT CHAR16                *String,
+  UINTN                        Offset,
+  UINTN                        Width
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       Data;
+  UINTN       BufferSize;
+  UINTN       ConvertedStrLen;
+
+  while ((String = StrStr (String, L"&OFFSET=")) != NULL) {
+    //
+    // Skip '&OFFSET='
+    //
+    String = String + 8;
+
+    Data = 0;
+    BufferSize = sizeof (UINTN);
+    Status = R8_HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
+    if (EFI_ERROR (Status)) {
+      return FALSE;
+    }
+    String = String + ConvertedStrLen;
+
+    if (Data != Offset) {
+      continue;
+    }
+
+    if (StrnCmp (String, L"&WIDTH=", 7) != 0) {
+      return FALSE;
+    }
+    String = String + 7;
+
+    Data = 0;
+    BufferSize = sizeof (UINTN);
+    Status = R8_HexStringToBuf ((UINT8 *) &Data, &BufferSize, String, &ConvertedStrLen);
+    if (EFI_ERROR (Status)) {
+      return FALSE;
+    }
+    if (Data == Width) {
+      return TRUE;
+    }
+
+    String = String + ConvertedStrLen;
+  }
+
+  return FALSE;
+}
+
+
+/**
+  This routine is invoked by ConfigAccess.Callback() to retrived uncommitted data from Form Browser.
+
+  @param  VariableGuid           An optional field to indicate the target variable
+                                 GUID name to use.
+  @param  VariableName           An optional field to indicate the target
+                                 human-readable variable name.
+  @param  BufferSize             On input: Length in bytes of buffer to hold
+                                 retrived data. On output: If return
+                                 EFI_BUFFER_TOO_SMALL, containg length of buffer
+                                 desired.
+  @param  Buffer                 Buffer to hold retrived data.
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval EFI_BUFFER_TOO_SMALL   The intput buffer is too small.
+
+**/
+EFI_STATUS
+EFIAPI
+GetBrowserData (
+  EFI_GUID                   *VariableGuid, OPTIONAL
+  CHAR16                     *VariableName, OPTIONAL
+  UINTN                      *BufferSize,
+  UINT8                      *Buffer
+  )
+{
+  EFI_STATUS                      Status;
+  CHAR16                          *ConfigHdr;
+  CHAR16                          *ConfigResp;
+  CHAR16                          *StringPtr;
+  UINTN                           HeaderLen;
+  UINTN                           BufferLen;
+  CHAR16                          *Progress;
+  EFI_FORM_BROWSER2_PROTOCOL      *FormBrowser2;
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
+
+  //
+  // Locate protocols for use
+  //
+  Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Retrive formset storage data from Form Browser
+  //
+  ConfigHdr = mFakeConfigHdr;
+  HeaderLen = StrLen (ConfigHdr);
+
+  BufferLen = 0x4000;
+  ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);
+
+  StringPtr = ConfigResp + HeaderLen;
+  *StringPtr = L'&';
+  StringPtr++;
+
+  Status = FormBrowser2->BrowserCallback (
+                           FormBrowser2,
+                           &BufferLen,
+                           StringPtr,
+                           TRUE,
+                           VariableGuid,
+                           VariableName
+                           );
+  if (Status == EFI_BUFFER_TOO_SMALL) {
+    gBS->FreePool (ConfigResp);
+    ConfigResp = AllocateZeroPool (BufferLen + HeaderLen);
+
+    StringPtr = ConfigResp + HeaderLen;
+    *StringPtr = L'&';
+    StringPtr++;
+
+    Status = FormBrowser2->BrowserCallback (
+                             FormBrowser2,
+                             &BufferLen,
+                             StringPtr,
+                             TRUE,
+                             VariableGuid,
+                             VariableName
+                             );
+  }
+  if (EFI_ERROR (Status)) {
+    gBS->FreePool (ConfigResp);
+    return Status;
+  }
+  CopyMem (ConfigResp, ConfigHdr, HeaderLen * sizeof (UINT16));
+
+  //
+  // Convert <ConfigResp> to buffer data
+  //
+  Status = HiiConfigRouting->ConfigToBlock (
+                               HiiConfigRouting,
+                               ConfigResp,
+                               Buffer,
+                               BufferSize,
+                               &Progress
+                               );
+  gBS->FreePool (ConfigResp);
+
+  return Status;
+}
+
+
+/**
+  This routine is invoked by ConfigAccess.Callback() to update uncommitted data of Form Browser.
+
+  @param  VariableGuid           An optional field to indicate the target variable
+                                 GUID name to use.
+  @param  VariableName           An optional field to indicate the target
+                                 human-readable variable name.
+  @param  BufferSize             Length in bytes of buffer to hold retrived data.
+  @param  Buffer                 Buffer to hold retrived data.
+  @param  RequestElement         An optional field to specify which part of the
+                                 buffer data will be send back to Browser. If NULL,
+                                 the whole buffer of data will be committed to
+                                 Browser. <RequestElement> ::=
+                                 &OFFSET=<Number>&WIDTH=<Number>*
+
+  @retval EFI_SUCCESS            Routine success.
+  @retval Other                  Updating Browser uncommitted data failed.
+
+**/
+EFI_STATUS
+EFIAPI
+SetBrowserData (
+  EFI_GUID                   *VariableGuid, OPTIONAL
+  CHAR16                     *VariableName, OPTIONAL
+  UINTN                      BufferSize,
+  UINT8                      *Buffer,
+  CHAR16                     *RequestElement  OPTIONAL
+  )
+{
+  EFI_STATUS                      Status;
+  CHAR16                          *ConfigHdr;
+  CHAR16                          *ConfigResp;
+  CHAR16                          *StringPtr;
+  UINTN                           HeaderLen;
+  UINTN                           BufferLen;
+  CHAR16                          *Progress;
+  EFI_FORM_BROWSER2_PROTOCOL      *FormBrowser2;
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
+  CHAR16                          BlockName[33];
+  CHAR16                          *ConfigRequest;
+  CHAR16                          *Request;
+
+  //
+  // Locate protocols for use
+  //
+  Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &FormBrowser2);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **) &HiiConfigRouting);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Prepare <ConfigRequest>
+  //
+  ConfigHdr = mFakeConfigHdr;
+  HeaderLen = StrLen (ConfigHdr);
+
+  if (RequestElement == NULL) {
+    //
+    // RequestElement not specified, use "&OFFSET=0&WIDTH=<BufferSize>" as <BlockName>
+    //
+    BlockName[0] = L'\0';
+    StrCpy (BlockName, L"&OFFSET=0&WIDTH=");
+
+    //
+    // String lenghth of L"&OFFSET=0&WIDTH=" is 16
+    //
+    StringPtr = BlockName + 16;
+    BufferLen = sizeof (BlockName) - (16 * sizeof (CHAR16));
+    R8_BufToHexString (StringPtr, &BufferLen, (UINT8 *) &BufferSize, sizeof (UINTN));
+
+    Request = BlockName;
+  } else {
+    Request = RequestElement;
+  }
+
+  BufferLen = HeaderLen * sizeof (CHAR16) + StrSize (Request);
+  ConfigRequest = AllocateZeroPool (BufferLen);
+
+  CopyMem (ConfigRequest, ConfigHdr, HeaderLen * sizeof (CHAR16));
+  StringPtr = ConfigRequest + HeaderLen;
+  StrCpy (StringPtr, Request);
+
+  //
+  // Convert buffer to <ConfigResp>
+  //
+  Status = HiiConfigRouting->BlockToConfig (
+                                HiiConfigRouting,
+                                ConfigRequest,
+                                Buffer,
+                                BufferSize,
+                                &ConfigResp,
+                                &Progress
+                                );
+  if (EFI_ERROR (Status)) {
+    gBS->FreePool (ConfigResp);
+    return Status;
+  }
+
+  //
+  // Skip <ConfigHdr> and '&'
+  //
+  StringPtr = ConfigResp + HeaderLen + 1;
+
+  //
+  // Change uncommitted data in Browser
+  //
+  Status = FormBrowser2->BrowserCallback (
+                           FormBrowser2,
+                           &BufferSize,
+                           StringPtr,
+                           FALSE,
+                           NULL,
+                           NULL
+                           );
+  gBS->FreePool (ConfigResp);
+  return Status;
+}
diff --git a/edk2/MdePkg/Library/IfrSupportLib/UefiIfrLibraryInternal.h b/edk2/MdePkg/Library/IfrSupportLib/UefiIfrLibraryInternal.h
new file mode 100644 (file)
index 0000000..dd41c7a
--- /dev/null
@@ -0,0 +1,47 @@
+/** @file
+
+Copyright (c) 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  UefiIfrLibraryInternal
+
+Abstract:
+
+  The file contain all library function for Ifr Operations.
+
+
+**/
+
+#ifndef _IFRLIBRARY_INTERNAL_H
+#define _IFRLIBRARY_INTERNAL_H
+
+
+#include <PiDxe.h>
+
+#include <Guid/GlobalVariable.h>
+#include <Protocol/DevicePath.h>
+
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/IfrSupportLib.h>
+#include <Library/HiiLib.h>
+#include <Library/PcdLib.h>
+
+//#include <MdeModuleHii.h>
+
+#include "R8Lib.h"
+
+#endif
diff --git a/edk2/MdePkg/Library/IfrSupportLib/UefiIfrOpCodeCreation.c b/edk2/MdePkg/Library/IfrSupportLib/UefiIfrOpCodeCreation.c
new file mode 100644 (file)
index 0000000..f2f82e0
--- /dev/null
@@ -0,0 +1,618 @@
+/** @file
+
+Copyright (c) 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  UefiIfrOpCodeCreation.c
+
+Abstract:
+
+  Library Routines to create IFR independent of string data - assume tokens already exist
+  Primarily to be used for exporting op-codes at a label in pre-defined forms.
+
+Revision History:
+
+
+**/
+
+#include "UefiIfrLibraryInternal.h"
+
+STATIC
+BOOLEAN
+IsValidQuestionFlags (
+  IN UINT8                   Flags
+  )
+{
+  return (BOOLEAN) ((Flags & (~QUESTION_FLAGS)) ? FALSE : TRUE);
+}
+
+STATIC
+BOOLEAN
+IsValidValueType (
+  IN UINT8                   Type
+  )
+{
+  return (BOOLEAN) ((Type <= EFI_IFR_TYPE_OTHER) ? TRUE : FALSE);
+}
+
+STATIC
+BOOLEAN
+IsValidNumricFlags (
+  IN UINT8                   Flags
+  )
+{
+  if (Flags & ~(EFI_IFR_NUMERIC_SIZE | EFI_IFR_DISPLAY)) {
+    return FALSE;
+  }
+
+  if ((Flags & EFI_IFR_DISPLAY) > EFI_IFR_DISPLAY_UINT_HEX) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+STATIC
+BOOLEAN
+IsValidCheckboxFlags (
+  IN UINT8                   Flags
+  )
+{
+  return (BOOLEAN) ((Flags <= EFI_IFR_CHECKBOX_DEFAULT_MFG) ? TRUE : FALSE);
+}
+
+EFI_STATUS
+EFIAPI
+CreateEndOpCode (
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+{
+  EFI_IFR_END                 End;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (Data->Offset + sizeof (EFI_IFR_END) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  End.Header.Length  = sizeof (EFI_IFR_END);
+  End.Header.OpCode  = EFI_IFR_END_OP;
+  End.Header.Scope   = 0;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &End, sizeof (EFI_IFR_END));
+  Data->Offset += sizeof (EFI_IFR_END);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateDefaultOpCode (
+  IN     EFI_IFR_TYPE_VALUE  *Value,
+  IN     UINT8               Type,
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+{
+  EFI_IFR_DEFAULT            Default;
+  UINT8                      *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if ((Value == NULL) || !IsValidValueType (Type)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_DEFAULT) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Default.Header.OpCode = EFI_IFR_DEFAULT_OP;
+  Default.Header.Length = sizeof (EFI_IFR_DEFAULT);
+  Default.Header.Scope  = 0;
+  Default.Type          = Type;
+  Default.DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;
+  CopyMem (&Default.Value, Value, sizeof(EFI_IFR_TYPE_VALUE));
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Default, sizeof (EFI_IFR_DEFAULT));
+  Data->Offset += sizeof (EFI_IFR_DEFAULT);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateActionOpCode (
+  IN     EFI_QUESTION_ID      QuestionId,
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     UINT8                QuestionFlags,
+  IN     EFI_STRING_ID        QuestionConfig,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_ACTION              Action;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_ACTION) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Action.Header.OpCode          = EFI_IFR_ACTION_OP;
+  Action.Header.Length          = sizeof (EFI_IFR_ACTION);
+  Action.Header.Scope           = 0;
+  Action.Question.QuestionId    = QuestionId;
+  Action.Question.Header.Prompt = Prompt;
+  Action.Question.Header.Help   = Help;
+  Action.Question.VarStoreId    = INVALID_VARSTORE_ID;
+  Action.Question.Flags         = QuestionFlags;
+  Action.QuestionConfig         = QuestionConfig;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Action, sizeof (EFI_IFR_ACTION));
+  Data->Offset += sizeof (EFI_IFR_ACTION);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateSubTitleOpCode (
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               Flags,
+  IN      UINT8               Scope,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_SUBTITLE            Subtitle;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (Data->Offset + sizeof (EFI_IFR_SUBTITLE) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Subtitle.Header.OpCode    = EFI_IFR_SUBTITLE_OP;
+  Subtitle.Header.Length    = sizeof (EFI_IFR_SUBTITLE);
+  Subtitle.Header.Scope     = Scope;
+  Subtitle.Statement.Prompt = Prompt;
+  Subtitle.Statement.Help   = Help;
+  Subtitle.Flags            = Flags;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Subtitle, sizeof (EFI_IFR_SUBTITLE));
+  Data->Offset += sizeof (EFI_IFR_SUBTITLE);
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EFIAPI
+CreateTextOpCode (
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     EFI_STRING_ID        TextTwo,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_TEXT                Text;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (Data->Offset + sizeof (EFI_IFR_TEXT) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Text.Header.OpCode    = EFI_IFR_TEXT_OP;
+  Text.Header.Length    = sizeof (EFI_IFR_TEXT);
+  Text.Header.Scope     = 0;
+  Text.Statement.Prompt = Prompt;
+  Text.Statement.Help   = Help;
+  Text.TextTwo          = TextTwo;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Text, sizeof (EFI_IFR_TEXT));
+  Data->Offset += sizeof (EFI_IFR_TEXT);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateGotoOpCode (
+  IN     EFI_FORM_ID          FormId,
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     UINT8                QuestionFlags,
+  IN     EFI_QUESTION_ID      QuestionId,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_REF                 Goto;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_REF) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Goto.Header.OpCode          = EFI_IFR_REF_OP;
+  Goto.Header.Length          = sizeof (EFI_IFR_REF);
+  Goto.Header.Scope           = 0;
+  Goto.Question.Header.Prompt = Prompt;
+  Goto.Question.Header.Help   = Help;
+  Goto.Question.VarStoreId    = INVALID_VARSTORE_ID;
+  Goto.Question.QuestionId    = QuestionId;
+  Goto.Question.Flags         = QuestionFlags;
+  Goto.FormId                 = FormId;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Goto, sizeof (EFI_IFR_REF));
+  Data->Offset += sizeof (EFI_IFR_REF);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateOneOfOptionOpCode (
+  IN     UINTN                OptionCount,
+  IN     IFR_OPTION           *OptionsList,
+  IN     UINT8                Type,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  UINTN                       Index;
+  UINT8                       *LocalBuffer;
+  EFI_IFR_ONE_OF_OPTION       OneOfOption;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if ((OptionCount != 0) && (OptionsList == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  for (Index = 0; Index < OptionCount; Index++) {
+    OneOfOption.Header.OpCode = EFI_IFR_ONE_OF_OPTION_OP;
+    OneOfOption.Header.Length = sizeof (EFI_IFR_ONE_OF_OPTION);
+    OneOfOption.Header.Scope  = 0;
+
+    OneOfOption.Option        = OptionsList[Index].StringToken;
+    OneOfOption.Value         = OptionsList[Index].Value;
+    OneOfOption.Flags         = (UINT8) (OptionsList[Index].Flags & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));
+    OneOfOption.Type          = Type;
+
+    LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+    CopyMem (LocalBuffer, &OneOfOption, sizeof (EFI_IFR_ONE_OF_OPTION));
+    Data->Offset += sizeof (EFI_IFR_ONE_OF_OPTION);
+  }
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateOneOfOpCode (
+  IN     EFI_QUESTION_ID      QuestionId,
+  IN     EFI_VARSTORE_ID      VarStoreId,
+  IN     UINT16               VarOffset,
+  IN     EFI_STRING_ID        Prompt,
+  IN     EFI_STRING_ID        Help,
+  IN     UINT8                QuestionFlags,
+  IN     UINT8                OneOfFlags,
+  IN     IFR_OPTION           *OptionsList,
+  IN     UINTN                OptionCount,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  UINTN                       Length;
+  EFI_IFR_ONE_OF              OneOf;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidNumricFlags (OneOfFlags) ||
+      !IsValidQuestionFlags (QuestionFlags) ||
+      ((OptionCount != 0) && (OptionsList == NULL))) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Length = sizeof (EFI_IFR_ONE_OF) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);
+  if (Data->Offset + Length > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  OneOf.Header.OpCode                   = EFI_IFR_ONE_OF_OP;
+  OneOf.Header.Length                   = sizeof (EFI_IFR_ONE_OF);
+  OneOf.Header.Scope                    = 1;
+  OneOf.Question.Header.Prompt          = Prompt;
+  OneOf.Question.Header.Help            = Help;
+  OneOf.Question.QuestionId             = QuestionId;
+  OneOf.Question.VarStoreId             = VarStoreId;
+  OneOf.Question.VarStoreInfo.VarOffset = VarOffset;
+  OneOf.Question.Flags                  = QuestionFlags;
+  OneOf.Flags                           = OneOfFlags;
+  ZeroMem ((VOID *) &OneOf.data, sizeof (MINMAXSTEP_DATA));
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &OneOf, sizeof (EFI_IFR_ONE_OF));
+  Data->Offset += sizeof (EFI_IFR_ONE_OF);
+
+  CreateOneOfOptionOpCode (OptionCount, OptionsList, (UINT8) (OneOfFlags & EFI_IFR_NUMERIC_SIZE), Data);
+
+  CreateEndOpCode (Data);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateOrderedListOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               OrderedListFlags,
+  IN      UINT8               DataType,
+  IN      UINT8               MaxContainers,
+  IN      IFR_OPTION          *OptionsList,
+  IN     UINTN                OptionCount,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  UINTN                       Length;
+  EFI_IFR_ORDERED_LIST        OrderedList;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags) ||
+      ((OptionCount != 0) && (OptionsList == NULL))) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if ((OrderedListFlags != 0) &&
+      (OrderedListFlags != EFI_IFR_UNIQUE_SET) &&
+      (OrderedListFlags != EFI_IFR_NO_EMPTY_SET)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Length = sizeof (EFI_IFR_ORDERED_LIST) + OptionCount * sizeof (EFI_IFR_ONE_OF_OPTION) + sizeof (EFI_IFR_END);
+  if (Data->Offset + Length > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  OrderedList.Header.OpCode                   = EFI_IFR_ORDERED_LIST_OP;
+  OrderedList.Header.Length                   = sizeof (EFI_IFR_ORDERED_LIST);
+  OrderedList.Header.Scope                    = 1;
+  OrderedList.Question.Header.Prompt          = Prompt;
+  OrderedList.Question.Header.Help            = Help;
+  OrderedList.Question.QuestionId             = QuestionId;
+  OrderedList.Question.VarStoreId             = VarStoreId;
+  OrderedList.Question.VarStoreInfo.VarOffset = VarOffset;
+  OrderedList.Question.Flags                  = QuestionFlags;
+  OrderedList.MaxContainers                   = MaxContainers;
+  OrderedList.Flags                           = OrderedListFlags;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &OrderedList, sizeof (EFI_IFR_ORDERED_LIST));
+  Data->Offset += sizeof (EFI_IFR_ORDERED_LIST);
+
+  CreateOneOfOptionOpCode (OptionCount, OptionsList, DataType, Data);
+
+  CreateEndOpCode (Data);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateCheckBoxOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               CheckBoxFlags,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_CHECKBOX            CheckBox;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags) || !IsValidCheckboxFlags (CheckBoxFlags)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  CheckBox.Header.OpCode                   = EFI_IFR_CHECKBOX_OP;
+  CheckBox.Header.Length                   = sizeof (EFI_IFR_CHECKBOX);
+  CheckBox.Header.Scope                    = 0;
+  CheckBox.Question.QuestionId             = QuestionId;
+  CheckBox.Question.VarStoreId             = VarStoreId;
+  CheckBox.Question.VarStoreInfo.VarOffset = VarOffset;
+  CheckBox.Question.Header.Prompt          = Prompt;
+  CheckBox.Question.Header.Help            = Help;
+  CheckBox.Question.Flags                  = QuestionFlags;
+  CheckBox.Flags                           = CheckBoxFlags;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &CheckBox, sizeof (EFI_IFR_CHECKBOX));
+  Data->Offset += sizeof (EFI_IFR_CHECKBOX);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateNumericOpCode (
+  IN     EFI_QUESTION_ID     QuestionId,
+  IN     EFI_VARSTORE_ID     VarStoreId,
+  IN     UINT16              VarOffset,
+  IN     EFI_STRING_ID       Prompt,
+  IN     EFI_STRING_ID       Help,
+  IN     UINT8               QuestionFlags,
+  IN     UINT8               NumericFlags,
+  IN     UINT64              Minimum,
+  IN     UINT64              Maximum,
+  IN     UINT64              Step,
+  IN     UINT64              Default,
+  IN OUT EFI_HII_UPDATE_DATA *Data
+  )
+{
+  EFI_STATUS                  Status;
+  EFI_IFR_NUMERIC             Numeric;
+  MINMAXSTEP_DATA             MinMaxStep;
+  EFI_IFR_TYPE_VALUE          DefaultValue;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags) || !IsValidNumricFlags (NumericFlags)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_CHECKBOX) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  Numeric.Header.OpCode                   = EFI_IFR_NUMERIC_OP;
+  Numeric.Header.Length                   = sizeof (EFI_IFR_NUMERIC);
+  Numeric.Header.Scope                    = 1;
+  Numeric.Question.QuestionId             = QuestionId;
+  Numeric.Question.VarStoreId             = VarStoreId;
+  Numeric.Question.VarStoreInfo.VarOffset = VarOffset;
+  Numeric.Question.Header.Prompt          = Prompt;
+  Numeric.Question.Header.Help            = Help;
+  Numeric.Question.Flags                  = QuestionFlags;
+  Numeric.Flags                           = NumericFlags;
+
+  switch (NumericFlags & EFI_IFR_NUMERIC_SIZE) {
+  case EFI_IFR_NUMERIC_SIZE_1:
+    MinMaxStep.u8.MinValue = (UINT8) Minimum;
+    MinMaxStep.u8.MaxValue = (UINT8) Maximum;
+    MinMaxStep.u8.Step     = (UINT8) Step;
+    break;
+
+  case EFI_IFR_NUMERIC_SIZE_2:
+    MinMaxStep.u16.MinValue = (UINT16) Minimum;
+    MinMaxStep.u16.MaxValue = (UINT16) Maximum;
+    MinMaxStep.u16.Step     = (UINT16) Step;
+    break;
+
+  case EFI_IFR_NUMERIC_SIZE_4:
+    MinMaxStep.u32.MinValue = (UINT32) Minimum;
+    MinMaxStep.u32.MaxValue = (UINT32) Maximum;
+    MinMaxStep.u32.Step     = (UINT32) Step;
+    break;
+
+  case EFI_IFR_NUMERIC_SIZE_8:
+    MinMaxStep.u64.MinValue = Minimum;
+    MinMaxStep.u64.MaxValue = Maximum;
+    MinMaxStep.u64.Step     = Step;
+    break;
+  }
+
+  CopyMem (&Numeric.data, &MinMaxStep, sizeof (MINMAXSTEP_DATA));
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &Numeric, sizeof (EFI_IFR_NUMERIC));
+  Data->Offset += sizeof (EFI_IFR_NUMERIC);
+
+  DefaultValue.u64 = Default;
+  Status = CreateDefaultOpCode (&DefaultValue, (UINT8) (NumericFlags & EFI_IFR_NUMERIC_SIZE), Data);
+  if (EFI_ERROR(Status)) {
+    return Status;
+  }
+
+  CreateEndOpCode (Data);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+CreateStringOpCode (
+  IN      EFI_QUESTION_ID     QuestionId,
+  IN      EFI_VARSTORE_ID     VarStoreId,
+  IN      UINT16              VarOffset,
+  IN      EFI_STRING_ID       Prompt,
+  IN      EFI_STRING_ID       Help,
+  IN      UINT8               QuestionFlags,
+  IN      UINT8               StringFlags,
+  IN      UINT8               MinSize,
+  IN      UINT8               MaxSize,
+  IN OUT EFI_HII_UPDATE_DATA  *Data
+  )
+{
+  EFI_IFR_STRING              String;
+  UINT8                       *LocalBuffer;
+
+  ASSERT (Data != NULL && Data->Data != NULL);
+
+  if (!IsValidQuestionFlags (QuestionFlags) || (StringFlags & (~EFI_IFR_STRING_MULTI_LINE))) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Data->Offset + sizeof (EFI_IFR_STRING) > Data->BufferSize) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+
+  String.Header.OpCode                   = EFI_IFR_STRING_OP;
+  String.Header.Length                   = sizeof (EFI_IFR_STRING);
+  String.Header.Scope                    = 0;
+  String.Question.Header.Prompt          = Prompt;
+  String.Question.Header.Help            = Help;
+  String.Question.QuestionId             = QuestionId;
+  String.Question.VarStoreId             = VarStoreId;
+  String.Question.VarStoreInfo.VarOffset = VarOffset;
+  String.Question.Flags                  = QuestionFlags;
+  String.MinSize                         = MinSize;
+  String.MaxSize                         = MaxSize;
+  String.Flags                           = StringFlags;
+
+  LocalBuffer = (UINT8 *) Data->Data + Data->Offset;
+  CopyMem (LocalBuffer, &String, sizeof (EFI_IFR_STRING));
+  Data->Offset += sizeof (EFI_IFR_STRING);
+
+  return EFI_SUCCESS;
+}
+
+
index 1a6f162..c43cd5c 100644 (file)
@@ -77,6 +77,7 @@
   MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf\r
   MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf\r
   MdePkg/Library/HiiLib/HiiLib.inf\r
+  MdePkg/Library/IfrSupportLib/IfrSupportLib.inf\r
   MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf\r
   MdePkg/Library/PeiDxePostCodeLibReportStatusCode/PeiDxePostCodeLibReportStatusCode.inf\r
   MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf\r