]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
Roll back changes to apply GetBestLanguage() in HiiDataBase. Exact language match...
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / HiiDatabase.h
index cf3519b8538546ce824c2284d7fcfd3d98e2a543..81f42c5bf2b96e69178e7d0a26775ad1ef0076b1 100644 (file)
-/** @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:
-
-    HiiDatabase.h
-
-Abstract:
-
-    Private structures definitions in HiiDatabase.
-
-Revision History
-
-
-**/
-
-#ifndef __HII_DATABASE_PRIVATE_H__
-#define __HII_DATABASE_PRIVATE_H__
-
-#include <PiDxe.h>
-
-#include <Protocol/ConsoleControl.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/HiiFont.h>
-#include <Protocol/HiiImage.h>
-#include <Protocol/HiiString.h>
-#include <Protocol/HiiDatabase.h>
-#include <Protocol/HiiConfigRouting.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/SimpleTextOut.h>
-
-#include <Guid/HiiKeyBoardLayout.h>
-
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/MemoryAllocationLib.h>
-
-#define HII_DATABASE_NOTIFY_GUID \
-  { \
-    0xc1c76, 0xd79e, 0x42fe, 0x86, 0xb, 0x8b, 0xe8, 0x7b, 0x3e, 0x7a, 0x78 \
-  }
-
-#define MAX_STRING_LENGTH                  1024
-#define MAX_FONT_NAME_LEN                  256
-#define NARROW_BASELINE                    15
-#define WIDE_BASELINE                      14
-#define SYS_FONT_INFO_MASK                 0x37
-#define REPLACE_UNKNOWN_GLYPH              0xFFFD
-#define PROPORTIONAL_GLYPH                 0x80
-#define NARROW_GLYPH                       0x40
-
-#define BITMAP_LEN_1_BIT(Width, Height)  (((Width) + 7) / 8 * (Height))
-#define BITMAP_LEN_4_BIT(Width, Height)  (((Width) + 1) / 2 * (Height))
-#define BITMAP_LEN_8_BIT(Width, Height)  ((Width) * (Height))
-#define BITMAP_LEN_24_BIT(Width, Height) ((Width) * (Height) * 3)
-
-//
-// Storage types
-//
-#define EFI_HII_VARSTORE_BUFFER            0
-#define EFI_HII_VARSTORE_NAME_VALUE        1
-#define EFI_HII_VARSTORE_EFI_VARIABLE      2
-
-#define HII_FORMSET_STORAGE_SIGNATURE           EFI_SIGNATURE_32 ('H', 'S', 'T', 'G')
-typedef struct {
-  UINTN               Signature;
-  LIST_ENTRY          Entry;
-
-  EFI_HII_HANDLE      HiiHandle;
-  EFI_HANDLE          DriverHandle;
-
-  UINT8               Type;   // EFI_HII_VARSTORE_BUFFER, EFI_HII_VARSTORE_NAME_VALUE, EFI_HII_VARSTORE_EFI_VARIABLE
-  EFI_GUID            Guid;
-  CHAR16              *Name;
-  UINT16              Size;
-} HII_FORMSET_STORAGE;
-
-#define HII_FORMSET_STORAGE_FROM_LINK(a)  CR (a, HII_FORMSET_STORAGE, Link, HII_FORMSET_STORAGE_SIGNATURE)
-
-
-//
-// String Package definitions
-//
-#define HII_STRING_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','i','s','p')
-typedef struct _HII_STRING_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_STRING_PACKAGE_HDR            *StringPkgHdr;
-  UINT8                                 *StringBlock;
-  LIST_ENTRY                            StringEntry;
-  LIST_ENTRY                            FontInfoList;  // local font info list
-  UINT8                                 FontId;
-} HII_STRING_PACKAGE_INSTANCE;
-
-//
-// Form Package definitions
-//
-#define HII_IFR_PACKAGE_SIGNATURE       EFI_SIGNATURE_32 ('h','f','r','p')
-typedef struct _HII_IFR_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_PACKAGE_HEADER                FormPkgHdr;
-  UINT8                                 *IfrData;
-  LIST_ENTRY                            IfrEntry;
-} HII_IFR_PACKAGE_INSTANCE;
-
-//
-// Simple Font Package definitions
-//
-#define HII_S_FONT_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','s','f','p')
-typedef struct _HII_SIMPLE_FONT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_SIMPLE_FONT_PACKAGE_HDR       *SimpleFontPkgHdr;
-  LIST_ENTRY                            SimpleFontEntry;
-} HII_SIMPLE_FONT_PACKAGE_INSTANCE;
-
-//
-// Font Package definitions
-//
-#define HII_FONT_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','f','p')
-typedef struct _HII_FONT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_FONT_PACKAGE_HDR              *FontPkgHdr;
-  UINT8                                 *GlyphBlock;
-  LIST_ENTRY                            FontEntry;
-  LIST_ENTRY                            GlyphInfoList;
-} HII_FONT_PACKAGE_INSTANCE;
-
-#define HII_GLYPH_INFO_SIGNATURE        EFI_SIGNATURE_32 ('h','g','i','s')
-typedef struct _HII_GLYPH_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  CHAR16                                CharId;
-  EFI_HII_GLYPH_INFO                    Cell;
-} HII_GLYPH_INFO;
-
-#define HII_FONT_INFO_SIGNATURE         EFI_SIGNATURE_32 ('h','l','f','i')
-typedef struct _HII_FONT_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  LIST_ENTRY                            *GlobalEntry;
-  UINT8                                 FontId;
-} HII_FONT_INFO;
-
-#define HII_GLOBAL_FONT_INFO_SIGNATURE  EFI_SIGNATURE_32 ('h','g','f','i')
-typedef struct _HII_GLOBAL_FONT_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  HII_FONT_PACKAGE_INSTANCE             *FontPackage;
-  UINTN                                 FontInfoSize;
-  EFI_FONT_INFO                         *FontInfo;
-} HII_GLOBAL_FONT_INFO;
-
-//
-// Image Package definitions
-//
-
-#define HII_PIXEL_MASK                  0x80
-
-typedef struct _HII_IMAGE_PACKAGE_INSTANCE {
-  EFI_HII_IMAGE_PACKAGE_HDR             ImagePkgHdr;
-  UINT32                                ImageBlockSize;
-  UINT32                                PaletteInfoSize;
-  UINT8                                 *ImageBlock;
-  UINT8                                 *PaletteBlock;
-} HII_IMAGE_PACKAGE_INSTANCE;
-
-//
-// Keyboard Layout Pacakge definitions
-//
-#define HII_KB_LAYOUT_PACKAGE_SIGNATURE EFI_SIGNATURE_32 ('h','k','l','p')
-typedef struct _HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  UINT8                                 *KeyboardPkg;
-  LIST_ENTRY                            KeyboardEntry;
-} HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE;
-
-//
-// Guid Package definitions
-//
-#define HII_GUID_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','g','p')
-typedef struct _HII_GUID_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  UINT8                                 *GuidPkg;
-  LIST_ENTRY                            GuidEntry;
-} HII_GUID_PACKAGE_INSTANCE;
-
-//
-// A package list can contain only one or less than one device path package.
-// This rule also applies to image package since ImageId can not be duplicate.
-//
-typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE {
-  EFI_HII_PACKAGE_LIST_HEADER           PackageListHdr;
-  LIST_ENTRY                            GuidPkgHdr;
-  LIST_ENTRY                            FormPkgHdr;
-  LIST_ENTRY                            KeyboardLayoutHdr;
-  LIST_ENTRY                            StringPkgHdr;
-  LIST_ENTRY                            FontPkgHdr;
-  HII_IMAGE_PACKAGE_INSTANCE            *ImagePkg;
-  LIST_ENTRY                            SimpleFontPkgHdr;
-  UINT8                                 *DevicePathPkg;
-} HII_DATABASE_PACKAGE_LIST_INSTANCE;
-
-#define HII_HANDLE_SIGNATURE            EFI_SIGNATURE_32 ('h','i','h','l')
-
-typedef struct {
-  UINTN               Signature;
-  LIST_ENTRY          Handle;
-  UINTN               Key;
-} HII_HANDLE;
-
-#define HII_DATABASE_RECORD_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','r')
-
-typedef struct _HII_DATABASE_RECORD {
-  UINTN                                 Signature;
-  HII_DATABASE_PACKAGE_LIST_INSTANCE    *PackageList;
-  EFI_HANDLE                            DriverHandle;
-  EFI_HII_HANDLE                        Handle;
-  LIST_ENTRY                            DatabaseEntry;
-} HII_DATABASE_RECORD;
-
-#define HII_DATABASE_NOTIFY_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','n')
-
-typedef struct _HII_DATABASE_NOTIFY {
-  UINTN                                 Signature;
-  EFI_HANDLE                            NotifyHandle;
-  UINT8                                 PackageType;
-  EFI_GUID                              *PackageGuid;
-  EFI_HII_DATABASE_NOTIFY               PackageNotifyFn;
-  EFI_HII_DATABASE_NOTIFY_TYPE          NotifyType;
-  LIST_ENTRY                            DatabaseNotifyEntry;
-} HII_DATABASE_NOTIFY;
-
-#define HII_DATABASE_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'D', 'p')
-
-typedef struct _HII_DATABASE_PRIVATE_DATA {
-  UINTN                                 Signature;
-  LIST_ENTRY                            DatabaseList;
-  LIST_ENTRY                            DatabaseNotifyList;
-  EFI_HII_FONT_PROTOCOL                 HiiFont;
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS
-  EFI_HII_IMAGE_PROTOCOL                HiiImage;
-#endif
-  EFI_HII_STRING_PROTOCOL               HiiString;
-  EFI_HII_DATABASE_PROTOCOL             HiiDatabase;
-  EFI_HII_CONFIG_ROUTING_PROTOCOL       ConfigRouting;
-  LIST_ENTRY                            HiiHandleList;
-  INTN                                  HiiHandleCount;
-  LIST_ENTRY                            FontInfoList;  // global font info list
-  UINTN                                 Attribute;     // default system color
-  EFI_GUID                              CurrentLayoutGuid;
-  EFI_HII_KEYBOARD_LAYOUT               *CurrentLayout;
-} HII_DATABASE_PRIVATE_DATA;
-
-#define HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiFont, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiImage, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiString, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiDatabase, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      ConfigRouting, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-//
-// Internal function prototypes.
-//
-
-/**
-  This function checks whether a handle is a valid EFI_HII_HANDLE
-
-  @param  Handle                  Pointer to a EFI_HII_HANDLE
-
-  @retval TRUE                    Valid
-  @retval FALSE                   Invalid
-
-**/
-BOOLEAN
-IsHiiHandleValid (
-  EFI_HII_HANDLE Handle
-  )
-;
-
-
-/**
-  This function checks whether EFI_FONT_INFO exists in current database. If
-  FontInfoMask is specified, check what options can be used to make a match.
-  Note that the masks relate to where the system default should be supplied
-  are ignored by this function.
-
-  @param  Private                 Hii database private structure.
-  @param  FontInfo                Points to EFI_FONT_INFO structure.
-  @param  FontInfoMask            If not NULL, describes what options can be used
-                                  to make a match between the font requested and
-                                  the font available. The caller must guarantee
-                                  this mask is valid.
-  @param  FontHandle              On entry, Points to the font handle returned by a
-                                  previous  call to GetFontInfo() or NULL to start
-                                  with the first font.
-  @param  GlobalFontInfo          If not NULL, output the corresponding globa font
-                                  info.
-
-  @retval TRUE                    Existed
-  @retval FALSE                   Not existed
-
-**/
-BOOLEAN
-IsFontInfoExisted (
-  IN  HII_DATABASE_PRIVATE_DATA *Private,
-  IN  EFI_FONT_INFO             *FontInfo,
-  IN  EFI_FONT_INFO_MASK        *FontInfoMask,   OPTIONAL
-  IN  EFI_FONT_HANDLE           FontHandle,      OPTIONAL
-  OUT HII_GLOBAL_FONT_INFO      **GlobalFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  Retrieve system default font and color.
-
-  @param  Private                 HII database driver private data.
-  @param  FontInfo                Points to system default font output-related
-                                  information. It's caller's responsibility to free
-                                  this buffer.
-  @param  FontInfoSize            If not NULL, output the size of buffer FontInfo.
-
-  @retval EFI_SUCCESS             Cell information is added to the GlyphInfoList.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-  @retval EFI_INVALID_PARAMETER   Any input parameter is invalid.
-
-**/
-EFI_STATUS
-GetSystemFont (
-  IN  HII_DATABASE_PRIVATE_DATA      *Private,
-  OUT EFI_FONT_DISPLAY_INFO          **FontInfo,
-  OUT UINTN                          *FontInfoSize OPTIONAL
-  )
-;
-
-
-/**
-  Parse all string blocks to find a String block specified by StringId.
-  If StringId = (EFI_STRING_ID) (-1), find out all EFI_HII_SIBT_FONT blocks
-  within this string package and backup its information.
-  If StringId = 0, output the string id of last string block (EFI_HII_SIBT_END).
-
-  @param  Private                 Hii database private structure.
-  @param  StringPackage           Hii string package instance.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  BlockType               Output the block type of found string block.
-  @param  StringBlockAddr         Output the block address of found string block.
-  @param  StringTextOffset        Offset, relative to the found block address, of
-                                  the  string text information.
-  @param  LastStringId            Output the last string id when StringId = 0.
-
-  @retval EFI_SUCCESS             The string text and font is retrieved
-                                  successfully.
-  @retval EFI_NOT_FOUND           The specified text or font info can not be found
-                                  out.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-FindStringBlock (
-  IN HII_DATABASE_PRIVATE_DATA        *Private,
-  IN  HII_STRING_PACKAGE_INSTANCE     *StringPackage,
-  IN  EFI_STRING_ID                   StringId,
-  OUT UINT8                           *BlockType, OPTIONAL
-  OUT UINT8                           **StringBlockAddr, OPTIONAL
-  OUT UINTN                           *StringTextOffset, OPTIONAL
-  OUT EFI_STRING_ID                   *LastStringId OPTIONAL
-  )
-;
-
-
-/**
-  Parse all glyph blocks to find a glyph block specified by CharValue.
-  If CharValue = (CHAR16) (-1), collect all default character cell information
-  within this font package and backup its information.
-
-  @param  FontPackage             Hii string package instance.
-  @param  CharValue               Unicode character value, which identifies a glyph
-                                  block.
-  @param  GlyphBuffer             Output the corresponding bitmap data of the found
-                                  block. It is the caller's responsiblity to free
-                                  this buffer.
-  @param  Cell                    Output cell information of the encoded bitmap.
-  @param  GlyphBufferLen          If not NULL, output the length of GlyphBuffer.
-
-  @retval EFI_SUCCESS             The bitmap data is retrieved successfully.
-  @retval EFI_NOT_FOUND           The specified CharValue does not exist in current
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-FindGlyphBlock (
-  IN  HII_FONT_PACKAGE_INSTANCE      *FontPackage,
-  IN  CHAR16                         CharValue,
-  OUT UINT8                          **GlyphBuffer, OPTIONAL
-  OUT EFI_HII_GLYPH_INFO             *Cell, OPTIONAL
-  OUT UINTN                          *GlyphBufferLen OPTIONAL
-  )
-;
-
-//
-// EFI_HII_FONT_PROTOCOL protocol interfaces
-//
-
-
-/**
-  Renders a string to a bitmap or to the display.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Flags                   Describes how the string is to be drawn.
-  @param  String                  Points to the null-terminated string to be
-                                  displayed.
-  @param  StringInfo              Points to the string output information,
-                                  including the color and font.  If NULL, then the
-                                  string will be output in the default system font
-                                  and color.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels   wide
-                                  and Height pixels high. The string will be drawn
-                                  onto this image and
-                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points
-                                  to a NULL on entry, then a              buffer
-                                  will be allocated to hold the generated image and
-                                  the pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltX,BLTY               Specifies the offset from the left and top edge
-                                  of the image of the first character cell in the
-                                  image.
-  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this
-                                  will point to an allocated buffer    containing
-                                  row information and RowInfoArraySize will be
-                                  updated to contain the        number of elements.
-                                  This array describes the characters which were at
-                                  least partially drawn and the heights of the
-                                  rows. It is the caller¡¯s responsibility to free
-                                  this buffer.
-  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it
-                                  contains the number of elements in RowInfoArray.
-  @param  ColumnInfoArray         If this is non-NULL, then on return it will be
-                                  filled with the horizontal offset for each
-                                  character in the string on the row where it is
-                                  displayed. Non-printing characters will     have
-                                  the offset ~0. The caller is responsible to
-                                  allocate a buffer large enough so that    there
-                                  is one entry for each character in the string,
-                                  not including the null-terminator. It is possible
-                                  when character display is normalized that some
-                                  character cells overlap.
-
-  @retval EFI_SUCCESS             The string was successfully rendered.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for
-                                  RowInfoArray or Blt.
-  @retval EFI_INVALID_PARAMETER   The String was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiStringToImage (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  EFI_HII_OUT_FLAGS              Flags,
-  IN  CONST EFI_STRING               String,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,
-  IN  OUT EFI_IMAGE_OUTPUT           **Blt,
-  IN  UINTN                          BltX,
-  IN  UINTN                          BltY,
-  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,
-  OUT UINTN                          *RowInfoArraySize OPTIONAL,
-  OUT UINTN                          *ColumnInfoArray  OPTIONAL
-  )
-;
-
-
-/**
-  Render a string to a bitmap or the screen containing the contents of the specified string.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Flags                   Describes how the string is to be drawn.
-  @param  PackageList             The package list in the HII database to search
-                                  for the specified string.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  Language                Points to the language for the retrieved string.
-                                  If NULL, then the current system language is
-                                  used.
-  @param  StringInfo              Points to the string output information,
-                                  including the color and font.  If NULL, then the
-                                  string will be output in the default system font
-                                  and color.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels   wide
-                                  and Height pixels high. The string will be drawn
-                                  onto this image and
-                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points
-                                  to a NULL on entry, then a              buffer
-                                  will be allocated to hold the generated image and
-                                  the pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltX,BLTY               Specifies the offset from the left and top edge
-                                  of the image of the first character cell in the
-                                  image.
-  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this
-                                  will point to an allocated buffer    containing
-                                  row information and RowInfoArraySize will be
-                                  updated to contain the        number of elements.
-                                  This array describes the characters which were at
-                                  least partially drawn and the heights of the
-                                  rows. It is the caller¡¯s responsibility to free
-                                  this buffer.
-  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it
-                                  contains the number of elements in RowInfoArray.
-  @param  ColumnInfoArray         If this is non-NULL, then on return it will be
-                                  filled with the horizontal offset for each
-                                  character in the string on the row where it is
-                                  displayed. Non-printing characters will     have
-                                  the offset ~0. The caller is responsible to
-                                  allocate a buffer large enough so that    there
-                                  is one entry for each character in the string,
-                                  not including the null-terminator. It is possible
-                                  when character display is normalized that some
-                                  character cells overlap.
-
-  @retval EFI_SUCCESS             The string was successfully rendered.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for
-                                  RowInfoArray or Blt.
-  @retval EFI_INVALID_PARAMETER   The String was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiStringIdToImage (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  EFI_HII_OUT_FLAGS              Flags,
-  IN  EFI_HII_HANDLE                 PackageList,
-  IN  EFI_STRING_ID                  StringId,
-  IN  CONST CHAR8*                   Language,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,
-  IN  OUT EFI_IMAGE_OUTPUT           **Blt,
-  IN  UINTN                          BltX,
-  IN  UINTN                          BltY,
-  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,
-  OUT UINTN                          *RowInfoArraySize OPTIONAL,
-  OUT UINTN                          *ColumnInfoArray  OPTIONAL
-  )
-;
-
-
-/**
-  Convert the glyph for a single character into a bitmap.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Char                    Character to retrieve.
-  @param  StringInfo              Points to the string font and color information
-                                  or NULL if the string should use the default
-                                  system font and color.
-  @param  Blt                     Thus must point to a NULL on entry. A buffer will
-                                  be allocated to hold the output and the pointer
-                                  updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  Baseline                Number of pixels from the bottom of the bitmap to
-                                  the baseline.
-
-  @retval EFI_SUCCESS             Glyph bitmap created.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate the output buffer Blt.
-  @retval EFI_WARN_UNKNOWN_GLYPH  The glyph was unknown and was replaced with the
-                                  glyph for Unicode character 0xFFFD.
-  @retval EFI_INVALID_PARAMETER   Blt is NULL or *Blt is not NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetGlyph (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  CHAR16                         Char,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo,
-  OUT EFI_IMAGE_OUTPUT               **Blt,
-  OUT UINTN                          *Baseline OPTIONAL
-  )
-;
-
-
-/**
-  This function iterates through fonts which match the specified font, using
-  the specified criteria. If String is non-NULL, then all of the characters in
-  the string must exist in order for a candidate font to be returned.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  FontHandle              On entry, points to the font handle returned by a
-                                   previous call to GetFontInfo() or NULL to start
-                                  with the  first font. On return, points to the
-                                  returned font handle or points to NULL if there
-                                  are no more matching fonts.
-  @param  StringInfoIn            Upon entry, points to the font to return
-                                  information about.
-  @param  StringInfoOut           Upon return, contains the matching font¡¯s
-                                  information.  If NULL, then no information is
-                                  returned. It's caller's responsibility to free
-                                  this buffer.
-  @param  String                  Points to the string which will be tested to
-                                  determine  if all characters are available. If
-                                  NULL, then any font  is acceptable.
-
-  @retval EFI_SUCCESS             Matching font returned successfully.
-  @retval EFI_NOT_FOUND           No matching font was found.
-  @retval EFI_INVALID_PARAMETER   StringInfoIn is NULL.
-  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the
-                                  request.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetFontInfo (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  OUT   EFI_FONT_HANDLE          *FontHandle,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfoIn,
-  OUT       EFI_FONT_DISPLAY_INFO    **StringInfoOut,
-  IN  CONST EFI_STRING               String OPTIONAL
-  )
-;
-
-//
-// EFI_HII_IMAGE_PROTOCOL interfaces
-//
-
-
-/**
-  This function adds the image Image to the group of images owned by PackageList, and returns
-  a new image identifier (ImageId).
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             Handle of the package list where this image will
-                                  be added.
-  @param  ImageId                 On return, contains the new image id, which is
-                                  unique within PackageList.
-  @param  Image                   Points to the image.
-
-  @retval EFI_SUCCESS             The new image was added successfully.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    Could not add the image due to lack of resources.
-  @retval EFI_INVALID_PARAMETER   Image is NULL or ImageId is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewImage (
-  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                 PackageList,
-  OUT EFI_IMAGE_ID                   *ImageId,
-  IN  CONST EFI_IMAGE_INPUT          *Image
-  )
-;
-
-
-/**
-  This function retrieves the image specified by ImageId which is associated with
-  the specified PackageList and copies it into the buffer specified by Image.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             Handle of the package list where this image will
-                                  be searched.
-  @param  ImageId                 The image¡¯s id,, which is unique within
-                                  PackageList.
-  @param  Image                   Points to the image.
-  @param  ImageSize               On entry, points to the size of the buffer
-                                  pointed to by Image, in bytes. On return, points
-                                  to the length of the image, in bytes.
-
-  @retval EFI_SUCCESS             The new image was returned successfully.
-  @retval EFI_NOT_FOUND           The image specified by ImageId is not available.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by ImageSize is too small to
-                                  hold the image.
-  @retval EFI_INVALID_PARAMETER   The Image or ImageSize was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetImage (
-  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                 PackageList,
-  IN  EFI_IMAGE_ID                   ImageId,
-  OUT EFI_IMAGE_INPUT                *Image,
-  OUT UINTN                          *ImageSize
-  )
-;
-
-
-/**
-  This function updates the image specified by ImageId in the specified PackageListHandle to
-  the image specified by Image.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             The package list containing the images.
-  @param  ImageId                 The image¡¯s id,, which is unique within
-                                  PackageList.
-  @param  Image                   Points to the image.
-
-  @retval EFI_SUCCESS             The new image was updated successfully.
-  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The Image was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetImage (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN EFI_IMAGE_ID                    ImageId,
-  IN CONST EFI_IMAGE_INPUT           *Image
-  )
-;
-
-
-/**
-  This function renders an image to a bitmap or the screen using the specified
-  color and options. It draws the image on an existing bitmap, allocates a new
-  bitmap or uses the screen. The images can be clipped.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  Flags                   Describes how the image is to be drawn.
-  @param  Image                   Points to the image to be displayed.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels wide
-                                  and Height pixels high.  The image will be drawn
-                                  onto this image and  EFI_HII_DRAW_FLAG_CLIP is
-                                  implied. If this points to a  NULL on entry, then
-                                  a buffer will be allocated to hold  the generated
-                                  image and the pointer updated on exit. It is the
-                                  caller¡¯s responsibility to free this buffer.
-  @param  BltY                    Specifies the offset from the left and top edge
-                                  of the  output image of the first pixel in the
-                                  image.
-
-  @retval EFI_SUCCESS             The image was successfully drawn.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.
-  @retval EFI_INVALID_PARAMETER   The Image or Blt was NULL.
-  @retval EFI_INVALID_PARAMETER   Any combination of Flags is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiDrawImage (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_DRAW_FLAGS              Flags,
-  IN CONST EFI_IMAGE_INPUT           *Image,
-  IN OUT EFI_IMAGE_OUTPUT            **Blt,
-  IN UINTN                           BltX,
-  IN UINTN                           BltY
-  )
-;
-
-
-/**
-  This function renders an image to a bitmap or the screen using the specified
-  color and options. It draws the image on an existing bitmap, allocates a new
-  bitmap or uses the screen. The images can be clipped.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  Flags                   Describes how the image is to be drawn.
-  @param  PackageList             The package list in the HII database to search
-                                  for the  specified image.
-  @param  ImageId                 The image's id, which is unique within
-                                  PackageList.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels wide
-                                  and Height pixels high. The image will be drawn
-                                  onto this image and
-                                  EFI_HII_DRAW_FLAG_CLIP is implied. If this points
-                                  to a  NULL on entry, then a buffer will be
-                                  allocated to hold  the generated image and the
-                                  pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltY                    Specifies the offset from the left and top edge
-                                  of the  output image of the first pixel in the
-                                  image.
-
-  @retval EFI_SUCCESS             The image was successfully drawn.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.
-  @retval EFI_INVALID_PARAMETER   The Image was NULL.
-  @retval EFI_NOT_FOUND           The specified packagelist could not be found in
-                                  current database.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiDrawImageId (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_DRAW_FLAGS              Flags,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN EFI_IMAGE_ID                    ImageId,
-  IN OUT EFI_IMAGE_OUTPUT            **Blt,
-  IN UINTN                           BltX,
-  IN UINTN                           BltY
-  )
-
-;
-
-//
-// EFI_HII_STRING_PROTOCOL
-//
-
-
-/**
-  This function adds the string String to the group of strings owned by PackageList, with the
-  specified font information StringFontInfo and returns a new string id.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             Handle of the package list where this string will
-                                  be added.
-  @param  StringId                On return, contains the new strings id, which is
-                                  unique within PackageList.
-  @param  Language                Points to the language for the new string.
-  @param  LanguageName            Points to the printable language name to
-                                  associate with the passed in  Language field.If
-                                  LanguageName is not NULL and the string package
-                                  header's LanguageName  associated with a given
-                                  Language is not zero, the LanguageName being
-                                  passed  in will be ignored.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringFontInfo          Points to the new string¡¯s font information or
-                                  NULL if the string should have the default system
-                                  font, size and style.
-
-  @retval EFI_SUCCESS             The new string was added successfully.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    Could not add the string due to lack of
-                                  resources.
-  @retval EFI_INVALID_PARAMETER   String is NULL or StringId is NULL or Language is
-                                  NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewString (
-  IN  CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                  PackageList,
-  OUT EFI_STRING_ID                   *StringId,
-  IN  CONST CHAR8                     *Language,
-  IN  CONST CHAR16                    *LanguageName, OPTIONAL
-  IN  CONST EFI_STRING                String,
-  IN  CONST EFI_FONT_INFO             *StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function retrieves the string specified by StringId which is associated
-  with the specified PackageList in the language Language and copies it into
-  the buffer specified by String.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  Language                Points to the language for the retrieved string.
-  @param  PackageList             The package list in the HII database to search
-                                  for the  specified string.
-  @param  StringId                The string's id, which is unique within
-                                  PackageList.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringSize              On entry, points to the size of the buffer
-                                  pointed to by  String, in bytes. On return,
-                                  points to the length of the string, in bytes.
-  @param  StringFontInfo          If not NULL, points to the string¡¯s font
-                                  information.  It's caller's responsibility to
-                                  free this buffer.
-
-  @retval EFI_SUCCESS             The string was returned successfully.
-  @retval EFI_NOT_FOUND           The string specified by StringId is not
-                                  available.
-  @retval EFI_NOT_FOUND           The string specified by StringId is available but
-                                  not in the specified language.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by StringSize is too small
-                                  to  hold the string.
-  @retval EFI_INVALID_PARAMETER   The String or Language or StringSize was NULL.
-  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the
-                                   request.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetString (
-  IN  CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN  CONST CHAR8                     *Language,
-  IN  EFI_HII_HANDLE                  PackageList,
-  IN  EFI_STRING_ID                   StringId,
-  OUT EFI_STRING                      String,
-  IN  OUT UINTN                       *StringSize,
-  OUT EFI_FONT_INFO                   **StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function updates the string specified by StringId in the specified PackageList to the text
-  specified by String and, optionally, the font information specified by StringFontInfo.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list containing the strings.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  Language                Points to the language for the updated string.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringFontInfo          Points to the string¡¯s font information or NULL
-                                  if the string font information is not changed.
-
-  @retval EFI_SUCCESS             The string was updated successfully.
-  @retval EFI_NOT_FOUND           The string specified by StringId is not in the
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The String or Language was NULL.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetString (
-  IN CONST EFI_HII_STRING_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                   PackageList,
-  IN EFI_STRING_ID                    StringId,
-  IN CONST CHAR8                      *Language,
-  IN CONST EFI_STRING                 String,
-  IN CONST EFI_FONT_INFO              *StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function returns the list of supported languages, in the format specified
-  in Appendix M of UEFI 2.1 spec.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list to examine.
-  @param  Languages               Points to the buffer to hold the returned string.
-  @param  LanguagesSize           On entry, points to the size of the buffer
-                                  pointed to by  Languages, in bytes. On  return,
-                                  points to the length of Languages, in bytes.
-
-  @retval EFI_SUCCESS             The languages were returned successfully.
-  @retval EFI_INVALID_PARAMETER   The Languages or LanguagesSize was NULL.
-  @retval EFI_BUFFER_TOO_SMALL    The LanguagesSize is too small to hold the list
-                                  of  supported languages. LanguageSize is updated
-                                  to contain the required size.
-  @retval EFI_NOT_FOUND           Could not find string package in specified
-                                  packagelist.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetLanguages (
-  IN CONST EFI_HII_STRING_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                   PackageList,
-  IN OUT CHAR8                        *Languages,
-  IN OUT UINTN                        *LanguagesSize
-  )
-;
-
-
-/**
-  Each string package has associated with it a single primary language and zero
-  or more secondary languages. This routine returns the secondary languages
-  associated with a package list.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list to examine.
-  @param  FirstLanguage           Points to the primary language.
-  @param  SecondaryLanguages      Points to the buffer to hold the returned list of
-                                   secondary languages for the specified
-                                  FirstLanguage. If there are no secondary
-                                  languages, the function  returns successfully,
-                                  but this is set to NULL.
-  @param  SecondaryLanguageSize   On entry, points to the size of the buffer
-                                  pointed to  by SecondLanguages, in bytes. On
-                                  return, points to the length of SecondLanguages
-                                  in bytes.
-
-  @retval EFI_SUCCESS             Secondary languages were correctly returned.
-  @retval EFI_INVALID_PARAMETER   FirstLanguage or SecondLanguages or
-                                  SecondLanguagesSize was NULL.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by SecondLanguagesSize is
-                                  too small to hold the returned information.
-                                  SecondLanguageSize is updated to hold the size of
-                                  the buffer required.
-  @retval EFI_NOT_FOUND           The language specified by FirstLanguage is not
-                                  present in the specified package list.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetSecondaryLanguages (
-  IN CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN CONST CHAR8                     *FirstLanguage,
-  IN OUT CHAR8                       *SecondLanguages,
-  IN OUT UINTN                       *SecondLanguagesSize
-  )
-;
-
-//
-// EFI_HII_DATABASE_PROTOCOL protocol interfaces
-//
-
-
-/**
-  This function adds the packages in the package list to the database and returns a handle. If there is a
-  EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
-  create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER
-                                  structure.
-  @param  DriverHandle            Associate the package list with this EFI handle.
-  @param  Handle                  A pointer to the EFI_HII_HANDLE instance.
-
-  @retval EFI_SUCCESS             The package list associated with the Handle was
-                                  added to the HII database.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary resources for the
-                                  new database contents.
-  @retval EFI_INVALID_PARAMETER   PackageList is NULL or Handle is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewPackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList,
-  IN CONST EFI_HANDLE                   DriverHandle,
-  OUT EFI_HII_HANDLE                    *Handle
-  )
-;
-
-
-/**
-  This function removes the package list that is associated with a handle Handle
-  from the HII database. Before removing the package, any registered functions
-  with the notification type REMOVE_PACK and the same package type will be called.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  The handle that was registered to the data that
-                                  is requested  for removal.
-
-  @retval EFI_SUCCESS             The data associated with the Handle was removed
-                                  from  the HII database.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The Handle was not valid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiRemovePackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                     Handle
-  )
-;
-
-
-/**
-  This function updates the existing package list (which has the specified Handle)
-  in the HII databases, using the new package list specified by PackageList.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  The handle that was registered to the data that
-                                  is  requested to be updated.
-  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER
-                                  package.
-
-  @retval EFI_SUCCESS             The HII database was successfully updated.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate enough memory for the updated
-                                  database.
-  @retval EFI_INVALID_PARAMETER   Handle or PackageList was NULL.
-  @retval EFI_NOT_FOUND           The Handle was not valid or could not be found in
-                                  database.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiUpdatePackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                     Handle,
-  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList
-  )
-;
-
-
-/**
-  This function returns a list of the package handles of the specified type
-  that are currently active in the database. The pseudo-type
-  EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageType             Specifies the package type of the packages to
-                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages
-                                  to be listed.
-  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
-                                  this  is the pointer to the GUID which must match
-                                  the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
-                                  Otherwise,  it must be NULL.
-  @param  HandleBufferLength      On input, a pointer to the length of the handle
-                                  buffer.  On output, the length of the handle
-                                  buffer that is required for the handles found.
-  @param  Handle                  An array of EFI_HII_HANDLE instances returned.
-
-  @retval EFI_SUCCESS             The matching handles are outputed successfully.
-  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that
-                                  Handle is too small to support the number of
-                                  handles. HandleBufferLength is updated with a
-                                  value that will  enable the data to fit.
-  @retval EFI_NOT_FOUND           No matching handle could not be found in
-                                  database.
-  @retval EFI_INVALID_PARAMETER   Handle or HandleBufferLength was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiListPackageLists (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  UINT8                             PackageType,
-  IN  CONST EFI_GUID                    *PackageGuid,
-  IN  OUT UINTN                         *HandleBufferLength,
-  OUT EFI_HII_HANDLE                    *Handle
-  )
-;
-
-
-/**
-  This function will export one or all package lists in the database to a buffer.
-  For each package list exported, this function will call functions registered
-  with EXPORT_PACK and then copy the package list to the buffer.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  An EFI_HII_HANDLE that corresponds to the desired
-                                  package list in the HII database to export or
-                                  NULL to indicate  all package lists should be
-                                  exported.
-  @param  BufferSize              On input, a pointer to the length of the buffer.
-                                  On output, the length of the buffer that is
-                                  required for the exported data.
-  @param  Buffer                  A pointer to a buffer that will contain the
-                                  results of  the export function.
-
-  @retval EFI_SUCCESS             Package exported.
-  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that
-                                  Handle is too small to support the number of
-                                  handles.      HandleBufferLength is updated with
-                                  a value that will enable the data to fit.
-  @retval EFI_NOT_FOUND           The specifiecd Handle could not be found in the
-                                  current database.
-  @retval EFI_INVALID_PARAMETER   Handle or Buffer or BufferSize was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiExportPackageLists (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                    Handle,
-  IN  OUT UINTN                         *BufferSize,
-  OUT EFI_HII_PACKAGE_LIST_HEADER       *Buffer
-  )
-;
-
-
-/**
-  This function registers a function which will be called when specified actions related to packages of
-  the specified type occur in the HII database. By registering a function, other HII-related drivers are
-  notified when specific package types are added, removed or updated in the HII database.
-  Each driver or application which registers a notification should use
-  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageType             Specifies the package type of the packages to
-                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages
-                                  to be listed.
-  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
-                                  this is the pointer to the GUID which must match
-                                  the Guid field of
-                                  EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
-                                  be NULL.
-  @param  PackageNotifyFn         Points to the function to be called when the
-                                  event specified by
-                                  NotificationType occurs.
-  @param  NotifyType              Describes the types of notification which this
-                                  function will be receiving.
-  @param  NotifyHandle            Points to the unique handle assigned to the
-                                  registered notification. Can be used in
-                                  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
-                                  to stop notifications.
-
-  @retval EFI_SUCCESS             Notification registered successfully.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary data structures
-  @retval EFI_INVALID_PARAMETER   NotifyHandle is NULL.
-  @retval EFI_INVALID_PARAMETER   PackageGuid is not NULL when PackageType is not
-                                  EFI_HII_PACKAGE_TYPE_GUID.
-  @retval EFI_INVALID_PARAMETER   PackageGuid is NULL when PackageType is
-                                  EFI_HII_PACKAGE_TYPE_GUID.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiRegisterPackageNotify (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  UINT8                             PackageType,
-  IN  CONST EFI_GUID                    *PackageGuid,
-  IN  CONST EFI_HII_DATABASE_NOTIFY     PackageNotifyFn,
-  IN  EFI_HII_DATABASE_NOTIFY_TYPE      NotifyType,
-  OUT EFI_HANDLE                        *NotifyHandle
-  )
-;
-
-
-/**
-  Removes the specified HII database package-related notification.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  NotifyHandle            The handle of the notification function being
-                                  unregistered.
-
-  @retval EFI_SUCCESS             Notification is unregistered successfully.
-  @retval EFI_INVALID_PARAMETER   The Handle is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiUnregisterPackageNotify (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HANDLE                         NotificationHandle
-  )
-;
-
-
-/**
-  This routine retrieves an array of GUID values for each keyboard layout that
-  was previously registered in the system.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuidBufferLength     On input, a pointer to the length of the keyboard
-                                  GUID  buffer. On output, the length of the handle
-                                  buffer  that is required for the handles found.
-  @param  KeyGuidBuffer           An array of keyboard layout GUID instances
-                                  returned.
-
-  @retval EFI_SUCCESS             KeyGuidBuffer was updated successfully.
-  @retval EFI_BUFFER_TOO_SMALL    The KeyGuidBufferLength parameter indicates
-                                  that KeyGuidBuffer is too small to support the
-                                  number of GUIDs. KeyGuidBufferLength is
-                                  updated with a value that will enable the data to
-                                  fit.
-  @retval EFI_INVALID_PARAMETER   The KeyGuidBuffer or KeyGuidBufferLength was
-                                  NULL.
-  @retval EFI_NOT_FOUND           There was no keyboard layout.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiFindKeyboardLayouts (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  OUT UINT16                        *KeyGuidBufferLength,
-  OUT EFI_GUID                          *KeyGuidBuffer
-  )
-;
-
-
-/**
-  This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
-  on a keyboard and the character(s) that are associated with a particular set of key strokes.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuid                 A pointer to the unique ID associated with a
-                                  given keyboard layout. If KeyGuid is NULL then
-                                  the current layout will be retrieved.
-  @param  KeyboardLayoutLength    On input, a pointer to the length of the
-                                  KeyboardLayout buffer.  On output, the length of
-                                  the data placed into KeyboardLayout.
-  @param  KeyboardLayout          A pointer to a buffer containing the retrieved
-                                  keyboard layout.
-
-  @retval EFI_SUCCESS             The keyboard layout was retrieved successfully.
-  @retval EFI_NOT_FOUND           The requested keyboard layout was not found.
-  @retval EFI_INVALID_PARAMETER   The KeyboardLayout or KeyboardLayoutLength was
-                                  NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetKeyboardLayout (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  CONST EFI_GUID                          *KeyGuid,
-  IN OUT UINT16                         *KeyboardLayoutLength,
-  OUT EFI_HII_KEYBOARD_LAYOUT           *KeyboardLayout
-  )
-;
-
-
-/**
-  This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
-  is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
-  group type. This is so that agents which are sensitive to the current keyboard layout being changed
-  can be notified of this change.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuid                 A pointer to the unique ID associated with a
-                                  given keyboard layout.
-
-  @retval EFI_SUCCESS             The current keyboard layout was successfully set.
-  @retval EFI_NOT_FOUND           The referenced keyboard layout was not found, so
-                                  action was taken.
-  @retval EFI_INVALID_PARAMETER   The KeyGuid was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetKeyboardLayout (
-  IN CONST EFI_HII_DATABASE_PROTOCOL          *This,
-  IN CONST EFI_GUID                           *KeyGuid
-  )
-;
-
-
-/**
-  Return the EFI handle associated with a package list.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageListHandle       An EFI_HII_HANDLE that corresponds to the desired
-                                  package list in the HIIdatabase.
-  @param  DriverHandle            On return, contains the EFI_HANDLE which was
-                                  registered with the package list in
-                                  NewPackageList().
-
-  @retval EFI_SUCCESS             The DriverHandle was returned successfully.
-  @retval EFI_INVALID_PARAMETER   The PackageListHandle was not valid or
-                                  DriverHandle was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetPackageListHandle (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL         *This,
-  IN  EFI_HII_HANDLE                    PackageListHandle,
-  OUT EFI_HANDLE                        *DriverHandle
-  )
-;
-
-//
-// EFI_HII_CONFIG_ROUTING_PROTOCOL interfaces
-//
-
-
-/**
-  This function allows a caller to extract the current configuration
-  for one or more named elements from one or more drivers.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Request                 A null-terminated Unicode string in
-                                  <MultiConfigRequest> format.
-  @param  Progress                On return, points to a character in the Request
-                                  string. Points to the string's null terminator if
-                                  request was successful. Points to the most recent
-                                  & before the first failing name / value pair (or
-                                  the beginning of the string if the failure is in
-                                  the first name / value pair) if the request was
-                                  not successful.
-  @param  Results                 Null-terminated Unicode string in
-                                  <MultiConfigAltResp> format which has all values
-                                  filled in for the names in the Request string.
-                                  String to be allocated by the called function.
-
-  @retval EFI_SUCCESS             The Results string is filled with the values
-                                  corresponding to all requested names.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_NOT_FOUND           Routing data doesn¡¯t match any known driver.
-                                     Progress set to the ¡°G¡± in ¡°GUID¡± of the
-                                  routing  header that doesn¡¯t match. Note: There
-                                  is no         requirement that all routing data
-                                  be validated before any configuration extraction.
-  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Request
-                                  parameter would result in this type of error. The
-                                  Progress parameter is set to NULL.
-  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set to most recent &
-                                  before the error or the beginning of the string.
-  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points to the & before the
-                                  name in question.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingExtractConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       Request,
-  OUT EFI_STRING                             *Progress,
-  OUT EFI_STRING                             *Results
-  )
-;
-
-
-/**
-  This function allows the caller to request the current configuration for the
-  entirety of the current HII database and returns the data in a null-terminated Unicode string.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Results                 Null-terminated Unicode string in
-                                  <MultiConfigAltResp> format which has all values
-                                  filled in for the names in the Request string.
-                                  String to be allocated by the  called function.
-                                  De-allocation is up to the caller.
-
-  @retval EFI_SUCCESS             The Results string is filled with the values
-                                  corresponding to all requested names.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Results
-                                  parameter would result in this type of error.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingExportConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  OUT EFI_STRING                             *Results
-  )
-;
-
-
-/**
-  This function processes the results of processing forms and routes it to the
-  appropriate handlers or storage.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Configuration           A null-terminated Unicode string in
-                                  <MulltiConfigResp> format.
-  @param  Progress                A pointer to a string filled in with the offset
-                                  of the most recent & before the first failing
-                                  name / value pair (or the beginning of the string
-                                  if the failure is in the first name / value pair)
-                                  or the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The results have been distributed or are awaiting
-                                  distribution.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the Configuration parameter
-                                  would result in this type of error.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingRoutConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       Configuration,
-  OUT EFI_STRING                             *Progress
-  )
-;
-
-
-
-/**
-  This helper function is to be called by drivers to map configuration data stored
-  in byte array (¡°block¡±) formats such as UEFI Variables into current configuration strings.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  ConfigRequest           A null-terminated Unicode string in
-                                  <ConfigRequest> format.
-  @param  Block                   Array of bytes defining the block's
-                                  configuration.
-  @param  BlockSize               Length in bytes of Block.
-  @param  Config                  Filled-in configuration string. String allocated
-                                  by  the function. Returned only if call is
-                                  successful.
-  @param  Progress                A pointer to a string filled in with the offset
-                                  of  the most recent & before the first failing
-                                  name/value pair (or the beginning of the string
-                                  if the failure is in the first name / value pair)
-                                  or the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. Progress points to the
-                                  null terminator at the end of the ConfigRequest
-                                        string.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.
-                                  Progress points to the first character of
-                                  ConfigRequest.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigRequest or
-                                  Block parameter would result in this type of
-                                  error. Progress points to the first character of
-                                  ConfigRequest.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found. Progress points to the ¡°G¡± in ¡°GUID¡± of
-                                  the      errant routing data.
-  @retval EFI_DEVICE_ERROR        Block not large enough. Progress undefined.
-  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted string.
-                                       Block is left updated and Progress points at
-                                  the ¡®&¡¯ preceding the first non-<BlockName>.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiBlockToConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       ConfigRequest,
-  IN  CONST UINT8                            *Block,
-  IN  CONST UINTN                            BlockSize,
-  OUT EFI_STRING                             *Config,
-  OUT EFI_STRING                             *Progress
-  )
-;
-
-
-/**
-  This helper function is to be called by drivers to map configuration strings
-  to configurations stored in byte array (¡°block¡±) formats such as UEFI Variables.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  ConfigResp              A null-terminated Unicode string in <ConfigResp>
-                                  format.
-  @param  Block                   A possibly null array of bytes representing the
-                                  current  block. Only bytes referenced in the
-                                  ConfigResp string  in the block are modified. If
-                                  this parameter is null or if the *BlockSize
-                                  parameter is (on input) shorter than required by
-                                  the Configuration string, only the BlockSize
-                                  parameter is updated and an appropriate status
-                                  (see below)  is returned.
-  @param  BlockSize               The length of the Block in units of UINT8.  On
-                                  input, this is the size of the Block. On output,
-                                  if successful, contains the index of the  last
-                                  modified byte in the Block.
-  @param  Progress                On return, points to an element of the ConfigResp
-                                   string filled in with the offset of the most
-                                  recent '&' before the first failing name / value
-                                  pair (or  the beginning of the string if the
-                                  failure is in the  first name / value pair) or
-                                  the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. Progress points to the
-                                  null terminator at the end of the ConfigResp
-                                  string.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.
-                                  Progress points to the first character of
-                                  ConfigResp.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigResp or
-                                  Block parameter would result in this type of
-                                  error. Progress points to the first character of
-                                           ConfigResp.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found. Progress points to the ¡°G¡± in ¡°GUID¡± of
-                                  the      errant routing data.
-  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted name /
-                                  value pair. Block is left updated and
-                                  Progress points at the ¡®&¡¯ preceding the first
-                                  non-<BlockName>.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigToBlock (
-  IN     CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
-  IN     CONST EFI_STRING                      ConfigResp,
-  IN OUT UINT8                                 *Block,
-  IN OUT UINTN                                 *BlockSize,
-  OUT    EFI_STRING                            *Progress
-  )
-;
-
-
-/**
-  This helper function is to be called by drivers to extract portions of
-  a larger configuration string.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Configuration           A null-terminated Unicode string in
-                                  <MultiConfigAltResp> format.
-  @param  Guid                    A pointer to the GUID value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If Guid is NULL,
-                                  then all GUID  values will be searched for.
-  @param  Name                    A pointer to the NAME value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If Name is NULL,
-                                  then all Name  values will be searched for.
-  @param  DevicePath              A pointer to the PATH value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If DevicePath is
-                                  NULL, then all  DevicePath values will be
-                                  searched for.
-  @param  AltCfgId                A pointer to the ALTCFG value to search for in
-                                  the  routing portion of the ConfigResp string
-                                  when retrieving  the requested data.  If this
-                                  parameter is NULL,  then the current setting will
-                                  be retrieved.
-  @param  AltCfgResp              A pointer to a buffer which will be allocated by
-                                  the  function which contains the retrieved string
-                                  as requested.   This buffer is only allocated if
-                                  the call was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. The requested data was
-                                  extracted  and placed in the newly allocated
-                                  AltCfgResp buffer.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate AltCfgResp.
-  @retval EFI_INVALID_PARAMETER   Any parameter is invalid.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetAltCfg (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL    *This,
-  IN  CONST EFI_STRING                         Configuration,
-  IN  CONST EFI_GUID                           *Guid,
-  IN  CONST EFI_STRING                         Name,
-  IN  CONST EFI_DEVICE_PATH_PROTOCOL           *DevicePath,
-  IN  CONST UINT16                             *AltCfgId,
-  OUT EFI_STRING                               *AltCfgResp
-  )
-;
-
-
-//
-// Global variables
-//
-extern EFI_EVENT gHiiKeyboardLayoutChanged;
-
-#include "R8Lib.h"
-
-#endif
+/** @file\r
+Private structures definitions in HiiDatabase.\r
+\r
+Copyright (c) 2007 - 2009, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __HII_DATABASE_PRIVATE_H__\r
+#define __HII_DATABASE_PRIVATE_H__\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Protocol/DevicePath.h>\r
+#include <Protocol/HiiFont.h>\r
+#include <Protocol/HiiImage.h>\r
+#include <Protocol/HiiString.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/SimpleTextOut.h>\r
+\r
+#include <Guid/HiiKeyBoardLayout.h>\r
+#include <Guid/GlobalVariable.h>\r
+\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/PrintLib.h>\r
+\r
+\r
+#define HII_DATABASE_NOTIFY_GUID \\r
+  { \\r
+    0xc1c76, 0xd79e, 0x42fe, {0x86, 0xb, 0x8b, 0xe8, 0x7b, 0x3e, 0x7a, 0x78} \\r
+  }\r
+\r
+#define MAX_STRING_LENGTH                  1024\r
+#define MAX_FONT_NAME_LEN                  256\r
+#define NARROW_BASELINE                    15\r
+#define WIDE_BASELINE                      14\r
+#define SYS_FONT_INFO_MASK                 0x37\r
+#define REPLACE_UNKNOWN_GLYPH              0xFFFD\r
+#define PROPORTIONAL_GLYPH                 0x80\r
+#define NARROW_GLYPH                       0x40\r
+\r
+#define BITMAP_LEN_1_BIT(Width, Height)  (((Width) + 7) / 8 * (Height))\r
+#define BITMAP_LEN_4_BIT(Width, Height)  (((Width) + 1) / 2 * (Height))\r
+#define BITMAP_LEN_8_BIT(Width, Height)  ((Width) * (Height))\r
+#define BITMAP_LEN_24_BIT(Width, Height) ((Width) * (Height) * 3)\r
+\r
+//\r
+// IFR data structure\r
+//\r
+// BASE_CR (a, IFR_DEFAULT_VALUE_DATA, Entry) to get the whole structure.\r
+\r
+typedef struct {\r
+  LIST_ENTRY          Entry;             // Link to VarStorage\r
+  EFI_GUID            Guid;\r
+  CHAR16              *Name;\r
+  EFI_VARSTORE_ID     VarStoreId;\r
+  UINT16              Size;\r
+  LIST_ENTRY          BlockEntry;        // Link to its Block array\r
+} IFR_VARSTORAGE_DATA;\r
+\r
+typedef struct {\r
+  LIST_ENTRY          Entry;             // Link to Block array\r
+  UINT16              Offset;\r
+  UINT16              Width;\r
+  EFI_QUESTION_ID     QuestionId;\r
+  UINT8               OpCode;\r
+  UINT8               Scope;\r
+  LIST_ENTRY          DefaultValueEntry; // Link to its default value array\r
+} IFR_BLOCK_DATA;\r
+\r
+typedef struct {\r
+  LIST_ENTRY          Entry;\r
+  UINT8               OpCode;\r
+  EFI_STRING_ID       DefaultName;\r
+  UINT16              DefaultId;\r
+  UINT64              Value;\r
+} IFR_DEFAULT_DATA;\r
+\r
+//\r
+// Storage types\r
+//\r
+#define EFI_HII_VARSTORE_BUFFER            0\r
+#define EFI_HII_VARSTORE_NAME_VALUE        1\r
+#define EFI_HII_VARSTORE_EFI_VARIABLE      2\r
+\r
+#define HII_FORMSET_STORAGE_SIGNATURE           SIGNATURE_32 ('H', 'S', 'T', 'G')\r
+typedef struct {\r
+  UINTN               Signature;\r
+  LIST_ENTRY          Entry;\r
+\r
+  EFI_HII_HANDLE      HiiHandle;\r
+  EFI_HANDLE          DriverHandle;\r
+\r
+  UINT8               Type;   // EFI_HII_VARSTORE_BUFFER, EFI_HII_VARSTORE_NAME_VALUE, EFI_HII_VARSTORE_EFI_VARIABLE\r
+  EFI_GUID            Guid;\r
+  CHAR16              *Name;\r
+  UINT16              Size;\r
+} HII_FORMSET_STORAGE;\r
+\r
+\r
+//\r
+// String Package definitions\r
+//\r
+#define HII_STRING_PACKAGE_SIGNATURE    SIGNATURE_32 ('h','i','s','p')\r
+typedef struct _HII_STRING_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_STRING_PACKAGE_HDR            *StringPkgHdr;\r
+  UINT8                                 *StringBlock;\r
+  LIST_ENTRY                            StringEntry;\r
+  LIST_ENTRY                            FontInfoList;  // local font info list\r
+  UINT8                                 FontId;\r
+} HII_STRING_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Form Package definitions\r
+//\r
+#define HII_IFR_PACKAGE_SIGNATURE       SIGNATURE_32 ('h','f','r','p')\r
+typedef struct _HII_IFR_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_PACKAGE_HEADER                FormPkgHdr;\r
+  UINT8                                 *IfrData;\r
+  LIST_ENTRY                            IfrEntry;\r
+} HII_IFR_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Simple Font Package definitions\r
+//\r
+#define HII_S_FONT_PACKAGE_SIGNATURE    SIGNATURE_32 ('h','s','f','p')\r
+typedef struct _HII_SIMPLE_FONT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_SIMPLE_FONT_PACKAGE_HDR       *SimpleFontPkgHdr;\r
+  LIST_ENTRY                            SimpleFontEntry;\r
+} HII_SIMPLE_FONT_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Font Package definitions\r
+//\r
+#define HII_FONT_PACKAGE_SIGNATURE      SIGNATURE_32 ('h','i','f','p')\r
+typedef struct _HII_FONT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_FONT_PACKAGE_HDR              *FontPkgHdr;\r
+  UINT8                                 *GlyphBlock;\r
+  LIST_ENTRY                            FontEntry;\r
+  LIST_ENTRY                            GlyphInfoList;\r
+} HII_FONT_PACKAGE_INSTANCE;\r
+\r
+#define HII_GLYPH_INFO_SIGNATURE        SIGNATURE_32 ('h','g','i','s')\r
+typedef struct _HII_GLYPH_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  CHAR16                                CharId;\r
+  EFI_HII_GLYPH_INFO                    Cell;\r
+} HII_GLYPH_INFO;\r
+\r
+#define HII_FONT_INFO_SIGNATURE         SIGNATURE_32 ('h','l','f','i')\r
+typedef struct _HII_FONT_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  LIST_ENTRY                            *GlobalEntry;\r
+  UINT8                                 FontId;\r
+} HII_FONT_INFO;\r
+\r
+#define HII_GLOBAL_FONT_INFO_SIGNATURE  SIGNATURE_32 ('h','g','f','i')\r
+typedef struct _HII_GLOBAL_FONT_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  HII_FONT_PACKAGE_INSTANCE             *FontPackage;\r
+  UINTN                                 FontInfoSize;\r
+  EFI_FONT_INFO                         *FontInfo;\r
+} HII_GLOBAL_FONT_INFO;\r
+\r
+//\r
+// Image Package definitions\r
+//\r
+\r
+#define HII_PIXEL_MASK                  0x80\r
+\r
+typedef struct _HII_IMAGE_PACKAGE_INSTANCE {\r
+  EFI_HII_IMAGE_PACKAGE_HDR             ImagePkgHdr;\r
+  UINT32                                ImageBlockSize;\r
+  UINT32                                PaletteInfoSize;\r
+  UINT8                                 *ImageBlock;\r
+  UINT8                                 *PaletteBlock;\r
+} HII_IMAGE_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Keyboard Layout Pacakge definitions\r
+//\r
+#define HII_KB_LAYOUT_PACKAGE_SIGNATURE SIGNATURE_32 ('h','k','l','p')\r
+typedef struct _HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  UINT8                                 *KeyboardPkg;\r
+  LIST_ENTRY                            KeyboardEntry;\r
+} HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Guid Package definitions\r
+//\r
+#define HII_GUID_PACKAGE_SIGNATURE      SIGNATURE_32 ('h','i','g','p')\r
+typedef struct _HII_GUID_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  UINT8                                 *GuidPkg;\r
+  LIST_ENTRY                            GuidEntry;\r
+} HII_GUID_PACKAGE_INSTANCE;\r
+\r
+//\r
+// A package list can contain only one or less than one device path package.\r
+// This rule also applies to image package since ImageId can not be duplicate.\r
+//\r
+typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE {\r
+  EFI_HII_PACKAGE_LIST_HEADER           PackageListHdr;\r
+  LIST_ENTRY                            GuidPkgHdr;\r
+  LIST_ENTRY                            FormPkgHdr;\r
+  LIST_ENTRY                            KeyboardLayoutHdr;\r
+  LIST_ENTRY                            StringPkgHdr;\r
+  LIST_ENTRY                            FontPkgHdr;\r
+  HII_IMAGE_PACKAGE_INSTANCE            *ImagePkg;\r
+  LIST_ENTRY                            SimpleFontPkgHdr;\r
+  UINT8                                 *DevicePathPkg;\r
+} HII_DATABASE_PACKAGE_LIST_INSTANCE;\r
+\r
+#define HII_HANDLE_SIGNATURE            SIGNATURE_32 ('h','i','h','l')\r
+\r
+typedef struct {\r
+  UINTN               Signature;\r
+  LIST_ENTRY          Handle;\r
+  UINTN               Key;\r
+} HII_HANDLE;\r
+\r
+#define HII_DATABASE_RECORD_SIGNATURE   SIGNATURE_32 ('h','i','d','r')\r
+\r
+typedef struct _HII_DATABASE_RECORD {\r
+  UINTN                                 Signature;\r
+  HII_DATABASE_PACKAGE_LIST_INSTANCE    *PackageList;\r
+  EFI_HANDLE                            DriverHandle;\r
+  EFI_HII_HANDLE                        Handle;\r
+  LIST_ENTRY                            DatabaseEntry;\r
+} HII_DATABASE_RECORD;\r
+\r
+#define HII_DATABASE_NOTIFY_SIGNATURE   SIGNATURE_32 ('h','i','d','n')\r
+\r
+typedef struct _HII_DATABASE_NOTIFY {\r
+  UINTN                                 Signature;\r
+  EFI_HANDLE                            NotifyHandle;\r
+  UINT8                                 PackageType;\r
+  EFI_GUID                              *PackageGuid;\r
+  EFI_HII_DATABASE_NOTIFY               PackageNotifyFn;\r
+  EFI_HII_DATABASE_NOTIFY_TYPE          NotifyType;\r
+  LIST_ENTRY                            DatabaseNotifyEntry;\r
+} HII_DATABASE_NOTIFY;\r
+\r
+#define HII_DATABASE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('H', 'i', 'D', 'p')\r
+\r
+typedef struct _HII_DATABASE_PRIVATE_DATA {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            DatabaseList;\r
+  LIST_ENTRY                            DatabaseNotifyList;\r
+  EFI_HII_FONT_PROTOCOL                 HiiFont;\r
+  EFI_HII_IMAGE_PROTOCOL                HiiImage;\r
+  EFI_HII_STRING_PROTOCOL               HiiString;\r
+  EFI_HII_DATABASE_PROTOCOL             HiiDatabase;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL       ConfigRouting;\r
+  LIST_ENTRY                            HiiHandleList;\r
+  INTN                                  HiiHandleCount;\r
+  LIST_ENTRY                            FontInfoList;  // global font info list\r
+  UINTN                                 Attribute;     // default system color\r
+  EFI_GUID                              CurrentLayoutGuid;\r
+  EFI_HII_KEYBOARD_LAYOUT               *CurrentLayout;\r
+} HII_DATABASE_PRIVATE_DATA;\r
+\r
+#define HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiFont, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiImage, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiString, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiDatabase, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      ConfigRouting, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+//\r
+// Internal function prototypes.\r
+//\r
+\r
+/**\r
+  This function checks whether a handle is a valid EFI_HII_HANDLE.\r
+\r
+  @param  Handle                  Pointer to a EFI_HII_HANDLE\r
+\r
+  @retval TRUE                    Valid\r
+  @retval FALSE                   Invalid\r
+\r
+**/\r
+BOOLEAN\r
+IsHiiHandleValid (\r
+  EFI_HII_HANDLE Handle\r
+  );\r
+\r
+\r
+/**\r
+  This function checks whether EFI_FONT_INFO exists in current database. If\r
+  FontInfoMask is specified, check what options can be used to make a match.\r
+  Note that the masks relate to where the system default should be supplied\r
+  are ignored by this function.\r
+\r
+  @param  Private                 Hii database private structure.\r
+  @param  FontInfo                Points to EFI_FONT_INFO structure.\r
+  @param  FontInfoMask            If not NULL, describes what options can be used\r
+                                  to make a match between the font requested and\r
+                                  the font available. The caller must guarantee\r
+                                  this mask is valid.\r
+  @param  FontHandle              On entry, Points to the font handle returned by a\r
+                                  previous  call to GetFontInfo() or NULL to start\r
+                                  with the first font.\r
+  @param  GlobalFontInfo          If not NULL, output the corresponding globa font\r
+                                  info.\r
+\r
+  @retval TRUE                    Existed\r
+  @retval FALSE                   Not existed\r
+\r
+**/\r
+BOOLEAN\r
+IsFontInfoExisted (\r
+  IN  HII_DATABASE_PRIVATE_DATA *Private,\r
+  IN  EFI_FONT_INFO             *FontInfo,\r
+  IN  EFI_FONT_INFO_MASK        *FontInfoMask,   OPTIONAL\r
+  IN  EFI_FONT_HANDLE           FontHandle,      OPTIONAL\r
+  OUT HII_GLOBAL_FONT_INFO      **GlobalFontInfo OPTIONAL\r
+  );\r
+\r
+/**\r
+\r
+   This function invokes the matching registered function.\r
+    \r
+   @param  Private           HII Database driver private structure.\r
+   @param  NotifyType        The type of change concerning the database.\r
+   @param  PackageInstance   Points to the package referred to by the notification.\r
+   @param  PackageType       Package type\r
+   @param  Handle            The handle of the package list which contains the specified package.\r
+    \r
+   @retval EFI_SUCCESS            Already checked all registered function and invoked \r
+                                  if matched.\r
+   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
+     \r
+**/\r
+EFI_STATUS\r
+InvokeRegisteredFunction (\r
+  IN HII_DATABASE_PRIVATE_DATA    *Private, \r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
+  IN VOID                         *PackageInstance,\r
+  IN UINT8                        PackageType,\r
+  IN EFI_HII_HANDLE               Handle\r
+  )\r
+;\r
+\r
+/**\r
+  Retrieve system default font and color.\r
+\r
+  @param  Private                 HII database driver private data.\r
+  @param  FontInfo                Points to system default font output-related\r
+                                  information. It's caller's responsibility to free\r
+                                  this buffer.\r
+  @param  FontInfoSize            If not NULL, output the size of buffer FontInfo.\r
+\r
+  @retval EFI_SUCCESS             Cell information is added to the GlyphInfoList.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+  @retval EFI_INVALID_PARAMETER   Any input parameter is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+GetSystemFont (\r
+  IN  HII_DATABASE_PRIVATE_DATA      *Private,\r
+  OUT EFI_FONT_DISPLAY_INFO          **FontInfo,\r
+  OUT UINTN                          *FontInfoSize OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Parse all string blocks to find a String block specified by StringId.\r
+  If StringId = (EFI_STRING_ID) (-1), find out all EFI_HII_SIBT_FONT blocks\r
+  within this string package and backup its information.\r
+  If StringId = 0, output the string id of last string block (EFI_HII_SIBT_END).\r
+\r
+  @param  Private                 Hii database private structure.\r
+  @param  StringPackage           Hii string package instance.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  BlockType               Output the block type of found string block.\r
+  @param  StringBlockAddr         Output the block address of found string block.\r
+  @param  StringTextOffset        Offset, relative to the found block address, of\r
+                                  the  string text information.\r
+  @param  LastStringId            Output the last string id when StringId = 0.\r
+\r
+  @retval EFI_SUCCESS             The string text and font is retrieved\r
+                                  successfully.\r
+  @retval EFI_NOT_FOUND           The specified text or font info can not be found\r
+                                  out.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+FindStringBlock (\r
+  IN HII_DATABASE_PRIVATE_DATA        *Private,\r
+  IN  HII_STRING_PACKAGE_INSTANCE     *StringPackage,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT UINT8                           *BlockType, OPTIONAL\r
+  OUT UINT8                           **StringBlockAddr, OPTIONAL\r
+  OUT UINTN                           *StringTextOffset, OPTIONAL\r
+  OUT EFI_STRING_ID                   *LastStringId OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Parse all glyph blocks to find a glyph block specified by CharValue.\r
+  If CharValue = (CHAR16) (-1), collect all default character cell information\r
+  within this font package and backup its information.\r
+\r
+  @param  FontPackage             Hii string package instance.\r
+  @param  CharValue               Unicode character value, which identifies a glyph\r
+                                  block.\r
+  @param  GlyphBuffer             Output the corresponding bitmap data of the found\r
+                                  block. It is the caller's responsiblity to free\r
+                                  this buffer.\r
+  @param  Cell                    Output cell information of the encoded bitmap.\r
+  @param  GlyphBufferLen          If not NULL, output the length of GlyphBuffer.\r
+\r
+  @retval EFI_SUCCESS             The bitmap data is retrieved successfully.\r
+  @retval EFI_NOT_FOUND           The specified CharValue does not exist in current\r
+                                  database.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+FindGlyphBlock (\r
+  IN  HII_FONT_PACKAGE_INSTANCE      *FontPackage,\r
+  IN  CHAR16                         CharValue,\r
+  OUT UINT8                          **GlyphBuffer, OPTIONAL\r
+  OUT EFI_HII_GLYPH_INFO             *Cell, OPTIONAL\r
+  OUT UINTN                          *GlyphBufferLen OPTIONAL\r
+  );\r
+\r
+/**\r
+  This function exports Form packages to a buffer.\r
+  This is a internal function.\r
+\r
+  @param  Private                Hii database private structure.\r
+  @param  Handle                 Identification of a package list.\r
+  @param  PackageList            Pointer to a package list which will be exported.\r
+  @param  UsedSize               The length of buffer be used.\r
+  @param  BufferSize             Length of the Buffer.\r
+  @param  Buffer                 Allocated space for storing exported data.\r
+  @param  ResultSize             The size of the already exported content of  this\r
+                                 package list.\r
+\r
+  @retval EFI_SUCCESS            Form Packages are exported successfully.\r
+  @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+ExportFormPackages (\r
+  IN HII_DATABASE_PRIVATE_DATA          *Private,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
+  IN UINTN                              UsedSize,\r
+  IN UINTN                              BufferSize,\r
+  IN OUT VOID                           *Buffer,\r
+  IN OUT UINTN                          *ResultSize\r
+  );\r
+\r
+//\r
+// EFI_HII_FONT_PROTOCOL protocol interfaces\r
+//\r
+\r
+\r
+/**\r
+  Renders a string to a bitmap or to the display.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Flags                   Describes how the string is to be drawn.\r
+  @param  String                  Points to the null-terminated string to be\r
+                                  displayed.\r
+  @param  StringInfo              Points to the string output information,\r
+                                  including the color and font.  If NULL, then the\r
+                                  string will be output in the default system font\r
+                                  and color.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels   wide\r
+                                  and Height pixels high. The string will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
+                                  to a NULL on entry, then a              buffer\r
+                                  will be allocated to hold the generated image and\r
+                                  the pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltX                    Together with BltX, Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  BltY                    Together with BltY, Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this\r
+                                  will point to an allocated buffer    containing\r
+                                  row information and RowInfoArraySize will be\r
+                                  updated to contain the        number of elements.\r
+                                  This array describes the characters which were at\r
+                                  least partially drawn and the heights of the\r
+                                  rows. It is the caller's responsibility to free\r
+                                  this buffer.\r
+  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
+                                  contains the number of elements in RowInfoArray.\r
+  @param  ColumnInfoArray         If this is non-NULL, then on return it will be\r
+                                  filled with the horizontal offset for each\r
+                                  character in the string on the row where it is\r
+                                  displayed. Non-printing characters will     have\r
+                                  the offset ~0. The caller is responsible to\r
+                                  allocate a buffer large enough so that    there\r
+                                  is one entry for each character in the string,\r
+                                  not including the null-terminator. It is possible\r
+                                  when character display is normalized that some\r
+                                  character cells overlap.\r
+\r
+  @retval EFI_SUCCESS             The string was successfully rendered.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for\r
+                                  RowInfoArray or Blt.\r
+  @retval EFI_INVALID_PARAMETER The String or Blt.\r
+  @retval EFI_INVALID_PARAMETER Flags were invalid combination..\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiStringToImage (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  EFI_HII_OUT_FLAGS              Flags,\r
+  IN  CONST EFI_STRING               String,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,\r
+  IN  OUT EFI_IMAGE_OUTPUT           **Blt,\r
+  IN  UINTN                          BltX,\r
+  IN  UINTN                          BltY,\r
+  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,\r
+  OUT UINTN                          *RowInfoArraySize OPTIONAL,\r
+  OUT UINTN                          *ColumnInfoArray  OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Render a string to a bitmap or the screen containing the contents of the specified string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Flags                   Describes how the string is to be drawn.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for the specified string.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  Language                Points to the language for the retrieved string.\r
+                                  If NULL, then the current system language is\r
+                                  used.\r
+  @param  StringInfo              Points to the string output information,\r
+                                  including the color and font.  If NULL, then the\r
+                                  string will be output in the default system font\r
+                                  and color.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels   wide\r
+                                  and Height pixels high. The string will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
+                                  to a NULL on entry, then a              buffer\r
+                                  will be allocated to hold the generated image and\r
+                                  the pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltX                    Together with BltX, Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  BltY                    Together with BltY, Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this\r
+                                  will point to an allocated buffer    containing\r
+                                  row information and RowInfoArraySize will be\r
+                                  updated to contain the        number of elements.\r
+                                  This array describes the characters which were at\r
+                                  least partially drawn and the heights of the\r
+                                  rows. It is the caller's responsibility to free\r
+                                  this buffer.\r
+  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
+                                  contains the number of elements in RowInfoArray.\r
+  @param  ColumnInfoArray         If this is non-NULL, then on return it will be\r
+                                  filled with the horizontal offset for each\r
+                                  character in the string on the row where it is\r
+                                  displayed. Non-printing characters will     have\r
+                                  the offset ~0. The caller is responsible to\r
+                                  allocate a buffer large enough so that    there\r
+                                  is one entry for each character in the string,\r
+                                  not including the null-terminator. It is possible\r
+                                  when character display is normalized that some\r
+                                  character cells overlap.\r
+\r
+  @retval EFI_SUCCESS             The string was successfully rendered.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for\r
+                                  RowInfoArray or Blt.\r
+  @retval EFI_INVALID_PARAMETER The Blt or PackageList was NULL.\r
+  @retval EFI_INVALID_PARAMETER Flags were invalid combination.\r
+  @retval EFI_NOT_FOUND         The specified PackageList is not in the Database or the stringid is not \r
+                          in the specified PackageList. \r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiStringIdToImage (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  EFI_HII_OUT_FLAGS              Flags,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  IN  EFI_STRING_ID                  StringId,\r
+  IN  CONST CHAR8*                   Language,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,\r
+  IN  OUT EFI_IMAGE_OUTPUT           **Blt,\r
+  IN  UINTN                          BltX,\r
+  IN  UINTN                          BltY,\r
+  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,\r
+  OUT UINTN                          *RowInfoArraySize OPTIONAL,\r
+  OUT UINTN                          *ColumnInfoArray  OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Convert the glyph for a single character into a bitmap.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Char                    Character to retrieve.\r
+  @param  StringInfo              Points to the string font and color information\r
+                                  or NULL if the string should use the default\r
+                                  system font and color.\r
+  @param  Blt                     Thus must point to a NULL on entry. A buffer will\r
+                                  be allocated to hold the output and the pointer\r
+                                  updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  Baseline                Number of pixels from the bottom of the bitmap to\r
+                                  the baseline.\r
+\r
+  @retval EFI_SUCCESS             Glyph bitmap created.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate the output buffer Blt.\r
+  @retval EFI_WARN_UNKNOWN_GLYPH  The glyph was unknown and was replaced with the\r
+                                  glyph for Unicode character 0xFFFD.\r
+  @retval EFI_INVALID_PARAMETER   Blt is NULL or *Blt is not NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetGlyph (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  CHAR16                         Char,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo,\r
+  OUT EFI_IMAGE_OUTPUT               **Blt,\r
+  OUT UINTN                          *Baseline OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  This function iterates through fonts which match the specified font, using\r
+  the specified criteria. If String is non-NULL, then all of the characters in\r
+  the string must exist in order for a candidate font to be returned.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  FontHandle              On entry, points to the font handle returned by a\r
+                                   previous call to GetFontInfo() or NULL to start\r
+                                  with the  first font. On return, points to the\r
+                                  returned font handle or points to NULL if there\r
+                                  are no more matching fonts.\r
+  @param  StringInfoIn            Upon entry, points to the font to return\r
+                                  information about. If NULL, then the information about the system default \r
+                                  font will be returned.\r
+  @param  StringInfoOut           Upon return, contains the matching font's\r
+                                  information.  If NULL, then no information is\r
+                                  returned. It's caller's responsibility to free\r
+                                  this buffer.\r
+  @param  String                  Points to the string which will be tested to\r
+                                  determine  if all characters are available. If\r
+                                  NULL, then any font  is acceptable.\r
+\r
+  @retval EFI_SUCCESS             Matching font returned successfully.\r
+  @retval EFI_NOT_FOUND           No matching font was found.\r
+  @retval EFI_INVALID_PARAMETER   StringInfoIn is NULL.\r
+  @retval EFI_INVALID_PARAMETER  StringInfoIn->FontInfoMask is an invalid combination.\r
+  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the\r
+                                  request.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetFontInfo (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  OUT   EFI_FONT_HANDLE          *FontHandle,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfoIn, OPTIONAL\r
+  OUT       EFI_FONT_DISPLAY_INFO    **StringInfoOut,\r
+  IN  CONST EFI_STRING               String OPTIONAL\r
+  );\r
+\r
+//\r
+// EFI_HII_IMAGE_PROTOCOL interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function adds the image Image to the group of images owned by PackageList, and returns\r
+  a new image identifier (ImageId).\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             Handle of the package list where this image will\r
+                                  be added.\r
+  @param  ImageId                 On return, contains the new image id, which is\r
+                                  unique within PackageList.\r
+  @param  Image                   Points to the image.\r
+\r
+  @retval EFI_SUCCESS             The new image 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 image due to lack of resources.\r
+  @retval EFI_INVALID_PARAMETER   Image is NULL or ImageId is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewImage (\r
+  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  OUT EFI_IMAGE_ID                   *ImageId,\r
+  IN  CONST EFI_IMAGE_INPUT          *Image\r
+  );\r
+\r
+\r
+/**\r
+  This function retrieves the image specified by ImageId which is associated with\r
+  the specified PackageList and copies it into the buffer specified by Image.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             Handle of the package list where this image will\r
+                                  be searched.\r
+  @param  ImageId                 The image's id,, which is unique within\r
+                                  PackageList.\r
+  @param  Image                   Points to the image.\r
+\r
+  @retval EFI_SUCCESS             The new image was returned successfully.\r
+  @retval EFI_NOT_FOUND           The image specified by ImageId is not available.\r
+                                                 The specified PackageList is not in the database.\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by ImageSize is too small to\r
+                                  hold the image.\r
+  @retval EFI_INVALID_PARAMETER   The Image or ImageSize was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not\r
+                                                       enough memory.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetImage (\r
+  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  IN  EFI_IMAGE_ID                   ImageId,\r
+  OUT EFI_IMAGE_INPUT                *Image\r
+  );\r
+\r
+\r
+/**\r
+  This function updates the image specified by ImageId in the specified PackageListHandle to\r
+  the image specified by Image.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             The package list containing the images.\r
+  @param  ImageId                 The image's id,, which is unique within\r
+                                  PackageList.\r
+  @param  Image                   Points to the image.\r
+\r
+  @retval EFI_SUCCESS             The new image was updated successfully.\r
+  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the\r
+                                                database. The specified PackageList is not in the database.\r
+  @retval EFI_INVALID_PARAMETER   The Image was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetImage (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN EFI_IMAGE_ID                    ImageId,\r
+  IN CONST EFI_IMAGE_INPUT           *Image\r
+  );\r
+\r
+\r
+/**\r
+  This function renders an image to a bitmap or the screen using the specified\r
+  color and options. It draws the image on an existing bitmap, allocates a new\r
+  bitmap or uses the screen. The images can be clipped.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  Flags                   Describes how the image is to be drawn.\r
+  @param  Image                   Points to the image to be displayed.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels wide\r
+                                  and Height pixels high.  The image will be drawn\r
+                                  onto this image and  EFI_HII_DRAW_FLAG_CLIP is\r
+                                  implied. If this points to a  NULL on entry, then\r
+                                  a buffer will be allocated to hold  the generated\r
+                                  image and the pointer updated on exit. It is the\r
+                                  caller's responsibility to free this buffer.\r
+  @param  BltX                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+  @param  BltY                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+\r
+  @retval EFI_SUCCESS             The image was successfully drawn.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.\r
+  @retval EFI_INVALID_PARAMETER   The Image or Blt was NULL.\r
+  @retval EFI_INVALID_PARAMETER   Any combination of Flags is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiDrawImage (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_DRAW_FLAGS              Flags,\r
+  IN CONST EFI_IMAGE_INPUT           *Image,\r
+  IN OUT EFI_IMAGE_OUTPUT            **Blt,\r
+  IN UINTN                           BltX,\r
+  IN UINTN                           BltY\r
+  );\r
+\r
+\r
+/**\r
+  This function renders an image to a bitmap or the screen using the specified\r
+  color and options. It draws the image on an existing bitmap, allocates a new\r
+  bitmap or uses the screen. The images can be clipped.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  Flags                   Describes how the image is to be drawn.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for the  specified image.\r
+  @param  ImageId                 The image's id, which is unique within\r
+                                  PackageList.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels wide\r
+                                  and Height pixels high. The image will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_DRAW_FLAG_CLIP is implied. If this points\r
+                                  to a  NULL on entry, then a buffer will be\r
+                                  allocated to hold  the generated image and the\r
+                                  pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltX                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+  @param  BltY                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+\r
+  @retval EFI_SUCCESS             The image was successfully drawn.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.\r
+  @retval EFI_INVALID_PARAMETER  The Blt was NULL.\r
+  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the database. \r
+                           The specified PackageList is not in the database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiDrawImageId (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_DRAW_FLAGS              Flags,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN EFI_IMAGE_ID                    ImageId,\r
+  IN OUT EFI_IMAGE_OUTPUT            **Blt,\r
+  IN UINTN                           BltX,\r
+  IN UINTN                           BltY\r
+  )\r
+\r
+;\r
+\r
+//\r
+// EFI_HII_STRING_PROTOCOL\r
+//\r
+\r
+\r
+/**\r
+  This function adds the string String to the group of strings owned by PackageList, with the\r
+  specified font information StringFontInfo and returns a new string id.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             Handle of the package list where this string will\r
+                                  be added.\r
+  @param  StringId                On return, contains the new strings id, which is\r
+                                  unique within PackageList.\r
+  @param  Language                Points to the language for the new string.\r
+  @param  LanguageName            Points to the printable language name to\r
+                                  associate with the passed in  Language field.If\r
+                                  LanguageName is not NULL and the string package\r
+                                  header's LanguageName  associated with a given\r
+                                  Language is not zero, the LanguageName being\r
+                                  passed  in will be ignored.\r
+  @param  String                  Points to the new null-terminated string.\r
+  @param  StringFontInfo          Points to the new string's font information or\r
+                                  NULL if the string should have the default system\r
+                                  font, size and style.\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\r
+                                  resources.\r
+  @retval EFI_INVALID_PARAMETER   String is NULL or StringId is NULL or Language is\r
+                                  NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewString (\r
+  IN  CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  OUT EFI_STRING_ID                   *StringId,\r
+  IN  CONST CHAR8                     *Language,\r
+  IN  CONST CHAR16                    *LanguageName, OPTIONAL\r
+  IN  CONST EFI_STRING                String,\r
+  IN  CONST EFI_FONT_INFO             *StringFontInfo OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  This function retrieves the string specified by StringId which is associated\r
+  with the specified PackageList in the language Language and copies it into\r
+  the buffer specified by String.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  Language                Points to the language for the retrieved string.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for 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\r
+                                  pointed to by  String, in bytes. On return,\r
+                                  points to the length of the string, in bytes.\r
+  @param  StringFontInfo          If not NULL, points to the string's font\r
+                                  information.  It's caller's responsibility to\r
+                                  free this buffer.\r
+\r
+  @retval EFI_SUCCESS             The string was returned successfully.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is not\r
+                                  available.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is available but\r
+                                                not in the specified language.\r
+                                                The specified PackageList is not in the database.\r
+  @retval EFI_INVALID_LANGUAGE   - The string specified by StringId is available but\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by StringSize is too small\r
+                                  to  hold the string.\r
+  @retval EFI_INVALID_PARAMETER   The String or Language or StringSize was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the\r
+                                   request.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetString (\r
+  IN  CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN  CONST CHAR8                     *Language,\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      String,\r
+  IN  OUT UINTN                       *StringSize,\r
+  OUT EFI_FONT_INFO                   **StringFontInfo OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  This function updates the string specified by StringId in the specified PackageList to the text\r
+  specified by String and, optionally, the font information specified by StringFontInfo.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list containing the strings.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  Language                Points to the language for the updated string.\r
+  @param  String                  Points to the new null-terminated string.\r
+  @param  StringFontInfo          Points to the string's font information or NULL\r
+                                  if the string font information is not changed.\r
+\r
+  @retval EFI_SUCCESS             The string was updated successfully.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is not in the\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   The String or Language was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetString (\r
+  IN CONST EFI_HII_STRING_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                   PackageList,\r
+  IN EFI_STRING_ID                    StringId,\r
+  IN CONST CHAR8                      *Language,\r
+  IN CONST EFI_STRING                 String,\r
+  IN CONST EFI_FONT_INFO              *StringFontInfo OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  This function returns the list of supported languages, in the format specified\r
+  in Appendix M of UEFI 2.1 spec.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list to examine.\r
+  @param  Languages               Points to the buffer to hold the returned string.\r
+  @param  LanguagesSize           On entry, points to the size of the buffer\r
+                                  pointed to by  Languages, in bytes. On  return,\r
+                                  points to the length of Languages, in bytes.\r
+\r
+  @retval EFI_SUCCESS             The languages were returned successfully.\r
+  @retval EFI_INVALID_PARAMETER   The Languages or LanguagesSize was NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL    The LanguagesSize is too small to hold the list\r
+                                  of  supported languages. LanguageSize is updated\r
+                                  to contain the required size.\r
+  @retval EFI_NOT_FOUND           Could not find string package in specified\r
+                                  packagelist.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetLanguages (\r
+  IN CONST EFI_HII_STRING_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                   PackageList,\r
+  IN OUT CHAR8                        *Languages,\r
+  IN OUT UINTN                        *LanguagesSize\r
+  );\r
+\r
+\r
+/**\r
+  Each string package has associated with it a single primary language and zero\r
+  or more secondary languages. This routine returns the secondary languages\r
+  associated with a package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list to examine.\r
+  @param  FirstLanguage           Points to the primary language.\r
+  @param  SecondaryLanguages      Points to the buffer to hold the returned list of\r
+                                   secondary languages for the specified\r
+                                  FirstLanguage. If there are no secondary\r
+                                  languages, the function  returns successfully,\r
+                                  but this is set to NULL.\r
+  @param  SecondaryLanguagesSize  On entry, points to the size of the buffer\r
+                                  pointed to  by SecondLanguages, in bytes. On\r
+                                  return, points to the length of SecondLanguages\r
+                                  in bytes.\r
+\r
+  @retval EFI_SUCCESS             Secondary languages were correctly returned.\r
+  @retval EFI_INVALID_PARAMETER   FirstLanguage or SecondLanguages or\r
+                                  SecondLanguagesSize was NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by SecondLanguagesSize is\r
+                                  too small to hold the returned information.\r
+                                  SecondLanguageSize is updated to hold the size of\r
+                                  the buffer required.\r
+  @retval EFI_INVALID_LANGUAGE           The language specified by FirstLanguage is not\r
+                                  present in the specified package list.\r
+  @retval EFI_NOT_FOUND          The specified PackageList is not in the Database.                                \r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetSecondaryLanguages (\r
+  IN CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN CONST CHAR8                     *FirstLanguage,\r
+  IN OUT CHAR8                       *SecondaryLanguages,\r
+  IN OUT UINTN                       *SecondaryLanguagesSize\r
+  );\r
+\r
+//\r
+// EFI_HII_DATABASE_PROTOCOL protocol interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function adds the packages in the package list to the database and returns a handle. If there is a\r
+  EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will\r
+  create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
+                                  structure.\r
+  @param  DriverHandle            Associate the package list with this EFI handle.\r
+  @param  Handle                  A pointer to the EFI_HII_HANDLE instance.\r
+\r
+  @retval EFI_SUCCESS             The package list associated with the Handle was\r
+                                  added to the HII database.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary resources for the\r
+                                  new database contents.\r
+  @retval EFI_INVALID_PARAMETER   PackageList is NULL or Handle is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewPackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList,\r
+  IN CONST EFI_HANDLE                   DriverHandle,\r
+  OUT EFI_HII_HANDLE                    *Handle\r
+  );\r
+\r
+\r
+/**\r
+  This function removes the package list that is associated with a handle Handle\r
+  from the HII database. Before removing the package, any registered functions\r
+  with the notification type REMOVE_PACK and the same package type will be called.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  The handle that was registered to the data that\r
+                                  is requested  for removal.\r
+\r
+  @retval EFI_SUCCESS             The data associated with the Handle was removed\r
+                                  from  the HII database.\r
+  @retval EFI_NOT_FOUND           The specified Handle is not in database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRemovePackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                     Handle\r
+  );\r
+\r
+\r
+/**\r
+  This function updates the existing package list (which has the specified Handle)\r
+  in the HII databases, using the new package list specified by PackageList.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  The handle that was registered to the data that\r
+                                  is  requested to be updated.\r
+  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
+                                  package.\r
+\r
+  @retval EFI_SUCCESS             The HII database was successfully updated.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate enough memory for the updated\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER  PackageList was NULL.\r
+  @retval EFI_NOT_FOUND          The specified Handle is not in database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUpdatePackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList\r
+  );\r
+\r
+\r
+/**\r
+  This function returns a list of the package handles of the specified type\r
+  that are currently active in the database. The pseudo-type\r
+  EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageType             Specifies the package type of the packages to\r
+                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages\r
+                                  to be listed.\r
+  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
+                                  this  is the pointer to the GUID which must match\r
+                                  the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.\r
+                                  Otherwise,  it must be NULL.\r
+  @param  HandleBufferLength      On input, a pointer to the length of the handle\r
+                                  buffer.  On output, the length of the handle\r
+                                  buffer that is required for the handles found.\r
+  @param  Handle                  An array of EFI_HII_HANDLE instances returned.\r
+\r
+  @retval EFI_SUCCESS             The matching handles are outputed successfully.\r
+                                                HandleBufferLength is updated with the actual length.\r
+  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that\r
+                                  Handle is too small to support the number of\r
+                                  handles. HandleBufferLength is updated with a\r
+                                  value that will  enable the data to fit.\r
+  @retval EFI_NOT_FOUND           No matching handle could not be found in\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   Handle or HandleBufferLength was NULL.\r
+  @retval EFI_INVALID_PARAMETER  PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but\r
+                         PackageGuid is not NULL, PackageType is a EFI_HII_\r
+                         PACKAGE_TYPE_GUID but PackageGuid is NULL.\r
+  \r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiListPackageLists (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  UINT8                             PackageType,\r
+  IN  CONST EFI_GUID                    *PackageGuid,\r
+  IN  OUT UINTN                         *HandleBufferLength,\r
+  OUT EFI_HII_HANDLE                    *Handle\r
+  );\r
+\r
+\r
+/**\r
+  This function will export one or all package lists in the database to a buffer.\r
+  For each package list exported, this function will call functions registered\r
+  with EXPORT_PACK and then copy the package list to the buffer.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  An EFI_HII_HANDLE that corresponds to the desired\r
+                                  package list in the HII database to export or\r
+                                  NULL to indicate  all package lists should be\r
+                                  exported.\r
+  @param  BufferSize              On input, a pointer to the length of the buffer.\r
+                                  On output, the length of the buffer that is\r
+                                  required for the exported data.\r
+  @param  Buffer                  A pointer to a buffer that will contain the\r
+                                  results of  the export function.\r
+\r
+  @retval EFI_SUCCESS             Package exported.\r
+  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that\r
+                                  Handle is too small to support the number of\r
+                                  handles.      HandleBufferLength is updated with\r
+                                  a value that will enable the data to fit.\r
+  @retval EFI_NOT_FOUND           The specifiecd Handle could not be found in the\r
+                                  current database.\r
+  @retval EFI_INVALID_PARAMETER   Handle or Buffer or BufferSize was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportPackageLists (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                    Handle,\r
+  IN  OUT UINTN                         *BufferSize,\r
+  OUT EFI_HII_PACKAGE_LIST_HEADER       *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  This function registers a function which will be called when specified actions related to packages of\r
+  the specified type occur in the HII database. By registering a function, other HII-related drivers are\r
+  notified when specific package types are added, removed or updated in the HII database.\r
+  Each driver or application which registers a notification should use\r
+  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageType             Specifies the package type of the packages to\r
+                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages\r
+                                  to be listed.\r
+  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
+                                  this is the pointer to the GUID which must match\r
+                                  the Guid field of\r
+                                  EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must\r
+                                  be NULL.\r
+  @param  PackageNotifyFn         Points to the function to be called when the\r
+                                  event specified by\r
+                                  NotificationType occurs.\r
+  @param  NotifyType              Describes the types of notification which this\r
+                                  function will be receiving.\r
+  @param  NotifyHandle            Points to the unique handle assigned to the\r
+                                  registered notification. Can be used in\r
+                                  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()\r
+                                  to stop notifications.\r
+\r
+  @retval EFI_SUCCESS             Notification registered successfully.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary data structures\r
+  @retval EFI_INVALID_PARAMETER   NotifyHandle is NULL.\r
+  @retval EFI_INVALID_PARAMETER   PackageGuid is not NULL when PackageType is not\r
+                                  EFI_HII_PACKAGE_TYPE_GUID.\r
+  @retval EFI_INVALID_PARAMETER   PackageGuid is NULL when PackageType is\r
+                                  EFI_HII_PACKAGE_TYPE_GUID.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRegisterPackageNotify (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  UINT8                             PackageType,\r
+  IN  CONST EFI_GUID                    *PackageGuid,\r
+  IN  CONST EFI_HII_DATABASE_NOTIFY     PackageNotifyFn,\r
+  IN  EFI_HII_DATABASE_NOTIFY_TYPE      NotifyType,\r
+  OUT EFI_HANDLE                        *NotifyHandle\r
+  );\r
+\r
+\r
+/**\r
+  Removes the specified HII database package-related notification.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  NotificationHandle      The handle of the notification function being\r
+                                  unregistered.\r
+\r
+  @retval EFI_SUCCESS             Notification is unregistered successfully.\r
+  @retval EFI_NOT_FOUND          The incoming notification handle does not exist \r
+                           in current hii database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUnregisterPackageNotify (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HANDLE                         NotificationHandle\r
+  );\r
+\r
+\r
+/**\r
+  This routine retrieves an array of GUID values for each keyboard layout that\r
+  was previously registered in the system.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuidBufferLength     On input, a pointer to the length of the keyboard\r
+                                  GUID  buffer. On output, the length of the handle\r
+                                  buffer  that is required for the handles found.\r
+  @param  KeyGuidBuffer           An array of keyboard layout GUID instances\r
+                                  returned.\r
+\r
+  @retval EFI_SUCCESS             KeyGuidBuffer was updated successfully.\r
+  @retval EFI_BUFFER_TOO_SMALL    The KeyGuidBufferLength parameter indicates\r
+                                  that KeyGuidBuffer is too small to support the\r
+                                  number of GUIDs. KeyGuidBufferLength is\r
+                                  updated with a value that will enable the data to\r
+                                  fit.\r
+  @retval EFI_INVALID_PARAMETER   The KeyGuidBuffer or KeyGuidBufferLength was\r
+                                  NULL.\r
+  @retval EFI_NOT_FOUND           There was no keyboard layout.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiFindKeyboardLayouts (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  OUT UINT16                        *KeyGuidBufferLength,\r
+  OUT EFI_GUID                          *KeyGuidBuffer\r
+  );\r
+\r
+\r
+/**\r
+  This routine retrieves the requested keyboard layout. The layout is a physical description of the keys\r
+  on a keyboard and the character(s) that are associated with a particular set of key strokes.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuid                 A pointer to the unique ID associated with a\r
+                                  given keyboard layout. If KeyGuid is NULL then\r
+                                  the current layout will be retrieved.\r
+  @param  KeyboardLayoutLength    On input, a pointer to the length of the\r
+                                  KeyboardLayout buffer.  On output, the length of\r
+                                  the data placed into KeyboardLayout.\r
+  @param  KeyboardLayout          A pointer to a buffer containing the retrieved\r
+                                  keyboard layout.\r
+\r
+  @retval EFI_SUCCESS             The keyboard layout was retrieved successfully.\r
+  @retval EFI_NOT_FOUND           The requested keyboard layout was not found.\r
+  @retval EFI_INVALID_PARAMETER   The KeyboardLayout or KeyboardLayoutLength was\r
+                                  NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetKeyboardLayout (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  CONST EFI_GUID                          *KeyGuid,\r
+  IN OUT UINT16                         *KeyboardLayoutLength,\r
+  OUT EFI_HII_KEYBOARD_LAYOUT           *KeyboardLayout\r
+  );\r
+\r
+\r
+/**\r
+  This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine\r
+  is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID\r
+  group type. This is so that agents which are sensitive to the current keyboard layout being changed\r
+  can be notified of this change.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuid                 A pointer to the unique ID associated with a\r
+                                  given keyboard layout.\r
+\r
+  @retval EFI_SUCCESS             The current keyboard layout was successfully set.\r
+  @retval EFI_NOT_FOUND           The referenced keyboard layout was not found, so\r
+                                  action was taken.\r
+  @retval EFI_INVALID_PARAMETER   The KeyGuid was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetKeyboardLayout (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL          *This,\r
+  IN CONST EFI_GUID                           *KeyGuid\r
+  );\r
+\r
+\r
+/**\r
+  Return the EFI handle associated with a package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageListHandle       An EFI_HII_HANDLE that corresponds to the desired\r
+                                  package list in the HIIdatabase.\r
+  @param  DriverHandle            On return, contains the EFI_HANDLE which was\r
+                                  registered with the package list in\r
+                                  NewPackageList().\r
+\r
+  @retval EFI_SUCCESS             The DriverHandle was returned successfully.\r
+  @retval EFI_INVALID_PARAMETER   The PackageListHandle was not valid or\r
+                                  DriverHandle was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetPackageListHandle (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL         *This,\r
+  IN  EFI_HII_HANDLE                    PackageListHandle,\r
+  OUT EFI_HANDLE                        *DriverHandle\r
+  );\r
+\r
+//\r
+// EFI_HII_CONFIG_ROUTING_PROTOCOL interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration\r
+  for one or more named elements from one or more drivers.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Request                 A null-terminated Unicode string in\r
+                                  <MultiConfigRequest> format.\r
+  @param  Progress                On return, points to a character in the Request\r
+                                  string. Points to the string's null terminator if\r
+                                  request was successful. Points to the most recent\r
+                                  & before the first failing name / value pair (or\r
+                                  the beginning of the string if the failure is in\r
+                                  the first name / value pair) if the request was\r
+                                  not successful.\r
+  @param  Results                 Null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format which has all values\r
+                                  filled in for the names in the Request string.\r
+                                  String to be allocated by the called function.\r
+\r
+  @retval EFI_SUCCESS             The Results string is filled with the values\r
+                                  corresponding to all requested names.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_NOT_FOUND           Routing data doesn't match any known driver.\r
+                                     Progress set to the "G" in "GUID" of the\r
+                                  routing  header that doesn't match. Note: There\r
+                                  is no         requirement that all routing data\r
+                                  be validated before any configuration extraction.\r
+  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Request\r
+                                  parameter would result in this type of error. The\r
+                                  Progress parameter is set to NULL.\r
+  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set to most recent &\r
+                                  before the error or the beginning of the string.\r
+  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points to the & before the\r
+                                  name in question.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  );\r
+\r
+\r
+/**\r
+  This function allows the caller to request the current configuration for the\r
+  entirety of the current HII database and returns the data in a null-terminated Unicode string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Results                 Null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format which has all values\r
+                                  filled in for the names in the Request string.\r
+                                  String to be allocated by the  called function.\r
+                                  De-allocation is up to the caller.\r
+\r
+  @retval EFI_SUCCESS             The Results string is filled with the values\r
+                                  corresponding to all requested names.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Results\r
+                                  parameter would result in this type of error.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingExportConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  OUT EFI_STRING                             *Results\r
+  );\r
+\r
+\r
+/**\r
+  This function processes the results of processing forms and routes it to the\r
+  appropriate handlers or storage.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Configuration           A null-terminated Unicode string in\r
+                                  <MulltiConfigResp> format.\r
+  @param  Progress                A pointer to a string filled in with the offset\r
+                                  of the most recent & before the first failing\r
+                                  name / value pair (or the beginning of the string\r
+                                  if the failure is in the first name / value pair)\r
+                                  or the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are awaiting\r
+                                  distribution.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the Configuration parameter\r
+                                  would result in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingRouteConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  );\r
+\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to map configuration data stored\r
+  in byte array ("block") formats such as UEFI Variables into current configuration strings.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  ConfigRequest           A null-terminated Unicode string in\r
+                                  <ConfigRequest> format.\r
+  @param  Block                   Array of bytes defining the block's\r
+                                  configuration.\r
+  @param  BlockSize               Length in bytes of Block.\r
+  @param  Config                  Filled-in configuration string. String allocated\r
+                                  by  the function. Returned only if call is\r
+                                  successful.\r
+  @param  Progress                A pointer to a string filled in with the offset\r
+                                  of  the most recent & before the first failing\r
+                                  name/value pair (or the beginning of the string\r
+                                  if the failure is in the first name / value pair)\r
+                                  or the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. Progress points to the\r
+                                  null terminator at the end of the ConfigRequest\r
+                                        string.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.\r
+                                  Progress points to the first character of\r
+                                  ConfigRequest.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigRequest or\r
+                                  Block parameter would result in this type of\r
+                                  error. Progress points to the first character of\r
+                                  ConfigRequest.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found. Progress points to the "G" in "GUID" of\r
+                                  the      errant routing data.\r
+  @retval EFI_DEVICE_ERROR        Block not large enough. Progress undefined.\r
+  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted string.\r
+                                       Block is left updated and Progress points at\r
+                                  the '&' preceding the first non-<BlockName>.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiBlockToConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       ConfigRequest,\r
+  IN  CONST UINT8                            *Block,\r
+  IN  CONST UINTN                            BlockSize,\r
+  OUT EFI_STRING                             *Config,\r
+  OUT EFI_STRING                             *Progress\r
+  );\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to map configuration strings\r
+  to configurations stored in byte array ("block") formats such as UEFI Variables.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  ConfigResp              A null-terminated Unicode string in <ConfigResp>\r
+                                  format.\r
+  @param  Block                   A possibly null array of bytes representing the\r
+                                  current  block. Only bytes referenced in the\r
+                                  ConfigResp string  in the block are modified. If\r
+                                  this parameter is null or if the *BlockSize\r
+                                  parameter is (on input) shorter than required by\r
+                                  the Configuration string, only the BlockSize\r
+                                  parameter is updated and an appropriate status\r
+                                  (see below)  is returned.\r
+  @param  BlockSize               The length of the Block in units of UINT8.  On\r
+                                  input, this is the size of the Block. On output,\r
+                                  if successful, contains the index of the  last\r
+                                  modified byte in the Block.\r
+  @param  Progress                On return, points to an element of the ConfigResp\r
+                                   string filled in with the offset of the most\r
+                                  recent '&' before the first failing name / value\r
+                                  pair (or  the beginning of the string if the\r
+                                  failure is in the  first name / value pair) or\r
+                                  the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. Progress points to the\r
+                                  null terminator at the end of the ConfigResp\r
+                                  string.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.\r
+                                  Progress points to the first character of\r
+                                  ConfigResp.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigResp or\r
+                                  Block parameter would result in this type of\r
+                                  error. Progress points to the first character of\r
+                                           ConfigResp.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found. Progress points to the "G" in "GUID" of\r
+                                  the      errant routing data.\r
+  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted name /\r
+                                  value pair. Block is left updated and\r
+                                  Progress points at the '&' preceding the first\r
+                                  non-<BlockName>.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigToBlock (\r
+  IN     CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,\r
+  IN     CONST EFI_STRING                      ConfigResp,\r
+  IN OUT UINT8                                 *Block,\r
+  IN OUT UINTN                                 *BlockSize,\r
+  OUT    EFI_STRING                            *Progress\r
+  );\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to extract portions of\r
+  a larger configuration string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Configuration           A null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format.\r
+  @param  Guid                    A pointer to the GUID value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If Guid is NULL,\r
+                                  then all GUID  values will be searched for.\r
+  @param  Name                    A pointer to the NAME value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If Name is NULL,\r
+                                  then all Name  values will be searched for.\r
+  @param  DevicePath              A pointer to the PATH value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If DevicePath is\r
+                                  NULL, then all  DevicePath values will be\r
+                                  searched for.\r
+  @param  AltCfgId                A pointer to the ALTCFG value to search for in\r
+                                  the  routing portion of the ConfigResp string\r
+                                  when retrieving  the requested data.  If this\r
+                                  parameter is NULL,  then the current setting will\r
+                                  be retrieved.\r
+  @param  AltCfgResp              A pointer to a buffer which will be allocated by\r
+                                  the  function which contains the retrieved string\r
+                                  as requested.   This buffer is only allocated if\r
+                                  the call was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. The requested data was\r
+                                  extracted  and placed in the newly allocated\r
+                                  AltCfgResp buffer.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate AltCfgResp.\r
+  @retval EFI_INVALID_PARAMETER   Any parameter is invalid.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetAltCfg (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL    *This,\r
+  IN  CONST EFI_STRING                         Configuration,\r
+  IN  CONST EFI_GUID                           *Guid,\r
+  IN  CONST EFI_STRING                         Name,\r
+  IN  CONST EFI_DEVICE_PATH_PROTOCOL           *DevicePath,\r
+  IN  CONST UINT16                             *AltCfgId,\r
+  OUT EFI_STRING                               *AltCfgResp\r
+  );\r
+\r
+\r
+/**\r
+  Compare whether two names of languages are identical.\r
+\r
+  @param  Language1              Name of language 1\r
+  @param  Language2              Name of language 2\r
+\r
+  @retval TRUE                   same\r
+  @retval FALSE                  not same\r
+\r
+**/\r
+BOOLEAN\r
+HiiCompareLanguage (\r
+  IN  CHAR8  *Language1,\r
+  IN  CHAR8  *Language2\r
+  )\r
+;\r
+\r
+//\r
+// Global variables\r
+//\r
+extern EFI_EVENT gHiiKeyboardLayoutChanged;\r
+#endif\r