+/**\r
+ Create ConfigHdr string for a storage.\r
+\r
+ @param FormSet Pointer of the current FormSet\r
+ @param Storage Pointer of the storage\r
+\r
+ @retval EFI_SUCCESS Initialize ConfigHdr success\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeConfigHdr (\r
+ IN FORM_BROWSER_FORMSET *FormSet,\r
+ IN OUT FORMSET_STORAGE *Storage\r
+ )\r
+{\r
+ CHAR16 *Name;\r
+\r
+ if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER || \r
+ Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ Name = Storage->BrowserStorage->Name;\r
+ } else {\r
+ Name = NULL;\r
+ }\r
+\r
+ Storage->ConfigHdr = HiiConstructConfigHdr (\r
+ &Storage->BrowserStorage->Guid,\r
+ Name,\r
+ FormSet->DriverHandle\r
+ );\r
+\r
+ if (Storage->ConfigHdr == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Find the global storage link base on the input storate type, name and guid.\r
+\r
+ For EFI_HII_VARSTORE_EFI_VARIABLE and EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER,\r
+ same guid + name = same storage\r
+\r
+ For EFI_HII_VARSTORE_NAME_VALUE:\r
+ same guid + HiiHandle = same storage\r
+\r
+ For EFI_HII_VARSTORE_BUFFER:\r
+ same guid + name + HiiHandle = same storage\r
+\r
+ @param StorageType Storage type.\r
+ @param StorageGuid Storage guid.\r
+ @param StorageName Storage Name.\r
+ @param HiiHandle HiiHandle for this varstore.\r
+\r
+ @return Pointer to a GLOBAL_STORAGE data structure.\r
+\r
+**/\r
+BROWSER_STORAGE *\r
+FindStorageInList (\r
+ IN UINT8 StorageType,\r
+ IN EFI_GUID *StorageGuid,\r
+ IN CHAR16 *StorageName,\r
+ IN EFI_HII_HANDLE HiiHandle\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ BROWSER_STORAGE *BrowserStorage;\r
+\r
+ Link = GetFirstNode (&gBrowserStorageList);\r
+ while (!IsNull (&gBrowserStorageList, Link)) {\r
+ BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);\r
+ Link = GetNextNode (&gBrowserStorageList, Link);\r
+\r
+ if ((BrowserStorage->Type == StorageType) && CompareGuid (&BrowserStorage->Guid, StorageGuid)) {\r
+ if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {\r
+ if (BrowserStorage->HiiHandle == HiiHandle) {\r
+ return BrowserStorage;\r
+ }\r
+\r
+ continue;\r
+ }\r
+\r
+ ASSERT (StorageName != NULL);\r
+ if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
+ if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE || StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ return BrowserStorage;\r
+ } else if (StorageType == EFI_HII_VARSTORE_BUFFER && BrowserStorage->HiiHandle == HiiHandle) {\r
+ return BrowserStorage;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Intialize the Global Storage.\r
+\r
+ @param BrowserStorage Pointer to the global storage.\r
+ @param StorageType Storage type.\r
+ @param OpCodeData Binary data for this opcode.\r
+\r
+**/\r
+VOID\r
+IntializeBrowserStorage (\r
+ IN BROWSER_STORAGE *BrowserStorage,\r
+ IN UINT8 StorageType,\r
+ IN UINT8 *OpCodeData\r
+ )\r
+{\r
+ switch (StorageType) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+ CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
+\r
+ BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
+ BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+ CopyMem (&BrowserStorage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
+ CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size, sizeof (UINT16));\r
+\r
+ if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+ BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
+ BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+ }\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_NAME_VALUE:\r
+ CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+\r
+ InitializeListHead (&BrowserStorage->NameValueListHead);\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+/**\r
+ Check whether exist device path info in the ConfigHdr string.\r
+\r
+ @param String UEFI configuration string\r
+\r
+ @retval TRUE Device Path exist.\r
+ @retval FALSE Not exist device path info.\r
+\r
+**/\r
+BOOLEAN\r
+IsDevicePathExist (\r
+ IN EFI_STRING String\r
+ )\r
+{\r
+ UINTN Length;\r
+\r
+ for (; (*String != 0 && StrnCmp (String, L"PATH=", StrLen (L"PATH=")) != 0); String++);\r
+ if (*String == 0) {\r
+ return FALSE;\r
+ }\r
+\r
+ String += StrLen (L"PATH=");\r
+ if (*String == 0) {\r
+ return FALSE;\r
+ }\r
+\r
+ for (Length = 0; *String != 0 && *String != L'&'; String++, Length++);\r
+ if (((Length + 1) / 2) < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r