);\r
}\r
\r
+/**\r
+ Internal function to check if the input boot option is a valid EFI NV Boot####.\r
+\r
+ @param OptionToCheck Boot option to be checked.\r
+\r
+ @retval TRUE This boot option matches a valid EFI NV Boot####.\r
+ @retval FALSE If not.\r
+ \r
+**/\r
+\r
+BOOLEAN\r
+IsBootOptionValidNVVarialbe (\r
+ IN BDS_COMMON_OPTION *OptionToCheck\r
+ )\r
+{\r
+ LIST_ENTRY TempList;\r
+ BDS_COMMON_OPTION *BootOption;\r
+ BOOLEAN Valid;\r
+ CHAR16 OptionName[20];\r
+\r
+ Valid = FALSE;\r
+\r
+ InitializeListHead (&TempList);\r
+ UnicodeSPrint (OptionName, sizeof (OptionName), L"Boot%04x", OptionToCheck->BootCurrent);\r
\r
+ BootOption = BdsLibVariableToOption (&TempList, OptionName);\r
+ if (BootOption == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ //\r
+ // If the Boot Option Number and Device Path matches, OptionToCheck matches a \r
+ // valid EFI NV Boot####.\r
+ //\r
+ if ((OptionToCheck->BootCurrent == BootOption->BootCurrent) &&\r
+ (CompareMem (OptionToCheck->DevicePath, BootOption->DevicePath, GetDevicePathSize (OptionToCheck->DevicePath)) == 0))\r
+ {\r
+ Valid = TRUE;\r
+ }\r
+\r
+ FreePool (BootOption);\r
+ \r
+ return Valid;\r
+}\r
/**\r
Process the boot option follow the UEFI specification and\r
special treat the legacy boot option with BBS_DEVICE_PATH.\r
//\r
// Set Boot Current\r
//\r
- gRT->SetVariable (\r
- L"BootCurrent",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof (UINT16),\r
- &Option->BootCurrent\r
- );\r
+ if (IsBootOptionValidNVVarialbe (Option)) {\r
+ //\r
+ // For a temporary boot (i.e. a boot by selected a EFI Shell using "Boot From File"), Boot Current is actually not valid.\r
+ // In this case, "BootCurrent" is not created.\r
+ // Only create the BootCurrent variable when it points to a valid Boot#### variable.\r
+ //\r
+ gRT->SetVariable (\r
+ L"BootCurrent",\r
+ &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ sizeof (UINT16),\r
+ &Option->BootCurrent\r
+ );\r
+ }\r
\r
ASSERT (Option->DevicePath != NULL);\r
if ((DevicePathType (Option->DevicePath) == BBS_DEVICE_PATH) &&\r