/** @file
Private structures definitions in HiiDatabase.

Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __HII_DATABASE_PRIVATE_H__
#define __HII_DATABASE_PRIVATE_H__

#include <Uefi.h>

#include <Protocol/DevicePath.h>
#include <Protocol/HiiFont.h>
#include <Protocol/HiiImage.h>
#include <Protocol/HiiImageEx.h>
#include <Protocol/HiiImageDecoder.h>
#include <Protocol/HiiString.h>
#include <Protocol/HiiDatabase.h>
#include <Protocol/HiiConfigRouting.h>
#include <Protocol/HiiConfigAccess.h>
#include <Protocol/HiiConfigKeyword.h>
#include <Protocol/SimpleTextOut.h>

#include <Guid/HiiKeyBoardLayout.h>
#include <Guid/GlobalVariable.h>
#include <Guid/MdeModuleHii.h>
#include <Guid/VariableFormat.h>
#include <Guid/PcdDataBaseSignatureGuid.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>
#include <Library/UefiLib.h>
#include <Library/PcdLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/PrintLib.h>

#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)

extern EFI_LOCK  mHiiDatabaseLock;

//
// IFR data structure
//
// BASE_CR (a, IFR_DEFAULT_VALUE_DATA, Entry) to get the whole structure.

typedef struct {
  LIST_ENTRY               Entry;          // Link to VarStorage Default Data
  UINT16                   DefaultId;
  VARIABLE_STORE_HEADER    *VariableStorage;
} VARSTORAGE_DEFAULT_DATA;

typedef struct {
  LIST_ENTRY    Entry;                   // Link to VarStorage
  EFI_GUID      Guid;
  CHAR16        *Name;
  UINT16        Size;
  UINT8         Type;
  LIST_ENTRY    BlockEntry;              // Link to its Block array
} IFR_VARSTORAGE_DATA;

typedef struct {
  LIST_ENTRY         Entry;              // Link to Block array
  UINT16             Offset;
  UINT16             Width;
  UINT16             BitOffset;
  UINT16             BitWidth;
  EFI_QUESTION_ID    QuestionId;
  UINT8              OpCode;
  UINT8              Scope;
  LIST_ENTRY         DefaultValueEntry;  // Link to its default value array
  CHAR16             *Name;
  BOOLEAN            IsBitVar;
} IFR_BLOCK_DATA;

//
// Get default value from IFR data.
//
typedef enum {
  DefaultValueFromDefault = 0,     // Get from the minimum or first one when not set default value.
  DefaultValueFromOtherDefault,    // Get default vale from other default when no default(When other
                                   // defaults are more than one, use the default with smallest default id).
  DefaultValueFromFlag,            // Get default value from the default flag.
  DefaultValueFromOpcode           // Get default value from default opcode, highest priority.
} DEFAULT_VALUE_TYPE;

typedef struct {
  LIST_ENTRY            Entry;
  DEFAULT_VALUE_TYPE    Type;
  BOOLEAN               Cleaned;     // Whether this value is cleaned
                                     // TRUE  Cleaned, the value can't be used
                                     // FALSE Not cleaned, the value can  be used.
  UINT16                DefaultId;
  EFI_IFR_TYPE_VALUE    Value;
} IFR_DEFAULT_DATA;

//
// Storage types
//
#define EFI_HII_VARSTORE_BUFFER               0
#define EFI_HII_VARSTORE_NAME_VALUE           1
#define EFI_HII_VARSTORE_EFI_VARIABLE         2
#define EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER  3

//
// Keyword handler protocol filter type.
//
#define EFI_KEYWORD_FILTER_READONY    0x01
#define EFI_KEYWORD_FILTER_REAWRITE   0x02
#define EFI_KEYWORD_FILTER_BUFFER     0x10
#define EFI_KEYWORD_FILTER_NUMERIC    0x20
#define EFI_KEYWORD_FILTER_NUMERIC_1  0x30
#define EFI_KEYWORD_FILTER_NUMERIC_2  0x40
#define EFI_KEYWORD_FILTER_NUMERIC_4  0x50
#define EFI_KEYWORD_FILTER_NUMERIC_8  0x60

#define HII_FORMSET_STORAGE_SIGNATURE  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;

//
// String Package definitions
//
#define HII_STRING_PACKAGE_SIGNATURE  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;
  EFI_STRING_ID                 MaxStringId;           // record StringId
} HII_STRING_PACKAGE_INSTANCE;

//
// Form Package definitions
//
#define HII_IFR_PACKAGE_SIGNATURE  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  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  SIGNATURE_32 ('h','i','f','p')
typedef struct _HII_FONT_PACKAGE_INSTANCE {
  UINTN                       Signature;
  EFI_HII_FONT_PACKAGE_HDR    *FontPkgHdr;
  UINT16                      Height;
  UINT16                      BaseLine;
  UINT8                       *GlyphBlock;
  LIST_ENTRY                  FontEntry;
  LIST_ENTRY                  GlyphInfoList;
} HII_FONT_PACKAGE_INSTANCE;

#define HII_GLYPH_INFO_SIGNATURE  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  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  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;
  EFI_HII_IMAGE_BLOCK          *ImageBlock;
  UINT8                        *PaletteBlock;
} HII_IMAGE_PACKAGE_INSTANCE;

//
// Keyboard Layout Package definitions
//
#define HII_KB_LAYOUT_PACKAGE_SIGNATURE  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  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  SIGNATURE_32 ('h','i','h','l')

typedef struct {
  UINTN         Signature;
  LIST_ENTRY    Handle;
  UINTN         Key;
} HII_HANDLE;

#define HII_DATABASE_RECORD_SIGNATURE  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  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  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;
  EFI_HII_IMAGE_PROTOCOL                 HiiImage;
  EFI_HII_IMAGE_EX_PROTOCOL              HiiImageEx;
  EFI_HII_STRING_PROTOCOL                HiiString;
  EFI_HII_DATABASE_PROTOCOL              HiiDatabase;
  EFI_HII_CONFIG_ROUTING_PROTOCOL        ConfigRouting;
  EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL    ConfigKeywordHandler;
  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_IMAGE_EX_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
  CR (a, \
      HII_DATABASE_PRIVATE_DATA, \
      HiiImageEx, \
      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 \
      )

#define CONFIG_KEYWORD_HANDLER_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
  CR (a, \
      HII_DATABASE_PRIVATE_DATA, \
      ConfigKeywordHandler, \
      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
      )

//
// Internal function prototypes.
//

/**
  Generate a sub string then output it.

  This is a internal function.

  @param  String                 A constant string which is the prefix of the to be
                                 generated string, e.g. GUID=

  @param  BufferLen              The length of the Buffer in bytes.

  @param  Buffer                 Points to a buffer which will be converted to be the
                                 content of the generated string.

  @param  Flag                   If 1, the buffer contains data for the value of GUID or PATH stored in
                                 UINT8 *; if 2, the buffer contains unicode string for the value of NAME;
                                 if 3, the buffer contains other data.

  @param  SubStr                 Points to the output string. It's caller's
                                 responsibility to free this buffer.


**/
VOID
GenerateSubStr (
  IN CONST EFI_STRING  String,
  IN  UINTN            BufferLen,
  IN  VOID             *Buffer,
  IN  UINT8            Flag,
  OUT EFI_STRING       *SubStr
  );

/**
  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 global 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
  );

/**

   This function invokes the matching registered function.

   @param  Private           HII Database driver private structure.
   @param  NotifyType        The type of change concerning the database.
   @param  PackageInstance   Points to the package referred to by the notification.
   @param  PackageType       Package type
   @param  Handle            The handle of the package list which contains the specified package.

   @retval EFI_SUCCESS            Already checked all registered function and invoked
                                  if matched.
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.

**/
EFI_STATUS
InvokeRegisteredFunction (
  IN HII_DATABASE_PRIVATE_DATA     *Private,
  IN EFI_HII_DATABASE_NOTIFY_TYPE  NotifyType,
  IN VOID                          *PackageInstance,
  IN UINT8                         PackageType,
  IN EFI_HII_HANDLE                Handle
  )
;

/**
  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 LastStringId is
  specified, the string id of last string block will also be output.
  If StringId = 0, output the string id of last string block (EFI_HII_SIBT_STRING).

  @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 or StringId = -1.
  @param  StartStringId           The first id in the skip block which StringId in the block.

  @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,
  OUT EFI_STRING_ID                *StartStringId 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 responsibility 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
  );

/**
  This function exports Form packages to a buffer.
  This is a internal function.

  @param  Private                Hii database private structure.
  @param  Handle                 Identification of a package list.
  @param  PackageList            Pointer to a package list which will be exported.
  @param  UsedSize               The length of buffer be used.
  @param  BufferSize             Length of the Buffer.
  @param  Buffer                 Allocated space for storing exported data.
  @param  ResultSize             The size of the already exported content of  this
                                 package list.

  @retval EFI_SUCCESS            Form Packages are exported successfully.
  @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.

**/
EFI_STATUS
ExportFormPackages (
  IN HII_DATABASE_PRIVATE_DATA           *Private,
  IN EFI_HII_HANDLE                      Handle,
  IN HII_DATABASE_PACKAGE_LIST_INSTANCE  *PackageList,
  IN UINTN                               UsedSize,
  IN UINTN                               BufferSize,
  IN OUT VOID                            *Buffer,
  IN OUT UINTN                           *ResultSize
  );

//
// 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                    Together with BltX, Specifies the offset from the left and top edge
                                  of the image of the first character cell in the
                                  image.
  @param  BltY                    Together with 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 or Blt.
  @retval EFI_INVALID_PARAMETER Flags were invalid combination..

**/
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                    Together with BltX, Specifies the offset from the left and top edge
                                  of the image of the first character cell in the
                                  image.
  @param  BltY                    Together with 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 Blt or PackageList was NULL.
  @retval EFI_INVALID_PARAMETER Flags were invalid combination.
  @retval EFI_NOT_FOUND         The specified PackageList is not in the Database or the stringid is not
                          in the specified PackageList.

**/
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. If NULL, then the information about the system
                                  default font will be returned.
  @param  StringInfoOut           Upon return, contains the matching font's information.
                                  If NULL, then no information is returned. This buffer
                                  is allocated with a call to the Boot Service AllocatePool().
                                  It is the caller's responsibility to call the Boot
                                  Service FreePool() when the caller no longer requires
                                  the contents of StringInfoOut.
  @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_INVALID_PARAMETER   StringInfoIn->FontInfoMask is an invalid combination.
  @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  OPTIONAL,
  OUT       EFI_FONT_DISPLAY_INFO  **StringInfoOut,
  IN  CONST EFI_STRING             String OPTIONAL
  );

//
// EFI_HII_IMAGE_PROTOCOL interfaces
//

/**
  Get the image id of last image block: EFI_HII_IIBT_END_BLOCK when input
  ImageId is zero, otherwise return the address of the
  corresponding image block with identifier specified by ImageId.

  This is a internal function.

  @param ImageBlocks     Points to the beginning of a series of image blocks stored in order.
  @param ImageId         If input ImageId is 0, output the image id of the EFI_HII_IIBT_END_BLOCK;
                         else use this id to find its corresponding image block address.

  @return The image block address when input ImageId is not zero; otherwise return NULL.

**/
EFI_HII_IMAGE_BLOCK *
GetImageIdOrAddress (
  IN EFI_HII_IMAGE_BLOCK  *ImageBlocks,
  IN OUT EFI_IMAGE_ID     *ImageId
  );

/**
  Return the HII package list identified by PackageList HII handle.

  @param Database    Pointer to HII database list header.
  @param PackageList HII handle of the package list to locate.

  @retval The HII package list instance.
**/
HII_DATABASE_PACKAGE_LIST_INSTANCE *
LocatePackageList (
  IN  LIST_ENTRY      *Database,
  IN  EFI_HII_HANDLE  PackageList
  );

/**
  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  Database               A pointer to the database list header.
  @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  BitmapOnly             TRUE to only return the bitmap type image.
                                 FALSE to locate image decoder instance to decode image.

  @retval EFI_SUCCESS            The new image was returned successfully.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the
                                 database. The specified PackageList is not in the database.
  @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.
  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not
                                 enough memory.
**/
EFI_STATUS
IGetImage (
  IN  LIST_ENTRY       *Database,
  IN  EFI_HII_HANDLE   PackageList,
  IN  EFI_IMAGE_ID     ImageId,
  OUT EFI_IMAGE_INPUT  *Image,
  IN  BOOLEAN          BitmapOnly
  );

/**
  Return the first HII image decoder instance which supports the DecoderName.

  @param BlockType  The image block type.

  @retval Pointer to the HII image decoder instance.
**/
EFI_HII_IMAGE_DECODER_PROTOCOL *
LocateHiiImageDecoder (
  UINT8  BlockType
  );

/**
  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.

  @retval EFI_SUCCESS             The new image was returned successfully.
  @retval EFI_NOT_FOUND           The image specified by ImageId is not available.
                                                 The specified PackageList is not in the database.
  @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.
  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not
                                                       enough memory.

**/
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
  );

/**
  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. The specified PackageList 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  BltX                    Specifies the offset from the left and top edge
                                  of the  output image of the first pixel in the
                                  image.
  @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  BltX                    Specifies the offset from the left and top edge
                                  of the  output image of the first pixel in the
                                  image.
  @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 Blt was NULL.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the database.
                           The specified PackageList is not in the 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
  );

/**
  The prototype of this extension function is the same with EFI_HII_IMAGE_PROTOCOL.NewImage().
  This protocol invokes EFI_HII_IMAGE_PROTOCOL.NewImage() implicitly.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_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 PackageList could not be found.
  @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
HiiNewImageEx (
  IN  CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
  IN  EFI_HII_HANDLE                   PackageList,
  OUT EFI_IMAGE_ID                     *ImageId,
  IN  CONST EFI_IMAGE_INPUT            *Image
  );

/**
  Return the information about the image, associated with the package list.
  The prototype of this extension function is the same with EFI_HII_IMAGE_PROTOCOL.GetImage().

  This function is similar to EFI_HII_IMAGE_PROTOCOL.GetImage(). The difference is that
  this function will locate all EFI_HII_IMAGE_DECODER_PROTOCOL instances installed in the
  system if the decoder of the certain image type is not supported by the
  EFI_HII_IMAGE_EX_PROTOCOL. The function will attempt to decode the image to the
  EFI_IMAGE_INPUT using the first EFI_HII_IMAGE_DECODER_PROTOCOL instance that
  supports the requested image type.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_PROTOCOL instance.
  @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  Image                  Points to the image.

  @retval EFI_SUCCESS            The new image was returned successfully.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not available. The specified
                                 PackageList is not in the Database.
  @retval EFI_INVALID_PARAMETER  Image was NULL or ImageId was 0.
  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there
                                 was not enough memory.

**/
EFI_STATUS
EFIAPI
HiiGetImageEx (
  IN  CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
  IN  EFI_HII_HANDLE                   PackageList,
  IN  EFI_IMAGE_ID                     ImageId,
  OUT EFI_IMAGE_INPUT                  *Image
  );

/**
  Change the information about the image.

  Same with EFI_HII_IMAGE_PROTOCOL.SetImage(), this protocol invokes
  EFI_HII_IMAGE_PROTOCOL.SetImage()implicitly.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_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 successfully updated.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the
                                 database. The specified PackageList is not in
                                 the database.
  @retval EFI_INVALID_PARAMETER  The Image was NULL, the ImageId was 0 or
                                 the Image->Bitmap was NULL.

**/
EFI_STATUS
EFIAPI
HiiSetImageEx (
  IN CONST EFI_HII_IMAGE_EX_PROTOCOL  *This,
  IN EFI_HII_HANDLE                   PackageList,
  IN EFI_IMAGE_ID                     ImageId,
  IN CONST EFI_IMAGE_INPUT            *Image
  );

/**
  Renders an image to a bitmap or to the display.

  The prototype of this extension function is the same with
  EFI_HII_IMAGE_PROTOCOL.DrawImage(). This protocol invokes
  EFI_HII_IMAGE_PROTOCOL.DrawImage() implicitly.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_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  BltX                   Specifies the offset from the left and top edge of
                                 the output image of the first pixel in the image.
  @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.

**/
EFI_STATUS
EFIAPI
HiiDrawImageEx (
  IN CONST EFI_HII_IMAGE_EX_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
  );

/**
  Renders an image to a bitmap or the screen containing the contents of the specified
  image.

  This function is similar to EFI_HII_IMAGE_PROTOCOL.DrawImageId(). The difference is that
  this function will locate all EFI_HII_IMAGE_DECODER_PROTOCOL instances installed in the
  system if the decoder of the certain image type is not supported by the
  EFI_HII_IMAGE_EX_PROTOCOL. The function will attempt to decode the image to the
  EFI_IMAGE_INPUT using the first EFI_HII_IMAGE_DECODER_PROTOCOL instance that
  supports the requested image type.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_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  BltX                   Specifies the offset from the left and top edge of
                                 the output image of the first pixel in the image.
  @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 Blt was NULL or ImageId was 0.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the database.
                                 The specified PackageList is not in the database.

**/
EFI_STATUS
EFIAPI
HiiDrawImageIdEx (
  IN CONST EFI_HII_IMAGE_EX_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
  );

/**
  This function returns the image information to EFI_IMAGE_OUTPUT. Only the width
  and height are returned to the EFI_IMAGE_OUTPUT instead of decoding the image
  to the buffer. This function is used to get the geometry of the image. This function
  will try to locate all of the EFI_HII_IMAGE_DECODER_PROTOCOL installed on the
  system if the decoder of image type is not supported by the EFI_HII_IMAGE_EX_PROTOCOL.

  @param  This                   A pointer to the EFI_HII_IMAGE_EX_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.

  @retval EFI_SUCCESS            The new image was returned successfully.
  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the
                                 database. The specified PackageList is not in the database.
  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by ImageSize is too small to
                                 hold the image.
  @retval EFI_INVALID_PARAMETER  The Image was NULL or the ImageId was 0.
  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there
                                 was not enough memory.

**/
EFI_STATUS
EFIAPI
HiiGetImageInfo (
  IN CONST  EFI_HII_IMAGE_EX_PROTOCOL  *This,
  IN        EFI_HII_HANDLE             PackageList,
  IN        EFI_IMAGE_ID               ImageId,
  OUT       EFI_IMAGE_OUTPUT           *Image
  );

//
// 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.
                                  The specified PackageList is not in the database.
  @retval EFI_INVALID_LANGUAGE    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 Language or StringSize was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by StringSize was not zero
                                  and String 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
                                  null-terminated ASCII 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 LanguagesSize was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by LanguagesSize is not zero and Languages is 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  PrimaryLanguage         Points to the null-terminated ASCII string that specifies
                                  the primary language. Languages are specified in the
                                  format specified in Appendix M of the UEFI 2.0 specification.
  @param  SecondaryLanguages      Points to the buffer to hold the returned null-terminated
                                  ASCII string that describes the list of
                                  secondary languages for the specified
                                  PrimaryLanguage. If there are no secondary
                                  languages, the function returns successfully,
                                  but this is set to NULL.
  @param  SecondaryLanguagesSize  On entry, points to the size of the buffer
                                  pointed to by SecondaryLanguages, in bytes. On
                                  return, points to the length of SecondaryLanguages
                                  in bytes.

  @retval EFI_SUCCESS             Secondary languages were correctly returned.
  @retval EFI_INVALID_PARAMETER   PrimaryLanguage or SecondaryLanguagesSize was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by SecondaryLanguagesSize is not
                                  zero and SecondaryLanguages is NULL.
  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by SecondaryLanguagesSize is
                                  too small to hold the returned information.
                                  SecondaryLanguageSize is updated to hold the size of
                                  the buffer required.
  @retval EFI_INVALID_LANGUAGE    The language specified by PrimaryLanguage is not
                                  present in the specified package list.
  @retval EFI_NOT_FOUND           The specified PackageList is not in the Database.

**/
EFI_STATUS
EFIAPI
HiiGetSecondaryLanguages (
  IN CONST EFI_HII_STRING_PROTOCOL  *This,
  IN EFI_HII_HANDLE                 PackageList,
  IN CONST CHAR8                    *PrimaryLanguage,
  IN OUT CHAR8                      *SecondaryLanguages,
  IN OUT UINTN                      *SecondaryLanguagesSize
  );

//
// 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.
                                  If a NULL is specified, this data will not be associate
                                  with any drivers and cannot have a callback induced.
  @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  OPTIONAL,
  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 Handle is not in database.

**/
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  PackageList was NULL.
  @retval EFI_NOT_FOUND          The specified Handle is not 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 outputted successfully.
                                  HandleBufferLength is updated with the actual length.
  @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   HandleBufferLength was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by HandleBufferLength was not
                                  zero and Handle was NULL.
  @retval EFI_INVALID_PARAMETER   PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
                                  PackageGuid is not NULL, PackageType is a EFI_HII_
                                  PACKAGE_TYPE_GUID but PackageGuid is 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 specified Handle could not be found in the
                                  current database.
  @retval EFI_INVALID_PARAMETER   BufferSize was NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by BufferSize was not zero
                                  and Buffer 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  NotificationHandle      The handle of the notification function being
                                  unregistered.

  @retval EFI_SUCCESS             Notification is unregistered successfully.
  @retval EFI_NOT_FOUND          The incoming notification handle does not exist
                           in current hii database.

**/
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 KeyGuidBufferLength is NULL.
  @retval EFI_INVALID_PARAMETER   The value referenced by KeyGuidBufferLength is not
                                  zero and KeyGuidBuffer is 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 entirety of the current HII
                                  database. 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
HiiConfigRoutingRouteConfig (
  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 largest index of the
                                  modified byte in the Block, or the required buffer
                                  size if the Block is not large enough.
  @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>.
  @retval EFI_BUFFER_TOO_SMALL    Block not large enough. Progress undefined.
                                  BlockSize is updated with the required buffer size.

**/
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
  );

/**

  This function accepts a <MultiKeywordResp> formatted string, finds the associated
  keyword owners, creates a <MultiConfigResp> string from it and forwards it to the
  EFI_HII_ROUTING_PROTOCOL.RouteConfig function.

  If there is an issue in resolving the contents of the KeywordString, then the
  function returns an error and also sets the Progress and ProgressErr with the
  appropriate information about where the issue occurred and additional data about
  the nature of the issue.

  In the case when KeywordString containing multiple keywords, when an EFI_NOT_FOUND
  error is generated during processing the second or later keyword element, the system
  storage associated with earlier keywords is not modified. All elements of the
  KeywordString must successfully pass all tests for format and access prior to making
  any modifications to storage.

  In the case when EFI_DEVICE_ERROR is returned from the processing of a KeywordString
  containing multiple keywords, the state of storage associated with earlier keywords
  is undefined.


  @param This             Pointer to the EFI_KEYWORD_HANDLER _PROTOCOL instance.

  @param KeywordString    A null-terminated string in <MultiKeywordResp> format.

  @param Progress         On return, points to a character in the KeywordString.
                          Points to the string's NULL terminator if the 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 ProgressErr      If during the processing of the KeywordString there was
                          a failure, this parameter gives additional information
                          about the possible source of the problem. The various
                          errors are defined in "Related Definitions" below.


  @retval EFI_SUCCESS             The specified action was completed successfully.

  @retval EFI_INVALID_PARAMETER   One or more of the following are TRUE:
                                  1. KeywordString is NULL.
                                  2. Parsing of the KeywordString resulted in an
                                     error. See Progress and ProgressErr for more data.

  @retval EFI_NOT_FOUND           An element of the KeywordString was not found.
                                  See ProgressErr for more data.

  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
                                  See ProgressErr for more data.

  @retval EFI_ACCESS_DENIED       The action violated system policy. See ProgressErr
                                  for more data.

  @retval EFI_DEVICE_ERROR        An unexpected system error occurred. See ProgressErr
                                  for more data.

**/
EFI_STATUS
EFIAPI
EfiConfigKeywordHandlerSetData (
  IN EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL  *This,
  IN CONST EFI_STRING                     KeywordString,
  OUT EFI_STRING                          *Progress,
  OUT UINT32                              *ProgressErr
  );

/**

  This function accepts a <MultiKeywordRequest> formatted string, finds the underlying
  keyword owners, creates a <MultiConfigRequest> string from it and forwards it to the
  EFI_HII_ROUTING_PROTOCOL.ExtractConfig function.

  If there is an issue in resolving the contents of the KeywordString, then the function
  returns an EFI_INVALID_PARAMETER and also set the Progress and ProgressErr with the
  appropriate information about where the issue occurred and additional data about the
  nature of the issue.

  In the case when KeywordString is NULL, or contains multiple keywords, or when
  EFI_NOT_FOUND is generated while processing the keyword elements, the Results string
  contains values returned for all keywords processed prior to the keyword generating the
  error but no values for the keyword with error or any following keywords.


  @param This           Pointer to the EFI_KEYWORD_HANDLER _PROTOCOL instance.

  @param NameSpaceId    A null-terminated string containing the platform configuration
                        language to search through in the system. If a NULL is passed
                        in, then it is assumed that any platform configuration language
                        with the prefix of "x-UEFI-" are searched.

  @param KeywordString  A null-terminated string in <MultiKeywordRequest> format. If a
                        NULL is passed in the KeywordString field, all of the known
                        keywords in the system for the NameSpaceId specified are
                        returned in the Results field.

  @param Progress       On return, points to a character in the KeywordString. Points
                        to the string's NULL terminator if the 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 ProgressErr    If during the processing of the KeywordString there was a
                        failure, this parameter gives additional information about the
                        possible source of the problem. See the definitions in SetData()
                        for valid value definitions.

  @param Results        A null-terminated string in <MultiKeywordResp> format is returned
                        which has all the values filled in for the keywords in the
                        KeywordString. This is a callee-allocated field, and must be freed
                        by the caller after being used.

  @retval EFI_SUCCESS             The specified action was completed successfully.

  @retval EFI_INVALID_PARAMETER   One or more of the following are TRUE:
                                  1.Progress, ProgressErr, or Results is NULL.
                                  2.Parsing of the KeywordString resulted in an error. See
                                    Progress and ProgressErr for more data.


  @retval EFI_NOT_FOUND           An element of the KeywordString was not found. See
                                  ProgressErr for more data.

  @retval EFI_NOT_FOUND           The NamespaceId specified was not found.  See ProgressErr
                                  for more data.

  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.  See
                                  ProgressErr for more data.

  @retval EFI_ACCESS_DENIED       The action violated system policy.  See ProgressErr for
                                  more data.

  @retval EFI_DEVICE_ERROR        An unexpected system error occurred.  See ProgressErr
                                  for more data.

**/
EFI_STATUS
EFIAPI
EfiConfigKeywordHandlerGetData (
  IN EFI_CONFIG_KEYWORD_HANDLER_PROTOCOL  *This,
  IN CONST EFI_STRING                     NameSpaceId  OPTIONAL,
  IN CONST EFI_STRING                     KeywordString  OPTIONAL,
  OUT EFI_STRING                          *Progress,
  OUT UINT32                              *ProgressErr,
  OUT EFI_STRING                          *Results
  );

/**
  Compare whether two names of languages are identical.

  @param  Language1              Name of language 1 from StringPackage
  @param  Language2              Name of language 2 to be compared with language 1.

  @retval TRUE                   same
  @retval FALSE                  not same

**/
BOOLEAN
HiiCompareLanguage (
  IN  CHAR8  *Language1,
  IN  CHAR8  *Language2
  )
;

/**
  Retrieves a pointer to a Null-terminated ASCII string containing the list
  of languages that an HII handle in the HII Database supports.  The returned
  string is allocated using AllocatePool().  The caller is responsible for freeing
  the returned string using FreePool().  The format of the returned string follows
  the language format assumed the HII Database.

  If HiiHandle is NULL, then ASSERT().

  @param[in]  HiiHandle  A handle that was previously registered in the HII Database.

  @retval NULL   HiiHandle is not registered in the HII database
  @retval NULL   There are not enough resources available to retrieve the supported
                 languages.
  @retval NULL   The list of supported languages could not be retrieved.
  @retval Other  A pointer to the Null-terminated ASCII string of supported languages.

**/
CHAR8 *
GetSupportedLanguages (
  IN EFI_HII_HANDLE  HiiHandle
  );

/**
This function mainly use to get HiiDatabase information.

@param  This                   A pointer to the EFI_HII_DATABASE_PROTOCOL instance.

@retval EFI_SUCCESS            Get the information successfully.
@retval EFI_OUT_OF_RESOURCES   Not enough memory to store the Hiidatabase data.

**/
EFI_STATUS
HiiGetDatabaseInfo (
  IN CONST EFI_HII_DATABASE_PROTOCOL  *This
  );

/**
This function mainly use to get and update ConfigResp string.

@param  This                   A pointer to the EFI_HII_DATABASE_PROTOCOL instance.

@retval EFI_SUCCESS            Get the information successfully.
@retval EFI_OUT_OF_RESOURCES   Not enough memory to store the Configuration Setting data.

**/
EFI_STATUS
HiiGetConfigRespInfo (
  IN CONST EFI_HII_DATABASE_PROTOCOL  *This
  );

/**
  Find question default value from PcdNvStoreDefaultValueBuffer

  @param DefaultId          Default store ID
  @param EfiVarStore        Point to EFI VarStore header
  @param IfrQuestionHdr     Point to Question header
  @param ValueBuffer        Point to Buffer includes the found default setting
  @param Width              Width of the default value
  @param BitFieldQuestion   Whether the Question is stored in Bit field.

  @retval EFI_SUCCESS       Question default value is found.
  @retval EFI_NOT_FOUND     Question default value is not found.
**/
EFI_STATUS
FindQuestionDefaultSetting (
  IN  UINT16                   DefaultId,
  IN  EFI_IFR_VARSTORE_EFI     *EfiVarStore,
  IN  EFI_IFR_QUESTION_HEADER  *IfrQuestionHdr,
  OUT VOID                     *ValueBuffer,
  IN  UINTN                    Width,
  IN  BOOLEAN                  BitFieldQuestion
  );

//
// Global variables
//
extern EFI_EVENT  gHiiKeyboardLayoutChanged;
extern BOOLEAN    gExportAfterReadyToBoot;

#endif
