+ //\r
+ // Cache the previous variable data into StorageArea.\r
+ //\r
+ DataOffset = sizeof (VARIABLE_HEADER) + Variable->CurrPtr->NameSize + GET_PAD_SIZE (Variable->CurrPtr->NameSize);\r
+ CopyMem (mStorageArea, (UINT8*)((UINTN) Variable->CurrPtr + DataOffset), Variable->CurrPtr->DataSize);\r
+\r
+ if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) ||\r
+ (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0))) {\r
+ //\r
+ // For variables with the GUID EFI_IMAGE_SECURITY_DATABASE_GUID (i.e. where the data\r
+ // buffer is formatted as EFI_SIGNATURE_LIST), the driver shall not perform an append of\r
+ // EFI_SIGNATURE_DATA values that are already part of the existing variable value.\r
+ //\r
+ BufSize = AppendSignatureList (mStorageArea, Variable->CurrPtr->DataSize, Data, DataSize);\r
+ if (BufSize == Variable->CurrPtr->DataSize) {\r
+ if ((TimeStamp == NULL) || CompareTimeStamp (TimeStamp, &Variable->CurrPtr->TimeStamp)) {\r
+ //\r
+ // New EFI_SIGNATURE_DATA is not found and timestamp is not later\r
+ // than current timestamp, return EFI_SUCCESS directly.\r
+ //\r
+ UpdateVariableInfo (VariableName, VendorGuid, Variable->Volatile, FALSE, TRUE, FALSE, FALSE);\r
+ Status = EFI_SUCCESS;\r
+ goto Done;\r
+ }\r
+ }\r
+ } else {\r
+ //\r
+ // For other Variables, append the new data to the end of previous data.\r
+ //\r
+ CopyMem ((UINT8*)((UINTN) mStorageArea + Variable->CurrPtr->DataSize), Data, DataSize);\r
+ BufSize = Variable->CurrPtr->DataSize + DataSize;\r
+ }\r
+\r
+ RevBufSize = MIN (PcdGet32 (PcdMaxVariableSize), ScratchDataSize);\r