diff --git a/PXEBoot/PXEBoot.csproj b/PXEBoot/PXEBoot.csproj index 1dddac1..4c7edc9 100644 --- a/PXEBoot/PXEBoot.csproj +++ b/PXEBoot/PXEBoot.csproj @@ -75,6 +75,7 @@ + diff --git a/PXEBoot/Program.cs b/PXEBoot/Program.cs index 363fdfb..3630366 100644 --- a/PXEBoot/Program.cs +++ b/PXEBoot/Program.cs @@ -153,6 +153,9 @@ static int CreateDirStruct() public static int SMain() { +#if DEBUG + Test.DisplayIPv4NetworkInterfaces(); +#endif try { Settings.Load(); @@ -225,8 +228,27 @@ static void recv69(IAsyncResult res) } finally { - if (RunService == true) - u.BeginReceive(new AsyncCallback(recv69), u); + try + { + if (RunService == true) + u.BeginReceive(new AsyncCallback(recv69), u); + } + catch + { + //reset port! + try + { + u.Close(); + } + catch + { + + } + UDP69 = new UdpClient(new IPEndPoint(IPAddress.Any, 69)); + UDP69.EnableBroadcast = true; + UDP69.BeginReceive(new AsyncCallback(recv69), UDP69); + UDP69.DontFragment = true; + } } } @@ -292,42 +314,46 @@ static void recv4011(IAsyncResult res) if (dhcppacket.DHCP60ClassIdentifier.StartsWith("PXEClient") == false) return; detectedarch = DetectArch(dhcppacket.DHCP60ClassIdentifier); - if (detectedarch == DHCPArchitecture.Undefined) - return; - - Session.RegisterSession(ip.Address, detectedarch); - - DHCPPacket send = new DHCPPacket(); - send.MacAddress = dhcppacket.MacAddress; - send.XID = dhcppacket.XID; - send.DHCP53MessageType = DHCPMessageType.DHCPACK; - send.WantedDHCP9ParameterList = DHCPPacket.DHCP9ParameterListBootFiles; - send.SupportedDHCP9ParameterList = dhcppacket.DHCP9ReqParameterList; - send.DHCP60ClassIdentifier = "PXEClient"; - send.DHCP66BootServer = GetCurrentIP().ToString(); + //if (detectedarch == DHCPArchitecture.Undefined) + // return; string MACAddr = dhcppacket.GetMacAddress(); string BootFile = "bootmgfw.efi"; + string BootPath = null; do { - RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Fox\\PXEBoot\\MAC\\" + MACAddr); - if (key != null) + using (RegistryKey key = Registry.LocalMachine.OpenSubKey("Software\\Fox\\PXEBoot\\MAC\\" + MACAddr)) { - object o = key.GetValue("BootFile"); - if (o != null) + if (key != null) { - BootFile = Convert.ToString(o); - key.Close(); + object o = key.GetValue("BootFile"); + if (o != null) + BootFile = Convert.ToString(o); + + o = key.GetValue("Path"); + if (o != null) + { + BootPath = Convert.ToString(o); + } break; } - key.Close(); } if (MACAddr.Length <= 2) break; MACAddr = MACAddr.Substring(0, MACAddr.Length - 2); } while (MACAddr.Length > 0); + Session.RegisterSession(ip.Address, detectedarch, BootPath); + + DHCPPacket send = new DHCPPacket(); + send.MacAddress = dhcppacket.MacAddress; + send.XID = dhcppacket.XID; + send.DHCP53MessageType = DHCPMessageType.DHCPACK; + send.WantedDHCP9ParameterList = DHCPPacket.DHCP9ParameterListBootFiles; + send.SupportedDHCP9ParameterList = dhcppacket.DHCP9ReqParameterList; + send.DHCP60ClassIdentifier = "PXEClient"; + send.DHCP66BootServer = GetCurrentIP().ToString(); send.DHCP67BootFilename = BootFile; //send.BootFile = "bootmgfw.efi"; diff --git a/PXEBoot/Sessions.cs b/PXEBoot/Sessions.cs index 6b1a6e9..e337a3c 100644 --- a/PXEBoot/Sessions.cs +++ b/PXEBoot/Sessions.cs @@ -97,7 +97,7 @@ public void StopSessions() } } - public bool RegisterSession(IPAddress Client, DHCPArchitecture Architecture) + public bool RegisterSession(IPAddress Client, DHCPArchitecture Architecture, string PathOverride) { if (Client == IPAddress.Any) return (false); @@ -116,28 +116,44 @@ public bool RegisterSession(IPAddress Client, DHCPArchitecture Architecture) ses.Architecture = Architecture; ses.IP = Client; ses.TFTPRootPath = Settings.TFTPRootPath; - switch (Architecture) + + if (string.IsNullOrWhiteSpace(PathOverride) == false) { - case DHCPArchitecture.ARC_x86: - ses.TFTPRootPath += "ARC x86\\"; break; - case DHCPArchitecture.DEC_ALPHA: - ses.TFTPRootPath += "DEC Alpha\\"; break; - case DHCPArchitecture.EFI_ByteCode: - ses.TFTPRootPath += "EFI BC\\"; break; - case DHCPArchitecture.EFI_EM64T: - ses.TFTPRootPath += "EFI X64\\"; break; - case DHCPArchitecture.EFI_IA32: - ses.TFTPRootPath += "EFI X86\\"; break; - case DHCPArchitecture.EFI_ITANIUM: - ses.TFTPRootPath += "EFI ITANIUM\\"; break; - case DHCPArchitecture.EFI_XScale: - ses.TFTPRootPath += "EFI XScale\\"; break; - case DHCPArchitecture.IA32Legacy: - ses.TFTPRootPath += "BIOS\\"; break; - case DHCPArchitecture.NEC_PC98: - ses.TFTPRootPath += "NEC PC98\\"; break; - default: - ses.TFTPRootPath += "Unknown\\"; break; + ses.TFTPRootPath += PathOverride; + if (ses.TFTPRootPath.EndsWith("\\") == false) + ses.TFTPRootPath += "\\"; + if (Directory.Exists(ses.TFTPRootPath) == false) + { + PathOverride = ""; + ses.TFTPRootPath = Settings.TFTPRootPath; + } + } + + if (string.IsNullOrWhiteSpace(PathOverride) == true) + { + switch (Architecture) + { + case DHCPArchitecture.ARC_x86: + ses.TFTPRootPath += "ARC x86\\"; break; + case DHCPArchitecture.DEC_ALPHA: + ses.TFTPRootPath += "DEC Alpha\\"; break; + case DHCPArchitecture.EFI_ByteCode: + ses.TFTPRootPath += "EFI BC\\"; break; + case DHCPArchitecture.EFI_EM64T: + ses.TFTPRootPath += "EFI X64\\"; break; + case DHCPArchitecture.EFI_IA32: + ses.TFTPRootPath += "EFI X86\\"; break; + case DHCPArchitecture.EFI_ITANIUM: + ses.TFTPRootPath += "EFI ITANIUM\\"; break; + case DHCPArchitecture.EFI_XScale: + ses.TFTPRootPath += "EFI XScale\\"; break; + case DHCPArchitecture.IA32Legacy: + ses.TFTPRootPath += "BIOS\\"; break; + case DHCPArchitecture.NEC_PC98: + ses.TFTPRootPath += "NEC PC98\\"; break; + default: + ses.TFTPRootPath += "Unknown\\"; break; + } } lock (RunningSessions) diff --git a/PXEBoot/Test.cs b/PXEBoot/Test.cs new file mode 100644 index 0000000..08d0f88 --- /dev/null +++ b/PXEBoot/Test.cs @@ -0,0 +1,111 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.NetworkInformation; +using System.Text; +using System.Threading.Tasks; + +namespace PXEBoot +{ +#if DEBUG + class Test + { + static byte[] DHCPdata = { + 0x01, 0x01, 0x06, 0x00, 0x2B, 0x9C, 0x4E, 0xCD, 0x00, 0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x29, 0x9C, + 0x4E, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82, 0x53, 0x63, + 0x35, 0x01, 0x01, 0x37, 0x18, 0x01, 0x02, 0x03, 0x05, 0x06, 0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, + 0x12, 0x2B, 0x36, 0x3C, 0x43, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x39, 0x02, 0x04, + 0xEC, 0x61, 0x11, 0x00, 0x56, 0x4D, 0x50, 0x81, 0x74, 0x47, 0xF0, 0x6A, 0x98, 0xFD, 0xA3, 0xA3, + 0xED, 0x9C, 0x4E, 0xCD, 0x5D, 0x02, 0x00, 0x00, 0x5E, 0x03, 0x01, 0x02, 0x01, 0x3C, 0x20, 0x50, + 0x58, 0x45, 0x43, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x3A, 0x41, 0x72, 0x63, 0x68, 0x3A, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x3A, 0x55, 0x4E, 0x44, 0x49, 0x3A, 0x30, 0x30, 0x32, 0x30, 0x30, 0x31, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + + static byte[] TFTPReqData = { + 0x00, 0x01, 0x62, 0x6F, 0x6F, 0x74, 0x6D, 0x67, 0x66, 0x77, 0x2E, 0x65, 0x66, 0x69, 0x00, 0x6F, + 0x63, 0x74, 0x65, 0x74, 0x00, 0x74, 0x73, 0x69, 0x7A, 0x65, 0x00, 0x30, 0x00, 0x62, 0x6C, 0x6B, + 0x73, 0x69, 0x7A, 0x65, 0x00, 0x31, 0x34, 0x36, 0x38, 0x00}; + + static byte[] TFTPErrorData ={ + 0x00,0x05,0x00,0x08,0x55,0x73,0x65,0x72,0x20,0x61,0x62,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x68, + 0x65,0x20,0x74,0x72,0x61,0x6e,0x73,0x66,0x65,0x72,0x00}; + + + + public static void Run() + { + DHCPPacket dh = new DHCPPacket(DHCPdata); + TFTPPacketReadReq pp = new TFTPPacketReadReq(TFTPReqData); + TFTPPacketError err = new TFTPPacketError(TFTPErrorData); + } + + public static void DisplayIPv4NetworkInterfaces() + { + NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); + IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); + Console.WriteLine("IPv4 interface information for {0}.{1}", properties.HostName, properties.DomainName); + Console.WriteLine(); + + foreach (NetworkInterface adapter in nics) + { + // Only display informatin for interfaces that support IPv4. + if (adapter.Supports(NetworkInterfaceComponent.IPv4) == false) + { + continue; + } + Console.WriteLine(adapter.Description); + // Underline the description. + Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '=')); + IPInterfaceProperties adapterProperties = adapter.GetIPProperties(); + // Try to get the IPv4 interface properties. + IPv4InterfaceProperties p = adapterProperties.GetIPv4Properties(); + + if (p == null) + { + Console.WriteLine("No IPv4 information is available for this interface."); + Console.WriteLine(); + continue; + } + // Display the IPv4 specific data. + Console.WriteLine(" Index ............................. : {0}", p.Index); + Console.WriteLine(" MTU ............................... : {0}", p.Mtu); + Console.WriteLine(" APIPA active....................... : {0}", + p.IsAutomaticPrivateAddressingActive); + Console.WriteLine(" APIPA enabled...................... : {0}", + p.IsAutomaticPrivateAddressingEnabled); + Console.WriteLine(" Forwarding enabled................. : {0}", + p.IsForwardingEnabled); + Console.WriteLine(" Uses WINS ......................... : {0}", + p.UsesWins); + Console.WriteLine(); + } + } + } +#endif +}