]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DriverSampleDxe/DriverSample.c
Correct DriverSample ConfigAcess protocol ExtractConfig interface.
[mirror_edk2.git] / MdeModulePkg / Universal / DriverSampleDxe / DriverSample.c
index 8fcce40327bf6dbf68dcf20e602bcf7c34f4d053..38d36f8a287a26c292f8a5e0c9278c7293870fe1 100644 (file)
@@ -22,8 +22,10 @@ EFI_GUID   mFormSetGuid = FORMSET_GUID;
 EFI_GUID   mInventoryGuid = INVENTORY_GUID;\r
 \r
 CHAR16     VariableName[] = L"MyIfrNVData";\r
+EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};\r
+DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData = NULL;\r
 \r
-HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath1 = {\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath0 = {\r
   {\r
     {\r
       HARDWARE_DEVICE_PATH,\r
@@ -48,7 +50,7 @@ HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath1 = {
   }\r
 };\r
 \r
-HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath2 = {\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath1 = {\r
   {\r
     {\r
       HARDWARE_DEVICE_PATH,\r
@@ -125,6 +127,7 @@ ValidatePassword (
   EFI_STATUS                      Status;\r
   UINTN                           Index;\r
   UINTN                           BufferSize;\r
+  UINTN                           PasswordMaxSize;\r
   CHAR16                          *Password;\r
   CHAR16                          *EncodedPassword;\r
   BOOLEAN                         OldPassword;\r
@@ -148,10 +151,11 @@ ValidatePassword (
   }\r
 \r
   OldPassword = FALSE;\r
+  PasswordMaxSize = sizeof (PrivateData->Configuration.WhatIsThePassword2);\r
   //\r
   // Check whether we have any old password set\r
   //\r
-  for (Index = 0; Index < 20; Index++) {\r
+  for (Index = 0; Index < PasswordMaxSize / sizeof (UINT16); Index++) {\r
     if (PrivateData->Configuration.WhatIsThePassword2[Index] != 0) {\r
       OldPassword = TRUE;\r
       break;\r
@@ -167,23 +171,23 @@ ValidatePassword (
   //\r
   // Get user input password\r
   //\r
-  BufferSize = 21 * sizeof (CHAR16);\r
-  Password = AllocateZeroPool (BufferSize);\r
-  ASSERT (Password != NULL);\r
-\r
-  Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
-  if (EFI_ERROR (Status)) {\r
+  Password = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL);\r
+  if (Password == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+  if (StrSize (Password) > PasswordMaxSize) {\r
     FreePool (Password);\r
-    return Status;\r
+    return EFI_NOT_READY;\r
   }\r
 \r
   //\r
   // Validate old password\r
   //\r
-  EncodedPassword = AllocateCopyPool (21 * sizeof (CHAR16), Password);\r
+  EncodedPassword = AllocateZeroPool (PasswordMaxSize);\r
   ASSERT (EncodedPassword != NULL);\r
-  EncodePassword (EncodedPassword, 20 * sizeof (CHAR16));\r
-  if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, 20 * sizeof (CHAR16)) != 0) {\r
+  StrnCpy (EncodedPassword, Password, StrLen (Password));\r
+  EncodePassword (EncodedPassword, StrLen (EncodedPassword) * sizeof (CHAR16));\r
+  if (CompareMem (EncodedPassword, PrivateData->Configuration.WhatIsThePassword2, StrLen (EncodedPassword) * sizeof (CHAR16)) != 0) {\r
     //\r
     // Old password mismatch, return EFI_NOT_READY to prompt for error message\r
     //\r
@@ -215,10 +219,11 @@ SetPassword (
   )\r
 {\r
   EFI_STATUS                      Status;\r
-  UINTN                           BufferSize;\r
   CHAR16                          *Password;\r
+  CHAR16                          *TempPassword;\r
   UINTN                           PasswordSize;\r
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;\r
+  UINTN                           BufferSize;\r
 \r
   //\r
   // Get Buffer Storage data from EFI variable\r
@@ -239,45 +244,53 @@ SetPassword (
   // Get user input password\r
   //\r
   Password = &PrivateData->Configuration.WhatIsThePassword2[0];\r
-  PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2);\r
-  \r
+  PasswordSize = sizeof (PrivateData->Configuration.WhatIsThePassword2); \r
   ZeroMem (Password, PasswordSize);\r
-  Status = HiiLibGetString (PrivateData->HiiHandle[0], StringId, Password, &BufferSize);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  \r
+  TempPassword = HiiGetString (PrivateData->HiiHandle[0], StringId, NULL);\r
+  if (TempPassword == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+  if (StrSize (TempPassword) > PasswordSize) {\r
+    FreePool (TempPassword);\r
+    return EFI_NOT_READY;\r
   }\r
+  StrnCpy (Password, TempPassword, StrLen (TempPassword));\r
+  FreePool (TempPassword);\r
 \r
   //\r
   // Retrive uncommitted data from Browser\r
   //\r
-  BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
-  Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
+  Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
   ASSERT (Configuration != NULL);\r
-  Status = GetBrowserData (&mFormSetGuid, VariableName, &BufferSize, (UINT8 *) Configuration);\r
-  if (!EFI_ERROR (Status)) {\r
+  if (HiiGetBrowserData (&mFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION), (UINT8 *) Configuration)) {\r
     //\r
     // Update password's clear text in the screen\r
     //\r
-    CopyMem (Configuration->PasswordClearText, Password, PasswordSize);\r
+    CopyMem (Configuration->PasswordClearText, Password, StrSize (Password));\r
 \r
     //\r
     // Update uncommitted data of Browser\r
     //\r
-    BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
-    Status = SetBrowserData (\r
-               &mFormSetGuid,\r
-               VariableName,\r
-               BufferSize,\r
-               (UINT8 *) Configuration,\r
-               NULL\r
-               );\r
+    HiiSetBrowserData (\r
+       &mFormSetGuid,\r
+       VariableName,\r
+       sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+       (UINT8 *) Configuration,\r
+       NULL\r
+       );\r
   }\r
+\r
+  //\r
+  // Free Configuration Buffer\r
+  //\r
   FreePool (Configuration);\r
 \r
+\r
   //\r
   // Set password\r
   //\r
-  EncodePassword (Password, PasswordSize);\r
+  EncodePassword (Password, StrLen (Password) * 2);\r
   Status = gRT->SetVariable(\r
                   VariableName,\r
                   &mFormSetGuid,\r
@@ -328,57 +341,63 @@ ExtractConfig (
   UINTN                            BufferSize;\r
   DRIVER_SAMPLE_PRIVATE_DATA       *PrivateData;\r
   EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
+  EFI_STRING                       ConfigRequest;\r
+  EFI_STRING                       ConfigRequestHdr;\r
+  UINTN                            Size;\r
+  \r
+  if (Progress == NULL || Results == NULL || Request == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // Initialize the local variables.\r
+  //\r
+  ConfigRequestHdr  = NULL;\r
+  ConfigRequest     = NULL;\r
+  Size              = 0;\r
+  *Progress         = Request;\r
 \r
   PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
   HiiConfigRouting = PrivateData->HiiConfigRouting;\r
 \r
   //\r
-  //\r
-  // Get Buffer Storage data from EFI variable\r
+  // Get Buffer Storage data from EFI variable.\r
+  // Try to get the current setting from variable.\r
   //\r
   BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
   Status = gRT->GetVariable (\r
-                  VariableName,\r
-                  &mFormSetGuid,\r
-                  NULL,\r
-                  &BufferSize,\r
-                  &PrivateData->Configuration\r
-                  );\r
+            VariableName,\r
+            &mFormSetGuid,\r
+            NULL,\r
+            &BufferSize,\r
+            &PrivateData->Configuration\r
+            );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    return EFI_NOT_FOUND;\r
   }\r
-\r
+  \r
   if (Request == NULL) {\r
     //\r
-    // Request is set to NULL, return all configurable elements together with ALTCFG\r
-    //\r
-    Status = ConstructConfigAltResp (\r
-               NULL,\r
-               NULL,\r
-               Results,\r
-               &mFormSetGuid,\r
-               VariableName,\r
-               PrivateData->DriverHandle[0],\r
-               &PrivateData->Configuration,\r
-               BufferSize,\r
-               VfrMyIfrNVDataBlockName,\r
-               2,\r
-               STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT),\r
-               VfrMyIfrNVDataDefault0000,\r
-               STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT),\r
-               VfrMyIfrNVDataDefault0001\r
-               );\r
-\r
-    return Status;\r
-  }\r
+    // Request is set to NULL, construct full request string.\r
+    //\r
 \r
-  //\r
-  // Check routing data in <ConfigHdr>.\r
-  // Note: if only one Storage is used, then this checking could be skipped.\r
-  //\r
-  if (!IsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) {\r
-    *Progress = Request;\r
-    return EFI_NOT_FOUND;\r
+    //\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template \r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, VariableName, PrivateData->DriverHandle[0]);\r
+    Size = (StrLen (ConfigRequest) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  } else {\r
+    //\r
+    // Check routing data in <ConfigHdr>.\r
+    // Note: if only one Storage is used, then this checking could be skipped.\r
+    //\r
+    if (!HiiIsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) {\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    ConfigRequest = Request;\r
   }\r
 \r
   //\r
@@ -386,12 +405,18 @@ ExtractConfig (
   //\r
   Status = HiiConfigRouting->BlockToConfig (\r
                                 HiiConfigRouting,\r
-                                Request,\r
+                                ConfigRequest,\r
                                 (UINT8 *) &PrivateData->Configuration,\r
                                 BufferSize,\r
                                 Results,\r
                                 Progress\r
                                 );\r
+  \r
+  if (Request == NULL) {\r
+    FreePool (ConfigRequest);\r
+    *Progress = NULL;\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
@@ -434,10 +459,11 @@ RouteConfig (
   PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
   HiiConfigRouting = PrivateData->HiiConfigRouting;\r
 \r
+  //\r
   // Check routing data in <ConfigHdr>.\r
   // Note: if only one Storage is used, then this checking could be skipped.\r
   //\r
-  if (!IsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) {\r
+  if (!HiiIsConfigHdrMatch (Configuration, &mFormSetGuid, VariableName)) {\r
     *Progress = Configuration;\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -447,12 +473,12 @@ RouteConfig (
   //\r
   BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
   Status = gRT->GetVariable (\r
-                  VariableName,\r
-                  &mFormSetGuid,\r
-                  NULL,\r
-                  &BufferSize,\r
-                  &PrivateData->Configuration\r
-                  );\r
+            VariableName,\r
+            &mFormSetGuid,\r
+            NULL,\r
+            &BufferSize,\r
+            &PrivateData->Configuration\r
+            );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -522,13 +548,21 @@ DriverCallback (
 {\r
   DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData;\r
   EFI_STATUS                      Status;\r
-  EFI_HII_UPDATE_DATA             UpdateData;\r
-  IFR_OPTION                      *IfrOptionList;\r
   UINT8                           MyVar;\r
+  VOID                            *StartOpCodeHandle;\r
+  VOID                            *OptionsOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL              *StartLabel;\r
+  VOID                            *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL              *EndLabel;\r
 \r
   if ((Value == NULL) || (ActionRequest == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+  \r
+  if ((Type == EFI_IFR_TYPE_STRING) && (Value->string == 0)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+   \r
 \r
   Status = EFI_SUCCESS;\r
   PrivateData = DRIVER_SAMPLE_PRIVATE_FROM_THIS (This);\r
@@ -538,139 +572,179 @@ DriverCallback (
     //\r
     // Initialize the container for dynamic opcodes\r
     //\r
-    IfrLibInitUpdateData (&UpdateData, 0x1000);\r
-\r
-    IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
-    ASSERT (IfrOptionList != NULL);\r
-\r
-    IfrOptionList[0].Flags        = 0;\r
-    IfrOptionList[0].StringToken  = STRING_TOKEN (STR_BOOT_OPTION1);\r
-    IfrOptionList[0].Value.u8     = 1;\r
-    IfrOptionList[1].Flags        = EFI_IFR_OPTION_DEFAULT;\r
-    IfrOptionList[1].StringToken  = STRING_TOKEN (STR_BOOT_OPTION2);\r
-    IfrOptionList[1].Value.u8     = 2;\r
-\r
-      CreateActionOpCode (\r
-        0x1237,                           // Question ID\r
-        STRING_TOKEN(STR_EXIT_TEXT),      // Prompt text\r
-        STRING_TOKEN(STR_EXIT_TEXT),      // Help text\r
-        EFI_IFR_FLAG_CALLBACK,            // Question flag\r
-        0,                                // Action String ID\r
-        &UpdateData                       // Container for dynamic created opcodes\r
-        );\r
-    \r
-      //\r
-      // Prepare initial value for the dynamic created oneof Question\r
-      //\r
-      PrivateData->Configuration.DynamicOneof = 2;\r
-      Status = gRT->SetVariable(\r
-                      VariableName,\r
-                      &mFormSetGuid,\r
-                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                      sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
-                      &PrivateData->Configuration\r
-                      );\r
-      CreateOneOfOpCode (\r
-        0x8001,                                    // Question ID (or call it "key")\r
-        CONFIGURATION_VARSTORE_ID,                 // VarStore ID\r
-        (UINT16) DYNAMIC_ONE_OF_VAR_OFFSET,        // Offset in Buffer Storage\r
-        STRING_TOKEN (STR_ONE_OF_PROMPT),          // Question prompt text\r
-        STRING_TOKEN (STR_ONE_OF_HELP),            // Question help text\r
-        EFI_IFR_FLAG_CALLBACK,                     // Question flag\r
-        EFI_IFR_NUMERIC_SIZE_1,                    // Data type of Question Value\r
-        IfrOptionList,                             // Option list\r
-        2,                                         // Number of options in Option list\r
-        &UpdateData                                // Container for dynamic created opcodes\r
-        );\r
-    \r
-      CreateOrderedListOpCode (\r
-        0x8002,                                    // Question ID\r
-        CONFIGURATION_VARSTORE_ID,                 // VarStore ID\r
-        (UINT16) DYNAMIC_ORDERED_LIST_VAR_OFFSET,  // Offset in Buffer Storage\r
-        STRING_TOKEN (STR_BOOT_OPTIONS),           // Question prompt text\r
-        STRING_TOKEN (STR_BOOT_OPTIONS),           // Question help text\r
-        EFI_IFR_FLAG_RESET_REQUIRED,               // Question flag\r
-        0,                                         // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
-        EFI_IFR_NUMERIC_SIZE_1,                    // Data type of Question value\r
-        5,                                         // Maximum container\r
-        IfrOptionList,                             // Option list\r
-        2,                                         // Number of options in Option list\r
-        &UpdateData                                // Container for dynamic created opcodes\r
-        );\r
-    \r
-      CreateGotoOpCode (\r
-        1,                                // Target Form ID\r
-        STRING_TOKEN (STR_GOTO_FORM1),    // Prompt text\r
-        STRING_TOKEN (STR_GOTO_HELP),     // Help text\r
-        0,                                // Question flag\r
-        0x8003,                           // Question ID\r
-        &UpdateData                       // Container for dynamic created opcodes\r
-        );\r
-    \r
-      Status = IfrLibUpdateForm (\r
-                 PrivateData->HiiHandle[0],  // HII handle\r
-                 &mFormSetGuid,              // Formset GUID\r
-                 0x1234,                     // Form ID\r
-                 0x1234,                     // Label for where to insert opcodes\r
-                 TRUE,                       // Append or replace\r
-                 &UpdateData                 // Dynamic created opcodes\r
-                 );\r
-      FreePool (IfrOptionList);\r
-      IfrLibFreeUpdateData (&UpdateData);\r
-      break;\r
-    \r
-    case 0x5678:\r
-      //\r
-      // We will reach here once the Question is refreshed\r
-      //\r
-      IfrLibInitUpdateData (&UpdateData, 0x1000);\r
-    \r
-      IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
-      ASSERT (IfrOptionList != NULL);\r
-    \r
-      CreateActionOpCode (\r
-        0x1237,                           // Question ID\r
-        STRING_TOKEN(STR_EXIT_TEXT),      // Prompt text\r
-        STRING_TOKEN(STR_EXIT_TEXT),      // Help text\r
-        EFI_IFR_FLAG_CALLBACK,            // Question flag\r
-        0,                                // Action String ID\r
-        &UpdateData                       // Container for dynamic created opcodes\r
-        );\r
-    \r
-      Status = IfrLibUpdateForm (\r
-                 PrivateData->HiiHandle[0],  // HII handle\r
-                 &mFormSetGuid,              // Formset GUID\r
-                 3,                          // Form ID\r
-                 0x2234,                     // Label for where to insert opcodes\r
-                 TRUE,                       // Append or replace\r
-                 &UpdateData                 // Dynamic created opcodes\r
-                 );\r
-      IfrLibFreeUpdateData (&UpdateData);\r
+    StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+    ASSERT (StartOpCodeHandle != NULL);\r
+\r
+    EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+    ASSERT (EndOpCodeHandle != NULL);\r
+\r
+    //\r
+    // Create Hii Extend Label OpCode as the start opcode\r
+    //\r
+    StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+    StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+    StartLabel->Number       = LABEL_UPDATE1;\r
+\r
+    //\r
+    // Create Hii Extend Label OpCode as the end opcode\r
+    //\r
+    EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+    EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+    EndLabel->Number       = LABEL_END;\r
+\r
+    HiiCreateActionOpCode (\r
+      StartOpCodeHandle,                // Container for dynamic created opcodes\r
+      0x1237,                           // Question ID\r
+      STRING_TOKEN(STR_EXIT_TEXT),      // Prompt text\r
+      STRING_TOKEN(STR_EXIT_TEXT),      // Help text\r
+      EFI_IFR_FLAG_CALLBACK,            // Question flag\r
+      0                                 // Action String ID\r
+    );\r
+\r
+    //\r
+    // Create Option OpCode\r
+    //\r
+    OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+    ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      STRING_TOKEN (STR_BOOT_OPTION1),\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_1,\r
+      1\r
+      );\r
+\r
+    HiiCreateOneOfOptionOpCode (\r
+      OptionsOpCodeHandle,\r
+      STRING_TOKEN (STR_BOOT_OPTION2),\r
+      0,\r
+      EFI_IFR_NUMERIC_SIZE_1,\r
+      2\r
+      );\r
+\r
+    //\r
+    // Prepare initial value for the dynamic created oneof Question\r
+    //\r
+    PrivateData->Configuration.DynamicOneof = 2;\r
+    Status = gRT->SetVariable(\r
+                    VariableName,\r
+                    &mFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+                    &PrivateData->Configuration\r
+                    );\r
+\r
+    HiiCreateOneOfOpCode (\r
+      StartOpCodeHandle,                         // Container for dynamic created opcodes\r
+      0x8001,                                    // Question ID (or call it "key")\r
+      CONFIGURATION_VARSTORE_ID,                 // VarStore ID\r
+      (UINT16) DYNAMIC_ONE_OF_VAR_OFFSET,        // Offset in Buffer Storage\r
+      STRING_TOKEN (STR_ONE_OF_PROMPT),          // Question prompt text\r
+      STRING_TOKEN (STR_ONE_OF_HELP),            // Question help text\r
+      EFI_IFR_FLAG_CALLBACK,                     // Question flag\r
+      EFI_IFR_NUMERIC_SIZE_1,                    // Data type of Question Value\r
+      OptionsOpCodeHandle,                       // Option Opcode list\r
+      NULL                                       // Default Opcode is NULl\r
+      );\r
+\r
+    HiiCreateOrderedListOpCode (\r
+      StartOpCodeHandle,                         // Container for dynamic created opcodes\r
+      0x8002,                                    // Question ID\r
+      CONFIGURATION_VARSTORE_ID,                 // VarStore ID\r
+      (UINT16) DYNAMIC_ORDERED_LIST_VAR_OFFSET,  // Offset in Buffer Storage\r
+      STRING_TOKEN (STR_BOOT_OPTIONS),           // Question prompt text\r
+      STRING_TOKEN (STR_BOOT_OPTIONS),           // Question help text\r
+      EFI_IFR_FLAG_RESET_REQUIRED,               // Question flag\r
+      0,                                         // Ordered list flag, e.g. EFI_IFR_UNIQUE_SET\r
+      EFI_IFR_NUMERIC_SIZE_1,                    // Data type of Question value\r
+      5,                                         // Maximum container\r
+      OptionsOpCodeHandle,                       // Option Opcode list\r
+      NULL                                       // Default Opcode is NULl\r
+      );\r
+\r
+    HiiCreateGotoOpCode (\r
+      StartOpCodeHandle,                // Container for dynamic created opcodes\r
+      1,                                // Target Form ID\r
+      STRING_TOKEN (STR_GOTO_FORM1),    // Prompt text\r
+      STRING_TOKEN (STR_GOTO_HELP),     // Help text\r
+      0,                                // Question flag\r
+      0x8003                            // Question ID\r
+      );\r
+\r
+    HiiUpdateForm (\r
+      PrivateData->HiiHandle[0],  // HII handle\r
+      &mFormSetGuid,              // Formset GUID\r
+      0x1234,                     // Form ID\r
+      StartOpCodeHandle,          // Label for where to insert opcodes\r
+      EndOpCodeHandle             // Replace data\r
+      );\r
+\r
+    HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+    HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+    break;\r
     \r
-      //\r
-      // Refresh the Question value\r
-      //\r
-      PrivateData->Configuration.DynamicRefresh++;\r
-      Status = gRT->SetVariable(\r
-                      VariableName,\r
-                      &mFormSetGuid,\r
-                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                      sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
-                      &PrivateData->Configuration\r
-                      );\r
+  case 0x5678:\r
+    //\r
+    // We will reach here once the Question is refreshed\r
+    //\r
+\r
+    //\r
+    // Initialize the container for dynamic opcodes\r
+    //\r
+    StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+    ASSERT (StartOpCodeHandle != NULL);\r
+\r
+    //\r
+    // Create Hii Extend Label OpCode as the start opcode\r
+    //\r
+    StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+    StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+    StartLabel->Number       = LABEL_UPDATE2;\r
+\r
+    HiiCreateActionOpCode (\r
+      StartOpCodeHandle,                // Container for dynamic created opcodes\r
+      0x1237,                           // Question ID\r
+      STRING_TOKEN(STR_EXIT_TEXT),      // Prompt text\r
+      STRING_TOKEN(STR_EXIT_TEXT),      // Help text\r
+      EFI_IFR_FLAG_CALLBACK,            // Question flag\r
+      0                                 // Action String ID\r
+    );\r
     \r
-      //\r
-      // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause\r
-      // the first statement in Form 3 be suppressed\r
-      //\r
-      MyVar = 111;\r
-      Status = gRT->SetVariable(\r
-                      L"MyVar",\r
-                      &mFormSetGuid,\r
-                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                      1,\r
-                      &MyVar\r
-                      );\r
+    HiiUpdateForm (\r
+      PrivateData->HiiHandle[0],  // HII handle\r
+      &mFormSetGuid,              // Formset GUID\r
+      0x3,                        // Form ID\r
+      StartOpCodeHandle,          // Label for where to insert opcodes\r
+      NULL                        // Insert data\r
+      );\r
+\r
+    HiiFreeOpCodeHandle (StartOpCodeHandle); \r
+  \r
+    //\r
+    // Refresh the Question value\r
+    //\r
+    PrivateData->Configuration.DynamicRefresh++;\r
+    Status = gRT->SetVariable(\r
+                    VariableName,\r
+                    &mFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+                    &PrivateData->Configuration\r
+                    );\r
+  \r
+    //\r
+    // Change an EFI Variable storage (MyEfiVar) asynchronous, this will cause\r
+    // the first statement in Form 3 be suppressed\r
+    //\r
+    MyVar = 111;\r
+    Status = gRT->SetVariable(\r
+                    L"MyVar",\r
+                    &mFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    1,\r
+                    &MyVar\r
+                    );\r
     break;\r
 \r
   case 0x1237:\r
@@ -736,11 +810,7 @@ DriverSampleInit (
   )\r
 {\r
   EFI_STATUS                      Status;\r
-  EFI_STATUS                      SavedStatus;\r
-  EFI_HII_PACKAGE_LIST_HEADER     *PackageList;\r
   EFI_HII_HANDLE                  HiiHandle[2];\r
-  EFI_HANDLE                      DriverHandle[2] = {NULL, NULL};\r
-  DRIVER_SAMPLE_PRIVATE_DATA      *PrivateData;\r
   EFI_SCREEN_DESCRIPTOR           Screen;\r
   EFI_HII_DATABASE_PROTOCOL       *HiiDatabase;\r
   EFI_HII_STRING_PROTOCOL         *HiiString;\r
@@ -749,12 +819,13 @@ DriverSampleInit (
   CHAR16                          *NewString;\r
   UINTN                           BufferSize;\r
   DRIVER_SAMPLE_CONFIGURATION     *Configuration;\r
-  BOOLEAN                         ExtractIfrDefault;\r
-\r
+  BOOLEAN                         ActionFlag;\r
+  EFI_STRING                      ConfigRequestHdr;  \r
+  \r
   //\r
-  // Initialize the library and our protocol.\r
+  // Initialize the local variables.\r
   //\r
-\r
+  ConfigRequestHdr = NULL;\r
   //\r
   // Initialize screen dimensions for SendForm().\r
   // Remove 3 characters from top and bottom\r
@@ -819,7 +890,7 @@ DriverSampleInit (
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &DriverHandle[0],\r
                   &gEfiDevicePathProtocolGuid,\r
-                  &mHiiVendorDevicePath1,\r
+                  &mHiiVendorDevicePath0,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
                   &PrivateData->ConfigAccess,\r
                   NULL\r
@@ -831,26 +902,17 @@ DriverSampleInit (
   //\r
   // Publish our HII data\r
   //\r
-  PackageList = HiiLibPreparePackageList (\r
-                  2,\r
-                  &mFormSetGuid,\r
-                  DriverSampleStrings,\r
-                  VfrBin\r
-                  );\r
-  if (PackageList == NULL) {\r
+  HiiHandle[0] = HiiAddPackages (\r
+                   &mFormSetGuid,\r
+                   DriverHandle[0],\r
+                   DriverSampleStrings,\r
+                   VfrBin,\r
+                   NULL\r
+                   );\r
+  if (HiiHandle[0] == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Status = HiiDatabase->NewPackageList (\r
-                          HiiDatabase,\r
-                          PackageList,\r
-                          DriverHandle[0],\r
-                          &HiiHandle[0]\r
-                          );\r
-  FreePool (PackageList);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
   PrivateData->HiiHandle[0] = HiiHandle[0];\r
 \r
   //\r
@@ -859,33 +921,24 @@ DriverSampleInit (
   Status = gBS->InstallMultipleProtocolInterfaces (\r
                   &DriverHandle[1],\r
                   &gEfiDevicePathProtocolGuid,\r
-                  &mHiiVendorDevicePath2,\r
+                  &mHiiVendorDevicePath1,\r
                   NULL\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   PrivateData->DriverHandle[1] = DriverHandle[1];\r
 \r
-  PackageList = HiiLibPreparePackageList (\r
-                  2,\r
-                  &mInventoryGuid,\r
-                  DriverSampleStrings,\r
-                  InventoryBin\r
-                  );\r
-  if (PackageList == NULL) {\r
+  HiiHandle[1] = HiiAddPackages (\r
+                   &mInventoryGuid,\r
+                   DriverHandle[1],\r
+                   DriverSampleStrings,\r
+                   InventoryBin,\r
+                   NULL\r
+                   );\r
+  if (HiiHandle[1] == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Status = HiiDatabase->NewPackageList (\r
-                          HiiDatabase,\r
-                          PackageList,\r
-                          DriverHandle[1],\r
-                          &HiiHandle[1]\r
-                          );\r
-  FreePool (PackageList);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
   PrivateData->HiiHandle[1] = HiiHandle[1];\r
 \r
   //\r
@@ -894,9 +947,8 @@ DriverSampleInit (
   //\r
   NewString = L"700 Mhz";\r
 \r
-  Status = HiiLibSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  if (HiiSetString (HiiHandle[0], STRING_TOKEN (STR_CPU_STRING2), NewString, NULL) == 0) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   //\r
@@ -908,69 +960,115 @@ DriverSampleInit (
   //\r
   // Try to read NV config EFI variable first\r
   //\r
-  ExtractIfrDefault = TRUE;\r
+  ConfigRequestHdr = HiiConstructConfigHdr (&mFormSetGuid, VariableName, DriverHandle[0]);\r
+  ASSERT (ConfigRequestHdr != NULL);\r
+\r
   BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
   Status = gRT->GetVariable (VariableName, &mFormSetGuid, NULL, &BufferSize, Configuration);\r
-  if (!EFI_ERROR (Status) && (BufferSize == sizeof (DRIVER_SAMPLE_CONFIGURATION))) {\r
-    ExtractIfrDefault = FALSE;\r
-  }\r
-\r
-  if (ExtractIfrDefault) {\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // Store zero data Buffer Storage to EFI variable\r
+    //\r
+    Status = gRT->SetVariable(\r
+                    VariableName,\r
+                    &mFormSetGuid,\r
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+                    sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
+                    Configuration\r
+                    );\r
+    ASSERT (Status == EFI_SUCCESS);\r
     //\r
     // EFI variable for NV config doesn't exit, we should build this variable\r
     // based on default values stored in IFR\r
     //\r
-    BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
-    Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
-\r
-    if (!EFI_ERROR (Status)) {\r
-      gRT->SetVariable(\r
-             VariableName,\r
-             &mFormSetGuid,\r
-             EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-             sizeof (DRIVER_SAMPLE_CONFIGURATION),\r
-             Configuration\r
-             );\r
-    }\r
+    ActionFlag = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+    ASSERT (ActionFlag);\r
+  } else {\r
+    //\r
+    // EFI variable does exist and Validate Current Setting\r
+    //\r
+    ActionFlag = HiiValidateSettings (ConfigRequestHdr);\r
+    ASSERT (ActionFlag);\r
   }\r
+  \r
+  FreePool (ConfigRequestHdr);\r
+\r
+\r
+  //\r
+  // In default, this driver is built into Flash device image, \r
+  // the following code doesn't run.\r
+  //\r
 \r
   //\r
   // Example of how to display only the item we sent to HII\r
+  // When this driver is not built into Flash device image, \r
+  // it need to call SendForm to show front page by itself.\r
   //\r
-  if (DISPLAY_ONLY_MY_ITEM == 0x0001) {\r
+  if (DISPLAY_ONLY_MY_ITEM <= 1) {\r
     //\r
     // Have the browser pull out our copy of the data, and only display our data\r
     //\r
-    //    Status = FormConfig->SendForm (FormConfig, TRUE, HiiHandle, NULL, NULL, NULL, &Screen, NULL);\r
-    //\r
     Status = FormBrowser2->SendForm (\r
                              FormBrowser2,\r
-                             HiiHandle,\r
+                             &(HiiHandle[DISPLAY_ONLY_MY_ITEM]),\r
                              1,\r
                              NULL,\r
                              0,\r
                              NULL,\r
                              NULL\r
                              );\r
-    SavedStatus = Status;\r
+  \r
+    HiiRemovePackages (HiiHandle[0]);\r
+  \r
+    HiiRemovePackages (HiiHandle[1]);\r
+  }\r
 \r
-    Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+  return EFI_SUCCESS;\r
+}\r
 \r
-    Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
+/**\r
+  Unloads the application and its installed protocol.\r
 \r
-    return SavedStatus;\r
-  } else {\r
-    //\r
-    // Have the browser pull out all the data in the HII Database and display it.\r
-    //\r
-    //    Status = FormConfig->SendForm (FormConfig, TRUE, 0, NULL, NULL, NULL, NULL, NULL);\r
-    //\r
+  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.\r
+\r
+  @retval EFI_SUCCESS           The image has been unloaded.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DriverSampleUnload (\r
+  IN EFI_HANDLE  ImageHandle\r
+  )\r
+{\r
+  if (DriverHandle[0] != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+            DriverHandle[0],\r
+            &gEfiDevicePathProtocolGuid,\r
+            &mHiiVendorDevicePath0,\r
+            &gEfiHiiConfigAccessProtocolGuid,\r
+            &PrivateData->ConfigAccess,\r
+            NULL\r
+           );\r
+  }\r
+\r
+  if (DriverHandle[1] != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+            DriverHandle[1],\r
+            &gEfiDevicePathProtocolGuid,\r
+            &mHiiVendorDevicePath1,\r
+            NULL\r
+           );\r
+  }\r
+\r
+  if (PrivateData->HiiHandle[0] != NULL) {\r
+    HiiRemovePackages (PrivateData->HiiHandle[0]);\r
+  }\r
+\r
+  if (PrivateData->HiiHandle[1] != NULL) {\r
+    HiiRemovePackages (PrivateData->HiiHandle[1]);\r
+  }\r
+\r
+  if (PrivateData != NULL) {\r
+    FreePool (PrivateData);\r
   }\r
 \r
   return EFI_SUCCESS;\r