Click here to Skip to main content
Licence CPOL
First Posted 16 Apr 2010
Views 16,699
Downloads 1,285
Bookmarked 22 times

Manage WiFi with Native API WIFI on Windows XP SP2

By | 16 Apr 2010 | Article
This article will demonstrate the ability to establish and operate a WiFi connection from a C# program using the Wireless LAN API on a Windows XP Embedded SP2 \ Windows XP Pro SP2.

Pre-requisites

Introduction

This article will demonstrate the ability to establish and operate a WiFi connection from a C# program using the Wireless LAN API on a Windows XP Embedded SP2 \ Windows XP Pro SP2.

Step 1

The first step was to create a function that returns the WiFi networks available for connection. Using the WLANOpenHandle, you create the client to use for the session:

Wlan.WlanOpenHandle( 
Wlan.WLAN_CLIENT_VERSION_XP_SP2, <--- (Wireless LAN API for Windows XP with SP2) 
IntPtr.Zero, 
ref negotiatedVersion, 
ref clientHandle)

Step 2

Then list all the wireless LAN interfaces visible from our PC:

Wlan.WlanEnumInterfaces( 
clientHandle, <--- (clientHandle precedentemente istanziato) 
IntPtr.Zero, 
ref pInterfaceList) 

Step 3

Using the pointer to the list of available interfaces, we will populate the structure that will contain all Wlan.WLAN_INTERFACE_INFO_LIST NIC interface information:

Wlan.WLAN_INTERFACE_INFO_LIST interfaceList = 
		new Wlan.WLAN_INTERFACE_INFO_LIST(pInterfaceList); 

Step 4

What we are still missing at this point and guidance of our interface to be passed to the function Wlan.WlanGetAvailableNetworkList, we get through this passage:

Guid InterfaceGuid = 
	((Wlan.WLAN_INTERFACE_INFO)interfaceList.InterfaceInfo[0]).InterfaceGuid; 

Step 5

Now we have all the elements to call the API Wlan.WlanGetAvailableNetworkList; declare that we will return the pointer function and proceed:

IntPtr pAvailableNetworkList = IntPtr.Zero; 
Wlan.WlanGetAvailableNetworkList( clientHandle, 
                                  InterfaceGuid, 
                                  Wlan.WlanGetAvailableNetworkFlags.
				IncludeAllManualHiddenProfiles,
                                  IntPtr.Zero, 
                                  out ppAvailableNetworkList)

Scroll through the list of connections:

Wlan.WLAN_AVAILABLE_NETWORK_LIST wlanAvailableNetworkList = 
    new Wlan.WLAN_AVAILABLE_NETWORK_LIST(pAvailableNetworkList); 
Wlan.WlanFreeMemory(pAvailableNetworkList); 
for (int j = 0; j < wlanAvailableNetworkList.dwNumberOfItems; j++) 
{ 
   Wlan.WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.Networks[j]; 
   string SSId = GetStringForSSID(network.dot11Ssid); 
   if(ssid != "") 
   { 
      //Connessione 
      Wifi_SetProfile(network.dot11DefaultAuthAlgorithm, SSId); 
   }  
}

Depending on the type of connection configured for my Access Point imposed the correct profile and I connect:

static void Wifi_SetProfile(Wlan.DOT11_AUTH_ALGORITHM connType, string sNetSSId) 
{ 
   switch (connType) 
   { 
      //WEP - OPen 
      case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_80211_OPEN: 
      profileXml = string.Format(
          "<?xml version=\"1.0\"?>
          <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">
          <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>
          <connectionType>ESS</connectionType><MSM><security><authEncryption>
          <authentication>open</authentication><encryption>WEP</encryption>
          <useOneX>false</useOneX></authEncryption><sharedKey>
          <keyType>networkKey</keyType><protected>false</protected>
          <keyMaterial>{1}</keyMaterial></sharedKey><keyIndex>0</keyIndex>
          </security></MSM></WLANProfile>", 
      profileName, key); 
 
      Wlan.WlanSetProfile( clientHandle, 
			InterfaceGuid, 
			Wlan.WlanProfileFlags.AllUser, 
			profileXml, 
			null, 
			true, 
			IntPtr.Zero, 
			out reasonCode); 
 
     if(reasonCode==Wlan.WlanReasonCode.Success) 
     { 
        //Connect!!! 
        ... 
     } 
     else 
     { 
        //Return usually 1168 – Error is on profile Xml or on key 
     } 
     break;
 
     //WPA_PSK 
     case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_WPA_PSK: 
     profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?>
         <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">
         <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>
         <connectionType>ESS</connectionType><connectionMode>auto</connectionMode>
         <autoSwitch>false</autoSwitch><MSM><security><authEncryption>
         <authentication>WPAPSK</authentication><encryption>TKIP</encryption>
         <useOneX>false</useOneX></authEncryption><sharedKey>
         <keyType>passPhrase</keyType><protected>false</protected>
         <keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", 
         profileName, key);
 
 		 Wlan.WlanSetProfile( clientHandle, 
                          InterfaceGuid, 
                          Wlan.WlanProfileFlags.AllUser, 
                          profileXml, 
                          null, 
                          true, 
                          IntPtr.Zero, 
                          out reasonCode);
 
 		 if(reasonCode == Wlan.WlanReasonCode.Success) 
     { 
         //Connect!!! 
         ... 
     } 
     else 
     { 
        //Return usually 1168 – Error is on profile Xml or on key 
     } 
     break; 
} 

If all parameters are correct, you should be connected to the network.

History

  • 16th April, 2010: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Alo1980



Italy Italy

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionException (target .NET Framework 3.5) Pinmemberlyk130:40 17 Nov '11  
QuestionCan't we use WlanGetProfile PinmemberDebojyoti Majumder21:44 10 Nov '11  
QuestionOther profiles needed? Pinmemberralph195719:42 10 Jun '10  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120517.1 | Last Updated 16 Apr 2010
Article Copyright 2010 by Alo1980
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid