//;****************************************************************************** //;* Copyright (c) 1983-2020, Insyde Software Corp. All Rights Reserved. //;* //;* You may not reproduce, distribute, publish, display, perform, modify, adapt, //;* transmit, broadcast, present, recite, release, license or otherwise exploit //;* any part of this publication in any form, by any means, without the prior //;* written permission of Insyde Software Corporation. //;* //;****************************************************************************** //; //; Module Name: //; //; DhcpDummy.h //; //; Abstract: //; //; Refer DhcpDummy.c //; #include "PxeDummy.h" #include BOOLEAN gDeviceConnecting; EFI_HII_DATABASE_NEW_PACK gOldNewPackFunction; EFI_HII_DATABASE_PROTOCOL *gHiiDataBaseProtocol; EFI_STATUS PxeNetworkStackCallback ( NETWORK_STACK_CALLBACK_IDENTIFIER Identifier ) { if (Identifier == NetworkStackSnpCallback) { return EFI_SUCCESS; } return EFI_UNSUPPORTED; } EFI_STATUS FindRealPxeEntry ( IN FAKE_LOAD_FILE_INSTANCE *LoadFileInstance, OUT EFI_LOAD_FILE_PROTOCOL **RealLoadFile OPTIONAL ) { EFI_STATUS Status; EFI_DEVICE_PATH *DevicePath; EFI_LOAD_FILE_PROTOCOL *LoadFile; EFI_HANDLE LoadFileHandle; EFI_DEVICE_PATH *CallerDevicePath; EFI_PXE_BASE_CODE_PROTOCOL *PxeBc; EFI_SIMPLE_NETWORK_PROTOCOL *Snp; VOID *MnpSb; if (LoadFileInstance->RealEntry != NULL) { if (RealLoadFile != NULL) { *RealLoadFile = LoadFileInstance->RealEntry; } return EFI_SUCCESS; } CallerDevicePath = LoadFileInstance->FakePxeDevicePath; Status = gBS->LocateDevicePath ( &gEfiLoadFileProtocolGuid, &CallerDevicePath, &LoadFileHandle ); if (EFI_ERROR (Status)) { return Status; } Status = gBS->HandleProtocol ( LoadFileHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath ); if (EFI_ERROR (Status)) { return Status; } Status = gBS->HandleProtocol ( LoadFileHandle, &gEfiLoadFileProtocolGuid, (VOID **) &LoadFile ); if (EFI_ERROR (Status)) { return Status; } // // Because uninstall device path from real handle will cause it UninsatllMultipleProtocol failed. // So keep the real PXE handle, PxeDummy can try to uninstall protocol from it. // To keep original handle, and install CallerIdGuid on it. // LoadFileInstance->RealPxeHandle = LoadFileHandle; LoadFileInstance->RealPxeDevicePath = DevicePath; LoadFileInstance->RealEntry = LoadFile; Status = gBS->InstallProtocolInterface ( &LoadFileHandle, &gEfiCallerIdGuid, EFI_NATIVE_INTERFACE, (VOID *) LoadFileInstance->RealEntry ); ASSERT_EFI_ERROR (Status); // // Bypass PxeBc and SNP protocol to FakeLoadFileHandle // Status = gBS->HandleProtocol ( LoadFileHandle, &gEfiPxeBaseCodeProtocolGuid, (VOID **) &PxeBc ); if (!EFI_ERROR (Status)) { gBS->InstallProtocolInterface ( &LoadFileInstance->FakePxeHandle, &gEfiPxeBaseCodeProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *) PxeBc ); } Status = gBS->HandleProtocol ( LoadFileHandle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &Snp ); if (!EFI_ERROR (Status)) { Status = gBS->InstallProtocolInterface ( &LoadFileInstance->FakePxeHandle, &gEfiSimpleNetworkProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *) Snp ); if (!EFI_ERROR (Status)) { gBS->OpenProtocol ( LoadFileInstance->FakePxeHandle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &Snp, LoadFileInstance->Instance->ImageHandle, LoadFileInstance->FakePxeHandle, EFI_OPEN_PROTOCOL_BY_DRIVER ); } } // // Uninstall real LoadFile protocol and DevicePath and store real LoadFileProtocol address // gBS->UninstallMultipleProtocolInterfaces ( LoadFileHandle, &gEfiDevicePathProtocolGuid, DevicePath, &gEfiLoadFileProtocolGuid, LoadFile, NULL, NULL ); // // Find the parent handle of PXE LoadFile, if VLAN enabled, the ManagedNetworkProtocol will be remove. // The fake PXE loader handle must be remove too. The MnpSb will be closed when DummyPxeDestroyFakeHandle function was be executed (Binding.stop). // if (LoadFileInstance->Instance->RealMnpSb == NULL) { Status = gBS->HandleProtocol ( LoadFileInstance->Instance->UndiHandle, &gEfiManagedNetworkServiceBindingProtocolGuid, &MnpSb ); if (!EFI_ERROR (Status)) { Status = gBS->OpenProtocol ( LoadFileInstance->Instance->UndiHandle, &gEfiManagedNetworkServiceBindingProtocolGuid, (VOID **) &MnpSb, LoadFileInstance->Instance->ImageHandle, LoadFileInstance->FakePxeHandle, EFI_OPEN_PROTOCOL_BY_DRIVER ); // // If this ASSERT trigged, system maybe hang when boot to the PXE when VLAN configuration is enabled and not reboot. // ASSERT_EFI_ERROR (Status); LoadFileInstance->Instance->RealMnpSb = MnpSb; } } if (RealLoadFile != NULL) { *RealLoadFile = LoadFileInstance->RealEntry; } return EFI_SUCCESS; } EFI_STATUS UninstallFakeDevice ( IN COMMON_INSTANCE *Instance ) { DUMMY_PXE_INSTANCE *DummyPxeInstance; DUMMY_IP_INSTANCE *DummyIpInstance; if (Instance == NULL) { return EFI_NOT_READY; } DummyPxeInstance = &(Instance->Pxe); DummyIpInstance = &(Instance->Ip); gBS->CloseProtocol ( Instance->UndiHandle, &gEfiSimpleNetworkProtocolGuid, Instance->ImageHandle, Instance->UndiHandle ); // // Kill the Fake device path first, make sure the real protocol can be binding success. // if (DummyPxeInstance->Ip4.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Ip4.FakePxeHandle, &gEfiDevicePathProtocolGuid, DummyPxeInstance->Ip4.FakePxeDevicePath ); } if (DummyPxeInstance->Ip6.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Ip6.FakePxeHandle, &gEfiDevicePathProtocolGuid, DummyPxeInstance->Ip6.FakePxeDevicePath ); } if (DummyPxeInstance->Http4.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Http4.FakePxeHandle, &gEfiDevicePathProtocolGuid, DummyPxeInstance->Http4.FakePxeDevicePath ); } if (DummyPxeInstance->Http6.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Http6.FakePxeHandle, &gEfiDevicePathProtocolGuid, DummyPxeInstance->Http6.FakePxeDevicePath ); } // // Kill the fake IP services. // gBS->CloseProtocol ( Instance->UndiHandle, &gEfiManagedNetworkServiceBindingProtocolGuid, Instance->ImageHandle, DummyIpInstance->MnpSB.Ip4ChildHandle ); gBS->UninstallMultipleProtocolInterfaces ( Instance->UndiHandle, &gEfiManagedNetworkServiceBindingProtocolGuid, &(DummyIpInstance->MnpSB.MnpSB), NULL ); gBS->UninstallMultipleProtocolInterfaces ( Instance->UndiHandle, &gEfiVlanConfigProtocolGuid, &(DummyIpInstance->VlanConfig.VlanConfig), NULL ); gBS->UninstallMultipleProtocolInterfaces ( Instance->UndiHandle, &gEfiIp4ServiceBindingProtocolGuid, &(DummyIpInstance->Ip4SB.Ip4SB), &gEfiDhcp4ServiceBindingProtocolGuid, &(DummyIpInstance->Dhcp4SB.Dhcp4SB), &gEfiIp4ConfigProtocolGuid, &(DummyIpInstance->Ip4Config.Ip4Config), &gEfiIp4Config2ProtocolGuid, &(DummyIpInstance->Ip4Config2.Ip4Config2), &gEfiIp6ServiceBindingProtocolGuid, &(DummyIpInstance->Ip6SB.Ip6SB), &gEfiDhcp6ServiceBindingProtocolGuid, &(DummyIpInstance->Dhcp6SB.Dhcp6SB), &gEfiIp6ConfigProtocolGuid, &(DummyIpInstance->Ip6Config.Ip6Config), NULL ); return EFI_SUCCESS; } EFI_STATUS ReinstallFakeDevicePath ( COMMON_INSTANCE *Instance ) { DUMMY_PXE_INSTANCE *DummyPxeInstance; if (Instance == NULL) { return EFI_SUCCESS; } DummyPxeInstance = &(Instance->Pxe); if (DummyPxeInstance->Ip4.Enable) { FindRealPxeEntry (&DummyPxeInstance->Ip4, NULL); gBS->InstallMultipleProtocolInterfaces ( &(DummyPxeInstance->Ip4.FakePxeHandle), &gEfiDevicePathProtocolGuid, DummyPxeInstance->Ip4.FakePxeDevicePath, &gEfiLoadFileProtocolGuid, (VOID **) &DummyPxeInstance->Ip4.LoadFile, NULL, NULL ); } if (DummyPxeInstance->Ip6.Enable) { FindRealPxeEntry (&DummyPxeInstance->Ip6, NULL); gBS->InstallMultipleProtocolInterfaces ( &(DummyPxeInstance->Ip6.FakePxeHandle), &gEfiDevicePathProtocolGuid, DummyPxeInstance->Ip6.FakePxeDevicePath, &gEfiLoadFileProtocolGuid, (VOID **) &DummyPxeInstance->Ip6.LoadFile, NULL, NULL ); } if (DummyPxeInstance->Http4.Enable) { FindRealPxeEntry (&DummyPxeInstance->Http4, NULL); gBS->InstallMultipleProtocolInterfaces ( &(DummyPxeInstance->Http4.FakePxeHandle), &gEfiDevicePathProtocolGuid, DummyPxeInstance->Http4.FakePxeDevicePath, &gEfiLoadFileProtocolGuid, (VOID **) &DummyPxeInstance->Http4.LoadFile, NULL, NULL ); } if (DummyPxeInstance->Http6.Enable) { FindRealPxeEntry (&DummyPxeInstance->Http6, NULL); gBS->InstallMultipleProtocolInterfaces ( &(DummyPxeInstance->Http6.FakePxeHandle), &gEfiDevicePathProtocolGuid, DummyPxeInstance->Http6.FakePxeDevicePath, &gEfiLoadFileProtocolGuid, (VOID **) &DummyPxeInstance->Http6.LoadFile, NULL, NULL ); } return EFI_SUCCESS; } EFI_STATUS ReinstallFakeDevice ( COMMON_INSTANCE *Instance ) { DUMMY_PXE_INSTANCE *DummyPxeInstance; DUMMY_IP_INSTANCE *DummyIpInstance; DummyPxeInstance = &(Instance->Pxe); DummyIpInstance = &(Instance->Ip); // // If connect failed, restore Device path to make sure fake entry valid. // if (DummyPxeInstance->Ip4.Enable) { gBS->InstallProtocolInterface ( &(DummyPxeInstance->Ip4.FakePxeHandle), &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, DummyPxeInstance->Ip4.FakePxeDevicePath ); } if (DummyPxeInstance->Ip6.Enable) { gBS->InstallProtocolInterface ( &(DummyPxeInstance->Ip6.FakePxeHandle), &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, DummyPxeInstance->Ip6.FakePxeDevicePath ); } if (DummyPxeInstance->Http4.Enable) { gBS->InstallProtocolInterface ( &(DummyPxeInstance->Http4.FakePxeHandle), &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, DummyPxeInstance->Http4.FakePxeDevicePath ); } if (DummyPxeInstance->Http6.Enable) { gBS->InstallProtocolInterface ( &(DummyPxeInstance->Http6.FakePxeHandle), &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, DummyPxeInstance->Http6.FakePxeDevicePath ); } gBS->InstallMultipleProtocolInterfaces ( &Instance->UndiHandle, &gEfiIp4ServiceBindingProtocolGuid, &(DummyIpInstance->Ip4SB.Ip4SB), &gEfiDhcp4ServiceBindingProtocolGuid, &(DummyIpInstance->Dhcp4SB.Dhcp4SB), &gEfiIp4ConfigProtocolGuid, &(DummyIpInstance->Ip4Config.Ip4Config), &gEfiIp4Config2ProtocolGuid, &(DummyIpInstance->Ip4Config2.Ip4Config2), &gEfiIp6ServiceBindingProtocolGuid, &(DummyIpInstance->Ip6SB.Ip6SB), &gEfiDhcp6ServiceBindingProtocolGuid, &(DummyIpInstance->Dhcp6SB.Dhcp6SB), &gEfiIp6ConfigProtocolGuid, &(DummyIpInstance->Ip6Config.Ip6Config), NULL, NULL ); return EFI_SUCCESS; } EFI_STATUS RelocateAllFunction ( COMMON_INSTANCE *Instance ) { DUMMY_PXE_INSTANCE *DummyPxeInstance; DUMMY_IP_INSTANCE *DummyIpInstance; EFI_STATUS Status; if (Instance == NULL) { return EFI_SUCCESS; } DummyPxeInstance = &(Instance->Pxe); DummyIpInstance = &(Instance->Ip); // // Kill fake PXE entry. // if (DummyPxeInstance->Ip4.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Ip4.FakePxeHandle, &gEfiLoadFileProtocolGuid, &(DummyPxeInstance->Ip4.LoadFile) ); } if (DummyPxeInstance->Ip6.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Ip6.FakePxeHandle, &gEfiLoadFileProtocolGuid, &(DummyPxeInstance->Ip6.LoadFile) ); } if (DummyPxeInstance->Http4.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Http4.FakePxeHandle, &gEfiLoadFileProtocolGuid, &(DummyPxeInstance->Http4.LoadFile) ); } if (DummyPxeInstance->Http6.Enable) { gBS->UninstallProtocolInterface ( DummyPxeInstance->Http6.FakePxeHandle, &gEfiLoadFileProtocolGuid, &(DummyPxeInstance->Http6.LoadFile) ); } // // Check Network Stack behavior. // If protocol is not ready, return failed to exit PxeDummy. // Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiManagedNetworkServiceBindingProtocolGuid, (VOID **) &(DummyIpInstance->MnpSB.RealMnpSB) ); if (EFI_ERROR(Status)) { return Status; } // // Try to get Vlan config protocol. // Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiVlanConfigProtocolGuid, (VOID **) &(DummyIpInstance->VlanConfig.RealVlanConfig) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get VlanConfigProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiIp4ServiceBindingProtocolGuid, (VOID **) &(DummyIpInstance->Ip4SB.RealIp4SB) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Ip4ServiceBindingProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiDhcp4ServiceBindingProtocolGuid, (VOID **) &(DummyIpInstance->Dhcp4SB.RealDhcp4SB) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Dhcp4ServiceBindingProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); // // Ip4Config protocol will be remove after Ip4Config2 implement. // Do not check it when PxeDummy find real instance. // Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiIp4ConfigProtocolGuid, (VOID **) &(DummyIpInstance->Ip4Config.RealIp4Config) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Ip4ConfigProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); // // Try to locate Ip4Config2 // Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiIp4Config2ProtocolGuid, (VOID **) &(DummyIpInstance->Ip4Config2.RealIp4Config2) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Ip4Config2Protocol on Handle %x - %r\n", Instance->UndiHandle, Status)); Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiIp6ServiceBindingProtocolGuid, (VOID **) &(DummyIpInstance->Ip6SB.RealIp6SB) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Ip6ServiceBindingProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiDhcp6ServiceBindingProtocolGuid, (VOID **) &(DummyIpInstance->Dhcp6SB.RealDhcp6SB) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Dhcp6ServiceBindingProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); Status = gBS->HandleProtocol ( Instance->UndiHandle, &gEfiIp6ConfigProtocolGuid, (VOID **) &(DummyIpInstance->Ip6Config.RealIp6Config) ); DEBUG ((EFI_D_ERROR, "RelocateAllFunction: Get Ip6ConfigProtocol on Handle %x - %r\n", Instance->UndiHandle, Status)); return EFI_SUCCESS; } EFI_STATUS ConnectDevice ( IN COMMON_INSTANCE *Instance ) { EFI_STATUS Status; if (Instance == NULL) { return EFI_SUCCESS; } if (gDeviceConnecting) { return EFI_SUCCESS; } if (Instance->DeviceConnected) { return EFI_SUCCESS; } Instance->DeviceConnected = TRUE; gDeviceConnecting = TRUE; UninstallFakeDevice (Instance); // // re-binding Network Stack services. // gNetworkLocker->NetworkStackCallback = gOldNetworkLockerCallback; gBS->ConnectController (Instance->UndiHandle, NULL, NULL, TRUE); Status = RelocateAllFunction (Instance); if (EFI_ERROR(Status)) { goto CONNECT_FAILED; } if (gOldNewPackFunction != NULL) { gHiiDataBaseProtocol->NewPackageList = gOldNewPackFunction; } gDeviceConnecting = FALSE; // // Reinstall DevicePath to make sure LoadFile can be loaded. // And stop event of ReadyToBoot to avoid Mnp DestroyChild Failed. // ReinstallFakeDevicePath (Instance); if (Instance->Ip.MnpSB.ReadyToBootEvent != NULL) { gBS->CloseEvent (Instance->Ip.MnpSB.ReadyToBootEvent); } // // Waitting for next trigger of network stack callers. // To avoid some driver will binding on Ip.CreateChildren function, this lock should be backup. // gNetworkLocker->NetworkStackCallback = PxeNetworkStackCallback; return Status; CONNECT_FAILED: // // Reinstall PxeDummy to make sure fake PXE can be calling. // ReinstallFakeDevice (Instance); Instance->DeviceConnected = FALSE; gDeviceConnecting = FALSE; return Status; } VOID RemoveDuplicatedDevicePath ( FAKE_LOAD_FILE_INSTANCE *LoadInstance ) { EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *UpdatedDevicePath; // // To avoid Locate.c (499) assert, Finding the same device path installed in two handles. // UpdatedDevicePath = NULL; Status = gBS->HandleProtocol ( LoadInstance->RealPxeHandle, &gEfiDevicePathProtocolGuid, (VOID **) &UpdatedDevicePath ); if (EFI_ERROR (Status)) { return; } if (LoadInstance->RealPxeDevicePath != UpdatedDevicePath) { LoadInstance->RealPxeDevicePath = UpdatedDevicePath; LoadInstance->FakePxeDevicePath = UpdatedDevicePath; } gBS->UninstallProtocolInterface ( LoadInstance->RealPxeHandle, &gEfiDevicePathProtocolGuid, (VOID *) UpdatedDevicePath ); gBS->InstallProtocolInterface ( &LoadInstance->FakePxeHandle, &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, (VOID *) LoadInstance->FakePxeDevicePath ); } /// // For PXE LoadFile Protocol // EFI_STATUS EFIAPI FakePxeLoadFile ( IN EFI_LOAD_FILE_PROTOCOL *This, IN EFI_DEVICE_PATH_PROTOCOL *CallerDevicePath, IN BOOLEAN BootPolicy, IN OUT UINTN *BufferSize, IN VOID *Buffer OPTIONAL ) { COMMON_INSTANCE *Instance; DUMMY_PXE_INSTANCE *DummyPxeInstance; FAKE_LOAD_FILE_INSTANCE *LoadInstance; EFI_STATUS Status; EFI_LOAD_FILE_PROTOCOL *RealEntry; // // Only support BootPolicy // if (!BootPolicy) { return EFI_UNSUPPORTED; } LoadInstance = (VOID *) This; Instance = LoadInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } DummyPxeInstance = &(Instance->Pxe); if (LoadInstance->RealEntry != NULL) { RealEntry = LoadInstance->RealEntry; return RealEntry->LoadFile (RealEntry, CallerDevicePath, BootPolicy, BufferSize, Buffer); } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } // // Find real PXE entry. // Status = FindRealPxeEntry (LoadInstance, &RealEntry); if (EFI_ERROR (Status)) { goto FUNCTION_FAILED; } if (RealEntry == NULL) { return EFI_NOT_READY; } // // Bypass to real PXE entry. // LoadInstance->RealEntry = RealEntry; return RealEntry->LoadFile (RealEntry, CallerDevicePath, BootPolicy, BufferSize, Buffer); FUNCTION_FAILED: return Status; } // // For HTTP LoadFile Protocol // EFI_STATUS EFIAPI FakeHttpLoadFile ( IN EFI_LOAD_FILE_PROTOCOL *This, IN EFI_DEVICE_PATH_PROTOCOL *CallerDevicePath, IN BOOLEAN BootPolicy, IN OUT UINTN *BufferSize, IN VOID *Buffer OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; DUMMY_PXE_INSTANCE *DummyPxeInstance; FAKE_LOAD_FILE_INSTANCE *LoadInstance; EFI_LOAD_FILE_PROTOCOL *RealEntry; EFI_DEVICE_PATH_PROTOCOL *RealDevicePath; if (This == NULL || BufferSize == NULL || CallerDevicePath == NULL) { return EFI_INVALID_PARAMETER; } // // Only support BootPolicy // if (!BootPolicy) { return EFI_UNSUPPORTED; } LoadInstance = (VOID *) This; Instance = LoadInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } DummyPxeInstance = &(Instance->Pxe); if (LoadInstance->RealEntry != NULL) { RealEntry = LoadInstance->RealEntry; goto BOOT_TO_HTTP_BOOT_LOAD_FILE; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } // // Find real PXE entry. // Status = FindRealPxeEntry (LoadInstance, &RealEntry); if (EFI_ERROR (Status)) { return Status; } if (RealEntry == NULL) { return EFI_NOT_READY; } LoadInstance->RealEntry = RealEntry; BOOT_TO_HTTP_BOOT_LOAD_FILE: // // Because HttpBootDxe will ReInstall DevicePath to append finded file path. // Copy device path to original HttpBoot handle. // Status = gBS->HandleProtocol ( LoadInstance->RealPxeHandle, &gEfiDevicePathProtocolGuid, (VOID **) &RealDevicePath ); if (EFI_ERROR (Status)) { // // Install original DevicePath back when there is no DevicePath protocol. // Status = gBS->InstallProtocolInterface ( &LoadInstance->RealPxeHandle, &gEfiDevicePathProtocolGuid, EFI_NATIVE_INTERFACE, LoadInstance->RealPxeDevicePath ); ASSERT_EFI_ERROR (Status); } // // Try to avoid RegisterRamDisk failed when install device path protocol. // gBS->UninstallProtocolInterface ( LoadInstance->FakePxeHandle, &gEfiDevicePathProtocolGuid, LoadInstance->FakePxeDevicePath ); // // Boot to real HTTP boot entry. // Maybe ReturnStatus is WARN_FILE_SYSTEM // Status = RealEntry->LoadFile (RealEntry, CallerDevicePath, BootPolicy, BufferSize, Buffer); RemoveDuplicatedDevicePath (LoadInstance); return Status; } // // For Ip4Config protocol // EFI_STATUS FakeIp4ConfigStart ( IN EFI_IP4_CONFIG_PROTOCOL *This, IN EFI_EVENT DoneEvent, IN EFI_EVENT ReconfigEvent ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG_INSATNCE *Ip4ConfigInstance; Ip4ConfigInstance = (VOID *) This; Instance = Ip4ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4ConfigInstance->RealIp4Config == NULL) { return EFI_NOT_READY; } return Ip4ConfigInstance->RealIp4Config->Start (Ip4ConfigInstance->RealIp4Config, DoneEvent, ReconfigEvent); } EFI_STATUS FakeIp4ConfigStop( IN EFI_IP4_CONFIG_PROTOCOL *This ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG_INSATNCE *Ip4ConfigInstance; Ip4ConfigInstance = (VOID *) This; Instance = Ip4ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4ConfigInstance->RealIp4Config == NULL) { return EFI_NOT_READY; } return Ip4ConfigInstance->RealIp4Config->Stop (Ip4ConfigInstance->RealIp4Config); } EFI_STATUS FakeIp4ConfigGetData ( IN EFI_IP4_CONFIG_PROTOCOL *This, IN OUT UINTN *IpConfigDataSize, OUT EFI_IP4_IPCONFIG_DATA *IpConfigData OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG_INSATNCE *Ip4ConfigInstance; Ip4ConfigInstance = (VOID *) This; Instance = Ip4ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4ConfigInstance->RealIp4Config == NULL) { return EFI_NOT_READY; } return Ip4ConfigInstance->RealIp4Config->GetData (Ip4ConfigInstance->RealIp4Config, IpConfigDataSize, IpConfigData); } // // For Ip6Config protocol // EFI_STATUS FakeIp4Config2SetData ( IN EFI_IP4_CONFIG2_PROTOCOL *This, IN EFI_IP4_CONFIG2_DATA_TYPE DataType, IN UINTN DataSize, IN VOID *Data ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG2_INSATNCE *Ip4Config2Instance; Ip4Config2Instance = (VOID *) This; Instance = Ip4Config2Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Config2Instance->RealIp4Config2 == NULL) { return EFI_NOT_READY; } return Ip4Config2Instance->RealIp4Config2->SetData (Ip4Config2Instance->RealIp4Config2, DataType, DataSize, Data); } EFI_STATUS FakeIp4Config2GetData ( IN EFI_IP4_CONFIG2_PROTOCOL *This, IN EFI_IP4_CONFIG2_DATA_TYPE DataType, IN OUT UINTN *DataSize, IN VOID *Data OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG2_INSATNCE *Ip4Config2Instance; Ip4Config2Instance = (VOID *) This; Instance = Ip4Config2Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Config2Instance->RealIp4Config2 == NULL) { return EFI_NOT_READY; } return Ip4Config2Instance->RealIp4Config2->GetData (Ip4Config2Instance->RealIp4Config2, DataType, DataSize, Data); } EFI_STATUS FakeIp4Config2RegisterDataNotify ( IN EFI_IP4_CONFIG2_PROTOCOL *This, IN EFI_IP4_CONFIG2_DATA_TYPE DataType, IN EFI_EVENT Event ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG2_INSATNCE *Ip4Config2Instance; Ip4Config2Instance = (VOID *) This; Instance = Ip4Config2Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Config2Instance->RealIp4Config2 == NULL) { return EFI_NOT_READY; } return Ip4Config2Instance->RealIp4Config2->RegisterDataNotify (Ip4Config2Instance->RealIp4Config2, DataType, Event); } EFI_STATUS FakeIp4Config2UnregisterDataNotify( IN EFI_IP4_CONFIG2_PROTOCOL *This, IN EFI_IP4_CONFIG2_DATA_TYPE DataType, IN EFI_EVENT Event ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_CONFIG2_INSATNCE *Ip4Config2Instance; Ip4Config2Instance = (VOID *) This; Instance = Ip4Config2Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Config2Instance->RealIp4Config2 == NULL) { return EFI_NOT_READY; } return Ip4Config2Instance->RealIp4Config2->UnregisterDataNotify (Ip4Config2Instance->RealIp4Config2, DataType, Event); } // // For Ip6Config protocol // EFI_STATUS FakeIp6ConfigSetData ( IN EFI_IP6_CONFIG_PROTOCOL *This, IN EFI_IP6_CONFIG_DATA_TYPE DataType, IN UINTN DataSize, IN VOID *Data ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_CONFIG_INSATNCE *Ip6ConfigInstance; Ip6ConfigInstance = (VOID *) This; Instance = Ip6ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6ConfigInstance->RealIp6Config == NULL) { return EFI_NOT_READY; } return Ip6ConfigInstance->RealIp6Config->SetData (Ip6ConfigInstance->RealIp6Config, DataType, DataSize, Data); } EFI_STATUS FakeIp6ConfigGetData ( IN EFI_IP6_CONFIG_PROTOCOL *This, IN EFI_IP6_CONFIG_DATA_TYPE DataType, IN OUT UINTN *DataSize, IN VOID *Data OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_CONFIG_INSATNCE *Ip6ConfigInstance; Ip6ConfigInstance = (VOID *) This; Instance = Ip6ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6ConfigInstance->RealIp6Config == NULL) { return EFI_NOT_READY; } return Ip6ConfigInstance->RealIp6Config->GetData (Ip6ConfigInstance->RealIp6Config, DataType, DataSize, Data); } EFI_STATUS FakeIp6ConfigRegisterDataNotify ( IN EFI_IP6_CONFIG_PROTOCOL *This, IN EFI_IP6_CONFIG_DATA_TYPE DataType, IN EFI_EVENT Event ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_CONFIG_INSATNCE *Ip6ConfigInstance; Ip6ConfigInstance = (VOID *) This; Instance = Ip6ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6ConfigInstance->RealIp6Config == NULL) { return EFI_NOT_READY; } return Ip6ConfigInstance->RealIp6Config->RegisterDataNotify (Ip6ConfigInstance->RealIp6Config, DataType, Event); } EFI_STATUS FakeIp6ConfigUnregisterDataNotify( IN EFI_IP6_CONFIG_PROTOCOL *This, IN EFI_IP6_CONFIG_DATA_TYPE DataType, IN EFI_EVENT Event ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_CONFIG_INSATNCE *Ip6ConfigInstance; Ip6ConfigInstance = (VOID *) This; Instance = Ip6ConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6ConfigInstance->RealIp6Config == NULL) { return EFI_NOT_READY; } return Ip6ConfigInstance->RealIp6Config->UnregisterDataNotify (Ip6ConfigInstance->RealIp6Config, DataType, Event); } // // For Ip4 protocol // EFI_STATUS FakeIp4GetModeData ( IN CONST EFI_IP4_PROTOCOL *This, OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->GetModeData (Ip4Instance->RealIp4, Ip4ModeData, MnpConfigData, SnpModeData); } EFI_STATUS FakeIp4Configure ( IN EFI_IP4_PROTOCOL *This, IN EFI_IP4_CONFIG_DATA *IpConfigData OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Configure (Ip4Instance->RealIp4, IpConfigData); } EFI_STATUS FakeIp4Groups ( IN EFI_IP4_PROTOCOL *This, IN BOOLEAN JoinFlag, IN EFI_IPv4_ADDRESS *GroupAddress OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Groups (Ip4Instance->RealIp4, JoinFlag, GroupAddress); } EFI_STATUS FakeIp4Routes ( IN EFI_IP4_PROTOCOL *This, IN BOOLEAN DeleteRoute, IN EFI_IPv4_ADDRESS *SubnetAddress, IN EFI_IPv4_ADDRESS *SubnetMask, IN EFI_IPv4_ADDRESS *GatewayAddress ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Routes (Ip4Instance->RealIp4, DeleteRoute, SubnetAddress, SubnetMask, GatewayAddress); } EFI_STATUS FakeIp4Transmit ( IN EFI_IP4_PROTOCOL *This, IN EFI_IP4_COMPLETION_TOKEN *Token ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Transmit (Ip4Instance->RealIp4, Token); } EFI_STATUS FakeIp4Receive ( IN EFI_IP4_PROTOCOL *This, IN EFI_IP4_COMPLETION_TOKEN *Token ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Receive (Ip4Instance->RealIp4, Token); } EFI_STATUS FakeIp4Cancel ( IN EFI_IP4_PROTOCOL *This, IN EFI_IP4_COMPLETION_TOKEN *Token OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Cancel (Ip4Instance->RealIp4, Token); } EFI_STATUS FakeIp4Poll ( IN EFI_IP4_PROTOCOL *This ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_INSATNCE *Ip4Instance; Ip4Instance = (VOID *) This; Instance = Ip4Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4Instance->RealIp4 == NULL) { return EFI_NOT_READY; } return Ip4Instance->RealIp4->Poll (Ip4Instance->RealIp4); } // // For Ip6 protocol // EFI_STATUS FakeIp6GetModeData ( IN EFI_IP6_PROTOCOL *This, OUT EFI_IP6_MODE_DATA *Ip6ModeData OPTIONAL, OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL, OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->GetModeData (Ip6Instance->RealIp6, Ip6ModeData, MnpConfigData, SnpModeData); } EFI_STATUS FakeIp6Configure ( IN EFI_IP6_PROTOCOL *This, IN EFI_IP6_CONFIG_DATA *Ip6ConfigData OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6== NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Configure (Ip6Instance->RealIp6, Ip6ConfigData); } EFI_STATUS FakeIp6Groups ( IN EFI_IP6_PROTOCOL *This, IN BOOLEAN JoinFlag, IN EFI_IPv6_ADDRESS *GroupAddress OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Groups (Ip6Instance->RealIp6, JoinFlag, GroupAddress); } EFI_STATUS FakeIp6Routes ( IN EFI_IP6_PROTOCOL *This, IN BOOLEAN DeleteRoute, IN EFI_IPv6_ADDRESS *Destination OPTIONAL, IN UINT8 PrefixLength, IN EFI_IPv6_ADDRESS *GatewayAddress OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Routes (Ip6Instance->RealIp6, DeleteRoute, Destination, PrefixLength, GatewayAddress); } EFI_STATUS FakeIp6Neighbors ( IN EFI_IP6_PROTOCOL *This, IN BOOLEAN DeleteFlag, IN EFI_IPv6_ADDRESS *TargetIp6Address, IN EFI_MAC_ADDRESS *TargetLinkAddress, IN UINT32 Timeout, IN BOOLEAN Override ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Neighbors (Ip6Instance->RealIp6, DeleteFlag, TargetIp6Address, TargetLinkAddress, Timeout, Override); } EFI_STATUS FakeIp6Transmit ( IN EFI_IP6_PROTOCOL *This, IN EFI_IP6_COMPLETION_TOKEN *Token ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Transmit (Ip6Instance->RealIp6, Token); } EFI_STATUS FakeIp6Receive ( IN EFI_IP6_PROTOCOL *This, IN EFI_IP6_COMPLETION_TOKEN *Token ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Receive (Ip6Instance->RealIp6, Token); } EFI_STATUS FakeIp6Cancel ( IN EFI_IP6_PROTOCOL *This, IN EFI_IP6_COMPLETION_TOKEN *Token OPTIONAL ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Cancel (Ip6Instance->RealIp6, Token); } EFI_STATUS FakeIp6Poll ( IN EFI_IP6_PROTOCOL *This ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_INSATNCE *Ip6Instance; Ip6Instance = (VOID *) This; Instance = Ip6Instance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6Instance->RealIp6 == NULL) { return EFI_NOT_READY; } return Ip6Instance->RealIp6->Poll (Ip6Instance->RealIp6); } // // For Ip4 ServiceBinding protocol // EFI_STATUS FakeIp4CreateChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_SB_INSATNCE *Ip4SBInstance; Ip4SBInstance = (VOID *) This; Instance = Ip4SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4SBInstance->RealIp4SB == NULL) { return EFI_NOT_READY; } return Ip4SBInstance->RealIp4SB->CreateChild (Ip4SBInstance->RealIp4SB, ChildHandle); } EFI_STATUS FakeIp4DestroyChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP4_SB_INSATNCE *Ip4SBInstance; Ip4SBInstance = (VOID *) This; Instance = Ip4SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip4SBInstance->RealIp4SB == NULL) { return EFI_NOT_READY; } return Ip4SBInstance->RealIp4SB->DestroyChild (Ip4SBInstance->RealIp4SB, ChildHandle); } // // For Ip6 ServiceBinding protocol // EFI_STATUS FakeIp6CreateChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_SB_INSATNCE *Ip6SBInstance; Ip6SBInstance = (VOID *) This; Instance = Ip6SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6SBInstance->RealIp6SB == NULL) { return EFI_NOT_READY; } return Ip6SBInstance->RealIp6SB->CreateChild (Ip6SBInstance->RealIp6SB, ChildHandle); } EFI_STATUS FakeIp6DestroyChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_IP6_SB_INSATNCE *Ip6SBInstance; Ip6SBInstance = (VOID *) This; Instance = Ip6SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Ip6SBInstance->RealIp6SB == NULL) { return EFI_NOT_READY; } return Ip6SBInstance->RealIp6SB->DestroyChild (Ip6SBInstance->RealIp6SB, ChildHandle); } // // For Dhcp4 ServiceBinding protocol // EFI_STATUS FakeDhcp4CreateChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_DHCP4_SB_INSATNCE *Dhcp4SBInstance; Dhcp4SBInstance = (VOID *) This; Instance = Dhcp4SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Dhcp4SBInstance->RealDhcp4SB == NULL) { return EFI_NOT_READY; } return Dhcp4SBInstance->RealDhcp4SB->CreateChild (Dhcp4SBInstance->RealDhcp4SB, ChildHandle); } EFI_STATUS FakeDhcp4DestroyChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_DHCP4_SB_INSATNCE *Dhcp4SBInstance; Dhcp4SBInstance = (VOID *) This; Instance = Dhcp4SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Dhcp4SBInstance->RealDhcp4SB == NULL) { return EFI_NOT_READY; } return Dhcp4SBInstance->RealDhcp4SB->DestroyChild (Dhcp4SBInstance->RealDhcp4SB, ChildHandle); } // // For Dhcp6 ServiceBinding protocol // EFI_STATUS FakeDhcp6CreateChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_DHCP6_SB_INSATNCE *Dhcp6SBInstance; Dhcp6SBInstance = (VOID *) This; Instance = Dhcp6SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Dhcp6SBInstance->RealDhcp6SB == NULL) { return EFI_NOT_READY; } return Dhcp6SBInstance->RealDhcp6SB->CreateChild (Dhcp6SBInstance->RealDhcp6SB, ChildHandle); } EFI_STATUS FakeDhcp6DestroyChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_IP_DHCP6_SB_INSATNCE *Dhcp6SBInstance; Dhcp6SBInstance = (VOID *) This; Instance = Dhcp6SBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (Dhcp6SBInstance->RealDhcp6SB == NULL) { return EFI_NOT_READY; } return Dhcp6SBInstance->RealDhcp6SB->DestroyChild (Dhcp6SBInstance->RealDhcp6SB, ChildHandle); } // // For MNP ServiceBinding protocol // EFI_STATUS FakeMnpCreateChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN OUT EFI_HANDLE *ChildHandle ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_MNP_SB_INSATNCE *MnpSBInstance; MnpSBInstance = (VOID *) This; Instance = MnpSBInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } if (gDeviceConnecting) { return EFI_NOT_READY; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (MnpSBInstance->RealMnpSB == NULL) { return EFI_NOT_READY; } return MnpSBInstance->RealMnpSB->CreateChild (MnpSBInstance->RealMnpSB, ChildHandle); } EFI_STATUS FakeMnpDestroyChild ( IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle ) { // EFI_STATUS Status; // COMMON_INSTANCE *Instance; // FAKE_MNP_SB_INSATNCE *MnpSBInstance; // // MnpSBInstance = (VOID *) This; // Instance = MnpSBInstance->Instance; // if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { // return EFI_INVALID_PARAMETER; // } // // if (!gAllDeviceConnected) { // Status = ConnectDevice (); // if (EFI_ERROR (Status)) { // return Status; // } // gAllDeviceConnected = TRUE; // } // // return MnpSBInstance->RealMnpSB->DestroyChild (MnpSBInstance->RealMnpSB, ChildHandle); return EFI_SUCCESS; } EFI_STATUS EFIAPI Ip4DeviceExtractConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Request, OUT EFI_STRING *Progress, OUT EFI_STRING *Results ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Ip4DeviceRouteConfig ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_STRING Configuration, OUT EFI_STRING *Progress ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Ip4FormCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { return EFI_NOT_READY; } EFI_STATUS FakeHiiDatabaseNewList ( IN CONST EFI_HII_DATABASE_PROTOCOL *This, IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList, IN EFI_HANDLE DriverHandle, OPTIONAL OUT EFI_HII_HANDLE *Handle ) { UINTN Index; COMMON_INSTANCE *Instance; if (!CompareGuid (&(PackageList->PackageListGuid), &gDeviceManagerFormSetGuid)) { return gOldNewPackFunction (This, PackageList, DriverHandle, Handle); } for (Index = 0; Index < gDriverInstance->BindedCount; Index++) { Instance = (COMMON_INSTANCE *) gDriverInstance->BindedList[Index]; ConnectDevice (Instance); } return gOldNewPackFunction (This, PackageList, DriverHandle, Handle); } EFI_STATUS EFIAPI Dhcp4DummyGetModeData ( IN EFI_DHCP4_PROTOCOL *This, OUT EFI_DHCP4_MODE_DATA *Dhcp4ModeData ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyConfigure ( IN EFI_DHCP4_PROTOCOL *This, IN EFI_DHCP4_CONFIG_DATA *Dhcp4CfgData OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyStart ( IN EFI_DHCP4_PROTOCOL *This, IN EFI_EVENT CompletionEvent OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyRenewRebind ( IN EFI_DHCP4_PROTOCOL *This, IN BOOLEAN RebindRequest, IN EFI_EVENT CompletionEvent OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyRelease ( IN EFI_DHCP4_PROTOCOL *This ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyStop ( IN EFI_DHCP4_PROTOCOL *This ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyBuild ( IN EFI_DHCP4_PROTOCOL *This, IN EFI_DHCP4_PACKET *SeedPacket, IN UINT32 DeleteCount, IN UINT8 *DeleteList OPTIONAL, IN UINT32 AppendCount, IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL, OUT EFI_DHCP4_PACKET **NewPacket ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyTransmitReceive ( IN EFI_DHCP4_PROTOCOL *This, IN EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp4DummyParse ( IN EFI_DHCP4_PROTOCOL *This, IN EFI_DHCP4_PACKET *Packet, IN OUT UINT32 *OptionCount, OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL ) { return EFI_NOT_READY; } EFI_DHCP4_PROTOCOL gDhcp4Dummy = { Dhcp4DummyGetModeData, Dhcp4DummyConfigure, Dhcp4DummyStart, Dhcp4DummyRenewRebind, Dhcp4DummyRelease, Dhcp4DummyStop, Dhcp4DummyBuild, Dhcp4DummyTransmitReceive, Dhcp4DummyParse }; EFI_STATUS EFIAPI Dhcp6DummyGetModeData ( IN EFI_DHCP6_PROTOCOL *This, OUT EFI_DHCP6_MODE_DATA *Dhcp6ModeData OPTIONAL, OUT EFI_DHCP6_CONFIG_DATA *Dhcp6ConfigData OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyConfigure ( IN EFI_DHCP6_PROTOCOL *This, IN EFI_DHCP6_CONFIG_DATA *Dhcp6CfgData OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyStart ( IN EFI_DHCP6_PROTOCOL *This ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyInfoRequest ( IN EFI_DHCP6_PROTOCOL *This, IN BOOLEAN SendClientId, IN EFI_DHCP6_PACKET_OPTION *OptionRequest, IN UINT32 OptionCount, IN EFI_DHCP6_PACKET_OPTION *OptionList[] OPTIONAL, IN EFI_DHCP6_RETRANSMISSION *Retransmission, IN EFI_EVENT TimeoutEvent OPTIONAL, IN EFI_DHCP6_INFO_CALLBACK ReplyCallback, IN VOID *CallbackContext OPTIONAL ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyRenewRebind ( IN EFI_DHCP6_PROTOCOL *This, IN BOOLEAN RebindRequest ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyDecline ( IN EFI_DHCP6_PROTOCOL *This, IN UINT32 AddressCount, IN EFI_IPv6_ADDRESS *Addresses ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyRelease ( IN EFI_DHCP6_PROTOCOL *This, IN UINT32 AddressCount, IN EFI_IPv6_ADDRESS *Addresses ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyStop ( IN EFI_DHCP6_PROTOCOL *This ) { return EFI_NOT_READY; } EFI_STATUS EFIAPI Dhcp6DummyParse ( IN EFI_DHCP6_PROTOCOL *This, IN EFI_DHCP6_PACKET *Packet, IN OUT UINT32 *OptionCount, OUT EFI_DHCP6_PACKET_OPTION *PacketOptionList[] OPTIONAL ) { return EFI_NOT_READY; } EFI_DHCP6_PROTOCOL gDhcp6Dummy = { Dhcp6DummyGetModeData, Dhcp6DummyConfigure, Dhcp6DummyStart, Dhcp6DummyInfoRequest, Dhcp6DummyRenewRebind, Dhcp6DummyDecline, Dhcp6DummyRelease, Dhcp6DummyStop, Dhcp6DummyParse }; EFI_STATUS PxeDummyDxeVlanConfigSet ( IN EFI_VLAN_CONFIG_PROTOCOL *This, IN UINT16 VlanId, IN UINT8 Priority ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_VLAN_CONFIG_INSATNCE *VlanConfigInstance; VlanConfigInstance = (VOID *) This; Instance = VlanConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (VlanConfigInstance->RealVlanConfig == NULL) { return EFI_NOT_READY; } return VlanConfigInstance->RealVlanConfig->Set (VlanConfigInstance->RealVlanConfig, VlanId, Priority); } EFI_STATUS PxeDummyDxeVlanConfigFind ( IN EFI_VLAN_CONFIG_PROTOCOL *This, IN UINT16 *VlanId OPTIONAL, OUT UINT16 *NumberOfVlan, OUT EFI_VLAN_FIND_DATA **Entries ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_VLAN_CONFIG_INSATNCE *VlanConfigInstance; VlanConfigInstance = (VOID *) This; Instance = VlanConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (VlanConfigInstance->RealVlanConfig == NULL) { return EFI_NOT_READY; } return VlanConfigInstance->RealVlanConfig->Find (VlanConfigInstance->RealVlanConfig, VlanId, NumberOfVlan, Entries); } EFI_STATUS PxeDummyDxeVlanConfigRemove ( IN EFI_VLAN_CONFIG_PROTOCOL *This, IN UINT16 VlanId ) { EFI_STATUS Status; COMMON_INSTANCE *Instance; FAKE_VLAN_CONFIG_INSATNCE *VlanConfigInstance; VlanConfigInstance = (VOID *) This; Instance = VlanConfigInstance->Instance; if (Instance->Signature != DUMMY_PXE_INSTANCE_SIGNATURE) { return EFI_INVALID_PARAMETER; } Status = ConnectDevice (Instance); if (EFI_ERROR (Status)) { return Status; } if (VlanConfigInstance->RealVlanConfig == NULL) { return EFI_NOT_READY; } return VlanConfigInstance->RealVlanConfig->Remove (VlanConfigInstance->RealVlanConfig, VlanId); }