+/**\r
+ Copy uncommitted data from source Storage to destination Storage.\r
+\r
+ @param Dst Target Storage for uncommitted data.\r
+ @param Src Source Storage for uncommitted data.\r
+\r
+ @retval EFI_SUCCESS The function completed successfully.\r
+ @retval EFI_INVALID_PARAMETER Source and destination Storage is not the same type.\r
+\r
+**/\r
+EFI_STATUS\r
+CopyStorage (\r
+ IN OUT FORMSET_STORAGE *Dst,\r
+ IN FORMSET_STORAGE *Src\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ NAME_VALUE_NODE *Node;\r
+\r
+ if ((Dst->Type != Src->Type) || (Dst->Size != Src->Size)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ switch (Src->Type) {\r
+ case EFI_HII_VARSTORE_BUFFER:\r
+ CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size);\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_NAME_VALUE:\r
+ Link = GetFirstNode (&Src->NameValueListHead);\r
+ while (!IsNull (&Src->NameValueListHead, Link)) {\r
+ Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
+\r
+ SetValueByName (Dst, Node->Name, Node->EditValue);\r
+\r
+ Link = GetNextNode (&Src->NameValueListHead, Link);\r
+ }\r
+ break;\r
+\r
+ case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+\r