30 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
31 IN EFI_DEVICE_PATH_PROTOCOL *FullPath
36 EFI_BLOCK_IO_PROTOCOL *BlockIo;
38 EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
39 EFI_DEVICE_PATH_PROTOCOL *NextFullPath;
42 EFI_HANDLE *SimpleFileSystemHandles;
43 UINTN NumberSimpleFileSystemHandles;
47 GetNext = (BOOLEAN)(FullPath == NULL);
51 TempDevicePath = DevicePath;
53 if (!EFI_ERROR (Status)) {
54 ASSERT (IsDevicePathEnd (TempDevicePath));
56 NextFullPath = FileDevicePath (
Handle, EFI_REMOVABLE_MEDIA_FILE_NAME);
63 FreePool (NextFullPath);
69 ASSERT_EFI_ERROR (Status);
76 gBS->ConnectController (
Handle, NULL, NULL, TRUE);
86 ASSERT_EFI_ERROR (Status);
87 if (EFI_ERROR (Status)) {
91 Buffer = AllocatePool (BlockIo->Media->BlockSize);
95 BlockIo->Media->MediaId,
97 BlockIo->Media->BlockSize,
107 Size = GetDevicePathSize (DevicePath) - END_DEVICE_PATH_LENGTH;
108 gBS->LocateHandleBuffer (
112 &NumberSimpleFileSystemHandles,
113 &SimpleFileSystemHandles
115 for (Index = 0; Index < NumberSimpleFileSystemHandles; Index++) {
120 TempSize = GetDevicePathSize (TempDevicePath) - END_DEVICE_PATH_LENGTH;
125 NextFullPath = FileDevicePath (SimpleFileSystemHandles[Index], EFI_REMOVABLE_MEDIA_FILE_NAME);
129 GetNext = (BOOLEAN)(
CompareMem (NextFullPath, FullPath, GetDevicePathSize (NextFullPath)) == 0);
130 FreePool (NextFullPath);
136 if (SimpleFileSystemHandles != NULL) {
137 FreePool (SimpleFileSystemHandles);
153 IN EFI_DEVICE_PATH_PROTOCOL *Left,
154 IN EFI_DEVICE_PATH_PROTOCOL *Right
157 for ( ; !IsDevicePathEnd (Left) && !IsDevicePathEnd (Right)
158 ; Left = NextDevicePathNode (Left), Right = NextDevicePathNode (Right)
161 if (
CompareMem (Left, Right, DevicePathNodeLength (Left)) != 0) {
162 if ((DevicePathType (Left) != MESSAGING_DEVICE_PATH) || (DevicePathType (Right) != MESSAGING_DEVICE_PATH)) {
166 if (DevicePathSubType (Left) == MSG_DNS_DP) {
167 Left = NextDevicePathNode (Left);
170 if (DevicePathSubType (Right) == MSG_DNS_DP) {
171 Right = NextDevicePathNode (Right);
174 if (((DevicePathSubType (Left) != MSG_IPv4_DP) || (DevicePathSubType (Right) != MSG_IPv4_DP)) &&
175 ((DevicePathSubType (Left) != MSG_IPv6_DP) || (DevicePathSubType (Right) != MSG_IPv6_DP)) &&
176 ((DevicePathSubType (Left) != MSG_URI_DP) || (DevicePathSubType (Right) != MSG_URI_DP))
184 return (BOOLEAN)(IsDevicePathEnd (Left) && IsDevicePathEnd (Right));
199 IN EFI_HANDLE LoadFileHandle,
200 OUT EFI_HANDLE *RamDiskHandle
208 EFI_DEVICE_PATH_PROTOCOL *Node;
210 Status =
gBS->LocateHandleBuffer (
217 if (EFI_ERROR (Status)) {
223 for (Index = 0; Index < HandleCount; Index++) {
225 Status =
gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node, &
Handle);
226 if (!EFI_ERROR (Status) &&
227 (
Handle == LoadFileHandle) &&
228 (DevicePathType (Node) == MEDIA_DEVICE_PATH) && (DevicePathSubType (Node) == MEDIA_RAM_DISK_DP))
238 if (Handles != NULL) {
242 if (Index == HandleCount) {
268 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath
272 EFI_DEVICE_PATH_PROTOCOL *RamDiskDevicePath;
273 EFI_DEVICE_PATH_PROTOCOL *Node;
277 Status =
gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node, &
Handle);
278 if (!EFI_ERROR (Status) &&
279 (DevicePathType (Node) == MEDIA_DEVICE_PATH) &&
280 (DevicePathSubType (Node) == MEDIA_RAM_DISK_DP)
286 Node = NextDevicePathNode (Node);
287 RamDiskDevicePath = DuplicateDevicePath (
FilePath);
288 ASSERT (RamDiskDevicePath != NULL);
289 SetDevicePathEndNode ((VOID *)((UINTN)RamDiskDevicePath + ((UINTN)Node - (UINTN)
FilePath)));
290 return RamDiskDevicePath;
307 IN EFI_DEVICE_PATH_PROTOCOL *RamDiskDevicePath,
308 OUT UINTN *RamDiskSizeInPages
316 ASSERT (RamDiskDevicePath != NULL);
318 *RamDiskSizeInPages = 0;
323 Status =
gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &RamDiskDevicePath, &
Handle);
324 ASSERT_EFI_ERROR (Status);
326 (DevicePathType (RamDiskDevicePath) == MEDIA_DEVICE_PATH) &&
327 (DevicePathSubType (RamDiskDevicePath) == MEDIA_RAM_DISK_DP)
329 StartingAddr =
ReadUnaligned64 ((UINT64 *)((MEDIA_RAM_DISK_DEVICE_PATH *)RamDiskDevicePath)->StartingAddr);
330 EndingAddr =
ReadUnaligned64 ((UINT64 *)((MEDIA_RAM_DISK_DEVICE_PATH *)RamDiskDevicePath)->EndingAddr);
331 *RamDiskSizeInPages = EFI_SIZE_TO_PAGES ((UINTN)(EndingAddr - StartingAddr + 1));
332 return (VOID *)(UINTN)StartingAddr;
346 IN EFI_DEVICE_PATH_PROTOCOL *RamDiskDevicePath
351 UINTN RamDiskSizeInPages;
353 ASSERT (RamDiskDevicePath != NULL);
361 Status =
gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, (VOID *)&
mRamDisk);
362 ASSERT_EFI_ERROR (Status);
365 Status =
mRamDisk->Unregister (RamDiskDevicePath);
366 ASSERT_EFI_ERROR (Status);
367 FreePages (RamDiskBuffer, RamDiskSizeInPages);
381 IN EFI_HANDLE LoadFileHandle,
382 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath,
388 EFI_LOAD_FILE_PROTOCOL *LoadFile;
390 EFI_HANDLE RamDiskHandle;
392 EFI_DEVICE_PATH_PROTOCOL *FullPath;
395 ASSERT (DataSize != NULL);
400 Status =
gBS->OpenProtocol (
402 &gEfiLoadFileProtocolGuid,
406 EFI_OPEN_PROTOCOL_GET_PROTOCOL
408 ASSERT_EFI_ERROR (Status);
412 Status = LoadFile->LoadFile (LoadFile,
FilePath, TRUE, &BufferSize, FileBuffer);
413 if ((Status != EFI_WARN_FILE_SYSTEM) && (Status != EFI_BUFFER_TOO_SMALL)) {
421 if (Status == EFI_BUFFER_TOO_SMALL) {
426 if (BufferSize > MAX_UINT32) {
430 FileBuffer = AllocatePool (BufferSize);
431 if (FileBuffer == NULL) {
439 Status = LoadFile->LoadFile (LoadFile,
FilePath, TRUE, &BufferSize, FileBuffer);
440 if (EFI_ERROR (Status)) {
441 FreePool (FileBuffer);
445 *DataSize = (UINT32)BufferSize;
448 return DuplicateDevicePath (FullPath);
454 FileBuffer = AllocateReservedPages (EFI_SIZE_TO_PAGES (BufferSize));
455 if (FileBuffer == NULL) {
457 EFI_DEVICE_PATH *LoadFilePath;
458 CHAR16 *LoadFileText;
462 if (LoadFilePath == NULL) {
465 LoadFileText = ConvertDevicePathToText (LoadFilePath, FALSE, FALSE);
468 FileText = ConvertDevicePathToText (
FilePath, FALSE, FALSE);
472 "%a:%a: failed to allocate reserved pages: "
473 "BufferSize=%Lu LoadFile=\"%s\" FilePath=\"%s\"\n",
481 if (FileText != NULL) {
485 if (LoadFileText != NULL) {
486 FreePool (LoadFileText);
493 Status = LoadFile->LoadFile (LoadFile,
FilePath, TRUE, &BufferSize, FileBuffer);
494 if (EFI_ERROR (Status)) {
495 FreePages (FileBuffer, EFI_SIZE_TO_PAGES (BufferSize));
500 if (FullPath == NULL) {
531 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath,
533 OUT UINT32 *DataSize,
534 IN BOOLEAN ValidateHttp
542 EFI_DEVICE_PATH_PROTOCOL *Node;
543 EFI_EVENT NotifyEvent;
549 Status =
gBS->LocateDevicePath (&gEfiLoadFileProtocolGuid, &Node, &
Handle);
550 if (!EFI_ERROR (Status) && IsDevicePathEnd (Node)) {
562 Status =
gBS->LocateHandleBuffer (
564 &gEfiLoadFileProtocolGuid,
569 if (EFI_ERROR (Status)) {
574 for (Index = 0; Index < HandleCount; Index++) {
581 if (Handles != NULL) {
592 if (NotifyEvent == NULL) {
600 gBS->CloseEvent (NotifyEvent);
604 DEBUG ((DEBUG_ERROR,
"NETB: LoadFile returned value but URI was never validated\n"));