Exemplo n.º 1
1
        /// <summary>
        ///     Gets all the available wireless interfaces on the current machine
        /// </summary>
        /// <returns>List of <see cref="WirelessInterface" /></returns>
        public List<WirelessInterface> GetAvailableWirelessInterfaces()
        {
            IntPtr handle;

            uint result = NativeWireless.WlanEnumInterfaces(this.GetHandle(), IntPtr.Zero, out handle);

            result.ThrowIfNotSuccess();

            var wlanInterfaceInfoList = new WLAN_INTERFACE_INFO_LIST(handle);

            NativeWireless.WlanFreeMemory(handle);

            // convert the native type to something we can pass on to the front
            List<WirelessInterface> wirelessInterfaces = wlanInterfaceInfoList.InterfaceInfo.Select(e => new WirelessInterface(e.InterfaceGuid, e.strInterfaceDescription)).ToList();

            return wirelessInterfaces;
        }
Exemplo n.º 2
0
        //********************************************************************************************
        // Function: GetInterfaceAndProfileName
        //
        // Description: Display the list of interfaces, and associated profile names, and get the user interested interface
        // Guid and the profile name
        //
        //********************************************************************************************
        public static HRESULT GetInterfaceAndProfileName(out Guid intfGuid, out string profName)
        {
            Win32Error dwRet = default;

            //variables used for WlanEnumInterfaces
            WLAN_INTERFACE_INFO_LIST pIfList = default;

            intfGuid = default;
            profName = default;

            //open handle to WLAN
            using var hWlan = WlanOpenHandle();
            if (!hWlan.IsInvalid)
            {
                //Get the list of interfaces for WLAN
                dwRet = WlanEnumInterfaces(hWlan, default, out pIfList);
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            //1.首先回去句柄
            uint   serviceVersion = 0;
            IntPtr handle         = IntPtr.Zero;
            uint   result         = WlanOpenHandle(2, IntPtr.Zero, out serviceVersion, ref handle);

            if (result == 0)
            {
                try
                {
                    //2.列举无线设备,如果你有几个无线网卡,这里就需要选择使用哪一个无线网卡设备
                    IntPtr ppInterfaceList = IntPtr.Zero;
                    WLAN_INTERFACE_INFO_LIST interfaceList;
                    result = WlanEnumInterfaces(handle, IntPtr.Zero, ref ppInterfaceList);
                    if (result == 0)
                    {
                        interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);
                        //记得释放内存
                        WlanFreeMemory(ppInterfaceList);
                        //3.假设只有一个无线设备,通过这个无线设置获取可见网络列表
                        IntPtr ppAvailableNetworkList = new IntPtr();
                        result = WlanGetAvailableNetworkList(handle, ref interfaceList.InterfaceInfo[0].InterfaceGuid, 0x00000002, new IntPtr(), ref ppAvailableNetworkList);
                        if (result == 0)
                        {
                            WLAN_AVAILABLE_NETWORK_LIST wlan_available_network_list = new WLAN_AVAILABLE_NETWORK_LIST(ppAvailableNetworkList);
                            //这里也不要忘记释放内存
                            WlanFreeMemory(ppAvailableNetworkList);
                            //打印结果出来看看
                            for (int i = 0; i < wlan_available_network_list.wlanAvailableNetwork.Length; i++)
                            {
                                Console.WriteLine(wlan_available_network_list.wlanAvailableNetwork[i].dot11Ssid.ucSSID);
                            }
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    //记得要关闭句柄
                    WlanCloseHandle(handle, IntPtr.Zero);
                }
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 获取无线网络的过程
        /// </summary>
        public WLAN_AVAILABLE_NETWORK_LIST EnumerateAvailableNetwork()
        {
            WLAN_AVAILABLE_NETWORK_LIST wlanAvailableNetworkList = new WLAN_AVAILABLE_NETWORK_LIST();
            uint   serviceVersion = 0;
            IntPtr handle         = IntPtr.Zero;
            int    result;

            result = (int)WlanOpenHandle(2, IntPtr.Zero, out serviceVersion, ref handle);
            //Console.WriteLine(result);

            IntPtr ppInterfaceList = IntPtr.Zero;
            WLAN_INTERFACE_INFO_LIST interfaceList;

            if (WlanEnumInterfaces(handle, IntPtr.Zero, ref ppInterfaceList) == 0)
            {
                interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);
                //Console.WriteLine("有{0}个无线网络适配器", interfaceList.dwNumberOfItems);
                //Console.WriteLine("Enumerating Wireless Network Adapters...");
                for (int i = 0; i < interfaceList.dwNumberOfItems; i++)
                {
                    //Console.WriteLine("{0}", interfaceList.InterfaceInfo[i].strInterfaceDescription);
                    IntPtr ppAvailableNetworkList = new IntPtr();
                    Guid   pInterfaceGuid         = interfaceList.InterfaceInfo[i].InterfaceGuid;
                    WlanGetAvailableNetworkList(handle, ref pInterfaceGuid, 0x00000002, new IntPtr(), ref ppAvailableNetworkList);
                    wlanAvailableNetworkList = new WLAN_AVAILABLE_NETWORK_LIST(ppAvailableNetworkList);
                    WlanFreeMemory(ppAvailableNetworkList);
                    WlanCloseHandle(handle, IntPtr.Zero);
                    //for (int j = 0; j < wlanAvailableNetworkList.dwNumberOfItems; j++)
                    //{
                    //    WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.wlanAvailableNetwork[j];
                    //    Console.ForegroundColor = ConsoleColor.Red;
                    //    Console.WriteLine("Available Network: ");
                    //    Console.WriteLine("SSID: " + network.dot11Ssid.ucSSID);
                    //    Console.WriteLine("StrProfile:" + network.strProfileName);
                    //    Console.WriteLine("Encrypted: " + network.bSecurityEnabled);
                    //    Console.WriteLine("Signal Strength: " + network.wlanSignalQuality);
                    //    Console.WriteLine("Default Authentication: " +
                    //        network.dot11DefaultAuthAlgorithm.ToString());
                    //    Console.WriteLine("Default Cipher: " + network.dot11DefaultCipherAlgorithm.ToString());
                    //    Console.WriteLine();
                    //    Console.Read();
                    //}
                    return(wlanAvailableNetworkList);
                }
            }
            return(wlanAvailableNetworkList);
        }
Exemplo n.º 5
0
        public static WLAN_INTERFACE_INFO_LIST EnumerateNICs()
        {
            IntPtr pClientHandle   = m_pClientHandle;
            IntPtr ppInterfaceList = IntPtr.Zero;

            if (WlanEnumInterfaces(m_pClientHandle, IntPtr.Zero, out ppInterfaceList) != 0)
            {
                m_errorMessage = "Failed WlanEnumInterfaces()";
            }
            WLAN_INTERFACE_INFO_LIST interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);

            if (ppInterfaceList != IntPtr.Zero)
            {
                WlanFreeMemory(ppInterfaceList);
            }
            return(interfaceList);
        }
Exemplo n.º 6
0
        /// <summary>
        /// enumerate wireless network adapters using wifi api
        /// </summary>
        public bool EnumerateNICs(string SSID)
        {
            uint   version        = 2;
            uint   serviceVersion = 0;
            IntPtr handle         = IntPtr.Zero;
            bool   connectPass    = false;
            int    connetCount    = 0;

            //Open WLAN handler
            try
            {
                if (WlanOpenHandle(version, IntPtr.Zero, out serviceVersion, ref handle) == ERROR_SUCCESS)
                {
                    while (connetCount < 3 && connectPass == false)
                    {
                        IntPtr ppInterfaceList = IntPtr.Zero;
                        WLAN_INTERFACE_INFO_LIST interfaceList;
                        ExecuteCommand("netsh wlan connect name=" + SSID + " ssid=" + SSID);
                        System.Threading.Thread.Sleep(500);
                        //Enumerates all of the wireless LAN interfaces currently enabled
                        if (WlanEnumInterfaces(handle, IntPtr.Zero, ref ppInterfaceList) == ERROR_SUCCESS)
                        {
                            //Tranfer all values from IntPtr to WLAN_INTERFACE_INFO_LIST structure
                            interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);
                            //檢查是否連線成功
                            if (getStateDescription(interfaceList.InterfaceInfo[0].isState) == "connected")
                            {
                                connectPass = true;
                            }
                            else
                            {
                                connetCount++;
                            }
                            if (ppInterfaceList != IntPtr.Zero)
                            {
                                WlanFreeMemory(ppInterfaceList);
                            }
                        }
                    }
                    WlanCloseHandle(handle, IntPtr.Zero);
                }
            }
            catch { MessageBox.Show("WiFi status error!!"); }
            return(connectPass);
        }
Exemplo n.º 7
0
        static void Main(string[] args)
        {
            Console.Write("Searching for valid Wi-Fi devices... ");
            IntPtr pdwNegotiatedVersion = IntPtr.Zero;
            IntPtr phClientHandle = IntPtr.Zero;
            int iSucces = WlanOpenHandle(2, IntPtr.Zero, out pdwNegotiatedVersion, out phClientHandle);

            IntPtr ppInterfaceList = IntPtr.Zero;
            iSucces = WlanEnumInterfaces(phClientHandle, IntPtr.Zero, out ppInterfaceList);

            WLAN_INTERFACE_INFO_LIST infoList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);

            Console.WriteLine(Environment.NewLine + "Success Status: " + iSucces.ToString());

            Console.Write("Beginning WFD device discovery... ");

            Console.WriteLine("Press any key to end the program.");
            Console.ReadKey(true);
        }
Exemplo n.º 8
0
        static void Main(string[] args)
        {
            Console.Write("Searching for valid Wi-Fi devices... ");
            IntPtr pdwNegotiatedVersion = IntPtr.Zero;
            IntPtr phClientHandle = IntPtr.Zero;
            int iSucces = WlanOpenHandle(2, IntPtr.Zero, out pdwNegotiatedVersion, out phClientHandle);
            
            IntPtr ppInterfaceList = IntPtr.Zero;
            iSucces = WlanEnumInterfaces(phClientHandle, IntPtr.Zero, out ppInterfaceList);

            WLAN_INTERFACE_INFO_LIST infoList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);

            Console.WriteLine(Environment.NewLine + "Success Status: " + iSucces.ToString());

            Console.Write("Beginning WFD device discovery... ");

            Console.WriteLine("Press any key to end the program.");
            Console.ReadKey(true);
        }
Exemplo n.º 9
0
        /// <summary >
        /// Get WLAN I/F info
        /// 端末の無線LANインターフェースから接続済みのNIC情報を取得する
        /// </summary >
        public void EnumerateNICs()
        {
            uint serviceVersion = 0;
            IntPtr handle = IntPtr.Zero;
            if (WlanOpenHandle(WLAN_API_VERSION_2_0, IntPtr.Zero,
                out serviceVersion, out handle) == ERROR_SUCCESS)
            {
                IntPtr ppInterfaceList = IntPtr.Zero;
                WLAN_INTERFACE_INFO_LIST interfaceList;
                var availableNetworkList = IntPtr.Zero;
                var queryData = IntPtr.Zero;

                if (WlanEnumInterfaces(handle, IntPtr.Zero, out ppInterfaceList) == ERROR_SUCCESS)
                {
                    // Transfer all values from IntPtr to WLAN_INTERFACE_INFO_LIST structure
                    interfaceList = new WLAN_INTERFACE_INFO_LIST(ppInterfaceList);

                    Console.WriteLine("Enumerating Wireless Network Adapters...");
                    for (int i = 0; i < interfaceList.dwNumberofItems; i++)
                    {
                        Console.WriteLine("{0}-->{1}",
                            interfaceList.InterfaceInfo[i].strInterfaceDescription,
                            getStateDescription(interfaceList.InterfaceInfo[i].isState));

                        uint dataSize;
                        if (WlanQueryInterface(handle,
                                    interfaceList.InterfaceInfo[i].InterfaceGuid,
                                    WLAN_INTF_OPCODE.wlan_intf_opcode_current_connection,
                                    IntPtr.Zero,
                                    out dataSize,
                                    ref queryData,
                                    IntPtr.Zero) != ERROR_SUCCESS)
                            continue;

                        // Connected WLAN I/F items only
                        var connection = (WLAN_CONNECTION_ATTRIBUTES)Marshal.PtrToStructure(queryData, typeof(WLAN_CONNECTION_ATTRIBUTES));
                        if (connection.isState != WLAN_INTERFACE_STATE.wlan_interface_state_connected)
                            continue;

                        var association = connection.wlanAssociationAttributes;

                        Console.WriteLine("   SSID: {0}, BSSID: {1}, Signal: {2}",
                            association.dot11Ssid,
                            association.dot11Bssid,
                            association.wlanSignalQuality);

                        // Hold WLAN I/F SSID and MAC address info
                        ssid = association.dot11Ssid.ToString();
                        macad = association.dot11Bssid.ToString();
                        break;
                    }

                    // Release memory
                    if (ppInterfaceList != IntPtr.Zero)
                        WlanFreeMemory(ppInterfaceList);
                }
                // Delete handle
                WlanCloseHandle(handle, IntPtr.Zero);
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// Gets SSIDs of connected wireless LANs.
        /// </summary>
        /// <returns>SSIDs</returns>
        public static IEnumerable <string> GetConnectedNetworkSsids()
        {
            var clientHandle  = IntPtr.Zero;
            var interfaceList = IntPtr.Zero;
            var queryData     = IntPtr.Zero;

            try
            {
                uint negotiatedVersion;
                if (WlanOpenHandle(
                        2,                 // Client version for Windows Vista and Windows Server 2008
                        IntPtr.Zero,
                        out negotiatedVersion,
                        out clientHandle) != ERROR_SUCCESS)
                {
                    yield break;
                }

                if (WlanEnumInterfaces(
                        clientHandle,
                        IntPtr.Zero,
                        out interfaceList) != ERROR_SUCCESS)
                {
                    yield break;
                }

                var interfaceInfoList = new WLAN_INTERFACE_INFO_LIST(interfaceList);

                Debug.WriteLine("Interface count: {0}", interfaceInfoList.dwNumberOfItems);

                foreach (var interfaceInfo in interfaceInfoList.InterfaceInfo)
                {
                    uint dataSize;
                    if (WlanQueryInterface(
                            clientHandle,
                            interfaceInfo.InterfaceGuid,
                            WLAN_INTF_OPCODE.wlan_intf_opcode_current_connection,
                            IntPtr.Zero,
                            out dataSize,
                            ref queryData,
                            IntPtr.Zero) != ERROR_SUCCESS)                     // If not connected to a network, ERROR_INVALID_STATE will be returned.
                    {
                        continue;
                    }

                    var connection = (WLAN_CONNECTION_ATTRIBUTES)Marshal.PtrToStructure(queryData, typeof(WLAN_CONNECTION_ATTRIBUTES));
                    if (connection.isState != WLAN_INTERFACE_STATE.wlan_interface_state_connected)
                    {
                        continue;
                    }

                    var association = connection.wlanAssociationAttributes;

                    Debug.WriteLine("Interface: {0}, SSID: {1}, BSSID: {2}, Signal: {3}",
                                    interfaceInfo.strInterfaceDescription,
                                    association.dot11Ssid,
                                    association.dot11Bssid,
                                    association.wlanSignalQuality);

                    yield return(association.dot11Ssid.ToString());
                }
            }
            finally
            {
                if (queryData != IntPtr.Zero)
                {
                    WlanFreeMemory(queryData);
                }

                if (interfaceList != IntPtr.Zero)
                {
                    WlanFreeMemory(interfaceList);
                }

                if (clientHandle != IntPtr.Zero)
                {
                    WlanCloseHandle(clientHandle, IntPtr.Zero);
                }
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// Gets SSIDs of available wireless LANs.
        /// </summary>
        /// <returns>SSIDs</returns>
        public static IEnumerable <string> GetAvailableNetworkSsids()
        {
            var clientHandle         = IntPtr.Zero;
            var interfaceList        = IntPtr.Zero;
            var availableNetworkList = IntPtr.Zero;

            try
            {
                uint negotiatedVersion;
                if (WlanOpenHandle(
                        2,                 // Client version for Windows Vista and Windows Server 2008
                        IntPtr.Zero,
                        out negotiatedVersion,
                        out clientHandle) != ERROR_SUCCESS)
                {
                    yield break;
                }

                if (WlanEnumInterfaces(
                        clientHandle,
                        IntPtr.Zero,
                        out interfaceList) != ERROR_SUCCESS)
                {
                    yield break;
                }

                var interfaceInfoList = new WLAN_INTERFACE_INFO_LIST(interfaceList);

                Debug.WriteLine("Interface count: {0}", interfaceInfoList.dwNumberOfItems);

                foreach (var interfaceInfo in interfaceInfoList.InterfaceInfo)
                {
                    if (WlanGetAvailableNetworkList(
                            clientHandle,
                            interfaceInfo.InterfaceGuid,
                            WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
                            IntPtr.Zero,
                            out availableNetworkList) != ERROR_SUCCESS)
                    {
                        continue;
                    }

                    var networkList = new WLAN_AVAILABLE_NETWORK_LIST(availableNetworkList);

                    foreach (var network in networkList.Network)
                    {
                        Debug.WriteLine("Interface: {0}, SSID: {1}, Signal: {2}",
                                        interfaceInfo.strInterfaceDescription,
                                        network.dot11Ssid,
                                        network.wlanSignalQuality);

                        yield return(network.dot11Ssid.ToString());
                    }
                }
            }
            finally
            {
                if (availableNetworkList != IntPtr.Zero)
                {
                    WlanFreeMemory(availableNetworkList);
                }

                if (interfaceList != IntPtr.Zero)
                {
                    WlanFreeMemory(interfaceList);
                }

                if (clientHandle != IntPtr.Zero)
                {
                    WlanCloseHandle(clientHandle, IntPtr.Zero);
                }
            }
        }
Exemplo n.º 12
0
        static void Main(string[] args)
        {
            const int dwClientVersion      = 2;
            IntPtr    clientHandle         = IntPtr.Zero;
            IntPtr    pdwNegotiatedVersion = IntPtr.Zero;
            IntPtr    pInterfaceList       = IntPtr.Zero;
            WLAN_INTERFACE_INFO_LIST interfaceList;
            WLAN_PROFILE_INFO_LIST   wifiProfileList;
            Guid   InterfaceGuid;
            IntPtr pAvailableNetworkList = IntPtr.Zero;
            string wifiXmlProfile        = null;
            IntPtr wlanAccess            = IntPtr.Zero;
            IntPtr profileList           = IntPtr.Zero;
            string profileName           = "";

            try
            {
                // Open Wifi Handle
                WlanOpenHandle(dwClientVersion, IntPtr.Zero, out pdwNegotiatedVersion, ref clientHandle);

                // Find Wi-Fi interface GUID
                WlanEnumInterfaces(clientHandle, IntPtr.Zero, ref pInterfaceList);
                interfaceList = new WLAN_INTERFACE_INFO_LIST(pInterfaceList);
                InterfaceGuid = ((WLAN_INTERFACE_INFO)interfaceList.InterfaceInfo[0]).InterfaceGuid;
                // Get Wifi Profile
                WlanGetProfileList(clientHandle, InterfaceGuid, IntPtr.Zero, ref profileList);
                wifiProfileList = new WLAN_PROFILE_INFO_LIST(profileList);
                Console.WriteLine("");
                Banner();
                Console.WriteLine("Found {0} SSIDs: ", wifiProfileList.dwNumberOfItems);
                Console.WriteLine("============================");
                Console.WriteLine("");

                for (int i = 0; i < wifiProfileList.dwNumberOfItems; i++)
                {
                    try
                    {
                        profileName = (wifiProfileList.ProfileInfo[i]).strProfileName;
                        int decryptKey = 63; //https://docs.microsoft.com/en-us/windows/win32/nativewifi/wlan-profileschema-keymaterial-sharedkey-element
                        // Retrieve Wifi SSID Name and Passsword
                        WlanGetProfile(clientHandle, InterfaceGuid, profileName, IntPtr.Zero, out wifiXmlProfile, ref decryptKey, out wlanAccess);

                        XmlDocument xmlProfileXml = new XmlDocument();
                        xmlProfileXml.LoadXml(wifiXmlProfile);

                        XmlNodeList pathToSSID     = xmlProfileXml.SelectNodes("//*[name()='WLANProfile']/*[name()='SSIDConfig']/*[name()='SSID']/*[name()='name']");
                        XmlNodeList pathToPassword = xmlProfileXml.SelectNodes("//*[name()='WLANProfile']/*[name()='MSM']/*[name()='security']/*[name()='sharedKey']/*[name()='keyMaterial']");


                        foreach (XmlNode ssid in pathToSSID)
                        {
                            Console.WriteLine("SSID: " + ssid.InnerText);
                            foreach (XmlNode password in pathToPassword)
                            {
                                Console.WriteLine("Password: "******"----------------------------");
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }

                // Close Wifi Handle
                WlanCloseHandle(clientHandle, IntPtr.Zero);
            }

            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
Exemplo n.º 13
0
		/// <summary>
		/// Gets SSIDs of connected wireless LANs.
		/// </summary>
		/// <returns>SSIDs</returns>
		public static IEnumerable<string> GetConnectedNetworkSsids()
		{
			var clientHandle = IntPtr.Zero;
			var interfaceList = IntPtr.Zero;
			var queryData = IntPtr.Zero;

			try
			{
				uint negotiatedVersion;
				if (WlanOpenHandle(
					2, // Client version for Windows Vista and Windows Server 2008
					IntPtr.Zero,
					out negotiatedVersion,
					out clientHandle) != ERROR_SUCCESS)
					yield break;

				if (WlanEnumInterfaces(
					clientHandle,
					IntPtr.Zero,
					out interfaceList) != ERROR_SUCCESS)
					yield break;

				var interfaceInfoList = new WLAN_INTERFACE_INFO_LIST(interfaceList);

				Debug.WriteLine("Interface count: {0}", interfaceInfoList.dwNumberOfItems);

				foreach (var interfaceInfo in interfaceInfoList.InterfaceInfo)
				{
					uint dataSize;
					if (WlanQueryInterface(
						clientHandle,
						interfaceInfo.InterfaceGuid,
						WLAN_INTF_OPCODE.wlan_intf_opcode_current_connection,
						IntPtr.Zero,
						out dataSize,
						ref queryData,
						IntPtr.Zero) != ERROR_SUCCESS) // If not connected to a network, ERROR_INVALID_STATE will be returned.
						continue;

					var connection = (WLAN_CONNECTION_ATTRIBUTES)Marshal.PtrToStructure(queryData, typeof(WLAN_CONNECTION_ATTRIBUTES));
					if (connection.isState != WLAN_INTERFACE_STATE.wlan_interface_state_connected)
						continue;

					var association = connection.wlanAssociationAttributes;

					Debug.WriteLine("Interface: {0}, SSID: {1}, BSSID: {2}, Signal: {3}",
						interfaceInfo.strInterfaceDescription,
						association.dot11Ssid,
						association.dot11Bssid,
						association.wlanSignalQuality);

					yield return association.dot11Ssid.ToString();
				}
			}
			finally
			{
				if (queryData != IntPtr.Zero)
					WlanFreeMemory(queryData);

				if (interfaceList != IntPtr.Zero)
					WlanFreeMemory(interfaceList);

				if (clientHandle != IntPtr.Zero)
					WlanCloseHandle(clientHandle, IntPtr.Zero);
			}
		}
Exemplo n.º 14
0
		/// <summary>
		/// Gets SSIDs of available wireless LANs.
		/// </summary>
		/// <returns>SSIDs</returns>
		public static IEnumerable<string> GetAvailableNetworkSsids()
		{
			var clientHandle = IntPtr.Zero;
			var interfaceList = IntPtr.Zero;
			var availableNetworkList = IntPtr.Zero;

			try
			{
				uint negotiatedVersion;
				if (WlanOpenHandle(
					2, // Client version for Windows Vista and Windows Server 2008
					IntPtr.Zero,
					out negotiatedVersion,
					out clientHandle) != ERROR_SUCCESS)
					yield break;

				if (WlanEnumInterfaces(
					clientHandle,
					IntPtr.Zero,
					out interfaceList) != ERROR_SUCCESS)
					yield break;

				var interfaceInfoList = new WLAN_INTERFACE_INFO_LIST(interfaceList);

				Debug.WriteLine("Interface count: {0}", interfaceInfoList.dwNumberOfItems);

				foreach (var interfaceInfo in interfaceInfoList.InterfaceInfo)
				{
					if (WlanGetAvailableNetworkList(
						clientHandle,
						interfaceInfo.InterfaceGuid,
						WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES,
						IntPtr.Zero,
						out availableNetworkList) != ERROR_SUCCESS)
						continue;

					var networkList = new WLAN_AVAILABLE_NETWORK_LIST(availableNetworkList);

					foreach (var network in networkList.Network)
					{
						Debug.WriteLine("Interface: {0}, SSID: {1}, Signal: {2}",
							interfaceInfo.strInterfaceDescription,
							network.dot11Ssid,
							network.wlanSignalQuality);

						yield return network.dot11Ssid.ToString();
					}
				}
			}
			finally
			{
				if (availableNetworkList != IntPtr.Zero)
					WlanFreeMemory(availableNetworkList);

				if (interfaceList != IntPtr.Zero)
					WlanFreeMemory(interfaceList);

				if (clientHandle != IntPtr.Zero)
					WlanCloseHandle(clientHandle, IntPtr.Zero);
			}
		}