+ //\r
+ // Install the new variable if it is not NULL.\r
+ //\r
+ if (NewVariable != NULL) {\r
+ if ((UINTN) (CurrPtr - ValidBuffer) + NewVariableSize > VariableStoreHeader->Size) {\r
+ //\r
+ // No enough space to store the new variable.\r
+ //\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ if (!IsVolatile) {\r
+ if ((NewVariable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
+ HwErrVariableTotalSize += NewVariableSize;\r
+ } else if ((NewVariable->Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) != EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
+ CommonVariableTotalSize += NewVariableSize;\r
+ }\r
+ if ((HwErrVariableTotalSize > PcdGet32 (PcdHwErrStorageSize)) ||\r
+ (CommonVariableTotalSize > VariableStoreHeader->Size - sizeof (VARIABLE_STORE_HEADER) - PcdGet32 (PcdHwErrStorageSize))) {\r
+ //\r
+ // No enough space to store the new variable by NV or NV+HR attribute.\r
+ //\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+ CopyMem (CurrPtr, (UINT8 *) NewVariable, NewVariableSize);\r
+ ((VARIABLE_HEADER *) CurrPtr)->State = VAR_ADDED;\r
+ if (UpdatingVariable != NULL) {\r
+ UpdatingPtrTrack->CurrPtr = (VARIABLE_HEADER *)((UINTN)UpdatingPtrTrack->StartPtr + ((UINTN)CurrPtr - (UINTN)GetStartPointer ((VARIABLE_STORE_HEADER *) ValidBuffer)));\r
+ UpdatingPtrTrack->InDeletedTransitionPtr = NULL;\r
+ }\r
+ CurrPtr += NewVariableSize;\r
+ }\r
+\r