private void button2_Click(object sender, EventArgs e) { if (!ValidateRoute()) return; if (savedRouteName.Text == "") { new BalloonTip("Warning", "Route name can not be empty", savedRouteName, BalloonTip.ICON.WARNING); return; } Config.SavedRouteItem route = new Config.SavedRouteItem(); route.Name = savedRouteName.Text; route.Destination = routeDestination.Text; route.Prefix = routePrefix.Text; route.Gateway = routeGateway.Text; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); if (ifIndex == 1) route.InterfaceGuid = NetworkInterface.Loopback.Guid; else route.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; route.Metric = ushort.Parse(routeMetric.Text); route.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView, route); if (result == 1) { new BalloonTip("Error", "Invalid destination", button2, BalloonTip.ICON.ERROR); return; } if (result == 2) { new BalloonTip("Warning", "Route name already used at current destination", savedRouteName, BalloonTip.ICON.WARNING); return; } Close(); }
private void button2_Click(object sender, EventArgs e) { if (!ValidateRoute()) { return; } if (savedRouteName.Text == "") { new BalloonTip("Warning", "Route name can not be empty", savedRouteName, BalloonTip.ICON.WARNING); return; } Config.SavedRouteItem route = new Config.SavedRouteItem(); route.Name = savedRouteName.Text; route.Destination = routeDestination.Text; route.Prefix = routePrefix.Text; route.Gateway = routeGateway.Text; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); if (ifIndex == 1) { route.InterfaceGuid = NetworkInterface.Loopback.Guid; } else { route.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; } route.Metric = ushort.Parse(routeMetric.Text); route.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView, route, true); if (result == 1) { new BalloonTip("Error", "Invalid destination", button2, BalloonTip.ICON.ERROR); return; } if (result == 2) { new BalloonTip("Warning", "Route name already used at current destination", savedRouteName, BalloonTip.ICON.WARNING); return; } Close(); if (savedRouteName.Text != route.Name) { //foreach (Config.SavedRouteNode node in parent.Nodes) // if (node.Name == savedRouteName.Text && node is Config.SavedRouteItem) // { // new Lib.Windows.BalloonTip("Warning", "Route name already used at current destination", savedRouteName, Lib.Windows.BalloonTip.ICON.WARNING); // return; // } } }
private void button1_Click(object sender, EventArgs e) { if (!ValidateConfigs()) { return; } IPAddress ipAddress = new IPAddress(0); for (int j = 0; j < unloadRoutes.Count; j++) { if (listView1.Items[j].Checked && ValidateRoute(ref unloadRoutes[j].Destination, ref unloadRoutes[j].Prefix, ref unloadRoutes[j].Gateway, unloadRoutes[j].IPVersion)) { Config.SavedRouteItem savedRoute = unloadRoutes[j]; int ifIndex = 0; if (Global.NetworkInterfaces.ContainsKey(savedRoute.InterfaceGuid)) { ifIndex = Global.NetworkInterfaces[savedRoute.InterfaceGuid].Index; } else if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.Guid == savedRoute.InterfaceGuid) { ifIndex = 1; } // load defaults if (defaultInterfaceMode.SelectedIndex == 0 && listView1.Items[j].SubItems[6].Text != "Active" || defaultInterfaceMode.SelectedIndex == 1) { if (unloadRoutes[j].IPVersion == 4) { ifIndex = int.Parse(Regex.Replace(defaultIPv4Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv4GatewayMode.SelectedIndex != 3) { unloadRoutes[j].Gateway = defaultIPv4Gateway.Text; } } else { ifIndex = int.Parse(Regex.Replace(defaultIPv6Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv6GatewayMode.SelectedIndex != 3) { unloadRoutes[j].Gateway = defaultIPv6Gateway.Text; } } } // unload route Iphlpapi.DeleteRoute(unloadRoutes[j].Destination, unloadRoutes[j].Prefix, unloadRoutes[j].Gateway, ifIndex.ToString()); } } Close(); }
private void button4_Click(object sender, EventArgs e) { if (!ValidateRoute()) { return; } Config.SavedRouteItem savedRoute = new Config.SavedRouteItem(); savedRoute.Name = savedRouteName.Text; savedRoute.Destination = routeDestination.Text; savedRoute.Prefix = routePrefix.Text; savedRoute.Gateway = routeGateway.Text; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); if (ifIndex == 1) { savedRoute.InterfaceGuid = NetworkInterface.Loopback.Guid; } else { savedRoute.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; } savedRoute.Metric = ushort.Parse(routeMetric.Text); savedRoute.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); if (result == 1) { new BalloonTip("Error", "Invalid destination", button4, BalloonTip.ICON.ERROR); return; } if (result == 2) { DialogResult dialogResult = MessageBox.Show("Route name already used at current destination.\nDo you want to overwrite?", "Overwrite confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (dialogResult == DialogResult.No) { return; } if (treeView1.SelectedNode.ImageIndex == (int)Config.SavedRouteNode.ImageIndex.Group) { treeView1.SelectedNode = treeView1.SelectedNode.Nodes.Find(savedRouteName.Text, false).First(); } else if (treeView1.SelectedNode.Name != savedRouteName.Text) { treeView1.SelectedNode = treeView1.SelectedNode.Parent.Nodes.Find(savedRouteName.Text, false).First(); } Global.Config.SavedRoutes.DeleteNode(treeView1); Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); } Close(); }
private void button4_Click(object sender, EventArgs e) { if (!ValidateRoute()) { return; } Config.SavedRouteItem savedRoute = new Config.SavedRouteItem(); savedRoute.Name = savedRouteName.Text; savedRoute.Destination = routeDestination.Text; savedRoute.Prefix = routePrefix.Text; savedRoute.Gateway = routeGateway.Text; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); if (ifIndex == 1) { savedRoute.InterfaceGuid = NetworkInterface.Loopback.Guid; } else { savedRoute.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; } savedRoute.Metric = ushort.Parse(routeMetric.Text); savedRoute.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); if (result == 1) { new BalloonTip("Error", "Invalid destination", button4, BalloonTip.ICON.ERROR); return; } if (result == 2) { new BalloonTip("Warning", "Route name already used at current destination", savedRouteName, BalloonTip.ICON.WARNING); return; } Close(); }
public EditRouteForm(int ipVersion, string destination, string prefix, string gateway, string interfaceIndex, string metric) { InitializeComponent(); this.ipVersion = ipVersion; this.destination = destination; this.prefix = prefix; this.gateway = gateway; this.interfaceIndex = interfaceIndex; // Check if route is saved route = new Config.SavedRouteItem(); route.IPVersion = ipVersion; route.Destination = destination; route.Prefix = prefix; route.Gateway = gateway; route.InterfaceGuid = Global.NetworkInterfaces.First(i => i.Value.Index == int.Parse(interfaceIndex)).Value.Guid; treeView = Global.Config.SavedRoutes.Find(route); if (treeView.SelectedNode != treeView.Nodes[0]) { route.Name = treeView.SelectedNode.Name; updateSavedRouteCheckBox.Checked = true; updateSavedRouteCheckBox.Enabled = true; } // Populate IPv4 or IPv6 if (ipVersion == 4) { Text = "Edit IPv4 Route"; groupBox1.Text = "IPv4 Route"; routeDestination.Text = "0.0.0.0"; routePrefix.Text = "255.255.255.255"; toolTip1.SetToolTip(routePrefix, "Subnet IP mask or prefix length"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv4Enabled) { routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0") + ")"); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv4Enabled) { routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)"); } } else { Text = "Edit IPv6 Route"; groupBox1.Text = "IPv6 Route"; routeDestination.Text = "::"; routePrefix.Text = "128"; toolTip1.SetToolTip(routePrefix, "Subnet prefix length, a value between 0 and 128 (inclusive)"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv6Enabled) { routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "::") + ")"); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv6Enabled) { routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)"); } } routeGatewayMode.SelectedIndex = 1; new TextBoxMask(routeMetric, TextBoxMask.Mask.Numeric); // load route routeDestination.Text = destination; routePrefix.Text = prefix; routeGatewayMode.SelectedIndex = 0; routeGateway.Text = gateway; for (int i = 0; i < routeInterface.Items.Count; i++) { if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + interfaceIndex + @" .*$")) { routeInterface.SelectedIndex = i; } } routeMetric.Text = metric; }
async void UpdateRoutes(CancellationTokenSource cts) { try { while (!cts.IsCancellationRequested) { listView1.BeginUpdate(); List <Iphlpapi.Route> routes = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC); List <Config.SavedRouteItem> savedRoutes = Global.Config.SavedRoutes.GetRoutes(Global.Config.SavedRoutes.Nodes[0]); Config.SavedRouteNode selectedNode = Global.Config.SavedRoutes.GetSelectedNode(treeView1); List <Config.SavedRouteItem> selectedRoutes = Global.Config.SavedRoutes.GetRoutes(selectedNode); // add/update items foreach (Iphlpapi.Route route in routes) { if (route.IPVersion == 4 && comboBox1.SelectedIndex == 1 || route.IPVersion == 6 && comboBox1.SelectedIndex == 0) { continue; } // skip disconnected interfaces if (Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).Count() == 0 && route.InterfaceIndex != 1) { continue; } // calculate route metric if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1) { if (route.InterfaceIndex != 1) { route.Metric += Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().InterfaceMetric; } else { route.Metric += NetworkInterface.Loopback.InterfaceMetric; } } bool found = false; string ifIndex; if (route.InterfaceIndex == 1) { ifIndex = route.InterfaceIndex.ToString() + " (" + NetworkInterface.Loopback.Name + ")"; } else { ifIndex = route.InterfaceIndex.ToString() + " (" + Global.NetworkInterfaces.Values.Where((i) => i.Index == route.InterfaceIndex).FirstOrDefault().Name + ")"; } // filter routes bool filter = false; if (checkBox1.Checked) { if (selectedRoutes.Find(i => i.Destination == route.Destination && i.Prefix == route.Prefix && i.Gateway == route.Gateway && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index == route.InterfaceIndex)) == null) { filter = true; } } // TODO: update routes with all matching saved routes using Find() // update existing items foreach (ListViewItem item in listView1.Items) { if (item.SubItems[0].Text == route.Destination && item.SubItems[1].Text == route.Prefix && item.SubItems[2].Text == route.Gateway && item.SubItems[3].Text == ifIndex) { item.SubItems[4].Text = route.Age.ToString(); item.SubItems[5].Text = route.Metric.ToString(); Config.SavedRouteItem savedRoute = savedRoutes.Find(i => i.Destination == route.Destination && i.Prefix == route.Prefix && i.Gateway == route.Gateway && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index == route.InterfaceIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index == route.InterfaceIndex)); if (savedRoute != null) { item.SubItems[6].Text = savedRoute.Name; } else { item.SubItems[6].Text = ""; } found = true; break; } } if (found || filter) { continue; } listView1.Items.Add(new ListViewItem(new string[] { route.Destination, route.Prefix, route.Gateway, ifIndex, route.Age.ToString(), route.Metric.ToString(), "" })); } // delete items foreach (ListViewItem item in listView1.Items) { string ifIndex = Regex.Replace(item.SubItems[3].Text, @"^(\d+) .*$", "$1"); // filter routes bool filter = false; if (checkBox1.Checked) { if (selectedRoutes.Find(i => i.Destination == item.SubItems[0].Text && i.Prefix == item.SubItems[1].Text && i.Gateway == item.SubItems[2].Text && (Global.NetworkInterfaces.ContainsKey(i.InterfaceGuid) && Global.NetworkInterfaces[i.InterfaceGuid].Index.ToString() == ifIndex || NetworkInterface.Loopback.Guid == i.InterfaceGuid && NetworkInterface.Loopback.Index.ToString() == ifIndex)) == null) { filter = true; } } if (routes.Find((i) => i.Destination == item.SubItems[0].Text && i.Prefix == item.SubItems[1].Text && i.Gateway == item.SubItems[2].Text && i.InterfaceIndex.ToString() == ifIndex) == null || item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 0 || !item.SubItems[0].Text.Contains(':') && comboBox1.SelectedIndex == 1 || filter) { item.Remove(); } } foreach (ColumnHeader column in listView1.Columns) { column.Width = -2; } listView1.EndUpdate(); await TaskEx.Delay(1000); } } catch { } }
public EditItemForm(TreeView treeView) { InitializeComponent(); this.treeView = treeView; route = (Config.SavedRouteItem)Global.Config.SavedRoutes.GetSelectedNode(treeView); IPAddress ipAddress = new IPAddress(0); IPAddress.TryParse(route.Destination, out ipAddress); if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { ipVersion = 4; groupBoxRoute.Text = "IPv4 Route"; routeDestination.Text = "0.0.0.0"; routePrefix.Text = "255.255.255.255"; toolTip1.SetToolTip(routePrefix, "Subnet IP mask or prefix length"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) if (nic.IPv4Enabled) routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0") + ")"); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv4Enabled) routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)"); } else { ipVersion = 6; groupBoxRoute.Text = "IPv6 Route"; routeDestination.Text = "::"; routePrefix.Text = "128"; toolTip1.SetToolTip(routePrefix, "Subnet prefix length, a value between 0 and 128 (inclusive)"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) if (nic.IPv6Enabled) routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "::") + ")"); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv6Enabled) routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)"); } routeGatewayMode.SelectedIndex = 1; new WinLib.Forms.TextBoxMask(routeMetric, WinLib.Forms.TextBoxMask.Mask.Numeric); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { routeMetric.Text = "1"; } else { toolTip1.SetToolTip(routeMetric, "Route metric offset. The actual route metric is the summation of interface metric"); routeMetric.Text = "0"; } // load route savedRouteName.Text = route.Name; routeDestination.Text = route.Destination; routePrefix.Text = route.Prefix; routeGatewayMode.SelectedIndex = 0; routeGateway.Text = route.Gateway; routeMetric.Text = route.Metric.ToString(); // select interface if (Global.NetworkInterfaces.ContainsKey(route.InterfaceGuid)) for (int i = 0; i < routeInterface.Items.Count; i++) if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + Global.NetworkInterfaces[route.InterfaceGuid].Index.ToString() + @" .*$")) routeInterface.SelectedIndex = i; if (NetworkInterface.Loopback.Guid == route.InterfaceGuid) for (int i = 0; i < routeInterface.Items.Count; i++) if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + NetworkInterface.Loopback.Index.ToString() + @" .*$")) routeInterface.SelectedIndex = i; }
private void button1_Click(object sender, EventArgs e) { if (!ValidateConfigs()) { return; } IPAddress ipAddress = new IPAddress(0); for (int j = 0; j < loadRoutes.Count; j++) { if (listView1.Items[j].Checked && ValidateRoute(ref loadRoutes[j].Destination, ref loadRoutes[j].Prefix, ref loadRoutes[j].Gateway, loadRoutes[j].IPVersion)) { Config.SavedRouteItem savedRoute = loadRoutes[j]; NetworkInterface nic = null; string gateway = savedRoute.Gateway; if (Global.NetworkInterfaces.ContainsKey(savedRoute.InterfaceGuid)) { nic = Global.NetworkInterfaces[savedRoute.InterfaceGuid]; } else if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.Guid == savedRoute.InterfaceGuid) { nic = NetworkInterface.Loopback; } // load defaults if (defaultInterfaceMode.SelectedIndex == 0 && nic == null || defaultInterfaceMode.SelectedIndex == 1) { int ifIndex = 0; if (loadRoutes[j].IPVersion == 4) { ifIndex = int.Parse(Regex.Replace(defaultIPv4Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv4GatewayMode.SelectedIndex != 3) { gateway = defaultIPv4Gateway.Text; } } else { ifIndex = int.Parse(Regex.Replace(defaultIPv6Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv6GatewayMode.SelectedIndex != 3) { gateway = defaultIPv6Gateway.Text; } } nic = Global.NetworkInterfaces.FirstOrDefault(i => i.Value.Index == ifIndex).Value; if (nic == null && Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.Index == ifIndex) { nic = NetworkInterface.Loopback; } if (updateSavedRoutesCheckBox.Checked == true) { loadRoutes[j].InterfaceGuid = nic.Guid; loadRoutes[j].Gateway = gateway; Global.Config.Save(); } } savedRoute.Load(nic, gateway); } else { MessageBox.Show("Could not load route:\nDestination: " + loadRoutes[j].Destination + "\nPrefix: " + loadRoutes[j].Prefix + "\nGateway: " + loadRoutes[j].Gateway + "\nIP version: " + loadRoutes[j].IPVersion, "Invalid route", MessageBoxButtons.OK, MessageBoxIcon.Error); } } Close(); }
private void button1_Click(object sender, EventArgs e) { if (!ValidateRoute()) { return; } Iphlpapi.MIB_IPFORWARD_TYPE type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_INDIRECT; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); // if on-link set type to direct for XP if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { NetworkInterface nic; if (ifIndex == 1) { nic = NetworkInterface.Loopback; } else { nic = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).First(); } if (ipVersion == 4) { if (nic.IPv4Address.Where((i) => i.Address == routeGateway.Text).Count() > 0) { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } //if (nic.Index == 1 && IP.CheckIfSameNetwork("127.0.0.1", routeGateway.Text, "255.0.0.0")) // type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } else { if (nic.IPv6Address.All.Where((i) => i.Address == routeGateway.Text).Count() > 0) { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } //if (nic.Index == 1 && IP.CheckIfSameNetwork("::1", routeGateway.Text, "128")) // type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } if (routeGateway.Text == "0.0.0.0" || routeGateway.Text == "::") { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } } Iphlpapi.AddRoute(routeDestination.Text, routePrefix.Text, routeGateway.Text, ifIndex.ToString(), routeMetric.Text, type); // save route if (checkBox1.Checked) { Config.SavedRouteItem savedRoute = new Config.SavedRouteItem(); savedRoute.Name = savedRouteName.Text; savedRoute.Destination = routeDestination.Text; savedRoute.Prefix = routePrefix.Text; savedRoute.Gateway = routeGateway.Text; if (ifIndex == 1) { savedRoute.InterfaceGuid = NetworkInterface.Loopback.Guid; } else { savedRoute.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; } savedRoute.Metric = ushort.Parse(routeMetric.Text); savedRoute.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); if (result == 1) { new BalloonTip("Error", "Invalid destination", button1, BalloonTip.ICON.ERROR); return; } if (result == 2) { DialogResult dialogResult = MessageBox.Show("Route name already used at current destination.\nDo you want to overwrite?", "Overwrite confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (dialogResult == DialogResult.No) { return; } if (treeView1.SelectedNode.ImageIndex == (int)Config.SavedRouteNode.ImageIndex.Group) { treeView1.SelectedNode = treeView1.SelectedNode.Nodes.Find(savedRouteName.Text, false).First(); } else if (treeView1.SelectedNode.Name != savedRouteName.Text) { treeView1.SelectedNode = treeView1.SelectedNode.Parent.Nodes.Find(savedRouteName.Text, false).First(); } Global.Config.SavedRoutes.DeleteNode(treeView1); Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); } } Close(); }
public EditItemForm(TreeView treeView) { InitializeComponent(); this.treeView = treeView; route = (Config.SavedRouteItem)Global.Config.SavedRoutes.GetSelectedNode(treeView); IPAddress ipAddress = new IPAddress(0); IPAddress.TryParse(route.Destination, out ipAddress); if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { ipVersion = 4; groupBoxRoute.Text = "IPv4 Route"; routeDestination.Text = "0.0.0.0"; routePrefix.Text = "255.255.255.255"; toolTip1.SetToolTip(routePrefix, "Subnet IP mask or prefix length"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv4Enabled) { routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0") + ")"); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv4Enabled) { routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)"); } } else { ipVersion = 6; groupBoxRoute.Text = "IPv6 Route"; routeDestination.Text = "::"; routePrefix.Text = "128"; toolTip1.SetToolTip(routePrefix, "Subnet prefix length, a value between 0 and 128 (inclusive)"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) { if (nic.IPv6Enabled) { routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "::") + ")"); } } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv6Enabled) { routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)"); } } routeGatewayMode.SelectedIndex = 1; new WinLib.Forms.TextBoxMask(routeMetric, WinLib.Forms.TextBoxMask.Mask.Numeric); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { routeMetric.Text = "1"; } else { toolTip1.SetToolTip(routeMetric, "Route metric offset. The actual route metric is the summation of interface metric"); routeMetric.Text = "0"; } // load route savedRouteName.Text = route.Name; routeDestination.Text = route.Destination; routePrefix.Text = route.Prefix; routeGatewayMode.SelectedIndex = 0; routeGateway.Text = route.Gateway; routeMetric.Text = route.Metric.ToString(); // select interface if (Global.NetworkInterfaces.ContainsKey(route.InterfaceGuid)) { for (int i = 0; i < routeInterface.Items.Count; i++) { if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + Global.NetworkInterfaces[route.InterfaceGuid].Index.ToString() + @" .*$")) { routeInterface.SelectedIndex = i; } } } if (NetworkInterface.Loopback.Guid == route.InterfaceGuid) { for (int i = 0; i < routeInterface.Items.Count; i++) { if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + NetworkInterface.Loopback.Index.ToString() + @" .*$")) { routeInterface.SelectedIndex = i; } } } }
private void button1_Click(object sender, EventArgs e) { if (!ValidateConfigs()) { return; } IPAddress ipAddress = new IPAddress(0); for (int j = 0; j < loadRoutes.Count; j++) { if (listView1.Items[j].Checked && ValidateRoute(ref loadRoutes[j].Destination, ref loadRoutes[j].Prefix, ref loadRoutes[j].Gateway, loadRoutes[j].IPVersion)) { Config.SavedRouteItem savedRoute = loadRoutes[j]; int ifIndex = 0; if (Global.NetworkInterfaces.ContainsKey(savedRoute.InterfaceGuid)) { ifIndex = Global.NetworkInterfaces[savedRoute.InterfaceGuid].Index; } else if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.Guid == savedRoute.InterfaceGuid) { ifIndex = 1; } // load defaults if (defaultInterfaceMode.SelectedIndex == 0 && ifIndex == 0 || defaultInterfaceMode.SelectedIndex == 1) { if (loadRoutes[j].IPVersion == 4) { ifIndex = int.Parse(Regex.Replace(defaultIPv4Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv4GatewayMode.SelectedIndex != 3) { loadRoutes[j].Gateway = defaultIPv4Gateway.Text; } } else { ifIndex = int.Parse(Regex.Replace(defaultIPv6Interface.Text, @"^(\d+) .*$", "$1")); if (defaultIPv6GatewayMode.SelectedIndex != 3) { loadRoutes[j].Gateway = defaultIPv6Gateway.Text; } } } // if on-link set type to direct for XP Iphlpapi.MIB_IPFORWARD_TYPE type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_INDIRECT; NetworkInterface nic; if (ifIndex == 1) { nic = NetworkInterface.Loopback; } else { nic = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).First(); } if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { if (savedRoute.IPVersion == 4) { if (nic.IPv4Address.Where((i) => i.Address == savedRoute.Gateway).Count() > 0) { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } } else { if (nic.IPv6Address.All.Where((i) => i.Address == savedRoute.Gateway).Count() > 0) { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } } if (savedRoute.Gateway == "0.0.0.0" || savedRoute.Gateway == "::") { type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } } // correction for Vista->XP transitioned saved route if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { if (IPAddress.TryParse(savedRoute.Gateway, out ipAddress)) { if (IPAddress.Parse(savedRoute.Gateway).GetAddressBytes().Max() == 0) { if (savedRoute.IPVersion == 4) { savedRoute.Gateway = nic.IPv4Address.First().Address; } else { savedRoute.Gateway = nic.IPv6Address.All.First().Address; } } } if (savedRoute.Metric == 0) { savedRoute.Metric = 1; } } Iphlpapi.DeleteRoute(savedRoute.Destination, savedRoute.Prefix, savedRoute.Gateway, ifIndex.ToString()); Iphlpapi.AddRoute(savedRoute.Destination, savedRoute.Prefix, savedRoute.Gateway, ifIndex.ToString(), savedRoute.Metric.ToString(), type); if (updateSavedRoutesCheckBox.Checked == true) { // TODO: update saved route with new interface + gw } } else { MessageBox.Show("Could not load route:\nDestination: " + loadRoutes[j].Destination + "\nPrefix: " + loadRoutes[j].Prefix + "\nGateway: " + loadRoutes[j].Gateway + "\nIP version: " + loadRoutes[j].IPVersion, "Invalid route", MessageBoxButtons.OK, MessageBoxIcon.Error); } } Close(); }
private void button4_Click(object sender, EventArgs e) { if (!ValidateRoute()) return; Config.SavedRouteItem savedRoute = new Config.SavedRouteItem(); savedRoute.Name = savedRouteName.Text; savedRoute.Destination = routeDestination.Text; savedRoute.Prefix = routePrefix.Text; savedRoute.Gateway = routeGateway.Text; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); if (ifIndex == 1) savedRoute.InterfaceGuid = NetworkInterface.Loopback.Guid; else savedRoute.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; savedRoute.Metric = ushort.Parse(routeMetric.Text); savedRoute.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); if (result == 1) { new BalloonTip("Error", "Invalid destination", button4, BalloonTip.ICON.ERROR); return; } if (result == 2) { DialogResult dialogResult = MessageBox.Show("Route name already used at current destination.\nDo you want to overwrite?", "Overwrite confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (dialogResult == DialogResult.No) return; if (treeView1.SelectedNode.ImageIndex == (int)Config.SavedRouteNode.ImageIndex.Group) treeView1.SelectedNode = treeView1.SelectedNode.Nodes.Find(savedRouteName.Text, false).First(); else if (treeView1.SelectedNode.Name != savedRouteName.Text) treeView1.SelectedNode = treeView1.SelectedNode.Parent.Nodes.Find(savedRouteName.Text, false).First(); Global.Config.SavedRoutes.DeleteNode(treeView1); Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); } Close(); }
private void button1_Click(object sender, EventArgs e) { if (!ValidateRoute()) return; Iphlpapi.MIB_IPFORWARD_TYPE type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_INDIRECT; int ifIndex = int.Parse(Regex.Replace(routeInterface.Text, @"^(\d+) .*$", "$1")); // if on-link set type to direct for XP if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) < 0) { NetworkInterface nic; if (ifIndex == 1) nic = NetworkInterface.Loopback; else nic = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).First(); if (ipVersion == 4) { if (nic.IPv4Address.Where((i) => i.Address == routeGateway.Text).Count() > 0) type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; //if (nic.Index == 1 && IP.CheckIfSameNetwork("127.0.0.1", routeGateway.Text, "255.0.0.0")) // type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } else { if (nic.IPv6Address.All.Where((i) => i.Address == routeGateway.Text).Count() > 0) type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; //if (nic.Index == 1 && IP.CheckIfSameNetwork("::1", routeGateway.Text, "128")) // type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } if (routeGateway.Text == "0.0.0.0" || routeGateway.Text == "::") type = Iphlpapi.MIB_IPFORWARD_TYPE.MIB_IPROUTE_TYPE_DIRECT; } Iphlpapi.AddRoute(routeDestination.Text, routePrefix.Text, routeGateway.Text, ifIndex.ToString(), routeMetric.Text, type); // save route if (checkBox1.Checked) { Config.SavedRouteItem savedRoute = new Config.SavedRouteItem(); savedRoute.Name = savedRouteName.Text; savedRoute.Destination = routeDestination.Text; savedRoute.Prefix = routePrefix.Text; savedRoute.Gateway = routeGateway.Text; if (ifIndex == 1) savedRoute.InterfaceGuid = NetworkInterface.Loopback.Guid; else savedRoute.InterfaceGuid = Global.NetworkInterfaces.Values.Where((i) => i.Index == ifIndex).FirstOrDefault().Guid; savedRoute.Metric = ushort.Parse(routeMetric.Text); savedRoute.IPVersion = ipVersion; int result = Global.Config.SavedRoutes.AddNode(treeView1, savedRoute); if (result == 1) { new BalloonTip("Error", "Invalid destination", button1, BalloonTip.ICON.ERROR); return; } if (result == 2) { new BalloonTip("Warning", "Route name already used at current destination", savedRouteName, BalloonTip.ICON.WARNING); return; } } Close(); }
public EditRouteForm(int ipVersion, string destination, string prefix, string gateway, string interfaceIndex, string metric) { InitializeComponent(); this.ipVersion = ipVersion; this.destination = destination; this.prefix = prefix; this.gateway = gateway; this.interfaceIndex = interfaceIndex; // Check if route is saved route = new Config.SavedRouteItem(); route.IPVersion = ipVersion; route.Destination = destination; route.Prefix = prefix; route.Gateway = gateway; route.InterfaceGuid = Global.NetworkInterfaces.First(i => i.Value.Index == int.Parse(interfaceIndex)).Value.Guid; treeView = Global.Config.SavedRoutes.Find(route); if (treeView.SelectedNode != treeView.Nodes[0]) { updateSavedRouteCheckBox.Checked = true; updateSavedRouteCheckBox.Enabled = true; } // Populate IPv4 or IPv6 if (ipVersion == 4) { Text = "Edit IPv4 Route"; groupBox1.Text = "IPv4 Route"; routeDestination.Text = "0.0.0.0"; routePrefix.Text = "255.255.255.255"; toolTip1.SetToolTip(routePrefix, "Subnet IP mask or prefix length"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) if (nic.IPv4Enabled) routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv4Address.Count > 0 ? nic.IPv4Address.FirstOrDefault().Address : "0.0.0.0") + ")"); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv4Enabled) routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)"); } else { Text = "Edit IPv6 Route"; groupBox1.Text = "IPv6 Route"; routeDestination.Text = "::"; routePrefix.Text = "128"; toolTip1.SetToolTip(routePrefix, "Subnet prefix length, a value between 0 and 128 (inclusive)"); foreach (NetworkInterface nic in Global.NetworkInterfaces.Values) if (nic.IPv6Enabled) routeInterface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " + (nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "::") + ")"); if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 && NetworkInterface.Loopback.IPv6Enabled) routeInterface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)"); } routeGatewayMode.SelectedIndex = 1; new TextBoxMask(routeMetric, TextBoxMask.Mask.Numeric); // load route routeDestination.Text = destination; routePrefix.Text = prefix; routeGatewayMode.SelectedIndex = 0; routeGateway.Text = gateway; for (int i = 0; i < routeInterface.Items.Count; i++) if (Regex.IsMatch(routeInterface.Items[i].ToString(), @"^" + interfaceIndex + @" .*$")) routeInterface.SelectedIndex = i; routeMetric.Text = metric; }