public UnloadForm(TreeView treeView)
{
InitializeComponent();
this.treeView = treeView;
// resize
Size minimumSize = ClientSize;
Rectangle screenRectangle = RectangleToScreen(ClientRectangle);
int titleBarHeight = screenRectangle.Top - Top;
int borderThickness = screenRectangle.Left - Left;
Rectangle workingArea = Screen.GetWorkingArea(this);
Size clientSize = new Size();
if (minimumSize.Width > workingArea.Width - 2 * borderThickness)
clientSize.Width = workingArea.Width - 2 * borderThickness;
else
clientSize.Width = minimumSize.Width;
if (minimumSize.Height > workingArea.Height - titleBarHeight - borderThickness)
clientSize.Height = workingArea.Height - titleBarHeight - borderThickness;
else
clientSize.Height = minimumSize.Height;
AutoScrollMinSize = new System.Drawing.Size(minimumSize.Width, minimumSize.Height);
ClientSize = new Size(clientSize.Width, clientSize.Height);
// load routes
IPAddress ipAddress = new IPAddress(0);
Config.SavedRouteNode unloadNode = Global.Config.SavedRoutes.GetSelectedNode(treeView);
unloadRoutes = Global.Config.SavedRoutes.GetRoutes(unloadNode);
activeRoutes = Iphlpapi.GetRoutes(Iphlpapi.FAMILY.AF_UNSPEC);
foreach (Config.SavedRouteItem item in unloadRoutes)
{
string interfaceIndex = "Not connected";
int ifIndex = 0;
string status = "Not loaded";
if (ValidateRoute(ref item.Destination, ref item.Prefix, ref item.Gateway, item.IPVersion))
{
if (Global.NetworkInterfaces.ContainsKey(item.InterfaceGuid) &&
(item.IPVersion == 4 && Global.NetworkInterfaces[item.InterfaceGuid].IPv4Enabled ||
item.IPVersion == 6 && Global.NetworkInterfaces[item.InterfaceGuid].IPv6Enabled))
{
interfaceIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index.ToString() +
" (" + Global.NetworkInterfaces[item.InterfaceGuid].Name + " - ";
ifIndex = Global.NetworkInterfaces[item.InterfaceGuid].Index;
if (item.IPVersion == 4)
{
unloadIPv4++;
if (Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address.Count > 0)
interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv4Address[0].Address;
else
interfaceIndex += "0.0.0.0";
}
else
{
unloadIPv6++;
if (Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All.Count > 0)
interfaceIndex += Global.NetworkInterfaces[item.InterfaceGuid].IPv6Address.All[0].Address;
else
interfaceIndex += "::";
}
interfaceIndex += ")";
}
else if (NetworkInterface.Loopback.Guid == item.InterfaceGuid &&
Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1 &&
(item.IPVersion == 4 && NetworkInterface.Loopback.IPv4Enabled ||
item.IPVersion == 6 && NetworkInterface.Loopback.IPv6Enabled))
{
interfaceIndex = "1 (" + NetworkInterface.Loopback.Name + " - ";
ifIndex = 1;
if (item.IPVersion == 4)
{
unloadIPv4++;
interfaceIndex += "127.0.0.1)";
}
else
{
unloadIPv6++;
interfaceIndex += "::1)";
}
}
else
{
if (item.IPVersion == 4)
{
unloadIPv4++;
}
else
{
unloadIPv6++;
}
}
if (activeRoutes.Find(i =>
i.IPVersion == item.IPVersion &&
IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
(i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) &&
IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway)) &&
i.InterfaceIndex == ifIndex) != null)
{
status = "Active";
}
else if (activeRoutes.Find(i =>
i.IPVersion == item.IPVersion &&
IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
(i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix)) &&
IPAddress.Parse(i.Gateway).Equals(IPAddress.Parse(item.Gateway))) != null)
{
status = "Active on a different interface";
if (item.IPVersion == 4)
NotActiveIPv4Routes++;
else
NotActiveIPv6Routes++;
}
else if (activeRoutes.Find(i =>
i.IPVersion == item.IPVersion &&
IPAddress.Parse(i.Destination).Equals(IPAddress.Parse(item.Destination)) &&
(i.IPVersion == 4 ? IPAddress.Parse(i.Prefix).Equals(IPAddress.Parse(item.Prefix)) : int.Parse(i.Prefix) == int.Parse(item.Prefix))
) != null)
{
status = "Active with a different gateway";
if (item.IPVersion == 4)
NotActiveIPv4Routes++;
else
NotActiveIPv6Routes++;
}
else
{
if (item.IPVersion == 4)
NotActiveIPv4Routes++;
else
NotActiveIPv6Routes++;
}
}
else
{
if (item.IPVersion == 4)
{
unloadIPv4++;
NotActiveIPv4Routes++;
}
else
{
unloadIPv6++;
NotActiveIPv6Routes++;
}
}
listView1.Items.Add(new ListViewItem(new string[] {
item.Destination,
item.Prefix,
item.Gateway,
interfaceIndex,
item.Metric.ToString(),
item.Name,
status
})).Checked = true;
}
foreach (ColumnHeader column in listView1.Columns)
column.Width = -2;
// load configs
defaultInterfaceMode.SelectedIndex = 0;
defaultIPv4GatewayMode.SelectedIndex = 3;
defaultIPv6GatewayMode.SelectedIndex = 3;
foreach (NetworkInterface nic in Global.NetworkInterfaces.Values)
if (nic.IPv4Enabled)
defaultIPv4Interface.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)
if (NetworkInterface.Loopback.IPv4Enabled)
defaultIPv4Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - 127.0.0.1)");
foreach (NetworkInterface nic in Global.NetworkInterfaces.Values)
if (nic.IPv6Enabled)
defaultIPv6Interface.Items.Add(nic.Index.ToString() + " (" + nic.Name + " - " +
(nic.IPv6Address.All.Count > 0 ? nic.IPv6Address.All.FirstOrDefault().Address : "0.0.0.0"));
if (Environment.OSVersion.Version.CompareTo(new Version("6.0")) > -1)
if (NetworkInterface.Loopback.IPv6Enabled)
defaultIPv6Interface.Items.Add("1 (" + NetworkInterface.Loopback.Name + " - ::1)");
}