/** @file
Private structures definitions in HiiDatabase.

Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#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)

//
// 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 is an internal function,mainly use to get and update configuration settings 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 Configuration Setting data.

**/
EFI_STATUS
HiiGetConfigurationSetting(
  IN CONST EFI_HII_DATABASE_PROTOCOL        *This
  );

//
// Global variables
//
extern EFI_EVENT gHiiKeyboardLayoutChanged;
extern BOOLEAN   gExportAfterReadyToBoot;

#endif
