+/**\r
+This function mainly use to get and update ConfigResp string.\r
+\r
+@param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
+\r
+@retval EFI_SUCCESS Get the information successfully.\r
+@retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.\r
+\r
+**/\r
+EFI_STATUS\r
+HiiGetConfigRespInfo(\r
+ IN CONST EFI_HII_DATABASE_PROTOCOL *This\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ HII_DATABASE_PRIVATE_DATA *Private;\r
+ EFI_STRING ConfigAltResp;\r
+ UINTN ConfigSize;\r
+\r
+ ConfigAltResp = NULL;\r
+ ConfigSize = 0;\r
+\r
+ Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ //\r
+ // Get ConfigResp string\r
+ //\r
+ Status = HiiConfigRoutingExportConfig(&Private->ConfigRouting,&ConfigAltResp);\r
+\r
+ if (!EFI_ERROR (Status)){\r
+ ConfigSize = StrSize(ConfigAltResp);\r
+ if (ConfigSize > gConfigRespSize){\r
+ gConfigRespSize = ConfigSize;\r
+ if (gRTConfigRespBuffer != NULL){\r
+ FreePool(gRTConfigRespBuffer);\r
+ }\r
+ gRTConfigRespBuffer = (EFI_STRING)AllocateRuntimeZeroPool(ConfigSize);\r
+ if (gRTConfigRespBuffer == NULL){\r
+ FreePool(ConfigAltResp);\r
+ DEBUG ((DEBUG_ERROR, "Not enough memory resource to get the ConfigResp string.\n"));\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ } else {\r
+ ZeroMem(gRTConfigRespBuffer,gConfigRespSize);\r
+ }\r
+ CopyMem(gRTConfigRespBuffer,ConfigAltResp,ConfigSize);\r
+ gBS->InstallConfigurationTable (&gEfiHiiConfigRoutingProtocolGuid, gRTConfigRespBuffer);\r
+ FreePool(ConfigAltResp);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+This is an internal function,mainly use to get HiiDatabase information.\r
+\r
+@param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
+\r
+@retval EFI_SUCCESS Get the information successfully.\r
+@retval EFI_OUT_OF_RESOURCES Not enough memory to store the Hiidatabase data.\r
+\r
+**/\r
+EFI_STATUS\r
+HiiGetDatabaseInfo(\r
+ IN CONST EFI_HII_DATABASE_PROTOCOL *This\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HII_PACKAGE_LIST_HEADER *DatabaseInfo;\r
+ UINTN DatabaseInfoSize;\r
+\r
+ DatabaseInfo = NULL;\r
+ DatabaseInfoSize = 0;\r
+\r
+ //\r
+ // Get HiiDatabase information.\r
+ //\r
+ Status = HiiExportPackageLists(This, NULL, &DatabaseInfoSize, DatabaseInfo);\r
+\r
+ ASSERT(Status == EFI_BUFFER_TOO_SMALL);\r
+\r
+ if(DatabaseInfoSize > gDatabaseInfoSize ) {\r
+ gDatabaseInfoSize = DatabaseInfoSize;\r
+ if (gRTDatabaseInfoBuffer != NULL){\r
+ FreePool(gRTDatabaseInfoBuffer);\r
+ }\r
+ gRTDatabaseInfoBuffer = AllocateRuntimeZeroPool(DatabaseInfoSize);\r
+ if (gRTDatabaseInfoBuffer == NULL){\r
+ DEBUG ((DEBUG_ERROR, "Not enough memory resource to get the HiiDatabase info.\n"));\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ } else {\r
+ ZeroMem(gRTDatabaseInfoBuffer,gDatabaseInfoSize);\r
+ }\r
+ Status = HiiExportPackageLists(This, NULL, &DatabaseInfoSize, gRTDatabaseInfoBuffer);\r
+ ASSERT_EFI_ERROR (Status);\r
+ gBS->InstallConfigurationTable (&gEfiHiiDatabaseProtocolGuid, gRTDatabaseInfoBuffer);\r
+\r
+ return EFI_SUCCESS;\r
+\r
+}\r
+\r
+/**\r
+This function mainly use to get and update configuration settings information.\r
+\r
+@param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance.\r
+\r
+@retval EFI_SUCCESS Get the information successfully.\r
+@retval EFI_OUT_OF_RESOURCES Not enough memory to store the Configuration Setting data.\r
+\r
+**/\r
+EFI_STATUS\r
+HiiGetConfigurationSetting(\r
+ IN CONST EFI_HII_DATABASE_PROTOCOL *This\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Get the HiiDatabase info.\r
+ //\r
+ Status = HiiGetDatabaseInfo(This);\r
+\r
+ //\r
+ // Get ConfigResp string\r
+ //\r
+ if (gExportConfigResp) {\r
+ Status = HiiGetConfigRespInfo (This);\r
+ gExportConfigResp = FALSE;\r
+ }\r
+ return Status;\r
+\r
+}\r
+\r