+// Run the IPXE_DISCOVER_NAME program, which obtains the IP address of the boot
+// server and the name of the boot file it delivers.
+CHAR16* RuniPXEDiscover(EFI_HANDLE Volume)
+{
+ EFI_STATUS Status;
+ EFI_DEVICE_PATH *FilePath;
+ EFI_HANDLE iPXEHandle;
+ CHAR16 *boot_info = NULL;
+ UINTN boot_info_size = 0;
+
+ FilePath = FileDevicePath (Volume, IPXE_DISCOVER_NAME);
+ Status = refit_call6_wrapper(BS->LoadImage, FALSE, SelfImageHandle, FilePath,
+ NULL, 0, &iPXEHandle);
+ if (Status != 0)
+ return NULL;
+
+ Status = refit_call3_wrapper(BS->StartImage, iPXEHandle, &boot_info_size, &boot_info);
+
+ return boot_info;
+} // RuniPXEDiscover()
+
+// Scan for network (PXE) boot servers. This function relies on the presence
+// of the IPXE_DISCOVER_NAME and IPXE_NAME program files on the volume from
+// which rEFInd launched. As of December 6, 2014, these tools aren't entirely
+// reliable. See BUILDING.txt for information on building them.
+static VOID ScanNetboot() {
+ CHAR16 *iPXEFileName = IPXE_NAME;
+ CHAR16 *Location;
+ REFIT_VOLUME *NetVolume;
+
+ if (FileExists(SelfVolume->RootDir, IPXE_DISCOVER_NAME) &&
+ FileExists(SelfVolume->RootDir, IPXE_NAME) &&
+ IsValidLoader(SelfVolume->RootDir, IPXE_DISCOVER_NAME) &&
+ IsValidLoader(SelfVolume->RootDir, IPXE_NAME)) {
+ Location = RuniPXEDiscover(SelfVolume->DeviceHandle);
+ if (Location != NULL && FileExists(SelfVolume->RootDir, iPXEFileName)) {
+ NetVolume = AllocatePool(sizeof(REFIT_VOLUME));
+ CopyMem(NetVolume, SelfVolume, sizeof(REFIT_VOLUME));
+ NetVolume->DiskKind = DISK_KIND_NET;
+ NetVolume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_NET);
+ NetVolume->PartName = NetVolume->VolName = NULL;
+ AddLoaderEntry(iPXEFileName, Location, NetVolume);
+ MyFreePool(NetVolume);
+ } // if support files exist and are valid
+ }
+} // VOID ScanNetBoot()
+