firmware updates.\r
\r
Copyright (c) 2016, Microsoft Corporation. All rights reserved.<BR>\r
- Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
(VOID **)&Buffer,\r
&Size\r
);\r
- if (!EFI_ERROR (Status) && Size == sizeof (*Value) && Buffer != NULL) {\r
+ if (!EFI_ERROR (Status) && (Size == sizeof (*Value)) && (Buffer != NULL)) {\r
*Valid = TRUE;\r
*Value = *Buffer;\r
}\r
+\r
if (Buffer != NULL) {\r
FreePool (Buffer);\r
}\r
if (Valid) {\r
Status = gRT->SetVariable (VariableName, &gEfiCallerIdGuid, 0, 0, NULL);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to delete FMP Variable %s. Status = %r\n", VariableName, Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to delete variable %s. Status = %r\n", mImageIdName, VariableName, Status));\r
} else {\r
- DEBUG ((DEBUG_INFO, "Deleted FMP Variable %s\n", VariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Deleted variable %s\n", mImageIdName, VariableName));\r
}\r
}\r
}\r
\r
FmpControllerState = NULL;\r
Size = 0;\r
- Status = GetVariable2 (\r
- Private->FmpStateVariableName,\r
- &gEfiCallerIdGuid,\r
- (VOID **)&FmpControllerState,\r
- &Size\r
- );\r
- if (EFI_ERROR (Status) || FmpControllerState == NULL) {\r
- DEBUG ((DEBUG_ERROR, "Failed to get the FMP Controller State. Status = %r\n", Status));\r
+ Status = GetVariable2 (\r
+ Private->FmpStateVariableName,\r
+ &gEfiCallerIdGuid,\r
+ (VOID **)&FmpControllerState,\r
+ &Size\r
+ );\r
+ if (EFI_ERROR (Status) || (FmpControllerState == NULL)) {\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to get the controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
if (Size == sizeof (*FmpControllerState)) {\r
return FmpControllerState;\r
}\r
- DEBUG ((DEBUG_ERROR, "Getting FMP Controller State returned a size different than expected. Size = 0x%x\n", Size));\r
+\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Getting controller state returned a size different than expected. Size = 0x%x\n", mImageIdName, Size));\r
}\r
+\r
if (FmpControllerState != NULL) {\r
FreePool (FmpControllerState);\r
}\r
+\r
return NULL;\r
}\r
\r
IN CHAR16 *BaseVariableName\r
)\r
{\r
+ UINTN Size;\r
CHAR16 *VariableName;\r
\r
- VariableName = CatSPrint (NULL, BaseVariableName);\r
+ //\r
+ // Allocate Unicode string with room for BaseVariableName and a 16 digit\r
+ // hexadecimal value for the HardwareInstance value.\r
+ //\r
+ Size = StrSize (BaseVariableName) + 16 * sizeof (CHAR16);\r
+ VariableName = AllocateCopyPool (Size, BaseVariableName);\r
if (VariableName == NULL) {\r
- DEBUG ((DEBUG_ERROR, "Failed to generate FMP variable name %s.\n", BaseVariableName));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to generate variable name %s.\n", mImageIdName, BaseVariableName));\r
return VariableName;\r
}\r
+\r
if (HardwareInstance == 0) {\r
return VariableName;\r
}\r
- VariableName = CatSPrint (VariableName, L"%016lx", HardwareInstance);\r
- if (VariableName == NULL) {\r
- DEBUG ((DEBUG_ERROR, "Failed to generate FMP variable name %s.\n", BaseVariableName));\r
- }\r
+\r
+ UnicodeValueToStringS (\r
+ &VariableName[StrLen (BaseVariableName)],\r
+ Size,\r
+ PREFIX_ZERO | RADIX_HEX,\r
+ HardwareInstance,\r
+ 16\r
+ );\r
return VariableName;\r
}\r
\r
IN OUT FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private\r
)\r
{\r
- EFI_STATUS Status;\r
- VOID *Buffer;\r
+ EFI_STATUS Status;\r
+ VOID *Buffer;\r
FMP_CONTROLLER_STATE FmpControllerState;\r
\r
if (Private->VersionVariableName != NULL) {\r
FreePool (Private->VersionVariableName);\r
}\r
+\r
if (Private->LsvVariableName != NULL) {\r
FreePool (Private->LsvVariableName);\r
}\r
+\r
if (Private->LastAttemptStatusVariableName != NULL) {\r
FreePool (Private->LastAttemptStatusVariableName);\r
}\r
+\r
if (Private->LastAttemptVersionVariableName != NULL) {\r
FreePool (Private->LastAttemptVersionVariableName);\r
}\r
+\r
if (Private->FmpStateVariableName != NULL) {\r
FreePool (Private->FmpStateVariableName);\r
}\r
VARNAME_FMPSTATE\r
);\r
\r
- DEBUG ((DEBUG_INFO, "FmpDxe Variable %g %s\n", &gEfiCallerIdGuid, Private->VersionVariableName));\r
- DEBUG ((DEBUG_INFO, "FmpDxe Variable %g %s\n", &gEfiCallerIdGuid, Private->LsvVariableName));\r
- DEBUG ((DEBUG_INFO, "FmpDxe Variable %g %s\n", &gEfiCallerIdGuid, Private->LastAttemptStatusVariableName));\r
- DEBUG ((DEBUG_INFO, "FmpDxe Variable %g %s\n", &gEfiCallerIdGuid, Private->LastAttemptVersionVariableName));\r
- DEBUG ((DEBUG_INFO, "FmpDxe Variable %g %s\n", &gEfiCallerIdGuid, Private->FmpStateVariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Variable %g %s\n", mImageIdName, &gEfiCallerIdGuid, Private->VersionVariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Variable %g %s\n", mImageIdName, &gEfiCallerIdGuid, Private->LsvVariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Variable %g %s\n", mImageIdName, &gEfiCallerIdGuid, Private->LastAttemptStatusVariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Variable %g %s\n", mImageIdName, &gEfiCallerIdGuid, Private->LastAttemptVersionVariableName));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Variable %g %s\n", mImageIdName, &gEfiCallerIdGuid, Private->FmpStateVariableName));\r
\r
Buffer = GetFmpControllerState (Private);\r
if (Buffer != NULL) {\r
// FMP Controller State was either not found or is wrong size.\r
// Create a new FMP Controller State variable with the correct size.\r
//\r
- DEBUG ((DEBUG_INFO, "Create FMP Controller State\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): Create controller state\n", mImageIdName));\r
GetFmpVariable (\r
Private->VersionVariableName,\r
&FmpControllerState.VersionValid,\r
// delete the individual variables. They can be used again on next boot\r
// to create the FMP Controller State.\r
//\r
- DEBUG ((DEBUG_ERROR, "Failed to create FMP Controller State. Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to create controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
DeleteFmpVariable (Private->VersionVariableName);\r
DeleteFmpVariable (Private->LsvVariableName);\r
FMP_CONTROLLER_STATE *FmpControllerState;\r
UINT32 Value;\r
\r
- Value = DEFAULT_VERSION;\r
+ Value = DEFAULT_VERSION;\r
FmpControllerState = GetFmpControllerState (Private);\r
if (FmpControllerState != NULL) {\r
if (FmpControllerState->VersionValid) {\r
Value = FmpControllerState->Version;\r
- DEBUG ((DEBUG_INFO, "Get FMP Variable %g %s Version %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Get variable %g %s Version %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
Value\r
));\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
+\r
return Value;\r
}\r
\r
FMP_CONTROLLER_STATE *FmpControllerState;\r
UINT32 Value;\r
\r
- Value = DEFAULT_LOWESTSUPPORTEDVERSION;\r
+ Value = DEFAULT_LOWESTSUPPORTEDVERSION;\r
FmpControllerState = GetFmpControllerState (Private);\r
if (FmpControllerState != NULL) {\r
if (FmpControllerState->LsvValid) {\r
Value = FmpControllerState->Lsv;\r
- DEBUG ((DEBUG_INFO, "Get FMP Variable %g %s LowestSupportedVersion %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Get variable %g %s LowestSupportedVersion %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
Value\r
));\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
+\r
return Value;\r
}\r
\r
FMP_CONTROLLER_STATE *FmpControllerState;\r
UINT32 Value;\r
\r
- Value = DEFAULT_LASTATTEMPTSTATUS;\r
+ Value = DEFAULT_LASTATTEMPTSTATUS;\r
FmpControllerState = GetFmpControllerState (Private);\r
if (FmpControllerState != NULL) {\r
if (FmpControllerState->LastAttemptStatusValid) {\r
Value = FmpControllerState->LastAttemptStatus;\r
- DEBUG ((DEBUG_INFO, "Get FMP Variable %g %s LastAttemptStatus %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Get variable %g %s LastAttemptStatus %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
Value\r
));\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
+\r
return Value;\r
}\r
\r
FMP_CONTROLLER_STATE *FmpControllerState;\r
UINT32 Value;\r
\r
- Value = DEFAULT_LASTATTEMPTVERSION;\r
+ Value = DEFAULT_LASTATTEMPTVERSION;\r
FmpControllerState = GetFmpControllerState (Private);\r
if (FmpControllerState != NULL) {\r
if (FmpControllerState->LastAttemptVersionValid) {\r
Value = FmpControllerState->LastAttemptVersion;\r
- DEBUG ((DEBUG_INFO, "Get FMP Variable %g %s LastAttemptVersion %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Get variable %g %s LastAttemptVersion %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
Value\r
));\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
+\r
return Value;\r
}\r
\r
if (!FmpControllerState->VersionValid) {\r
Update = TRUE;\r
}\r
+\r
if (FmpControllerState->Version != Version) {\r
Update = TRUE;\r
}\r
+\r
if (!Update) {\r
- DEBUG ((DEBUG_INFO, "No need to update FMP Controller State. Same value as before.\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): No need to update controller state. Same value as before.\n", mImageIdName));\r
} else {\r
FmpControllerState->VersionValid = TRUE;\r
FmpControllerState->Version = Version;\r
- Status = gRT->SetVariable (\r
- Private->FmpStateVariableName,\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (*FmpControllerState),\r
- FmpControllerState\r
- );\r
+ Status = gRT->SetVariable (\r
+ Private->FmpStateVariableName,\r
+ &gEfiCallerIdGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (*FmpControllerState),\r
+ FmpControllerState\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to update FMP Controller State. Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to update controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
- DEBUG ((DEBUG_INFO, "Set FMP Variable %g %s Version %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Set variable %g %s Version %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
Version\r
));\r
}\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
\r
if (!FmpControllerState->LsvValid) {\r
Update = TRUE;\r
}\r
+\r
if (FmpControllerState->Lsv < LowestSupportedVersion) {\r
Update = TRUE;\r
}\r
+\r
if (!Update) {\r
- DEBUG ((DEBUG_INFO, "No need to update FMP Controller State. Same value as before.\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): No need to update controller state. Same value as before.\n", mImageIdName));\r
} else {\r
FmpControllerState->LsvValid = TRUE;\r
FmpControllerState->Lsv = LowestSupportedVersion;\r
- Status = gRT->SetVariable (\r
- Private->FmpStateVariableName,\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (*FmpControllerState),\r
- FmpControllerState\r
- );\r
+ Status = gRT->SetVariable (\r
+ Private->FmpStateVariableName,\r
+ &gEfiCallerIdGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (*FmpControllerState),\r
+ FmpControllerState\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to update FMP Controller State. Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to update controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
- DEBUG ((DEBUG_INFO, "Set FMP Variable %g %s LowestSupportedVersion %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Set variable %g %s LowestSupportedVersion %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
LowestSupportedVersion\r
));\r
}\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
\r
if (!FmpControllerState->LastAttemptStatusValid) {\r
Update = TRUE;\r
}\r
+\r
if (FmpControllerState->LastAttemptStatus != LastAttemptStatus) {\r
Update = TRUE;\r
}\r
+\r
if (!Update) {\r
- DEBUG ((DEBUG_INFO, "No need to update FMP Controller State. Same value as before.\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): No need to update controller state. Same value as before.\n", mImageIdName));\r
} else {\r
FmpControllerState->LastAttemptStatusValid = TRUE;\r
FmpControllerState->LastAttemptStatus = LastAttemptStatus;\r
- Status = gRT->SetVariable (\r
- Private->FmpStateVariableName,\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (*FmpControllerState),\r
- FmpControllerState\r
- );\r
+ Status = gRT->SetVariable (\r
+ Private->FmpStateVariableName,\r
+ &gEfiCallerIdGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (*FmpControllerState),\r
+ FmpControllerState\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to update FMP Controller State. Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to update controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
- DEBUG ((DEBUG_INFO, "Set FMP Variable %g %s LastAttemptStatus %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Set variable %g %s LastAttemptStatus %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
LastAttemptStatus\r
));\r
}\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
\r
if (!FmpControllerState->LastAttemptVersionValid) {\r
Update = TRUE;\r
}\r
+\r
if (FmpControllerState->LastAttemptVersion != LastAttemptVersion) {\r
Update = TRUE;\r
}\r
+\r
if (!Update) {\r
- DEBUG ((DEBUG_INFO, "No need to update FMP Controller State. Same value as before.\n"));\r
+ DEBUG ((DEBUG_INFO, "FmpDxe(%s): No need to update controller state. Same value as before.\n", mImageIdName));\r
} else {\r
FmpControllerState->LastAttemptVersionValid = TRUE;\r
FmpControllerState->LastAttemptVersion = LastAttemptVersion;\r
- Status = gRT->SetVariable (\r
- Private->FmpStateVariableName,\r
- &gEfiCallerIdGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- sizeof (*FmpControllerState),\r
- FmpControllerState\r
- );\r
+ Status = gRT->SetVariable (\r
+ Private->FmpStateVariableName,\r
+ &gEfiCallerIdGuid,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
+ sizeof (*FmpControllerState),\r
+ FmpControllerState\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to update FMP Controller State. Status = %r\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe(%s): Failed to update controller state. Status = %r\n", mImageIdName, Status));\r
} else {\r
- DEBUG ((DEBUG_INFO, "Set FMP Variable %g %s LastAttemptVersion %08x\n",\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FmpDxe(%s): Set variable %g %s LastAttemptVersion %08x\n",\r
+ mImageIdName,\r
&gEfiCallerIdGuid,\r
Private->FmpStateVariableName,\r
LastAttemptVersion\r
));\r
}\r
}\r
+\r
FreePool (FmpControllerState);\r
}\r
\r
static\r
EFI_STATUS\r
LockFmpVariable (\r
- IN EFI_STATUS PreviousStatus,\r
- IN EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock,\r
- IN CHAR16 *VariableName\r
+ IN EFI_STATUS PreviousStatus,\r
+ IN EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy,\r
+ IN CHAR16 *VariableName\r
)\r
{\r
EFI_STATUS Status;\r
\r
- Status = VariableLock->RequestToLock (\r
- VariableLock,\r
- VariableName,\r
- &gEfiCallerIdGuid\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- return PreviousStatus;\r
+ // If success, go ahead and set the policies to protect the target variables.\r
+ Status = RegisterBasicVariablePolicy (\r
+ VariablePolicy,\r
+ &gEfiCallerIdGuid,\r
+ VariableName,\r
+ VARIABLE_POLICY_NO_MIN_SIZE,\r
+ VARIABLE_POLICY_NO_MAX_SIZE,\r
+ VARIABLE_POLICY_NO_MUST_ATTR,\r
+ VARIABLE_POLICY_NO_CANT_ATTR,\r
+ VARIABLE_POLICY_TYPE_LOCK_NOW\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "FmpDxe(%s): Failed to lock variable %g %s. Status = %r\n",\r
+ mImageIdName,\r
+ &gEfiCallerIdGuid,\r
+ VariableName,\r
+ Status\r
+ ));\r
}\r
\r
- DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to lock variable %g %s. Status = %r\n",\r
- &gEfiCallerIdGuid,\r
- VariableName,\r
- Status\r
- ));\r
-\r
if (EFI_ERROR (PreviousStatus)) {\r
return PreviousStatus;\r
}\r
+\r
return Status;\r
}\r
\r
FIRMWARE_MANAGEMENT_PRIVATE_DATA *Private\r
)\r
{\r
- EFI_STATUS Status;\r
- EDKII_VARIABLE_LOCK_PROTOCOL *VariableLock;\r
-\r
- VariableLock = NULL;\r
- Status = gBS->LocateProtocol (\r
- &gEdkiiVariableLockProtocolGuid,\r
- NULL,\r
- (VOID **)&VariableLock\r
- );\r
- if (EFI_ERROR (Status) || VariableLock == NULL) {\r
- DEBUG ((DEBUG_ERROR, "FmpDxe: Failed to locate Variable Lock Protocol (%r).\n", Status));\r
- return EFI_UNSUPPORTED;\r
+ EFI_STATUS Status;\r
+ EDKII_VARIABLE_POLICY_PROTOCOL *VariablePolicy;\r
+\r
+ // Locate the VariablePolicy protocol.\r
+ Status = gBS->LocateProtocol (&gEdkiiVariablePolicyProtocolGuid, NULL, (VOID **)&VariablePolicy);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "FmpDxe %a - Could not locate VariablePolicy protocol! %r\n", __FUNCTION__, Status));\r
+ return Status;\r
}\r
\r
Status = EFI_SUCCESS;\r
- Status = LockFmpVariable (Status, VariableLock, Private->VersionVariableName);\r
- Status = LockFmpVariable (Status, VariableLock, Private->LsvVariableName);\r
- Status = LockFmpVariable (Status, VariableLock, Private->LastAttemptStatusVariableName);\r
- Status = LockFmpVariable (Status, VariableLock, Private->LastAttemptVersionVariableName);\r
- Status = LockFmpVariable (Status, VariableLock, Private->FmpStateVariableName);\r
+ Status = LockFmpVariable (Status, VariablePolicy, Private->VersionVariableName);\r
+ Status = LockFmpVariable (Status, VariablePolicy, Private->LsvVariableName);\r
+ Status = LockFmpVariable (Status, VariablePolicy, Private->LastAttemptStatusVariableName);\r
+ Status = LockFmpVariable (Status, VariablePolicy, Private->LastAttemptVersionVariableName);\r
+ Status = LockFmpVariable (Status, VariablePolicy, Private->FmpStateVariableName);\r
\r
return Status;\r
}\r