2 * PROJECT: ReactOS WLAN command-line configuration utility
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/network/wlanconf/wlanconf.c
5 * PURPOSE: Allows WLAN configuration via the command prompt
6 * COPYRIGHT: Copyright 2012 Cameron Gutman (cameron.gutman@reactos.org)
18 BOOL bConnect
= FALSE
;
21 BOOL bDisconnect
= FALSE
;
23 DWORD
DoFormatMessage(DWORD ErrorCode
)
28 if ((RetVal
= FormatMessage(
29 FORMAT_MESSAGE_ALLOCATE_BUFFER
|
30 FORMAT_MESSAGE_FROM_SYSTEM
|
31 FORMAT_MESSAGE_IGNORE_INSERTS
,
34 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
), /* Default language */
39 _tprintf(_T("%s"), (LPTSTR
)lpMsgBuf
);
43 /* return number of TCHAR's stored in output buffer
44 * excluding '\0' - as FormatMessage does*/
52 OpenDriverHandle(VOID
)
55 DWORD dwBytesReturned
;
58 /* Open a handle to this NDISUIO driver */
59 hDriver
= CreateFileW(NDISUIO_DEVICE_NAME
,
60 GENERIC_READ
| GENERIC_WRITE
,
64 FILE_ATTRIBUTE_NORMAL
,
66 if (hDriver
== INVALID_HANDLE_VALUE
)
67 return INVALID_HANDLE_VALUE
;
70 bSuccess
= DeviceIoControl(hDriver
,
71 IOCTL_NDISUIO_BIND_WAIT
,
81 return INVALID_HANDLE_VALUE
;
88 IsWlanAdapter(HANDLE hAdapter
)
91 DWORD dwBytesReturned
;
92 NDISUIO_QUERY_OID QueryOid
;
94 /* NDIS 5.1 WLAN drivers must support this OID */
95 QueryOid
.Oid
= OID_GEN_PHYSICAL_MEDIUM
;
97 bSuccess
= DeviceIoControl(hAdapter
,
98 IOCTL_NDISUIO_QUERY_OID_VALUE
,
105 if (!bSuccess
|| *(PULONG
)QueryOid
.Data
!= NdisPhysicalMediumWirelessLan
)
112 OpenAdapterHandle(DWORD Index
)
116 DWORD dwBytesReturned
;
118 PNDISUIO_QUERY_BINDING QueryBinding
= (PNDISUIO_QUERY_BINDING
)Buffer
;
120 /* Open the driver handle */
121 hDriver
= OpenDriverHandle();
122 if (hDriver
== INVALID_HANDLE_VALUE
)
123 return INVALID_HANDLE_VALUE
;
125 /* Query for bindable adapters */
126 QueryBinding
->BindingIndex
= 0;
128 bSuccess
= DeviceIoControl(hDriver
,
129 IOCTL_NDISUIO_QUERY_BINDING
,
136 if (QueryBinding
->BindingIndex
== Index
)
138 QueryBinding
->BindingIndex
++;
143 CloseHandle(hDriver
);
144 return INVALID_HANDLE_VALUE
;
147 /* Bind to the adapter */
148 bSuccess
= DeviceIoControl(hDriver
,
149 IOCTL_NDISUIO_OPEN_DEVICE
,
150 (PUCHAR
)QueryBinding
+ QueryBinding
->DeviceNameOffset
,
151 QueryBinding
->DeviceNameLength
,
158 CloseHandle(hDriver
);
159 return INVALID_HANDLE_VALUE
;
165 /* Only works with the first adapter for now */
167 OpenWlanAdapter(VOID
)
169 DWORD dwCurrentIndex
;
170 HANDLE hCurrentAdapter
;
172 for (dwCurrentIndex
= 0; ; dwCurrentIndex
++)
174 hCurrentAdapter
= OpenAdapterHandle(dwCurrentIndex
);
175 if (hCurrentAdapter
== INVALID_HANDLE_VALUE
)
178 if (IsWlanAdapter(hCurrentAdapter
))
179 return hCurrentAdapter
;
181 CloseHandle(hCurrentAdapter
);
184 return INVALID_HANDLE_VALUE
;
188 WlanDisconnect(HANDLE hAdapter
)
191 DWORD dwBytesReturned
;
192 NDISUIO_SET_OID SetOid
;
194 SetOid
.Oid
= OID_802_11_DISASSOCIATE
;
196 bSuccess
= DeviceIoControl(hAdapter
,
197 IOCTL_NDISUIO_SET_OID_VALUE
,
209 WlanConnect(HANDLE hAdapter
)
212 DWORD dwBytesReturned
;
213 PNDISUIO_SET_OID SetOid
;
214 PNDIS_802_11_SSID Ssid
;
216 SetOid
= HeapAlloc(GetProcessHeap(), 0, sizeof(NDISUIO_SET_OID
) + sizeof(NDIS_802_11_SSID
));
220 SetOid
->Oid
= OID_802_11_SSID
;
221 Ssid
= (PNDIS_802_11_SSID
)SetOid
->Data
;
223 /* Fill the OID data buffer */
224 RtlCopyMemory(Ssid
->Ssid
, sSsid
, strlen(sSsid
));
225 Ssid
->SsidLength
= strlen(sSsid
);
227 bSuccess
= DeviceIoControl(hAdapter
,
228 IOCTL_NDISUIO_SET_OID_VALUE
,
236 HeapFree(GetProcessHeap(), 0, SetOid
);
242 WlanScan(HANDLE hAdapter
)
245 DWORD dwBytesReturned
;
246 NDISUIO_SET_OID SetOid
;
247 PNDISUIO_QUERY_OID QueryOid
;
249 PNDIS_802_11_BSSID_LIST BssidList
;
252 SetOid
.Oid
= OID_802_11_BSSID_LIST_SCAN
;
254 /* Send the scan OID */
255 bSuccess
= DeviceIoControl(hAdapter
,
256 IOCTL_NDISUIO_SET_OID_VALUE
,
266 /* Allocate space for 15 networks to be returned */
267 QueryOidSize
= sizeof(NDISUIO_QUERY_OID
) + (sizeof(NDIS_WLAN_BSSID
) * 15);
268 QueryOid
= HeapAlloc(GetProcessHeap(), 0, QueryOidSize
);
272 QueryOid
->Oid
= OID_802_11_BSSID_LIST
;
273 BssidList
= (PNDIS_802_11_BSSID_LIST
)QueryOid
->Data
;
275 bSuccess
= DeviceIoControl(hAdapter
,
276 IOCTL_NDISUIO_QUERY_OID_VALUE
,
285 HeapFree(GetProcessHeap(), 0, QueryOid
);
289 if (BssidList
->NumberOfItems
== 0)
291 _tprintf(_T("No networks found in range\n"));
295 for (i
= 0; i
< BssidList
->NumberOfItems
; i
++)
297 PNDIS_WLAN_BSSID BssidInfo
= &BssidList
->Bssid
[i
];
298 PNDIS_802_11_SSID Ssid
= &BssidInfo
->Ssid
;
299 NDIS_802_11_RSSI Rssi
= BssidInfo
->Rssi
;
300 NDIS_802_11_NETWORK_INFRASTRUCTURE NetworkType
= BssidInfo
->InfrastructureMode
;
301 CHAR SsidBuffer
[NDIS_802_11_LENGTH_SSID
+ 1];
303 /* SSID member is a non-null terminated ASCII string */
304 RtlCopyMemory(SsidBuffer
, Ssid
->Ssid
, Ssid
->SsidLength
);
305 SsidBuffer
[Ssid
->SsidLength
] = 0;
307 _tprintf(_T("\nSSID: %s\n"
311 "Supported Rates: "),
313 BssidInfo
->Privacy
== 0 ? "No" : "Yes",
314 NetworkType
== Ndis802_11IBSS
? "Adhoc" : "Infrastructure",
317 for (j
= 0; j
< NDIS_802_11_LENGTH_RATES
; j
++)
319 if (BssidInfo
->SupportedRates
[j
] != 0)
321 /* SupportedRates are in units of .5 */
322 _tprintf(_T("%d "), (BssidInfo
->SupportedRates
[j
] << 2));
329 HeapFree(GetProcessHeap(), 0, QueryOid
);
336 _tprintf(_T("\nConfigures a WLAN adapter.\n\n"
337 "WLANCONF [-c SSID] [-d] [-s]\n\n"
338 " -c SSID Connects to a supplied SSID.\n"
339 " -d Disconnects from the current AP.\n"
340 " -s Scans and displays a list of access points in range.\n"));
344 BOOL
ParseCmdline(int argc
, char* argv
[])
348 for (i
= 1; i
< argc
; i
++)
350 if ((argc
> 1) && (argv
[i
][0] == '-'))
354 while ((c
= *++argv
[i
]) != '\0')
376 if (!bScan
&& !bDisconnect
&& !bConnect
)
385 int main(int argc
, char* argv
[])
389 if (!ParseCmdline(argc
, argv
))
392 hAdapter
= OpenWlanAdapter();
393 if (hAdapter
== INVALID_HANDLE_VALUE
)
395 DoFormatMessage(GetLastError());
401 if (!WlanScan(hAdapter
))
403 DoFormatMessage(GetLastError());
404 CloseHandle(hAdapter
);
408 else if (bDisconnect
)
410 if (!WlanDisconnect(hAdapter
))
412 DoFormatMessage(GetLastError());
413 CloseHandle(hAdapter
);
419 if (!WlanConnect(hAdapter
))
421 DoFormatMessage(GetLastError());
422 CloseHandle(hAdapter
);
427 CloseHandle(hAdapter
);