+/**\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
+\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 OUT VARIABLE_POINTER_TRACK *PtrTrack\r
+ )\r
+{\r
+ VARIABLE_HEADER *InDeletedVariable;\r
+ VOID *Point;\r
+\r
+ //\r
+ // Find the variable by walk through HOB, volatile and non-volatile variable store.\r
+ //\r
+ InDeletedVariable = NULL;\r
+\r
+ for ( PtrTrack->CurrPtr = PtrTrack->StartPtr\r
+ ; (PtrTrack->CurrPtr < PtrTrack->EndPtr) && IsValidVariableHeader (PtrTrack->CurrPtr)\r
+ ; PtrTrack->CurrPtr = GetNextVariablePtr (PtrTrack->CurrPtr)\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 (VariableName[0] == 0) {\r
+ if (PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
+ InDeletedVariable = PtrTrack->CurrPtr;\r
+ } else {\r
+ return EFI_SUCCESS;\r
+ }\r
+ } else {\r
+ if (CompareGuid (VendorGuid, &PtrTrack->CurrPtr->VendorGuid)) {\r
+ Point = (VOID *) GetVariableNamePtr (PtrTrack->CurrPtr);\r
+\r
+ ASSERT (NameSizeOfVariable (PtrTrack->CurrPtr) != 0);\r
+ if (CompareMem (VariableName, Point, NameSizeOfVariable (PtrTrack->CurrPtr)) == 0) {\r
+ if (PtrTrack->CurrPtr->State == (VAR_IN_DELETED_TRANSITION & VAR_ADDED)) {\r
+ InDeletedVariable = PtrTrack->CurrPtr;\r
+ } else {\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ PtrTrack->CurrPtr = InDeletedVariable;\r
+ return (PtrTrack->CurrPtr == NULL) ? EFI_NOT_FOUND : EFI_SUCCESS;\r
+}\r
+\r