\r
CHAR16 VariableName[] = L"MyIfrNVData";\r
\r
-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1 = {\r
+EFI_HANDLE DriverHandle[2] = {NULL, NULL};\r
+DRIVER_SAMPLE_PRIVATE_DATA *PrivateData = NULL;\r
+\r
+HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath0 = {\r
{\r
{\r
HARDWARE_DEVICE_PATH,\r
}\r
};\r
\r
-HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath2 = {\r
+HII_VENDOR_DEVICE_PATH mHiiVendorDevicePath1 = {\r
{\r
{\r
HARDWARE_DEVICE_PATH,\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN BufferSize;\r
CHAR16 *Password;\r
UINTN PasswordSize;\r
DRIVER_SAMPLE_CONFIGURATION *Configuration;\r
+ UINTN BufferSize;\r
\r
//\r
// Get Buffer Storage data from EFI variable\r
//\r
// Retrive uncommitted data from Browser\r
//\r
- BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
- Configuration = AllocateZeroPool (sizeof (DRIVER_SAMPLE_PRIVATE_DATA));\r
- ASSERT (Configuration != NULL);\r
- Status = GetBrowserData (&mFormSetGuid, VariableName, &BufferSize, (UINT8 *) Configuration);\r
- if (!EFI_ERROR (Status)) {\r
+ Configuration = (DRIVER_SAMPLE_CONFIGURATION *) HiiGetBrowserData (&mFormSetGuid, VariableName, sizeof (DRIVER_SAMPLE_CONFIGURATION));\r
+ if (Configuration != NULL) {\r
//\r
// Update password's clear text in the screen\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
+ FreePool (Configuration);\r
}\r
- FreePool (Configuration);\r
+\r
\r
//\r
// Set password\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
+ *Results = HiiConstructConfigAltResp (\r
+ &mFormSetGuid,\r
+ VariableName,\r
+ PrivateData->DriverHandle[0],\r
+ &PrivateData->Configuration,\r
+ BufferSize,\r
+ VfrMyIfrNVDataBlockName,\r
+ STRING_TOKEN (STR_STANDARD_DEFAULT_PROMPT),\r
+ VfrMyIfrNVDataDefault0000,\r
+ STRING_TOKEN (STR_MANUFACTURE_DEFAULT_PROMPT),\r
+ VfrMyIfrNVDataDefault0001,\r
+ 0,\r
+ NULL\r
);\r
+ \r
+ //\r
+ // No matched storage is found.\r
+ //\r
+ if (*Results == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
\r
- return Status;\r
+ return EFI_SUCCESS;\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
+ if (!HiiIsConfigHdrMatch (Request, &mFormSetGuid, VariableName)) {\r
*Progress = Request;\r
return EFI_NOT_FOUND;\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
{\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
// 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
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
Status = gBS->InstallMultipleProtocolInterfaces (\r
&DriverHandle[0],\r
&gEfiDevicePathProtocolGuid,\r
- &mHiiVendorDevicePath1,\r
+ &mHiiVendorDevicePath0,\r
&gEfiHiiConfigAccessProtocolGuid,\r
&PrivateData->ConfigAccess,\r
NULL\r
Status = gBS->InstallMultipleProtocolInterfaces (\r
&DriverHandle[1],\r
&gEfiDevicePathProtocolGuid,\r
- &mHiiVendorDevicePath2,\r
+ &mHiiVendorDevicePath1,\r
NULL\r
);\r
ASSERT_EFI_ERROR (Status);\r
// based on default values stored in IFR\r
//\r
BufferSize = sizeof (DRIVER_SAMPLE_CONFIGURATION);\r
- Status = IfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
+ Status = HiiIfrLibExtractDefault (Configuration, &BufferSize, 1, VfrMyIfrNVDataDefault0000);\r
\r
if (!EFI_ERROR (Status)) {\r
gRT->SetVariable(\r
);\r
}\r
}\r
+ \r
+ SavedStatus = EFI_SUCCESS;\r
+\r
+ //\r
+ // 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
);\r
SavedStatus = Status;\r
-\r
+ \r
Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[0]);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
-\r
+ \r
Status = HiiDatabase->RemovePackageList (HiiDatabase, HiiHandle[1]);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+ }\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
+ return SavedStatus;\r
+}\r
+\r
+/**\r
+ Unloads the application and its installed protocol.\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 != NULL) {\r
+ FreePool (PrivateData);\r
}\r
\r
return EFI_SUCCESS;\r