**/\r
\r
#include "HttpBootDxe.h"\r
+#include <Library/UefiBootManagerLib.h>\r
\r
CHAR16 mHttpBootConfigStorageName[] = L"HTTP_BOOT_CONFIG_IFR_NVDATA";\r
\r
IN CHAR16 *Uri\r
)\r
{\r
- EFI_DEV_PATH *Node;\r
- EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
- EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
- UINTN Length;\r
- CHAR8 AsciiUri[URI_STR_MAX_SIZE];\r
- CHAR16 *CurrentOrder;\r
- EFI_STATUS Status;\r
- UINTN OrderCount;\r
- UINTN TargetLocation;\r
- BOOLEAN Found;\r
- UINT8 *TempByteBuffer;\r
- UINT8 *TempByteStart;\r
- UINTN DescSize;\r
- UINTN FilePathSize;\r
- CHAR16 OptionStr[10];\r
- UINT16 *NewOrder;\r
- UINTN Index;\r
-\r
- NewOrder = NULL;\r
- TempByteStart = NULL;\r
+ EFI_DEV_PATH *Node;\r
+ EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
+ EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
+ UINTN Length;\r
+ CHAR8 AsciiUri[URI_STR_MAX_SIZE];\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ EFI_BOOT_MANAGER_LOAD_OPTION NewOption;\r
+\r
NewDevicePath = NULL;\r
- NewOrder = NULL;\r
Node = NULL;\r
TmpDevicePath = NULL;\r
- CurrentOrder = NULL;\r
\r
if (StrLen (Description) == 0) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
- // Only accept http and https URI.\r
+ // Only accept empty URI, or http and https URI.\r
//\r
- if ((StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 7) != 0)) {\r
+ if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
//\r
// Update the URI node with the input boot file URI.\r
//\r
- UnicodeStrToAsciiStr (Uri, AsciiUri);\r
+ UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));\r
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);\r
Node = AllocatePool (Length);\r
if (Node == NULL) {\r
}\r
\r
//\r
- // Get current "BootOrder" variable and find a free target.\r
+ // Add a new load option.\r
//\r
- Length = 0;\r
- Status = GetVariable2 (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- (VOID **)&CurrentOrder,\r
- &Length \r
- );\r
- if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {\r
- goto ON_EXIT;\r
- }\r
- OrderCount = Length / sizeof (UINT16);\r
- Found = FALSE;\r
- for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {\r
- Found = TRUE;\r
- for (Index = 0; Index < OrderCount; Index++) {\r
- if (CurrentOrder[Index] == TargetLocation) {\r
- Found = FALSE;\r
- break;\r
- }\r
- }\r
- if (Found) {\r
- break;\r
- }\r
- }\r
-\r
- if (TargetLocation == 0xFFFF) {\r
- DEBUG ((EFI_D_ERROR, "Could not find unused target index.\n"));\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto ON_EXIT;\r
- } else {\r
- DEBUG ((EFI_D_INFO, "TargetIndex = %04x.\n", TargetLocation));\r
- }\r
- \r
- //\r
- // Construct and set the "Boot####" variable\r
- //\r
- DescSize = StrSize(Description);\r
- FilePathSize = GetDevicePathSize (NewDevicePath);\r
- TempByteBuffer = AllocateZeroPool(sizeof(EFI_LOAD_OPTION) + DescSize + FilePathSize);\r
- if (TempByteBuffer == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto ON_EXIT;\r
- }\r
-\r
- TempByteStart = TempByteBuffer;\r
- *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes\r
- TempByteBuffer += sizeof (UINT32);\r
-\r
- *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength\r
- TempByteBuffer += sizeof (UINT16);\r
-\r
- CopyMem (TempByteBuffer, Description, DescSize);\r
- TempByteBuffer += DescSize;\r
- CopyMem (TempByteBuffer, NewDevicePath, FilePathSize);\r
-\r
- UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", L"Boot", TargetLocation);\r
- Status = gRT->SetVariable (\r
- OptionStr,\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
- TempByteStart\r
- );\r
+ Status = EfiBootManagerInitializeLoadOption (\r
+ &NewOption,\r
+ LoadOptionNumberUnassigned,\r
+ LoadOptionTypeBoot,\r
+ LOAD_OPTION_ACTIVE,\r
+ Description,\r
+ NewDevicePath,\r
+ NULL,\r
+ 0\r
+ );\r
if (EFI_ERROR (Status)) {\r
goto ON_EXIT;\r
}\r
\r
- //\r
- // Insert into the order list and set "BootOrder" variable\r
- //\r
- NewOrder = AllocateZeroPool ((OrderCount + 1) * sizeof (UINT16));\r
- if (NewOrder == NULL) {\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto ON_EXIT;\r
- }\r
- CopyMem(NewOrder, CurrentOrder, OrderCount * sizeof(UINT16));\r
- NewOrder[OrderCount] = (UINT16) TargetLocation;\r
- Status = gRT->SetVariable (\r
- L"BootOrder",\r
- &gEfiGlobalVariableGuid,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
- ((OrderCount + 1) * sizeof (UINT16)),\r
- NewOrder\r
- );\r
- \r
+ Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1);\r
+ EfiBootManagerFreeLoadOption (&NewOption);\r
\r
ON_EXIT:\r
\r
- if (CurrentOrder != NULL) {\r
- FreePool (CurrentOrder);\r
- }\r
- if (NewOrder != NULL) {\r
- FreePool (NewOrder);\r
- }\r
- if (TempByteStart != NULL) {\r
- FreePool (TempByteStart);\r
- }\r
if (NewDevicePath != NULL) {\r
FreePool (NewDevicePath);\r
}\r
ConfigRequestHdr = HiiConstructConfigHdr (&gHttpBootConfigGuid, mHttpBootConfigStorageName, CallbackInfo->ChildHandle);\r
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
ConfigRequest = AllocateZeroPool (Size);\r
- ASSERT (ConfigRequest != NULL);\r
+ if (ConfigRequest == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
AllocatedRequest = TRUE;\r
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
FreePool (ConfigRequestHdr);\r
// Get user input URI string\r
//\r
Uri = HiiGetString (CallbackInfo->RegisteredHandle, Value->string, NULL);\r
- ASSERT (Uri != NULL);\r
if (Uri == NULL) {\r
return EFI_UNSUPPORTED;\r
}\r
HiiSetString (CallbackInfo->RegisteredHandle, Value->string, Uri, NULL);\r
\r
//\r
- // We only accept http and https, pop up a message box for unsupported URI.\r
+ // The URI should be either an empty string (for corporate environment) ,or http(s) for home environment.\r
+ // Pop up a message box for other unsupported URI.\r
//\r
- if ((StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 7) != 0)) {\r
+ if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)) {\r
CreatePopUp (\r
EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
&Key,\r