]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
MdeModulePkg/SetupBrowserDxe: ASSERT GetBufferForValue(&Value)
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.h
index b1e3c847b9f7ce16faf08286b2f217145b8d733f..5d46fa42e0493532565bcbb570aa0480ec252b8f 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
-Private MACRO, structure and function definitions for Setup Browser module. \r
+Private MACRO, structure and function definitions for Setup Browser module.\r
 \r
-Copyright (c) 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 \r
 **/\r
@@ -19,20 +13,26 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <PiDxe.h>\r
 \r
-#include <Protocol/Print.h>\r
 #include <Protocol/SimpleTextOut.h>\r
 #include <Protocol/SimpleTextIn.h>\r
 #include <Protocol/FormBrowser2.h>\r
+#include <Protocol/FormBrowserEx2.h>\r
+#include <Protocol/DisplayProtocol.h>\r
 #include <Protocol/DevicePath.h>\r
 #include <Protocol/UnicodeCollation.h>\r
 #include <Protocol/HiiConfigAccess.h>\r
 #include <Protocol/HiiConfigRouting.h>\r
 #include <Protocol/HiiDatabase.h>\r
 #include <Protocol/HiiString.h>\r
+#include <Protocol/UserManager.h>\r
+#include <Protocol/DevicePathFromText.h>\r
+#include <Protocol/RegularExpressionProtocol.h>\r
 \r
-#include <MdeModuleHii.h>\r
+#include <Guid/MdeModuleHii.h>\r
+#include <Guid/HiiPlatformSetupFormset.h>\r
+#include <Guid/HiiFormMapMethodGuid.h>\r
+#include <Guid/ZeroGuid.h>\r
 \r
-#include <Library/GraphicsLib.h>\r
 #include <Library/PrintLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
@@ -41,128 +41,40 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
-#include <Library/IfrSupportLib.h>\r
-#include <Library/ExtendedIfrSupportLib.h>\r
 #include <Library/HiiLib.h>\r
-#include <Library/ExtendedHiiLib.h>\r
 #include <Library/PcdLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/UefiLib.h>\r
 \r
-#include "Colors.h"\r
 \r
 //\r
 // This is the generated header file which includes whatever needs to be exported (strings + IFR)\r
 //\r
 \r
-extern UINT8  SetupBrowserStrings[];\r
-\r
-//\r
-// Screen definitions\r
-//\r
-#define BANNER_HEIGHT                 6\r
-#define BANNER_COLUMNS                3\r
-\r
-#define FRONT_PAGE_HEADER_HEIGHT      6\r
-#define NONE_FRONT_PAGE_HEADER_HEIGHT 3\r
-#define LEFT_SKIPPED_COLUMNS          4\r
-#define FOOTER_HEIGHT                 4\r
-#define STATUS_BAR_HEIGHT             1\r
-#define SCROLL_ARROW_HEIGHT           1\r
-#define POPUP_PAD_SPACE_COUNT         5\r
-#define POPUP_FRAME_WIDTH             2\r
-\r
-//\r
-// Definition for function key setting\r
-//\r
-#define NONE_FUNCTION_KEY_SETTING     0\r
-#define DEFAULT_FUNCTION_KEY_SETTING  (FUNCTION_ONE | FUNCTION_TWO | FUNCTION_NINE | FUNCTION_TEN)\r
-\r
-#define FUNCTION_ONE                  (1 << 0)\r
-#define FUNCTION_TWO                  (1 << 1)\r
-#define FUNCTION_NINE                 (1 << 2)\r
-#define FUNCTION_TEN                  (1 << 3)\r
-\r
-typedef struct {\r
-  EFI_GUID  FormSetGuid;\r
-  UINTN     KeySetting;\r
-} FUNCTIION_KEY_SETTING;\r
+#define UI_ACTION_NONE               0\r
+#define UI_ACTION_REFRESH_FORM       1\r
+#define UI_ACTION_REFRESH_FORMSET    2\r
+#define UI_ACTION_EXIT               3\r
 \r
 //\r
-// Character definitions\r
-//\r
-#define CHAR_SPACE              0x0020\r
-#define UPPER_LOWER_CASE_OFFSET 0x20\r
-\r
 //\r
 // Time definitions\r
 //\r
 #define ONE_SECOND  10000000\r
 \r
-//\r
-// Display definitions\r
-//\r
-#define LEFT_HYPER_DELIMITER      L'<'\r
-#define RIGHT_HYPER_DELIMITER     L'>'\r
-\r
-#define LEFT_ONEOF_DELIMITER      L'<'\r
-#define RIGHT_ONEOF_DELIMITER     L'>'\r
-\r
-#define LEFT_NUMERIC_DELIMITER    L'['\r
-#define RIGHT_NUMERIC_DELIMITER   L']'\r
-\r
-#define LEFT_CHECKBOX_DELIMITER   L'['\r
-#define RIGHT_CHECKBOX_DELIMITER  L']'\r
-\r
-#define CHECK_ON                  L'X'\r
-#define CHECK_OFF                 L' '\r
-\r
-#define TIME_SEPARATOR            L':'\r
-#define DATE_SEPARATOR            L'/'\r
-\r
-#define YES_ANSWER                L'Y'\r
-#define NO_ANSWER                 L'N'\r
-\r
-//\r
-// This is the Input Error Message\r
-//\r
-#define INPUT_ERROR 1\r
-\r
-//\r
-// This is the NV RAM update required Message\r
-//\r
-#define NV_UPDATE_REQUIRED  2\r
-\r
-//\r
-// Refresh the Status Bar with flags\r
-//\r
-#define REFRESH_STATUS_BAR  0xff\r
-\r
-//\r
 // Incremental string lenght of ConfigRequest\r
 //\r
 #define CONFIG_REQUEST_STRING_INCREMENTAL  1024\r
 \r
-//\r
-// HII value compare result\r
-//\r
-#define HII_VALUE_UNDEFINED     0\r
-#define HII_VALUE_EQUAL         1\r
-#define HII_VALUE_LESS_THAN     2\r
-#define HII_VALUE_GREATER_THAN  3\r
-\r
 //\r
 // Incremental size of stack for expression\r
 //\r
 #define EXPRESSION_STACK_SIZE_INCREMENT    0x100\r
 \r
+#define EFI_IFR_SPECIFICATION_VERSION  (UINT16) (((EFI_SYSTEM_TABLE_REVISION >> 16) << 8) | (((EFI_SYSTEM_TABLE_REVISION & 0xFFFF) / 10) << 4) | ((EFI_SYSTEM_TABLE_REVISION & 0xFFFF) % 10))\r
 \r
-#define EFI_SPECIFICATION_ERRATA_VERSION   0\r
 \r
-#define EFI_IFR_SPECIFICATION_VERSION  \\r
-        ((((EFI_SPECIFICATION_VERSION) >> 8) & 0xff00) | \\r
-         (((EFI_SPECIFICATION_VERSION) & 0xf) << 4) | \\r
-         ((EFI_SPECIFICATION_ERRATA_VERSION) & 0xf))\r
-\r
-#define SETUP_DRIVER_SIGNATURE EFI_SIGNATURE_32 ('F', 'B', 'D', 'V')\r
+#define SETUP_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'B', 'D', 'V')\r
 typedef struct {\r
   UINT32                             Signature;\r
 \r
@@ -171,14 +83,12 @@ typedef struct {
   //\r
   // Produced protocol\r
   //\r
-  EFI_FORM_BROWSER2_PROTOCOL         FormBrowser2;\r
-  EFI_PRINT_PROTOCOL                 Print;\r
+  EFI_FORM_BROWSER2_PROTOCOL            FormBrowser2;\r
+  EDKII_FORM_BROWSER_EXTENSION_PROTOCOL FormBrowserEx;\r
 \r
-} SETUP_DRIVER_PRIVATE_DATA;\r
+  EDKII_FORM_BROWSER_EXTENSION2_PROTOCOL FormBrowserEx2;\r
 \r
-typedef struct {\r
-  EFI_STRING_ID  Banner[BANNER_HEIGHT][BANNER_COLUMNS];\r
-} BANNER_DATA;\r
+} SETUP_DRIVER_PRIVATE_DATA;\r
 \r
 //\r
 // IFR relative definition\r
@@ -190,20 +100,19 @@ typedef struct {
 #define EFI_HII_EXPRESSION_DISABLE_IF        4\r
 #define EFI_HII_EXPRESSION_VALUE             5\r
 #define EFI_HII_EXPRESSION_RULE              6\r
+#define EFI_HII_EXPRESSION_READ              7\r
+#define EFI_HII_EXPRESSION_WRITE             8\r
+#define EFI_HII_EXPRESSION_WARNING_IF        9\r
 \r
 #define EFI_HII_VARSTORE_BUFFER              0\r
 #define EFI_HII_VARSTORE_NAME_VALUE          1\r
-#define EFI_HII_VARSTORE_EFI_VARIABLE        2\r
+#define EFI_HII_VARSTORE_EFI_VARIABLE        2    // EFI Varstore type follow UEFI spec before 2.3.1.\r
+#define EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER 3    // EFI varstore type follow UEFI spec 2.3.1 and later.\r
 \r
 #define FORM_INCONSISTENT_VALIDATION         0\r
 #define FORM_NO_SUBMIT_VALIDATION            1\r
 \r
-typedef struct {\r
-  UINT8               Type;\r
-  EFI_IFR_TYPE_VALUE  Value;\r
-} EFI_HII_VALUE;\r
-\r
-#define NAME_VALUE_NODE_SIGNATURE  EFI_SIGNATURE_32 ('N', 'V', 'S', 'T')\r
+#define NAME_VALUE_NODE_SIGNATURE  SIGNATURE_32 ('N', 'V', 'S', 'T')\r
 \r
 typedef struct {\r
   UINTN            Signature;\r
@@ -215,7 +124,7 @@ typedef struct {
 \r
 #define NAME_VALUE_NODE_FROM_LINK(a)  CR (a, NAME_VALUE_NODE, Link, NAME_VALUE_NODE_SIGNATURE)\r
 \r
-#define FORMSET_STORAGE_SIGNATURE  EFI_SIGNATURE_32 ('F', 'S', 'T', 'G')\r
+#define BROWSER_STORAGE_SIGNATURE  SIGNATURE_32 ('B', 'S', 'T', 'G')\r
 \r
 typedef struct {\r
   UINTN            Signature;\r
@@ -223,7 +132,9 @@ typedef struct {
 \r
   UINT8            Type;           // Storage type\r
 \r
-  UINT16           VarStoreId;\r
+  BOOLEAN          Initialized;    // Whether this varstore is initialized, efi varstore not used.\r
+\r
+  EFI_HII_HANDLE   HiiHandle;      // HiiHandle for this varstore, efi varstore not used.\r
   EFI_GUID         Guid;\r
 \r
   CHAR16           *Name;          // For EFI_IFR_VARSTORE\r
@@ -235,15 +146,45 @@ typedef struct {
 \r
   UINT32           Attributes;     // For EFI_IFR_VARSTORE_EFI: EFI Variable attribute\r
 \r
+  CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
+                                   // <RequestElement> includes all fields which is used by current form sets.\r
+  UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
+} BROWSER_STORAGE;\r
+\r
+#define BROWSER_STORAGE_FROM_LINK(a)  CR (a, BROWSER_STORAGE, Link, BROWSER_STORAGE_SIGNATURE)\r
+\r
+#define FORMSET_STORAGE_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'G')\r
+\r
+typedef struct {\r
+  UINTN            Signature;\r
+  LIST_ENTRY       Link;\r
+\r
+  LIST_ENTRY       SaveFailLink;\r
+\r
+  UINT16           VarStoreId;\r
+\r
+  BROWSER_STORAGE  *BrowserStorage;\r
+\r
   CHAR16           *ConfigHdr;     // <ConfigHdr>\r
+\r
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
+  CHAR16           *ConfigAltResp; // Alt config response string for this ConfigRequest.\r
+  BOOLEAN          HasCallAltCfg;  // Flag to show whether browser has call ExtractConfig to get Altcfg string.\r
   UINTN            ElementCount;   // Number of <RequestElement> in the <ConfigRequest>\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
+  CHAR16           *RestoreConfigRequest; // When submit formset fail, the element need to be restored\r
+  CHAR16           *SyncConfigRequest;    // When submit formset fail, the element need to be synced\r
 } FORMSET_STORAGE;\r
 \r
 #define FORMSET_STORAGE_FROM_LINK(a)  CR (a, FORMSET_STORAGE, Link, FORMSET_STORAGE_SIGNATURE)\r
+#define FORMSET_STORAGE_FROM_SAVE_FAIL_LINK(a)  CR (a, FORMSET_STORAGE, SaveFailLink, FORMSET_STORAGE_SIGNATURE)\r
 \r
-#define EXPRESSION_OPCODE_SIGNATURE  EFI_SIGNATURE_32 ('E', 'X', 'O', 'P')\r
+typedef union {\r
+  EFI_STRING_ID         VarName;\r
+  UINT16                VarOffset;\r
+} VAR_STORE_INFO;\r
+\r
+#define EXPRESSION_OPCODE_SIGNATURE  SIGNATURE_32 ('E', 'X', 'O', 'P')\r
 \r
 typedef struct {\r
   UINTN             Signature;\r
@@ -257,19 +198,26 @@ typedef struct {
 \r
   EFI_HII_VALUE     Value;       // For EFI_IFR_EQ_ID_VAL, EFI_IFR_UINT64, EFI_IFR_UINT32, EFI_IFR_UINT16, EFI_IFR_UINT8, EFI_IFR_STRING_REF1\r
 \r
-  EFI_QUESTION_ID   QuestionId;  // For EFI_IFR_EQ_ID_ID, EFI_IFR_EQ_ID_LIST, EFI_IFR_QUESTION_REF1\r
+  EFI_QUESTION_ID   QuestionId;  // For EFI_IFR_EQ_ID_ID, EFI_IFR_EQ_ID_VAL_LIST, EFI_IFR_QUESTION_REF1\r
   EFI_QUESTION_ID   QuestionId2;\r
 \r
-  UINT16            ListLength;  // For EFI_IFR_EQ_ID_LIST\r
+  UINT16            ListLength;  // For EFI_IFR_EQ_ID_VAL_LIST\r
   UINT16            *ValueList;\r
 \r
   EFI_STRING_ID     DevicePath;  // For EFI_IFR_QUESTION_REF3_2, EFI_IFR_QUESTION_REF3_3\r
   EFI_GUID          Guid;\r
+\r
+  BROWSER_STORAGE   *VarStorage; // For EFI_IFR_SET, EFI_IFR_GET\r
+  VAR_STORE_INFO    VarStoreInfo;// For EFI_IFR_SET, EFI_IFR_GET\r
+  UINT8             ValueType;   // For EFI_IFR_SET, EFI_IFR_GET\r
+  UINT8             ValueWidth;  // For EFI_IFR_SET, EFI_IFR_GET\r
+  CHAR16            *ValueName;  // For EFI_IFR_SET, EFI_IFR_GET\r
+  LIST_ENTRY        MapExpressionList;   // nested expressions inside of Map opcode.\r
 } EXPRESSION_OPCODE;\r
 \r
 #define EXPRESSION_OPCODE_FROM_LINK(a)  CR (a, EXPRESSION_OPCODE, Link, EXPRESSION_OPCODE_SIGNATURE)\r
 \r
-#define FORM_EXPRESSION_SIGNATURE  EFI_SIGNATURE_32 ('F', 'E', 'X', 'P')\r
+#define FORM_EXPRESSION_SIGNATURE  SIGNATURE_32 ('F', 'E', 'X', 'P')\r
 \r
 typedef struct {\r
   UINTN             Signature;\r
@@ -282,12 +230,23 @@ typedef struct {
 \r
   EFI_HII_VALUE     Result;          // Expression evaluation result\r
 \r
+  UINT8             TimeOut;         // For EFI_IFR_WARNING_IF\r
+  EFI_IFR_OP_HEADER *OpCode;         // Save the opcode buffer.\r
+\r
   LIST_ENTRY        OpCodeListHead;  // OpCodes consist of this expression (EXPRESSION_OPCODE)\r
 } FORM_EXPRESSION;\r
 \r
 #define FORM_EXPRESSION_FROM_LINK(a)  CR (a, FORM_EXPRESSION, Link, FORM_EXPRESSION_SIGNATURE)\r
 \r
-#define QUESTION_DEFAULT_SIGNATURE  EFI_SIGNATURE_32 ('Q', 'D', 'F', 'T')\r
+#define FORM_EXPRESSION_LIST_SIGNATURE  SIGNATURE_32 ('F', 'E', 'X', 'R')\r
+\r
+typedef struct {\r
+    UINTN               Signature;\r
+    UINTN               Count;\r
+    FORM_EXPRESSION    *Expression[1];   // Array[Count] of expressions\r
+} FORM_EXPRESSION_LIST;\r
+\r
+#define QUESTION_DEFAULT_SIGNATURE  SIGNATURE_32 ('Q', 'D', 'F', 'T')\r
 \r
 typedef struct {\r
   UINTN               Signature;\r
@@ -301,28 +260,48 @@ typedef struct {
 \r
 #define QUESTION_DEFAULT_FROM_LINK(a)  CR (a, QUESTION_DEFAULT, Link, QUESTION_DEFAULT_SIGNATURE)\r
 \r
-#define QUESTION_OPTION_SIGNATURE  EFI_SIGNATURE_32 ('Q', 'O', 'P', 'T')\r
+#define QUESTION_OPTION_SIGNATURE  SIGNATURE_32 ('Q', 'O', 'P', 'T')\r
 \r
 typedef struct {\r
-  UINTN               Signature;\r
-  LIST_ENTRY          Link;\r
+  UINTN                Signature;\r
+  LIST_ENTRY           Link;\r
 \r
-  EFI_STRING_ID       Text;\r
-  UINT8               Flags;\r
-  EFI_HII_VALUE       Value;\r
-  EFI_IMAGE_ID        ImageId;\r
+  EFI_IFR_ONE_OF_OPTION  *OpCode;   // OneOfOption Data\r
 \r
-  FORM_EXPRESSION     *SuppressExpression; // Non-NULL indicates nested inside of SuppressIf\r
+  EFI_STRING_ID        Text;\r
+  UINT8                Flags;\r
+  EFI_HII_VALUE        Value;\r
+  EFI_IMAGE_ID         ImageId;\r
+\r
+  FORM_EXPRESSION_LIST *SuppressExpression; // Non-NULL indicates nested inside of SuppressIf\r
 } QUESTION_OPTION;\r
 \r
 #define QUESTION_OPTION_FROM_LINK(a)  CR (a, QUESTION_OPTION, Link, QUESTION_OPTION_SIGNATURE)\r
 \r
-#define FORM_BROWSER_STATEMENT_SIGNATURE  EFI_SIGNATURE_32 ('F', 'S', 'T', 'A')\r
-typedef struct {\r
+typedef enum {\r
+  ExpressFalse = 0,\r
+  ExpressGrayOut,\r
+  ExpressSuppress,\r
+  ExpressDisable\r
+} EXPRESS_RESULT;\r
+\r
+typedef enum {\r
+  ExpressNone = 0,\r
+  ExpressForm,\r
+  ExpressStatement,\r
+  ExpressOption\r
+} EXPRESS_LEVEL;\r
+\r
+typedef struct _FORM_BROWSER_STATEMENT FORM_BROWSER_STATEMENT;\r
+\r
+#define FORM_BROWSER_STATEMENT_SIGNATURE  SIGNATURE_32 ('F', 'S', 'T', 'A')\r
+\r
+struct _FORM_BROWSER_STATEMENT{\r
   UINTN                 Signature;\r
   LIST_ENTRY            Link;\r
 \r
   UINT8                 Operand;          // The operand (first byte) of this Statement or Question\r
+  EFI_IFR_OP_HEADER     *OpCode;\r
 \r
   //\r
   // Statement Header\r
@@ -331,23 +310,29 @@ typedef struct {
   EFI_STRING_ID         Help;\r
   EFI_STRING_ID         TextTwo;          // For EFI_IFR_TEXT\r
 \r
+  //\r
+  // Fake Question Id, used for statement not has true QuestionId.\r
+  //\r
+  EFI_QUESTION_ID       FakeQuestionId;\r
+\r
   //\r
   // Question Header\r
   //\r
   EFI_QUESTION_ID       QuestionId;       // The value of zero is reserved\r
   EFI_VARSTORE_ID       VarStoreId;       // A value of zero indicates no variable storage\r
-  FORMSET_STORAGE       *Storage;\r
-  union {\r
-    EFI_STRING_ID       VarName;\r
-    UINT16              VarOffset;\r
-  }  VarStoreInfo;\r
+  BROWSER_STORAGE       *Storage;\r
+  VAR_STORE_INFO        VarStoreInfo;\r
   UINT16                StorageWidth;\r
+  UINT16                BitStorageWidth;\r
+  UINT16                BitVarOffset;\r
   UINT8                 QuestionFlags;\r
+  BOOLEAN               QuestionReferToBitField;// Whether the question is stored in a bit field.\r
   CHAR16                *VariableName;    // Name/Value or EFI Variable name\r
   CHAR16                *BlockName;       // Buffer storage block name: "OFFSET=...WIDTH=..."\r
 \r
   EFI_HII_VALUE         HiiValue;         // Edit copy for checkbox, numberic, oneof\r
   UINT8                 *BufferValue;     // Edit copy for string, password, orderedlist\r
+  UINT8                 ValueType;        // Data type for orderedlist value array\r
 \r
   //\r
   // OpCode specific members\r
@@ -364,11 +349,9 @@ typedef struct {
   UINT64                Step;\r
 \r
   EFI_DEFAULT_ID        DefaultId;        // for EFI_IFR_RESET_BUTTON\r
-  EFI_FORM_ID           RefFormId;        // for EFI_IFR_REF\r
-  EFI_QUESTION_ID       RefQuestionId;    // for EFI_IFR_REF2\r
-  EFI_GUID              RefFormSetId;     // for EFI_IFR_REF3\r
-  EFI_STRING_ID         RefDevicePath;    // for EFI_IFR_REF4\r
-\r
+  EFI_GUID              RefreshGuid;      // for EFI_IFR_REFRESH_ID\r
+  BOOLEAN               Locked;           // Whether this statement is locked.\r
+  BOOLEAN               ValueChanged;     // Whether this statement's value is changed.\r
   //\r
   // Get from IFR parsing\r
   //\r
@@ -378,35 +361,66 @@ typedef struct {
 \r
   EFI_IMAGE_ID          ImageId;             // nested EFI_IFR_IMAGE\r
   UINT8                 RefreshInterval;     // nested EFI_IFR_REFRESH, refresh interval(in seconds) for Question value, 0 means no refresh\r
-  BOOLEAN               InSubtitle;          // nesting inside of EFI_IFR_SUBTITLE\r
+\r
+  FORM_BROWSER_STATEMENT *ParentStatement;\r
 \r
   LIST_ENTRY            InconsistentListHead;// nested inconsistent expression list (FORM_EXPRESSION)\r
   LIST_ENTRY            NoSubmitListHead;    // nested nosubmit expression list (FORM_EXPRESSION)\r
-  FORM_EXPRESSION       *GrayOutExpression;  // nesting inside of GrayOutIf\r
-  FORM_EXPRESSION       *SuppressExpression; // nesting inside of SuppressIf\r
+  LIST_ENTRY            WarningListHead;     // nested warning expression list (FORM_EXPRESSION)\r
+  FORM_EXPRESSION_LIST  *Expression;         // nesting inside of GrayOutIf/DisableIf/SuppressIf\r
 \r
-} FORM_BROWSER_STATEMENT;\r
+  FORM_EXPRESSION       *ReadExpression;     // nested EFI_IFR_READ, provide this question value by read expression.\r
+  FORM_EXPRESSION       *WriteExpression;    // nested EFI_IFR_WRITE, evaluate write expression after this question value is set.\r
+};\r
 \r
 #define FORM_BROWSER_STATEMENT_FROM_LINK(a)  CR (a, FORM_BROWSER_STATEMENT, Link, FORM_BROWSER_STATEMENT_SIGNATURE)\r
 \r
-#define FORM_BROWSER_FORM_SIGNATURE  EFI_SIGNATURE_32 ('F', 'F', 'R', 'M')\r
+#define FORM_BROWSER_CONFIG_REQUEST_SIGNATURE  SIGNATURE_32 ('F', 'C', 'R', 'S')\r
+typedef struct {\r
+  UINTN                 Signature;\r
+  LIST_ENTRY            Link;\r
+\r
+  LIST_ENTRY            SaveFailLink;\r
+\r
+  CHAR16                *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
+  CHAR16                *ConfigAltResp; // Alt config response string for this ConfigRequest.\r
+  UINTN                 ElementCount;   // Number of <RequestElement> in the <ConfigRequest>\r
+  UINTN                 SpareStrLen;\r
+  CHAR16                *RestoreConfigRequest; // When submit form fail, the element need to be restored\r
+  CHAR16                *SyncConfigRequest;    // When submit form fail, the element need to be synced\r
+\r
+  BROWSER_STORAGE       *Storage;\r
+} FORM_BROWSER_CONFIG_REQUEST;\r
+#define FORM_BROWSER_CONFIG_REQUEST_FROM_LINK(a)  CR (a, FORM_BROWSER_CONFIG_REQUEST, Link, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)\r
+#define FORM_BROWSER_CONFIG_REQUEST_FROM_SAVE_FAIL_LINK(a)  CR (a, FORM_BROWSER_CONFIG_REQUEST, SaveFailLink, FORM_BROWSER_CONFIG_REQUEST_SIGNATURE)\r
+\r
+#define FORM_BROWSER_FORM_SIGNATURE  SIGNATURE_32 ('F', 'F', 'R', 'M')\r
+#define STANDARD_MAP_FORM_TYPE 0x01\r
 \r
 typedef struct {\r
-  UINTN             Signature;\r
-  LIST_ENTRY        Link;\r
+  UINTN                Signature;\r
+  LIST_ENTRY           Link;\r
 \r
-  UINT16            FormId;\r
-  EFI_STRING_ID     FormTitle;\r
+  UINT16               FormId;               // FormId of normal form or formmap form.\r
+  EFI_STRING_ID        FormTitle;            // FormTile of normal form, or FormMapMethod title of formmap form.\r
+  UINT16               FormType;             // Specific form type for the different form.\r
 \r
-  EFI_IMAGE_ID      ImageId;\r
+  EFI_IMAGE_ID         ImageId;\r
 \r
-  LIST_ENTRY        ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
-  LIST_ENTRY        StatementListHead;    // List of Statements and Questions (FORM_BROWSER_STATEMENT)\r
+  BOOLEAN              ModalForm;            // Whether this is a modal form.\r
+  BOOLEAN              Locked;               // Whether this form is locked.\r
+  EFI_GUID             RefreshGuid;          // Form refresh event guid.\r
+\r
+  LIST_ENTRY           FormViewListHead;     // List of type FORMID_INFO is Browser View Form History List.\r
+  LIST_ENTRY           ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
+  LIST_ENTRY           StatementListHead;    // List of Statements and Questions (FORM_BROWSER_STATEMENT)\r
+  LIST_ENTRY           ConfigRequestHead;    // List of configreques for all storage.\r
+  FORM_EXPRESSION_LIST *SuppressExpression;  // nesting inside of SuppressIf\r
 } FORM_BROWSER_FORM;\r
 \r
 #define FORM_BROWSER_FORM_FROM_LINK(a)  CR (a, FORM_BROWSER_FORM, Link, FORM_BROWSER_FORM_SIGNATURE)\r
 \r
-#define FORMSET_DEFAULTSTORE_SIGNATURE  EFI_SIGNATURE_32 ('F', 'D', 'F', 'S')\r
+#define FORMSET_DEFAULTSTORE_SIGNATURE  SIGNATURE_32 ('F', 'D', 'F', 'S')\r
 \r
 typedef struct {\r
   UINTN            Signature;\r
@@ -418,8 +432,14 @@ typedef struct {
 \r
 #define FORMSET_DEFAULTSTORE_FROM_LINK(a)  CR (a, FORMSET_DEFAULTSTORE, Link, FORMSET_DEFAULTSTORE_SIGNATURE)\r
 \r
+#define FORM_BROWSER_FORMSET_SIGNATURE  SIGNATURE_32 ('F', 'B', 'F', 'S')\r
+\r
 typedef struct {\r
-  EFI_HII_HANDLE                  HiiHandle;\r
+  UINTN                           Signature;\r
+  LIST_ENTRY                      Link;\r
+  LIST_ENTRY                      SaveFailLink;\r
+\r
+  EFI_HII_HANDLE                  HiiHandle;      // unique id for formset.\r
   EFI_HANDLE                      DriverHandle;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
   EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
@@ -427,180 +447,168 @@ typedef struct {
   UINTN                           IfrBinaryLength;\r
   UINT8                           *IfrBinaryData;\r
 \r
+  BOOLEAN                         QuestionInited;   // Have finished question initilization?\r
   EFI_GUID                        Guid;\r
   EFI_STRING_ID                   FormSetTitle;\r
   EFI_STRING_ID                   Help;\r
-  UINT16                          Class;\r
-  UINT16                          SubClass;\r
+  UINT8                           NumberOfClassGuid;\r
+  EFI_GUID                        ClassGuid[3];         // Up to three ClassGuid\r
+  UINT16                          Class;                // Tiano extended Class code\r
+  UINT16                          SubClass;             // Tiano extended Subclass code\r
   EFI_IMAGE_ID                    ImageId;\r
+  EFI_IFR_OP_HEADER               *OpCode;              //mainly for formset op to get ClassGuid\r
 \r
   FORM_BROWSER_STATEMENT          *StatementBuffer;     // Buffer for all Statements and Questions\r
   EXPRESSION_OPCODE               *ExpressionBuffer;    // Buffer for all Expression OpCode\r
+  FORM_BROWSER_FORM               *SaveFailForm;        // The form which failed to save.\r
+  FORM_BROWSER_STATEMENT          *SaveFailStatement;   // The Statement which failed to save.\r
 \r
+  LIST_ENTRY                      StatementListOSF;     // Statement list out side of the form.\r
   LIST_ENTRY                      StorageListHead;      // Storage list (FORMSET_STORAGE)\r
+  LIST_ENTRY                      SaveFailStorageListHead; // Storage list for the save fail storage.\r
   LIST_ENTRY                      DefaultStoreListHead; // DefaultStore list (FORMSET_DEFAULTSTORE)\r
   LIST_ENTRY                      FormListHead;         // Form list (FORM_BROWSER_FORM)\r
+  LIST_ENTRY                      ExpressionListHead;   // List of Expressions (FORM_EXPRESSION)\r
 } FORM_BROWSER_FORMSET;\r
+#define FORM_BROWSER_FORMSET_FROM_LINK(a)  CR (a, FORM_BROWSER_FORMSET, Link, FORM_BROWSER_FORMSET_SIGNATURE)\r
 \r
+#define FORM_BROWSER_FORMSET_FROM_SAVE_FAIL_LINK(a)  CR (a, FORM_BROWSER_FORMSET, SaveFailLink, FORM_BROWSER_FORMSET_SIGNATURE)\r
 \r
-extern EFI_HII_DATABASE_PROTOCOL         *mHiiDatabase;\r
-extern EFI_HII_STRING_PROTOCOL           *mHiiString;\r
-extern EFI_HII_CONFIG_ROUTING_PROTOCOL   *mHiiConfigRouting;\r
-\r
-extern BANNER_DATA           *BannerData;\r
-extern EFI_HII_HANDLE        FrontPageHandle;\r
-extern UINTN                 gClassOfVfr;\r
-extern UINTN                 gFunctionKeySetting;\r
-extern BOOLEAN               gResetRequired;\r
-extern BOOLEAN               gNvUpdateRequired;\r
-extern EFI_HII_HANDLE        gHiiHandle;\r
-extern BOOLEAN               gFirstIn;\r
-extern UINT16                gDirection;\r
-extern EFI_SCREEN_DESCRIPTOR gScreenDimensions;\r
-extern BOOLEAN               gUpArrow;\r
-extern BOOLEAN               gDownArrow;\r
-\r
-//\r
-// Browser Global Strings\r
-//\r
-extern CHAR16            *gFunctionOneString;\r
-extern CHAR16            *gFunctionTwoString;\r
-extern CHAR16            *gFunctionNineString;\r
-extern CHAR16            *gFunctionTenString;\r
-extern CHAR16            *gEnterString;\r
-extern CHAR16            *gEnterCommitString;\r
-extern CHAR16            *gEscapeString;\r
-extern CHAR16            *gSaveFailed;\r
-extern CHAR16            *gMoveHighlight;\r
-extern CHAR16            *gMakeSelection;\r
-extern CHAR16            *gDecNumericInput;\r
-extern CHAR16            *gHexNumericInput;\r
-extern CHAR16            *gToggleCheckBox;\r
-extern CHAR16            *gPromptForData;\r
-extern CHAR16            *gPromptForPassword;\r
-extern CHAR16            *gPromptForNewPassword;\r
-extern CHAR16            *gConfirmPassword;\r
-extern CHAR16            *gConfirmError;\r
-extern CHAR16            *gPassowordInvalid;\r
-extern CHAR16            *gPressEnter;\r
-extern CHAR16            *gEmptyString;\r
-extern CHAR16            *gAreYouSure;\r
-extern CHAR16            *gYesResponse;\r
-extern CHAR16            *gNoResponse;\r
-extern CHAR16            *gMiniString;\r
-extern CHAR16            *gPlusString;\r
-extern CHAR16            *gMinusString;\r
-extern CHAR16            *gAdjustNumber;\r
-\r
-extern CHAR16            gPromptBlockWidth;\r
-extern CHAR16            gOptionBlockWidth;\r
-extern CHAR16            gHelpBlockWidth;\r
-\r
-extern EFI_GUID          gZeroGuid;\r
-extern EFI_GUID          gTianoHiiIfrGuid;\r
-\r
-//\r
-// Global Procedure Defines\r
-//\r
-\r
-/**\r
-  Initialize the HII String Token to the correct values.\r
+typedef struct {\r
+  LIST_ENTRY   Link;\r
+  EFI_EVENT    RefreshEvent;\r
+} FORM_BROWSER_REFRESH_EVENT_NODE;\r
 \r
-**/\r
-VOID\r
-InitializeBrowserStrings (\r
-  VOID\r
-  )\r
-;\r
+#define FORM_BROWSER_REFRESH_EVENT_FROM_LINK(a) BASE_CR (a, FORM_BROWSER_REFRESH_EVENT_NODE, Link)\r
 \r
-/**\r
-  Prints a unicode string to the default console,\r
-  using L"%s" format.\r
 \r
-  @param  String     String pointer.\r
+typedef struct {\r
+  EFI_HII_HANDLE  Handle;\r
 \r
-  @return Length of string printed to the console\r
+  //\r
+  // Target formset/form/Question information\r
+  //\r
+  EFI_GUID        FormSetGuid;\r
+  UINT16          FormId;\r
+  UINT16          QuestionId;\r
+  UINTN           Sequence;  // used for time/date only.\r
 \r
-**/\r
-UINTN\r
-PrintString (\r
-  IN CHAR16       *String\r
-  )\r
-;\r
+  UINTN           TopRow;\r
+  UINTN           BottomRow;\r
+  UINTN           PromptCol;\r
+  UINTN           OptionCol;\r
+  UINTN           CurrentRow;\r
 \r
-/**\r
-  Prints a chracter to the default console,\r
-  using L"%c" format.\r
+  //\r
+  // Ation for Browser to taken:\r
+  //   UI_ACTION_NONE            - navigation inside a form\r
+  //   UI_ACTION_REFRESH_FORM    - re-evaluate expressions and repaint form\r
+  //   UI_ACTION_REFRESH_FORMSET - re-parse formset IFR binary\r
+  //\r
+  UINTN           Action;\r
 \r
-  @param  Character  Character to print.\r
+  //\r
+  // Current selected fomset/form/Question\r
+  //\r
+  FORM_BROWSER_FORMSET    *FormSet;\r
+  FORM_BROWSER_FORM       *Form;\r
+  FORM_BROWSER_STATEMENT  *Statement;\r
 \r
-  @return Length of string printed to the console.\r
+  //\r
+  // Whether the Form is editable\r
+  //\r
+  BOOLEAN                 FormEditable;\r
 \r
-**/\r
-UINTN\r
-PrintChar (\r
-  CHAR16       Character\r
-  )\r
-;\r
+  FORM_ENTRY_INFO            *CurrentMenu;\r
+} UI_MENU_SELECTION;\r
 \r
-/**\r
-  Prints a formatted unicode string to the default console, at\r
-  the supplied cursor position.\r
+#define BROWSER_CONTEXT_SIGNATURE  SIGNATURE_32 ('B', 'C', 'T', 'X')\r
 \r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at\r
-  @param  Fmt        Format string\r
-  @param  ...        Variable argument list for formating string.\r
+typedef struct {\r
+  UINTN                 Signature;\r
+  LIST_ENTRY            Link;\r
 \r
-  @return Length of string printed to the console\r
+  //\r
+  // Globals defined in Setup.c\r
+  //\r
+  BOOLEAN                  FlagReconnect;\r
+  BOOLEAN                  CallbackReconnect;\r
+  BOOLEAN                  ResetRequired;\r
+  BOOLEAN                  ExitRequired;\r
+  EFI_HII_HANDLE           HiiHandle;\r
+  EFI_GUID                 FormSetGuid;\r
+  EFI_FORM_ID              FormId;\r
+  UI_MENU_SELECTION        *Selection;\r
+  FORM_BROWSER_FORMSET     *SystemLevelFormSet;\r
+  EFI_QUESTION_ID          CurFakeQestId;\r
+  BOOLEAN                  HiiPackageListUpdated;\r
+  BOOLEAN                  FinishRetrieveCall;\r
+  LIST_ENTRY               FormHistoryList;\r
+  LIST_ENTRY               FormSetList;\r
+} BROWSER_CONTEXT;\r
+\r
+#define BROWSER_CONTEXT_FROM_LINK(a)  CR (a, BROWSER_CONTEXT, Link, BROWSER_CONTEXT_SIGNATURE)\r
 \r
-**/\r
-UINTN\r
-PrintAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *Fmt,\r
-  ...\r
-  )\r
-;\r
+//\r
+// Scope for get defaut value. It may be GetDefaultForNoStorage, GetDefaultForStorage or GetDefaultForAll.\r
+//\r
+typedef enum {\r
+  GetDefaultForNoStorage,       // Get default value for question which not has storage.\r
+  GetDefaultForStorage,         // Get default value for question which has storage.\r
+  GetDefaultForAll,             // Get default value for all questions.\r
+  GetDefaultForMax              // Invalid value.\r
+} BROWSER_GET_DEFAULT_VALUE;\r
 \r
-/**\r
-  Prints a unicode string to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
+//\r
+// Get/set question value from/to.\r
+//\r
+typedef enum {\r
+  GetSetValueWithEditBuffer = 0,   // Get/Set question value from/to editbuffer in the storage.\r
+  GetSetValueWithBuffer,           // Get/Set question value from/to buffer in the storage.\r
+  GetSetValueWithHiiDriver,        // Get/Set question value from/to hii driver.\r
+  GetSetValueWithBothBuffer,       // Compare the editbuffer with buffer for this question, not use the question value.\r
+  GetSetValueWithMax               // Invalid value.\r
+} GET_SET_QUESTION_VALUE_WITH;\r
 \r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at\r
-  @param  String     String pointer.\r
+extern EFI_HII_DATABASE_PROTOCOL         *mHiiDatabase;\r
+extern EFI_HII_CONFIG_ROUTING_PROTOCOL   *mHiiConfigRouting;\r
+extern EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *mPathFromText;\r
+extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;\r
+\r
+extern BOOLEAN               gCallbackReconnect;\r
+extern BOOLEAN               gFlagReconnect;\r
+extern BOOLEAN               gResetRequiredFormLevel;\r
+extern BOOLEAN               gResetRequiredSystemLevel;\r
+extern BOOLEAN               gExitRequired;\r
+extern LIST_ENTRY            gBrowserFormSetList;\r
+extern LIST_ENTRY            gBrowserHotKeyList;\r
+extern BROWSER_SETTING_SCOPE gBrowserSettingScope;\r
+extern EXIT_HANDLER          ExitHandlerFunction;\r
+extern EFI_HII_HANDLE        mCurrentHiiHandle;\r
+extern SETUP_DRIVER_PRIVATE_DATA mPrivateData;\r
+//\r
+// Browser Global Strings\r
+//\r
+extern CHAR16            *gEmptyString;\r
 \r
-  @return Length of string printed to the console\r
+extern UI_MENU_SELECTION  *gCurrentSelection;\r
+extern BOOLEAN            mHiiPackageListUpdated;\r
+extern UINT16             mCurFakeQestId;\r
+extern BOOLEAN            mFinishRetrieveCall;\r
 \r
-**/\r
-UINTN\r
-PrintStringAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String\r
-  )\r
-;\r
+//\r
+// Global Procedure Defines\r
+//\r
+#include "Expression.h"\r
 \r
 /**\r
-  Prints a chracter to the default console, at\r
-  the supplied cursor position, using L"%c" format.\r
-\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at.\r
-  @param  Character  Character to print.\r
-\r
-  @return Length of string printed to the console.\r
+  Initialize the HII String Token to the correct values.\r
 \r
 **/\r
-UINTN\r
-PrintCharAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  CHAR16       Character\r
-  )\r
-;\r
+VOID\r
+InitializeBrowserStrings (\r
+  VOID\r
+  );\r
 \r
 /**\r
   Parse opcodes in the formset IFR binary.\r
@@ -614,8 +622,7 @@ PrintCharAt (
 EFI_STATUS\r
 ParseOpCodes (\r
   IN FORM_BROWSER_FORMSET              *FormSet\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Free resources allocated for a FormSet.\r
@@ -626,18 +633,8 @@ ParseOpCodes (
 VOID\r
 DestroyFormSet (\r
   IN OUT FORM_BROWSER_FORMSET  *FormSet\r
-  )\r
-;\r
-\r
-/**\r
-  This function displays the page frame.\r
+  );\r
 \r
-**/\r
-VOID\r
-DisplayPageFrame (\r
-  VOID\r
-  )\r
-;\r
 \r
 /**\r
   Create a new string in HII Package List.\r
@@ -653,8 +650,7 @@ EFI_STRING_ID
 NewString (\r
   IN  CHAR16                   *String,\r
   IN  EFI_HII_HANDLE           HiiHandle\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Delete a string from HII Package List.\r
@@ -669,8 +665,7 @@ EFI_STATUS
 DeleteString (\r
   IN  EFI_STRING_ID            StringId,\r
   IN  EFI_HII_HANDLE           HiiHandle\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Get the string based on the StringId and HII Package List Handle.\r
@@ -686,63 +681,98 @@ CHAR16 *
 GetToken (\r
   IN  EFI_STRING_ID                Token,\r
   IN  EFI_HII_HANDLE               HiiHandle\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
+  Get Value for given Name from a NameValue Storage.\r
+\r
+  @param  Storage                The NameValue Storage.\r
+  @param  Name                   The Name.\r
+  @param  Value                  The retured Value.\r
+  @param  GetValueFrom           Where to get source value, from EditValue or Value.\r
 \r
-  @param RequestedWidth  The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param Marker          The variable argument list for the list of string to be printed.\r
+  @retval EFI_SUCCESS            Value found for given Name.\r
+  @retval EFI_NOT_FOUND          No such Name found in NameValue storage.\r
 \r
 **/\r
-VOID\r
-CreateSharedPopUp (\r
-  IN  UINTN                       RequestedWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  IN  VA_LIST                     Marker\r
-  )\r
-;\r
-\r
-/**\r
-  Routine used to abstract a generic dialog interface and return the selected key or string\r
-\r
-  @param  NumberOfLines          The number of lines for the dialog box\r
-  @param  HotKey                 Defines whether a single character is parsed\r
-                                 (TRUE) and returned in KeyValue or a string is\r
-                                 returned in StringBuffer.  Two special characters\r
-                                 are considered when entering a string, a SCAN_ESC\r
-                                 and an CHAR_CARRIAGE_RETURN.  SCAN_ESC terminates\r
-                                 string input and returns\r
-  @param  MaximumStringSize      The maximum size in bytes of a typed in string\r
-                                 (each character is a CHAR16) and the minimum\r
-                                 string returned is two bytes\r
-  @param  StringBuffer           The passed in pointer to the buffer which will\r
-                                 hold the typed in string if HotKey is FALSE\r
-  @param  KeyValue               The EFI_KEY value returned if HotKey is TRUE..\r
-  @param  String                 Pointer to the first string in the list\r
-  @param  ...                    A series of (quantity == NumberOfLines) text\r
-                                 strings which will be used to construct the dialog\r
-                                 box\r
-\r
-  @retval EFI_SUCCESS            Displayed dialog and received user interaction\r
-  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid (e.g.\r
-                                 (StringBuffer == NULL) && (HotKey == FALSE))\r
-  @retval EFI_DEVICE_ERROR       User typed in an ESC character to exit the routine\r
+EFI_STATUS\r
+GetValueByName (\r
+  IN BROWSER_STORAGE             *Storage,\r
+  IN CHAR16                      *Name,\r
+  IN OUT CHAR16                  **Value,\r
+  IN GET_SET_QUESTION_VALUE_WITH GetValueFrom\r
+  );\r
+\r
+/**\r
+  Set Value of given Name in a NameValue Storage.\r
+\r
+  @param  Storage                The NameValue Storage.\r
+  @param  Name                   The Name.\r
+  @param  Value                  The Value to set.\r
+  @param  SetValueTo             Whether update editValue or Value.\r
+  @param  ReturnNode             The node use the input name.\r
+\r
+  @retval EFI_SUCCESS            Value found for given Name.\r
+  @retval EFI_NOT_FOUND          No such Name found in NameValue storage.\r
 \r
 **/\r
 EFI_STATUS\r
-CreateDialog (\r
-  IN  UINTN                       NumberOfLines,\r
-  IN  BOOLEAN                     HotKey,\r
-  IN  UINTN                       MaximumStringSize,\r
-  OUT CHAR16                      *StringBuffer,\r
-  OUT EFI_INPUT_KEY               *KeyValue,\r
-  ...\r
-  )\r
-;\r
+SetValueByName (\r
+  IN  BROWSER_STORAGE             *Storage,\r
+  IN  CHAR16                      *Name,\r
+  IN  CHAR16                      *Value,\r
+  IN  GET_SET_QUESTION_VALUE_WITH SetValueTo,\r
+  OUT NAME_VALUE_NODE             **ReturnNode\r
+  );\r
+\r
+/**\r
+  Validate whether this question's value has changed.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  Question               Question to be initialized.\r
+  @param  GetValueFrom           Where to get value, may from editbuffer, buffer or hii driver.\r
+\r
+  @retval TRUE                   Question's value has changed.\r
+  @retval FALSE                  Question's value has not changed\r
+\r
+**/\r
+BOOLEAN\r
+IsQuestionValueChanged (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN OUT FORM_BROWSER_STATEMENT       *Question,\r
+  IN GET_SET_QUESTION_VALUE_WITH      GetValueFrom\r
+  );\r
+\r
+/**\r
+  Validate the FormSet. If the formset is not validate, remove it from the list.\r
+\r
+  @param  FormSet                The input FormSet which need to validate.\r
+\r
+  @retval TRUE                   The handle is validate.\r
+  @retval FALSE                  The handle is invalidate.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateFormSet (\r
+  FORM_BROWSER_FORMSET    *FormSet\r
+  );\r
+\r
+/**\r
+  Update the ValueChanged status for questions.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Default action.\r
+\r
+**/\r
+VOID\r
+UpdateStatementStatus (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  );\r
 \r
 /**\r
   Get Question's current Value.\r
@@ -750,8 +780,7 @@ CreateDialog (
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
   @param  Question               Question to be initialized.\r
-  @param  Cached                 TRUE:  get from Edit copy FALSE: get from original\r
-                                 Storage\r
+  @param  GetValueFrom           Where to get value, may from editbuffer, buffer or hii driver.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
 \r
@@ -761,9 +790,8 @@ GetQuestionValue (
   IN FORM_BROWSER_FORMSET             *FormSet,\r
   IN FORM_BROWSER_FORM                *Form,\r
   IN OUT FORM_BROWSER_STATEMENT       *Question,\r
-  IN BOOLEAN                          Cached\r
-  )\r
-;\r
+  IN GET_SET_QUESTION_VALUE_WITH      GetValueFrom\r
+  );\r
 \r
 /**\r
   Save Question Value to edit copy(cached) or Storage(uncached).\r
@@ -771,8 +799,7 @@ GetQuestionValue (
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
   @param  Question               Pointer to the Question.\r
-  @param  Cached                 TRUE:  set to Edit copy FALSE: set to original\r
-                                 Storage\r
+  @param  SetValueTo             Update the question value to editbuffer , buffer or hii driver.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
 \r
@@ -782,9 +809,8 @@ SetQuestionValue (
   IN FORM_BROWSER_FORMSET             *FormSet,\r
   IN FORM_BROWSER_FORM                *Form,\r
   IN OUT FORM_BROWSER_STATEMENT       *Question,\r
-  IN BOOLEAN                          Cached\r
-  )\r
-;\r
+  IN GET_SET_QUESTION_VALUE_WITH      SetValueTo\r
+  );\r
 \r
 /**\r
   Perform inconsistent check for a Form.\r
@@ -804,24 +830,44 @@ ValidateQuestion (
   IN  FORM_BROWSER_FORM               *Form,\r
   IN  FORM_BROWSER_STATEMENT          *Question,\r
   IN  UINTN                           Type\r
-  )\r
-;\r
+  );\r
+\r
+\r
+/**\r
+  Discard data based on the input setting scope (Form, FormSet or System).\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Discard action.\r
+\r
+  @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
+\r
+**/\r
+EFI_STATUS\r
+DiscardForm (\r
+  IN FORM_BROWSER_FORMSET             *FormSet,\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  );\r
 \r
 /**\r
-  Submit a Form.\r
+  Submit data based on the input Setting level (Form, FormSet or System).\r
 \r
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
+  @param  SettingScope           Setting Scope for Submit action.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
 \r
 **/\r
 EFI_STATUS\r
 SubmitForm (\r
   IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN FORM_BROWSER_FORM                *Form\r
-  )\r
-;\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN BROWSER_SETTING_SCOPE            SettingScope\r
+  );\r
 \r
 /**\r
   Reset Question to its default value.\r
@@ -840,22 +886,18 @@ GetQuestionDefault (
   IN FORM_BROWSER_FORM                *Form,\r
   IN FORM_BROWSER_STATEMENT           *Question,\r
   IN UINT16                           DefaultId\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Get current setting of Questions.\r
 \r
   @param  FormSet                FormSet data structure.\r
 \r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-\r
 **/\r
-EFI_STATUS\r
+VOID\r
 InitializeCurrentSetting (\r
   IN OUT FORM_BROWSER_FORMSET             *FormSet\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Initialize the internal data structure of a FormSet.\r
@@ -875,30 +917,48 @@ InitializeFormSet (
   IN  EFI_HII_HANDLE                   Handle,\r
   IN OUT EFI_GUID                      *FormSetGuid,\r
   OUT FORM_BROWSER_FORMSET             *FormSet\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
-  Reset Questions in a Form to their default value.\r
+  Reset Questions to their initial value or default value in a Form, Formset or System.\r
+\r
+  GetDefaultValueScope parameter decides which questions will reset\r
+  to its default value.\r
 \r
   @param  FormSet                FormSet data structure.\r
-  @param  Form                   The Form which to be reset.\r
+  @param  Form                   Form data structure.\r
   @param  DefaultId              The Class of the default.\r
+  @param  SettingScope           Setting Scope for Default action.\r
+  @param  GetDefaultValueScope   Get default value scope.\r
+  @param  Storage                Get default value only for this storage.\r
+  @param  RetrieveValueFirst     Whether call the retrieve call back to\r
+                                 get the initial value before get default\r
+                                 value.\r
+  @param  SkipGetAltCfg          Whether skip the get altcfg string process.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
+  @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
 \r
 **/\r
 EFI_STATUS\r
-ExtractFormDefault (\r
+ExtractDefault (\r
   IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN  FORM_BROWSER_FORM               *Form,\r
-  IN UINT16                           DefaultId\r
-  )\r
-;\r
+  IN FORM_BROWSER_FORM                *Form,\r
+  IN UINT16                           DefaultId,\r
+  IN BROWSER_SETTING_SCOPE            SettingScope,\r
+  IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,\r
+  IN BROWSER_STORAGE                  *Storage,\r
+  IN BOOLEAN                          RetrieveValueFirst,\r
+  IN BOOLEAN                          SkipGetAltCfg\r
+  );\r
 \r
 /**\r
   Initialize Question's Edit copy from Storage.\r
 \r
+  @param  Selection              Selection contains the information about\r
+                                 the Selection, form and formset to be displayed.\r
+                                 Selection action may be updated in retrieve callback.\r
+                                 If Selection is NULL, only initialize Question value.\r
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
 \r
@@ -907,16 +967,36 @@ ExtractFormDefault (
 **/\r
 EFI_STATUS\r
 LoadFormConfig (\r
-  IN FORM_BROWSER_FORMSET             *FormSet,\r
-  IN FORM_BROWSER_FORM                *Form\r
-  )\r
-;\r
+  IN OUT UI_MENU_SELECTION    *Selection,\r
+  IN FORM_BROWSER_FORMSET     *FormSet,\r
+  IN FORM_BROWSER_FORM        *Form\r
+  );\r
+\r
+/**\r
+  Initialize Question's Edit copy from Storage for the whole Formset.\r
+\r
+  @param  Selection              Selection contains the information about\r
+                                 the Selection, form and formset to be displayed.\r
+                                 Selection action may be updated in retrieve callback.\r
+                                 If Selection is NULL, only initialize Question value.\r
+  @param  FormSet                FormSet data structure.\r
+\r
+  @retval EFI_SUCCESS            The function completed successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+LoadFormSetConfig (\r
+  IN OUT UI_MENU_SELECTION    *Selection,\r
+  IN     FORM_BROWSER_FORMSET *FormSet\r
+  );\r
 \r
 /**\r
   Convert setting of Buffer Storage or NameValue Storage to <ConfigResp>.\r
 \r
   @param  Storage                The Storage to be conveted.\r
   @param  ConfigResp             The returned <ConfigResp>.\r
+  @param  ConfigRequest          The ConfigRequest string.\r
+  @param  GetEditBuf             Get the data from editbuffer or buffer.\r
 \r
   @retval EFI_SUCCESS            Convert success.\r
   @retval EFI_INVALID_PARAMETER  Incorrect storage type.\r
@@ -924,10 +1004,11 @@ LoadFormConfig (
 **/\r
 EFI_STATUS\r
 StorageToConfigResp (\r
-  IN FORMSET_STORAGE         *Storage,\r
-  IN CHAR16                  **ConfigResp\r
-  )\r
-;\r
+  IN BROWSER_STORAGE         *Storage,\r
+  IN CHAR16                  **ConfigResp,\r
+  IN CHAR16                  *ConfigRequest,\r
+  IN BOOLEAN                 GetEditBuf\r
+  );\r
 \r
 /**\r
   Convert <ConfigResp> to settings in Buffer Storage or NameValue Storage.\r
@@ -941,10 +1022,9 @@ StorageToConfigResp (
 **/\r
 EFI_STATUS\r
 ConfigRespToStorage (\r
-  IN FORMSET_STORAGE         *Storage,\r
+  IN BROWSER_STORAGE         *Storage,\r
   IN CHAR16                  *ConfigResp\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Fill storage's edit copy with settings requested from Configuration Driver.\r
@@ -952,15 +1032,12 @@ ConfigRespToStorage (
   @param  FormSet                FormSet data structure.\r
   @param  Storage                Buffer Storage.\r
 \r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-\r
 **/\r
-EFI_STATUS\r
+VOID\r
 LoadStorage (\r
   IN FORM_BROWSER_FORMSET    *FormSet,\r
   IN FORMSET_STORAGE         *Storage\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   Fetch the Ifr binary data of a FormSet.\r
@@ -985,8 +1062,27 @@ GetIfrBinaryData (
   IN OUT EFI_GUID      *FormSetGuid,\r
   OUT UINTN            *BinaryLength,\r
   OUT UINT8            **BinaryData\r
-  )\r
-;\r
+  );\r
+\r
+/**\r
+  Save globals used by previous call to SendForm(). SendForm() may be called from\r
+  HiiConfigAccess.Callback(), this will cause SendForm() be reentried.\r
+  So, save globals of previous call to SendForm() and restore them upon exit.\r
+\r
+**/\r
+VOID\r
+SaveBrowserContext (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Restore globals used by previous call to SendForm().\r
+\r
+**/\r
+VOID\r
+RestoreBrowserContext (\r
+  VOID\r
+  );\r
 \r
 /**\r
   This is the routine which an external caller uses to direct the browser\r
@@ -1007,7 +1103,7 @@ GetIfrBinaryData (
                          ScreenDimenions - This allows the browser to be called so that it occupies a\r
                          portion of the physical screen instead of dynamically determining the screen dimensions.\r
                          ActionRequest   - Points to the action recommended by the form.\r
-  @param ScreenDimensions Points to recommended form dimensions, including any non-content area, in \r
+  @param ScreenDimensions Points to recommended form dimensions, including any non-content area, in\r
                           characters.\r
   @param ActionRequest       Points to the action recommended by the form.\r
 \r
@@ -1026,8 +1122,7 @@ SendForm (
   IN  UINT16                           FormId, OPTIONAL\r
   IN  CONST EFI_SCREEN_DESCRIPTOR      *ScreenDimensions, OPTIONAL\r
   OUT EFI_BROWSER_ACTION_REQUEST       *ActionRequest  OPTIONAL\r
-  )\r
-;\r
+  );\r
 \r
 /**\r
   This function is called by a callback handler to retrieve uncommitted state\r
@@ -1065,7 +1160,716 @@ BrowserCallback (
   IN BOOLEAN                           RetrieveData,\r
   IN CONST EFI_GUID                    *VariableGuid, OPTIONAL\r
   IN CONST CHAR16                      *VariableName  OPTIONAL\r
-  )\r
-;\r
+  );\r
+\r
+/**\r
+  Find menu which will show next time.\r
+\r
+  @param Selection       On input, Selection tell setup browser the information\r
+                         about the Selection, form and formset to be displayed.\r
+                         On output, Selection return the screen item that is selected\r
+                         by user.\r
+  @param SettingLevel    Input Settting level, if it is FormLevel, just exit current form.\r
+                         else, we need to exit current formset.\r
+\r
+  @retval TRUE           Exit current form.\r
+  @retval FALSE          User press ESC and keep in current form.\r
+**/\r
+BOOLEAN\r
+FindNextMenu (\r
+  IN OUT UI_MENU_SELECTION        *Selection,\r
+  IN       BROWSER_SETTING_SCOPE  SettingLevel\r
+  );\r
+\r
+/**\r
+  check whether the form need to update the NV.\r
+\r
+  @param  Form                Form data structure.\r
+\r
+  @retval TRUE                   Need to update the NV.\r
+  @retval FALSE                  No need to update the NV.\r
+**/\r
+BOOLEAN\r
+IsNvUpdateRequiredForForm (\r
+  IN FORM_BROWSER_FORM    *Form\r
+  );\r
+\r
+/**\r
+  check whether the formset need to update the NV.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+\r
+  @retval TRUE                   Need to update the NV.\r
+  @retval FALSE                  No need to update the NV.\r
+**/\r
+BOOLEAN\r
+IsNvUpdateRequiredForFormSet (\r
+  IN FORM_BROWSER_FORMSET  *FormSet\r
+  );\r
+\r
+/**\r
+  Call the call back function for the question and process the return action.\r
+\r
+  @param Selection             On input, Selection tell setup browser the information\r
+                               about the Selection, form and formset to be displayed.\r
+                               On output, Selection return the screen item that is selected\r
+                               by user.\r
+  @param FormSet               The formset this question belong to.\r
+  @param Form                  The form this question belong to.\r
+  @param Question              The Question which need to call.\r
+  @param Action                The action request.\r
+  @param SkipSaveOrDiscard     Whether skip save or discard action.\r
+\r
+  @retval EFI_SUCCESS          The call back function executes successfully.\r
+  @return Other value if the call back function failed to execute.\r
+**/\r
+EFI_STATUS\r
+ProcessCallBackFunction (\r
+  IN OUT UI_MENU_SELECTION               *Selection,\r
+  IN     FORM_BROWSER_FORMSET            *FormSet,\r
+  IN     FORM_BROWSER_FORM               *Form,\r
+  IN     FORM_BROWSER_STATEMENT          *Question,\r
+  IN     EFI_BROWSER_ACTION              Action,\r
+  IN     BOOLEAN                         SkipSaveOrDiscard\r
+  );\r
+\r
+/**\r
+  Call the retrieve type call back function for one question to get the initialize data.\r
+\r
+  This function only used when in the initialize stage, because in this stage, the\r
+  Selection->Form is not ready. For other case, use the ProcessCallBackFunction instead.\r
+\r
+  @param ConfigAccess          The config access protocol produced by the hii driver.\r
+  @param Statement             The Question which need to call.\r
+  @param FormSet               The formset this question belong to.\r
+\r
+  @retval EFI_SUCCESS          The call back function executes successfully.\r
+  @return Other value if the call back function failed to execute.\r
+**/\r
+EFI_STATUS\r
+ProcessRetrieveForQuestion (\r
+  IN     EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess,\r
+  IN     FORM_BROWSER_STATEMENT          *Statement,\r
+  IN     FORM_BROWSER_FORMSET            *FormSet\r
+  );\r
+\r
+/**\r
+  Find the matched FormSet context in the backup maintain list based on HiiHandle.\r
+\r
+  @param Handle  The Hii Handle.\r
+\r
+  @return the found FormSet context. If no found, NULL will return.\r
+\r
+**/\r
+FORM_BROWSER_FORMSET *\r
+GetFormSetFromHiiHandle (\r
+  EFI_HII_HANDLE Handle\r
+  );\r
+\r
+/**\r
+  Check whether the input HII handle is the FormSet that is being used.\r
+\r
+  @param Handle  The Hii Handle.\r
+\r
+  @retval TRUE   HII handle is being used.\r
+  @retval FALSE  HII handle is not being used.\r
+\r
+**/\r
+BOOLEAN\r
+IsHiiHandleInBrowserContext (\r
+  EFI_HII_HANDLE Handle\r
+  );\r
+\r
+/**\r
+  Configure what scope the hot key will impact.\r
+  All hot keys have the same scope. The mixed hot keys with the different level are not supported.\r
+  If no scope is set, the default scope will be FormSet level.\r
+  After all registered hot keys are removed, previous Scope can reset to another level.\r
+\r
+  @param[in] Scope               Scope level to be set.\r
+\r
+  @retval EFI_SUCCESS            Scope is set correctly.\r
+  @retval EFI_INVALID_PARAMETER  Scope is not the valid value specified in BROWSER_SETTING_SCOPE.\r
+  @retval EFI_UNSPPORTED         Scope level is different from current one that the registered hot keys have.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SetScope (\r
+  IN BROWSER_SETTING_SCOPE Scope\r
+  );\r
+\r
+/**\r
+  Register the hot key with its browser action, or unregistered the hot key.\r
+  Only support hot key that is not printable character (control key, function key, etc.).\r
+  If the action value is zero, the hot key will be unregistered if it has been registered.\r
+  If the same hot key has been registered, the new action and help string will override the previous ones.\r
+\r
+  @param[in] KeyData     A pointer to a buffer that describes the keystroke\r
+                         information for the hot key. Its type is EFI_INPUT_KEY to\r
+                         be supported by all ConsoleIn devices.\r
+  @param[in] Action      Action value that describes what action will be trigged when the hot key is pressed.\r
+  @param[in] DefaultId   Specifies the type of defaults to retrieve, which is only for DEFAULT action.\r
+  @param[in] HelpString  Help string that describes the hot key information.\r
+                         Its value may be NULL for the unregistered hot key.\r
+\r
+  @retval EFI_SUCCESS            Hot key is registered or unregistered.\r
+  @retval EFI_INVALID_PARAMETER  KeyData is NULL.\r
+  @retval EFI_NOT_FOUND          KeyData is not found to be unregistered.\r
+  @retval EFI_UNSUPPORTED        Key represents a printable character. It is conflicted with Browser.\r
+  @retval EFI_ALREADY_STARTED    Key already been registered for one hot key.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+RegisterHotKey (\r
+  IN EFI_INPUT_KEY *KeyData,\r
+  IN UINT32        Action,\r
+  IN UINT16        DefaultId,\r
+  IN EFI_STRING    HelpString OPTIONAL\r
+  );\r
+\r
+/**\r
+  Register Exit handler function.\r
+  When more than one handler function is registered, the latter one will override the previous one.\r
+  When NULL handler is specified, the previous Exit handler will be unregistered.\r
+\r
+  @param[in] Handler      Pointer to handler function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+RegiserExitHandler (\r
+  IN EXIT_HANDLER Handler\r
+  );\r
+\r
+/**\r
+\r
+  Check whether the browser data has been modified.\r
+\r
+  @retval TRUE        Browser data is changed.\r
+  @retval FALSE       No browser data is changed.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsBrowserDataModified (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+  Execute the action requested by the Action parameter.\r
+\r
+  @param[in] Action     Execute the request action.\r
+  @param[in] DefaultId  The default Id info when need to load default value.\r
+\r
+  @retval EFI_SUCCESS              Execute the request action succss.\r
+  @retval EFI_INVALID_PARAMETER    The input action value is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ExecuteAction (\r
+  IN UINT32        Action,\r
+  IN UINT16        DefaultId\r
+  );\r
+\r
+/**\r
+  Create reminder to let user to choose save or discard the changed browser data.\r
+  Caller can use it to actively check the changed browser data.\r
+\r
+  @retval BROWSER_NO_CHANGES       No browser data is changed.\r
+  @retval BROWSER_SAVE_CHANGES     The changed browser data is saved.\r
+  @retval BROWSER_DISCARD_CHANGES  The changed browser data is discard.\r
+  @retval BROWSER_KEEP_CURRENT     Browser keep current changes.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+SaveReminder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Check whether the Reset Required for the browser\r
+\r
+  @retval TRUE      Browser required to reset after exit.\r
+  @retval FALSE     Browser not need to reset after exit.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsResetRequired (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Find the registered HotKey based on KeyData.\r
+\r
+  @param[in] KeyData     A pointer to a buffer that describes the keystroke\r
+                         information for the hot key.\r
+\r
+  @return The registered HotKey context. If no found, NULL will return.\r
+**/\r
+BROWSER_HOT_KEY *\r
+GetHotKeyFromRegisterList (\r
+  IN EFI_INPUT_KEY *KeyData\r
+  );\r
+\r
+/**\r
+\r
+  Get FORM_BROWSER_STATEMENT from FORM_DISPLAY_ENGINE_STATEMENT based on the OpCode info.\r
+\r
+  @param DisplayStatement        The input FORM_DISPLAY_ENGINE_STATEMENT.\r
+\r
+  @retval FORM_BROWSER_STATEMENT  The return FORM_BROWSER_STATEMENT info.\r
+\r
+**/\r
+FORM_BROWSER_STATEMENT *\r
+GetBrowserStatement (\r
+  IN FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement\r
+  );\r
+\r
+/**\r
+  Password may be stored as encrypted by Configuration Driver. When change a\r
+  password, user will be challenged with old password. To validate user input old\r
+  password, we will send the clear text to Configuration Driver via Callback().\r
+  Configuration driver is responsible to check the passed in password and return\r
+  the validation result. If validation pass, state machine in password Callback()\r
+  will transit from BROWSER_STATE_VALIDATE_PASSWORD to BROWSER_STATE_SET_PASSWORD.\r
+  After user type in new password twice, Callback() will be invoked to send the\r
+  new password to Configuration Driver.\r
+\r
+  @param  Selection              Pointer to UI_MENU_SELECTION.\r
+  @param  MenuOption             The MenuOption for this password Question.\r
+  @param  String                 The clear text of password.\r
+\r
+  @retval EFI_NOT_AVAILABLE_YET  Callback() request to terminate password input.\r
+  @return In state of BROWSER_STATE_VALIDATE_PASSWORD:\r
+  @retval EFI_SUCCESS            Password correct, Browser will prompt for new\r
+                                 password.\r
+  @retval EFI_NOT_READY          Password incorrect, Browser will show error\r
+                                 message.\r
+  @retval Other                  Browser will do nothing.\r
+  @return In state of BROWSER_STATE_SET_PASSWORD:\r
+  @retval EFI_SUCCESS            Set password success.\r
+  @retval Other                  Set password failed.\r
+\r
+**/\r
+EFI_STATUS\r
+PasswordCallback (\r
+  IN  UI_MENU_SELECTION           *Selection,\r
+  IN  FORM_BROWSER_STATEMENT      *Question,\r
+  IN  CHAR16                      *String\r
+  );\r
+\r
+/**\r
+  Display error message for invalid password.\r
+\r
+**/\r
+VOID\r
+PasswordInvalid (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  The worker function that send the displays to the screen. On output,\r
+  the selection made by user is returned.\r
+\r
+  @param Selection       On input, Selection tell setup browser the information\r
+                         about the Selection, form and formset to be displayed.\r
+                         On output, Selection return the screen item that is selected\r
+                         by user.\r
+\r
+  @retval EFI_SUCCESS    The page is displayed successfully.\r
+  @return Other value if the page failed to be diplayed.\r
+\r
+**/\r
+EFI_STATUS\r
+SetupBrowser (\r
+  IN OUT UI_MENU_SELECTION    *Selection\r
+  );\r
+\r
+/**\r
+  Free up the resource allocated for all strings required\r
+  by Setup Browser.\r
+\r
+**/\r
+VOID\r
+FreeBrowserStrings (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Create a menu with specified formset GUID and form ID, and add it as a child\r
+  of the given parent menu.\r
+\r
+  @param  HiiHandle              Hii handle related to this formset.\r
+  @param  FormSetGuid            The Formset Guid of menu to be added.\r
+  @param  FormId                 The Form ID of menu to be added.\r
+  @param  QuestionId             The question id of this menu to be added.\r
+\r
+  @return A pointer to the newly added menu or NULL if memory is insufficient.\r
+\r
+**/\r
+FORM_ENTRY_INFO *\r
+UiAddMenuList (\r
+  IN EFI_HII_HANDLE       HiiHandle,\r
+  IN EFI_GUID             *FormSetGuid,\r
+  IN UINT16               FormId,\r
+  IN UINT16               QuestionId\r
+  );\r
+\r
+/**\r
+  Search Menu with given FormSetGuid and FormId in all cached menu list.\r
+\r
+  @param  HiiHandle              HiiHandle for FormSet.\r
+  @param  FormSetGuid            The Formset GUID of the menu to search.\r
+  @param  FormId                 The Form ID of menu to search.\r
+\r
+  @return A pointer to menu found or NULL if not found.\r
+\r
+**/\r
+FORM_ENTRY_INFO *\r
+UiFindMenuList (\r
+  IN EFI_HII_HANDLE       HiiHandle,\r
+  IN EFI_GUID             *FormSetGuid,\r
+  IN UINT16               FormId\r
+  );\r
+\r
+/**\r
+  Free Menu list linked list.\r
+\r
+  @param  MenuListHead    One Menu list point in the menu list.\r
+\r
+**/\r
+VOID\r
+UiFreeMenuList (\r
+  LIST_ENTRY   *MenuListHead\r
+  );\r
+\r
+/**\r
+  Find parent menu for current menu.\r
+\r
+  @param  CurrentMenu    Current Menu\r
+  @param  SettingLevel   Whether find parent menu in Form Level or Formset level.\r
+                         In form level, just find the parent menu;\r
+                         In formset level, find the parent menu which has different\r
+                         formset guid value.\r
+\r
+  @retval   The parent menu for current menu.\r
+**/\r
+FORM_ENTRY_INFO *\r
+UiFindParentMenu (\r
+  IN FORM_ENTRY_INFO          *CurrentMenu,\r
+  IN BROWSER_SETTING_SCOPE    SettingLevel\r
+  );\r
+\r
+/**\r
+  Validate the HiiHandle.\r
+\r
+  @param  HiiHandle              The input HiiHandle which need to validate.\r
+\r
+  @retval TRUE                   The handle is validate.\r
+  @retval FALSE                  The handle is invalidate.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateHiiHandle (\r
+  EFI_HII_HANDLE          HiiHandle\r
+  );\r
+\r
+/**\r
+  Copy current Menu list to the new menu list.\r
+\r
+  @param  NewMenuListHead        New create Menu list.\r
+  @param  CurrentMenuListHead    Current Menu list.\r
+\r
+**/\r
+VOID\r
+UiCopyMenuList (\r
+  OUT LIST_ENTRY   *NewMenuListHead,\r
+  IN  LIST_ENTRY   *CurrentMenuListHead\r
+  );\r
+\r
+/**\r
+  Search an Option of a Question by its value.\r
+\r
+  @param  Question               The Question\r
+  @param  OptionValue            Value for Option to be searched.\r
+\r
+  @retval Pointer                Pointer to the found Option.\r
+  @retval NULL                   Option not found.\r
+\r
+**/\r
+QUESTION_OPTION *\r
+ValueToOption (\r
+  IN FORM_BROWSER_STATEMENT   *Question,\r
+  IN EFI_HII_VALUE            *OptionValue\r
+  );\r
+/**\r
+  Return data element in an Array by its Index.\r
+\r
+  @param  Array                  The data array.\r
+  @param  Type                   Type of the data in this array.\r
+  @param  Index                  Zero based index for data in this array.\r
+\r
+  @retval Value                  The data to be returned\r
+\r
+**/\r
+UINT64\r
+GetArrayData (\r
+  IN VOID                     *Array,\r
+  IN UINT8                    Type,\r
+  IN UINTN                    Index\r
+  );\r
+\r
+/**\r
+  Set value of a data element in an Array by its Index.\r
+\r
+  @param  Array                  The data array.\r
+  @param  Type                   Type of the data in this array.\r
+  @param  Index                  Zero based index for data in this array.\r
+  @param  Value                  The value to be set.\r
+\r
+**/\r
+VOID\r
+SetArrayData (\r
+  IN VOID                     *Array,\r
+  IN UINT8                    Type,\r
+  IN UINTN                    Index,\r
+  IN UINT64                   Value\r
+  );\r
+\r
+/**\r
+   Compare two Hii value.\r
+\r
+   @param  Value1                 Expression value to compare on left-hand.\r
+   @param  Value2                 Expression value to compare on right-hand.\r
+   @param  Result                 Return value after compare.\r
+                                  retval 0                      Two operators equal.\r
+                                  return Positive value if Value1 is greater than Value2.\r
+                                  retval Negative value if Value1 is less than Value2.\r
+   @param  HiiHandle              Only required for string compare.\r
+\r
+   @retval other                  Could not perform compare on two values.\r
+   @retval EFI_SUCCESS            Compare the value success.\r
+\r
+**/\r
+EFI_STATUS\r
+CompareHiiValue (\r
+  IN  EFI_HII_VALUE   *Value1,\r
+  IN  EFI_HII_VALUE   *Value2,\r
+  OUT INTN            *Result,\r
+  IN  EFI_HII_HANDLE  HiiHandle OPTIONAL\r
+  );\r
+\r
+/**\r
+  Perform Password check.\r
+  Passwork may be encrypted by driver that requires the specific check.\r
+\r
+  @param  Form             Form where Password Statement is in.\r
+  @param  Statement        Password statement\r
+  @param  PasswordString   Password string to be checked. It may be NULL.\r
+                           NULL means to restore password.\r
+                           "" string can be used to checked whether old password does exist.\r
+\r
+  @return Status     Status of Password check.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PasswordCheck (\r
+  IN FORM_DISPLAY_ENGINE_FORM      *Form,\r
+  IN FORM_DISPLAY_ENGINE_STATEMENT *Statement,\r
+  IN EFI_STRING                    PasswordString  OPTIONAL\r
+  );\r
+\r
+/**\r
+\r
+  Get FORM_BROWSER_STATEMENT from FORM_DISPLAY_ENGINE_STATEMENT based on the OpCode info.\r
+\r
+  @param DisplayStatement        The input FORM_DISPLAY_ENGINE_STATEMENT.\r
+\r
+  @retval FORM_BROWSER_STATEMENT  The return FORM_BROWSER_STATEMENT info.\r
+\r
+**/\r
+FORM_BROWSER_STATEMENT *\r
+GetBrowserStatement (\r
+  IN FORM_DISPLAY_ENGINE_STATEMENT *DisplayStatement\r
+  );\r
+\r
+/**\r
+\r
+  Initialize the Display form structure data.\r
+\r
+**/\r
+VOID\r
+InitializeDisplayFormData (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Base on the current formset info, clean the ConfigRequest string in browser storage.\r
+\r
+  @param  FormSet                Pointer of the FormSet\r
+\r
+**/\r
+VOID\r
+CleanBrowserStorage (\r
+  IN OUT FORM_BROWSER_FORMSET  *FormSet\r
+  );\r
+\r
+/**\r
+  Find HII Handle in the HII database associated with given Device Path.\r
+\r
+  If DevicePath is NULL, then ASSERT.\r
+\r
+  @param  DevicePath             Device Path associated with the HII package list\r
+                                 handle.\r
+  @param  FormsetGuid            The formset guid for this formset.\r
+\r
+  @retval Handle                 HII package list Handle associated with the Device\r
+                                        Path.\r
+  @retval NULL                   Hii Package list handle is not found.\r
+\r
+**/\r
+EFI_HII_HANDLE\r
+DevicePathToHiiHandle (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath,\r
+  IN EFI_GUID                   *FormsetGuid\r
+  );\r
+\r
+/**\r
+  Adjust the config request info, remove the request elements which already in AllConfigRequest string.\r
+\r
+  @param  Storage                Form set Storage.\r
+  @param  Request                The input request string.\r
+  @param  RespString             Whether the input is ConfigRequest or ConfigResp format.\r
+\r
+  @retval TRUE                   Has element not covered by current used elements, need to continue to call ExtractConfig\r
+  @retval FALSE                  All elements covered by current used elements.\r
+\r
+**/\r
+BOOLEAN\r
+ConfigRequestAdjust (\r
+  IN  BROWSER_STORAGE         *Storage,\r
+  IN  CHAR16                  *Request,\r
+  IN  BOOLEAN                 RespString\r
+  );\r
+\r
+/**\r
+  Perform question check.\r
+\r
+  If one question has more than one check, process form high priority to low.\r
+\r
+  @param  FormSet                FormSet data structure.\r
+  @param  Form                   Form data structure.\r
+  @param  Question               The Question to be validated.\r
+\r
+  @retval EFI_SUCCESS            Form validation pass.\r
+  @retval other                  Form validation failed.\r
+\r
+**/\r
+EFI_STATUS\r
+ValueChangedValidation (\r
+  IN  FORM_BROWSER_FORMSET            *FormSet,\r
+  IN  FORM_BROWSER_FORM               *Form,\r
+  IN  FORM_BROWSER_STATEMENT          *Question\r
+  );\r
+\r
+/**\r
+  Pop up the error info.\r
+\r
+  @param      BrowserStatus    The input browser status.\r
+  @param      HiiHandle        The HiiHandle for this error opcode.\r
+  @param      OpCode           The opcode use to get the erro info and timeout value.\r
+  @param      ErrorString      Error string used by BROWSER_NO_SUBMIT_IF.\r
+\r
+**/\r
+UINT32\r
+PopupErrorMessage (\r
+  IN UINT32                BrowserStatus,\r
+  IN EFI_HII_HANDLE        HiiHandle,\r
+  IN EFI_IFR_OP_HEADER     *OpCode, OPTIONAL\r
+  IN CHAR16                *ErrorString\r
+  );\r
+\r
+/**\r
+  Check whether the result is TRUE or FALSE.\r
+\r
+  For the EFI_HII_VALUE value type is numeric, return TRUE if the\r
+  value is not 0.\r
+\r
+  @param  Result             Input the result data.\r
+\r
+  @retval TRUE               The result is TRUE.\r
+  @retval FALSE              The result is FALSE.\r
+\r
+**/\r
+BOOLEAN\r
+IsTrue (\r
+  IN EFI_HII_VALUE     *Result\r
+  );\r
+\r
+/**\r
+  Get Formset_storage base on the input varstoreid info.\r
+\r
+  @param  FormSet                Pointer of the current FormSet.\r
+  @param  VarStoreId             Varstore ID info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromVarId (\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN EFI_VARSTORE_ID       VarStoreId\r
+  );\r
+\r
+/**\r
+  Get Formset_storage base on the input browser storage.\r
+\r
+  More than one formsets may share the same browser storage,\r
+  this function just get the first formset storage which\r
+  share the browser storage.\r
+\r
+  @param  Storage              browser storage info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromBrsStg (\r
+  IN BROWSER_STORAGE       *Storage\r
+  );\r
+\r
+/**\r
+  Reconnect the controller.\r
+\r
+  @param DriverHandle          The controller handle which need to be reconnect.\r
+\r
+  @retval   TRUE     do the reconnect behavior success.\r
+  @retval   FALSE    do the reconnect behavior failed.\r
+\r
+**/\r
+BOOLEAN\r
+ReconnectController (\r
+  IN EFI_HANDLE   DriverHandle\r
+  );\r
+\r
+/**\r
+  Converts the unicode character of the string from uppercase to lowercase.\r
+  This is a internal function.\r
+\r
+  @param ConfigString  String to be converted\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HiiToLower (\r
+  IN EFI_STRING  ConfigString\r
+  );\r
 \r
 #endif\r