Files
Disco/Disco.ClientBootstrapper/Interop/NetworkAdapter.cs
T
2013-02-01 12:35:28 +11:00

165 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Runtime.InteropServices;
namespace Disco.ClientBootstrapper.Interop
{
class NetworkAdapter
{
public uint Index { get; set; }
public string WmiPath { get; set; }
public Guid Guid { get; set; }
public string Name { get; set; }
public string NetConnectionID { get; set; }
public string MACAddress { get; set; }
public UInt64 Speed { get; set; }
public UInt16 LastConnectionStatus { get; set; }
public bool IsWireless { get; set; }
public string WirelessInterfaceDescription { get; set; }
public int LastWirelessConnectionStatus { get; set; }
public NetworkAdapter(ManagementObject wmiObject)
{
UpdateFromWmi(wmiObject);
}
private void UpdateFromWmi(ManagementObject wmiObject)
{
this.WmiPath = (string)wmiObject.GetPropertyValue("__PATH");
this.Index = (UInt32)wmiObject.GetPropertyValue("Index");
this.Guid = Guid.Parse((string)wmiObject.GetPropertyValue("GUID"));
this.MACAddress = (string)wmiObject.GetPropertyValue("MACAddress");
this.Name = (string)wmiObject.GetPropertyValue("Name");
this.NetConnectionID = (string)wmiObject.GetPropertyValue("NetConnectionID");
this.Speed = (UInt64)wmiObject.GetPropertyValue("Speed");
var connectionStatus = ConnectionStatus;
this.IsWireless = true;
try
{
var wirelessConnectionStatus = WirelessConnectionStatus;
}
catch (Exception) {
this.IsWireless = false;
};
}
public int WirelessConnectionStatus
{
get {
if (this.IsWireless)
{
IntPtr handle = IntPtr.Zero;
uint negotiatedVersion;
try
{
if (NetworkInterop.WlanOpenHandle(1, IntPtr.Zero, out negotiatedVersion, ref handle) != 0)
throw new NotSupportedException("This network adapter does not support Wireless");
IntPtr ptr = new IntPtr();
uint dataSize;
var interfaceGuid = this.Guid;
if (NetworkInterop.WlanQueryInterface(handle, ref interfaceGuid, NetworkInterop.WLAN_INTF_OPCODE.wlan_intf_opcode_interface_state, IntPtr.Zero, out dataSize, ref ptr, IntPtr.Zero) != 0)
throw new NotSupportedException("This network adapter does not support Wireless");
this.LastWirelessConnectionStatus = Marshal.ReadInt32(ptr);
NetworkInterop.WlanFreeMemory(ptr);
return this.LastWirelessConnectionStatus;
}
finally
{
if (handle != IntPtr.Zero)
NetworkInterop.WlanCloseHandle(handle, IntPtr.Zero);
}
}
else
{
throw new NotSupportedException("This network adapter does not support Wireless");
}
}
}
public string WirelessConnectionStatusMeaning(int status)
{
switch ((NetworkInterop.WLAN_INTERFACE_STATE)status)
{
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_ad_hoc_network_formed:
return "Ad Hoc Network Formed";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_associating:
return "Associating";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_authenticating:
return "Authenticating";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_connected:
return "Connected";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_disconnected:
return "Disconnected";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_disconnecting:
return "Disconnecting";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_discovering:
return "Discovering";
case NetworkInterop.WLAN_INTERFACE_STATE.wlan_interface_state_not_ready:
return "Not Ready";
default:
return "Unknown";
}
}
public UInt16 ConnectionStatus
{
get
{
using (var wmiObject = new ManagementObject(this.WmiPath))
{
this.LastConnectionStatus = (UInt16)wmiObject.GetPropertyValue("NetConnectionStatus");
}
return this.LastConnectionStatus;
}
}
public string ConnectionStatusMeaning(UInt16 status)
{
switch (status)
{
case (UInt16)0:
return "Disconnected";
case (UInt16)1:
return "Connecting";
case (UInt16)2:
return "Connected";
case (UInt16)3:
return "Disconnecting";
case (UInt16)4:
return "Hardware not present";
case (UInt16)5:
return "Hardware disabled";
case (UInt16)6:
return "Hardware malfunction";
case (UInt16)7:
return "Media disconnected";
case (UInt16)8:
return "Authenticating";
case (UInt16)9:
return "Authentication succeeded";
case (UInt16)10:
return "Authentication failed";
case (UInt16)11:
return "Invalid address";
case (UInt16)12:
return "Credentials required";
default:
return "Unknown";
}
}
}
}