+/**\r
+ Compare two variable names, one of them may be inconsecutive.\r
+\r
+ @param StoreInfo Pointer to variable store info structure.\r
+ @param Name1 Pointer to one variable name.\r
+ @param Name2 Pointer to another variable name.\r
+ @param NameSize Variable name size.\r
+\r
+ @retval TRUE Name1 and Name2 are identical.\r
+ @retval FALSE Name1 and Name2 are not identical.\r
+\r
+**/\r
+BOOLEAN\r
+CompareVariableName (\r
+ IN VARIABLE_STORE_INFO *StoreInfo,\r
+ IN CONST CHAR16 *Name1,\r
+ IN CONST CHAR16 *Name2,\r
+ IN UINTN NameSize\r
+ )\r
+{\r
+ EFI_PHYSICAL_ADDRESS TargetAddress;\r
+ EFI_PHYSICAL_ADDRESS SpareAddress;\r
+ UINTN PartialNameSize;\r
+\r
+ if (StoreInfo->FtwLastWriteData != NULL) {\r
+ TargetAddress = StoreInfo->FtwLastWriteData->TargetAddress;\r
+ SpareAddress = StoreInfo->FtwLastWriteData->SpareAddress;\r
+ if (((UINTN) Name1 < (UINTN) TargetAddress) && (((UINTN) Name1 + NameSize) > (UINTN) TargetAddress)) {\r
+ //\r
+ // Name1 is inconsecutive.\r
+ //\r
+ PartialNameSize = (UINTN) TargetAddress - (UINTN) Name1;\r
+ //\r
+ // Partial content is in NV storage.\r
+ //\r
+ if (CompareMem ((UINT8 *) Name1, (UINT8 *) Name2, PartialNameSize) == 0) {\r
+ //\r
+ // Another partial content is in spare block.\r
+ //\r
+ if (CompareMem ((UINT8 *) (UINTN) SpareAddress, (UINT8 *) Name2 + PartialNameSize, NameSize - PartialNameSize) == 0) {\r
+ return TRUE;\r
+ }\r
+ }\r
+ return FALSE;\r
+ } else if (((UINTN) Name2 < (UINTN) TargetAddress) && (((UINTN) Name2 + NameSize) > (UINTN) TargetAddress)) {\r
+ //\r
+ // Name2 is inconsecutive.\r
+ //\r
+ PartialNameSize = (UINTN) TargetAddress - (UINTN) Name2;\r
+ //\r
+ // Partial content is in NV storage.\r
+ //\r
+ if (CompareMem ((UINT8 *) Name2, (UINT8 *) Name1, PartialNameSize) == 0) {\r
+ //\r
+ // Another partial content is in spare block.\r
+ //\r
+ if (CompareMem ((UINT8 *) (UINTN) SpareAddress, (UINT8 *) Name1 + PartialNameSize, NameSize - PartialNameSize) == 0) {\r
+ return TRUE;\r
+ }\r
+ }\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Both Name1 and Name2 are consecutive.\r
+ //\r
+ if (CompareMem ((UINT8 *) Name1, (UINT8 *) Name2, NameSize) == 0) {\r
+ return TRUE;\r
+ }\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ This function compares a variable with variable entries in database.\r
+\r
+ @param StoreInfo Pointer to variable store info structure.\r
+ @param Variable Pointer to the variable in our database\r
+ @param VariableHeader Pointer to the Variable Header that has consecutive content.\r
+ @param VariableName Name of the variable to compare to 'Variable'\r
+ @param VendorGuid GUID of the variable to compare to 'Variable'\r
+ @param PtrTrack Variable Track Pointer structure that contains Variable Information.\r
+\r
+ @retval EFI_SUCCESS Found match variable\r
+ @retval EFI_NOT_FOUND Variable not found\r
+\r
+**/\r