/**\r
Find the variable in the specified variable store.\r
\r
- @param VariableName Name of the variable to be found\r
- @param VendorGuid Vendor GUID to be found.\r
- @param PtrTrack Variable Track Pointer structure that contains Variable Information.\r
+ @param[in] VariableName Name of the variable to be found\r
+ @param[in] VendorGuid Vendor GUID to be found.\r
+ @param[in] IgnoreRtAttribute Ignore RUNTIME_ACCESS attribute when searching variable.\r
+ @param[in, out] PtrTrack Variable Track Pointer structure that contains Variable Information.\r
\r
- @retval EFI_SUCCESS Variable found successfully\r
- @retval EFI_NOT_FOUND Variable not found\r
+ @retval EFI_SUCCESS Variable found successfully\r
+ @retval EFI_NOT_FOUND Variable not found\r
**/\r
EFI_STATUS\r
FindVariableEx (\r
IN CHAR16 *VariableName,\r
IN EFI_GUID *VendorGuid,\r
+ IN BOOLEAN IgnoreRtAttribute,\r
IN OUT VARIABLE_POINTER_TRACK *PtrTrack\r
)\r
{\r
if (PtrTrack->CurrPtr->State == VAR_ADDED ||\r
PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)\r
) {\r
- if (!AtRuntime () || ((PtrTrack->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) != 0)) {\r
+ if (IgnoreRtAttribute || !AtRuntime () || ((PtrTrack->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) != 0)) {\r
if (VariableName[0] == 0) {\r
if (PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
InDeletedVariable = PtrTrack->CurrPtr;\r
This code finds variable in storage blocks of volatile and non-volatile storage areas.\r
If VariableName is an empty string, then we just return the first\r
qualified variable without comparing VariableName and VendorGuid.\r
- Otherwise, VariableName and VendorGuid are compared.\r
+ If IgnoreRtAttribute is TRUE, then we ignore the EFI_VARIABLE_RUNTIME_ACCESS Attribute\r
+ when searching existing variable, only VariableName and VendorGuid are compared.\r
+ Otherwise, variables with EFI_VARIABLE_RUNTIME_ACCESS are not visible at runtime.\r
\r
- @param VariableName Name of the variable to be found.\r
- @param VendorGuid Vendor GUID to be found.\r
- @param PtrTrack VARIABLE_POINTER_TRACK structure for output,\r
+ @param[in] VariableName Name of the variable to be found.\r
+ @param[in] VendorGuid Vendor GUID to be found.\r
+ @param[out] PtrTrack VARIABLE_POINTER_TRACK structure for output,\r
including the range searched and the target position.\r
- @param Global Pointer to VARIABLE_GLOBAL structure, including\r
+ @param[in] Global Pointer to VARIABLE_GLOBAL structure, including\r
base of volatile variable storage area, base of\r
NV variable storage area, and a lock.\r
+ @param[in] IgnoreRtAttribute Ignore RUNTIME_ACCESS attribute when searching variable.\r
\r
@retval EFI_INVALID_PARAMETER If VariableName is not an empty string, while\r
VendorGuid is NULL.\r
IN CHAR16 *VariableName,\r
IN EFI_GUID *VendorGuid,\r
OUT VARIABLE_POINTER_TRACK *PtrTrack,\r
- IN VARIABLE_GLOBAL *Global\r
+ IN VARIABLE_GLOBAL *Global,\r
+ IN BOOLEAN IgnoreRtAttribute\r
)\r
{\r
EFI_STATUS Status;\r
PtrTrack->EndPtr = GetEndPointer (VariableStoreHeader[Type]);\r
PtrTrack->Volatile = (BOOLEAN) (Type == VariableStoreTypeVolatile);\r
\r
- Status = FindVariableEx (VariableName, VendorGuid, PtrTrack);\r
+ Status = FindVariableEx (VariableName, VendorGuid, IgnoreRtAttribute, PtrTrack);\r
if (!EFI_ERROR (Status)) {\r
return Status;\r
}\r
// Update Lang if PlatformLang is already set\r
// Update PlatformLang if Lang is already set\r
//\r
- Status = FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update Lang\r
Data = GetVariableDataPtr (Variable.CurrPtr);\r
DataSize = Variable.CurrPtr->DataSize;\r
} else {\r
- Status = FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Update PlatformLang\r
//\r
// Successfully convert PlatformLang to Lang, and set the BestLang value into Lang variable simultaneously.\r
//\r
- FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ FindVariable (L"Lang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
\r
Status = UpdateVariable (L"Lang", &gEfiGlobalVariableGuid, BestLang,\r
ISO_639_2_ENTRY_SIZE + 1, Attributes, 0, 0, &Variable, NULL);\r
//\r
// Successfully convert Lang to PlatformLang, and set the BestPlatformLang value into PlatformLang variable simultaneously.\r
//\r
- FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ FindVariable (L"PlatformLang", &gEfiGlobalVariableGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
\r
Status = UpdateVariable (L"PlatformLang", &gEfiGlobalVariableGuid, BestPlatformLang,\r
AsciiStrSize (BestPlatformLang), Attributes, 0, 0, &Variable, NULL);\r
Status = EFI_INVALID_PARAMETER;\r
goto Done;\r
}\r
+ \r
+ //\r
+ // Only variable that have RT attributes can be updated/deleted in Runtime.\r
+ //\r
+ if ((Variable->CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
}\r
\r
//\r
\r
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
\r
- Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
goto Done;\r
}\r
\r
AcquireLockOnlyAtBootTime(&mVariableModuleGlobal->VariableGlobal.VariableServicesLock);\r
\r
- Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
if (Variable.CurrPtr == NULL || EFI_ERROR (Status)) {\r
goto Done;\r
}\r
Status = FindVariableEx (\r
GetVariableNamePtr (Variable.CurrPtr),\r
&Variable.CurrPtr->VendorGuid,\r
+ FALSE,\r
&VariableInHob\r
);\r
if (!EFI_ERROR (Status)) {\r
//\r
// Check whether the input variable is already existed.\r
//\r
- FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal);\r
-\r
+ Status = FindVariable (VariableName, VendorGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, TRUE);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (((Variable.CurrPtr->Attributes & EFI_VARIABLE_RUNTIME_ACCESS) == 0) && AtRuntime ()) {\r
+ return EFI_WRITE_PROTECTED;\r
+ }\r
+ }\r
+ \r
//\r
// Hook the operation of setting PlatformLangCodes/PlatformLang and LangCodes/Lang.\r
//\r
Status = ProcessVarWithPk (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes, TRUE);\r
} else if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0)) {\r
Status = ProcessVarWithPk (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes, FALSE);\r
- } else if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) && ((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0)) {\r
+ } else if (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) && \r
+ ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0))) {\r
Status = ProcessVarWithKek (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes);\r
} else {\r
Status = ProcessVariable (VariableName, VendorGuid, Data, DataSize, &Variable, Attributes);\r