Author: cgutman
Date: Sun Jan 8 03:02:58 2012
New Revision: 54869
URL:
http://svn.reactos.org/svn/reactos?rev=54869&view=rev
Log:
[WLANCONF]
- Initial drop of a little WLAN configuration tool to use until WZC is implemented and
working
- Doesn't build yet due to missing OID definitions
- Some of this code will eventually be reused when implementing WZC
Added:
branches/wlan-bringup/base/applications/network/wlanconf/
branches/wlan-bringup/base/applications/network/wlanconf/CMakeLists.txt (with
props)
branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.c (with props)
branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rbuild (with
props)
branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rc (with props)
Modified:
branches/wlan-bringup/base/applications/network/CMakeLists.txt
branches/wlan-bringup/base/applications/network/network.rbuild
Modified: branches/wlan-bringup/base/applications/network/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/CMakeLists.txt [iso-8859-1]
(original)
+++ branches/wlan-bringup/base/applications/network/CMakeLists.txt [iso-8859-1] Sun Jan 8
03:02:58 2012
@@ -14,3 +14,5 @@
endif()
add_subdirectory(tracert)
add_subdirectory(whois)
+add_subdirectory(wlanconf)
+
Modified: branches/wlan-bringup/base/applications/network/network.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/network.rbuild [iso-8859-1]
(original)
+++ branches/wlan-bringup/base/applications/network/network.rbuild [iso-8859-1] Sun Jan 8
03:02:58 2012
@@ -40,4 +40,7 @@
<directory name="whois">
<xi:include href="whois/whois.rbuild" />
</directory>
+ <directory name="wlanconf">
+ <xi:include href="wlanconf/wlanconf.rbuild" />
+ </directory>
</group>
Added: branches/wlan-bringup/base/applications/network/wlanconf/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/wlanconf/CMakeLists.txt (added)
+++ branches/wlan-bringup/base/applications/network/wlanconf/CMakeLists.txt [iso-8859-1]
Sun Jan 8 03:02:58 2012
@@ -1,0 +1,8 @@
+
+include_directories(
+ BEFORE include
+ ${REACTOS_SOURCE_DIR}/include/reactos/drivers/ndisuio)
+add_executable(wlanconf wlanconf.c wlanconf.rc)
+set_module_type(wlanconf win32cui)
+add_importlibs(wlanconf kernel32)
+add_cd_file(TARGET wlanconf DESTINATION reactos/system32 FOR all)
Propchange: branches/wlan-bringup/base/applications/network/wlanconf/CMakeLists.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.c
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.c (added)
+++ branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.c [iso-8859-1] Sun
Jan 8 03:02:58 2012
@@ -1,0 +1,430 @@
+/*
+ * PROJECT: ReactOS WLAN command-line configuration utility
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: base/applications/network/wlanconf/wlanconf.c
+ * PURPOSE: Allows WLAN configuration via the command prompt
+ * COPYRIGHT: Copyright 2012 Cameron Gutman (cameron.gutman(a)reactos.org)
+ */
+
+#include <windows.h>
+#include <tchar.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ntddndis.h>
+#include <nuiouser.h>
+
+BOOL bScan = FALSE;
+
+BOOL bConnect = FALSE;
+char* sSsid = NULL;
+
+BOOL bDisconnect = FALSE;
+
+DWORD DoFormatMessage(DWORD ErrorCode)
+{
+ LPVOID lpMsgBuf;
+ DWORD RetVal;
+
+ if ((RetVal = FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ ErrorCode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
+ (LPTSTR) &lpMsgBuf,
+ 0,
+ NULL )))
+ {
+ _tprintf(_T("%s"), (LPTSTR)lpMsgBuf);
+
+ LocalFree(lpMsgBuf);
+
+ /* return number of TCHAR's stored in output buffer
+ * excluding '\0' - as FormatMessage does*/
+ return RetVal;
+ }
+ else
+ return 0;
+}
+
+HANDLE
+OpenDriverHandle(VOID)
+{
+ HANDLE hDriver;
+ DWORD dwBytesReturned;
+ BOOL bSuccess;
+
+ /* Open a handle to this NDISUIO driver */
+ hDriver = CreateFileW(NDISUIO_DEVICE_NAME,
+ GENERIC_READ | GENERIC_WRITE,
+ 0,
+ NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (hDriver == INVALID_HANDLE_VALUE)
+ return INVALID_HANDLE_VALUE;
+
+ /* Wait for binds */
+ bSuccess = DeviceIoControl(hDriver,
+ IOCTL_NDISUIO_BIND_WAIT,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess)
+ {
+ CloseHandle(hDriver);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ return hDriver;
+}
+
+BOOL
+IsWlanAdapter(HANDLE hAdapter)
+{
+ BOOL bSuccess;
+ DWORD dwBytesReturned;
+ NDISUIO_QUERY_OID QueryOid;
+
+ /* NDIS 5.1 WLAN drivers must support this OID */
+ QueryOid.Oid = OID_GEN_PHYSICAL_MEDIUM;
+
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_QUERY_OID_VALUE,
+ &QueryOid,
+ sizeof(QueryOid),
+ &QueryOid,
+ sizeof(QueryOid),
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess || *(PULONG)QueryOid.Data != NdisPhysicalMediumWirelessLan)
+ return FALSE;
+
+ return TRUE;
+}
+
+HANDLE
+OpenAdapterHandle(DWORD Index)
+{
+ HANDLE hDriver;
+ BOOL bSuccess;
+ DWORD dwBytesReturned;
+ char Buffer[1024];
+ PNDISUIO_QUERY_BINDING QueryBinding = (PNDISUIO_QUERY_BINDING)Buffer;
+
+ /* Open the driver handle */
+ hDriver = OpenDriverHandle();
+ if (hDriver == INVALID_HANDLE_VALUE)
+ return INVALID_HANDLE_VALUE;
+
+ /* Query for bindable adapters */
+ QueryBinding->BindingIndex = 0;
+ do {
+ bSuccess = DeviceIoControl(hDriver,
+ IOCTL_NDISUIO_QUERY_BINDING,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+ if (QueryBinding->BindingIndex == Index)
+ break;
+ QueryBinding->BindingIndex++;
+ } while (bSuccess);
+
+ if (!bSuccess)
+ {
+ CloseHandle(hDriver);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ /* Bind to the adapter */
+ bSuccess = DeviceIoControl(hDriver,
+ IOCTL_NDISUIO_OPEN_DEVICE,
+ (PUCHAR)QueryBinding + QueryBinding->DeviceNameOffset,
+ QueryBinding->DeviceNameLength,
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess)
+ {
+ CloseHandle(hDriver);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ return hDriver;
+}
+
+/* Only works with the first adapter for now */
+HANDLE
+OpenWlanAdapter(VOID)
+{
+ DWORD dwCurrentIndex;
+ HANDLE hCurrentAdapter;
+
+ for (dwCurrentIndex = 0; ; dwCurrentIndex++)
+ {
+ hCurrentAdapter = OpenAdapterHandle(dwCurrentIndex);
+ if (hCurrentAdapter == INVALID_HANDLE_VALUE)
+ break;
+
+ if (IsWlanAdapter(hCurrentAdapter))
+ return hCurrentAdapter;
+ else
+ CloseHandle(hCurrentAdapter);
+ }
+
+ return INVALID_HANDLE_VALUE;
+}
+
+BOOL
+WlanDisconnect(HANDLE hAdapter)
+{
+ BOOL bSuccess;
+ DWORD dwBytesReturned;
+ NDISUIO_SET_OID SetOid;
+
+ SetOid.Oid = OID_802_11_DISASSOCIATE;
+
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_SET_OID_VALUE,
+ &SetOid,
+ sizeof(SetOid),
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+
+ return bSuccess;
+}
+
+BOOL
+WlanConnect(HANDLE hAdapter)
+{
+ BOOL bSuccess;
+ DWORD dwBytesReturned;
+ PNDISUIO_SET_OID SetOid;
+ PNDIS_802_11_SSID Ssid;
+
+ SetOid = HeapAlloc(GetProcessHeap(), 0, sizeof(NDISUIO_SET_OID) +
sizeof(NDIS_802_11_SSID));
+ if (!SetOid)
+ return FALSE;
+
+ SetOid->Oid = OID_802_11_SSID;
+ Ssid = SetOid->Data;
+
+ /* Fill the OID data buffer */
+ RtlCopyMemory(Ssid->Ssid, sSsid, strlen(sSsid));
+ Ssid->SsidLength = strlen(sSsid);
+
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_SET_OID_VALUE,
+ &SetOid,
+ sizeof(SetOid),
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+
+ HeapFree(GetProcessHeap(), 0, SetOid);
+
+ return bSuccess;
+}
+
+BOOL
+WlanScan(HANDLE hAdapter)
+{
+ BOOL bSuccess;
+ DWORD dwBytesReturned;
+ NDISUIO_SET_OID SetOid;
+ PNDISUIO_QUERY_OID QueryOid;
+ DWORD QueryOidSize;
+ PNDIS_802_11_BSSID_LIST_EX BssidList;
+ DWORD i, j;
+
+ SetOid.Oid = OID_802_11_BSSID_LIST_SCAN;
+
+ /* Send the scan OID */
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_SET_OID_VALUE,
+ &SetOid,
+ sizeof(SetOid),
+ NULL,
+ 0,
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess)
+ return FALSE;
+
+ /* Allocate space for 15 networks to be returned */
+ QueryOidSize = sizeof(NDISUIO_QUERY_OID) + (sizeof(NDIS_WLAN_BSSID_EX) * 15);
+ QueryOid = HeapAlloc(GetProcessHeap(), 0, QueryOidSize);
+ if (!QueryOid)
+ return FALSE;
+
+ QueryOid->Oid = OID_802_11_BSSID_LIST;
+ BssidList = QueryOid->Data;
+
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_QUERY_OID_VALUE,
+ QueryOid,
+ QueryOidSize,
+ QueryOid,
+ QueryOidSize,
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess)
+ {
+ HeapFree(GetProcessHeap(), 0, QueryOid);
+ return FALSE;
+ }
+
+ if (BssidList->NumberOfItems == 0)
+ {
+ _tprintf(_T("No networks found in range\n"));
+ }
+ else
+ {
+ for (i = 0; i < BssidList->NumberOfItems; i++)
+ {
+ PNDIS_WLAN_BSSID_EX BssidInfo = BssidList->Bssid[i];
+ PNDIS_802_11_SSID Ssid = &BssidInfo->Ssid;
+ UCHAR SupportedRates[16] = &BssidInfo->SupportedRates;
+ NDIS_802_11_RSSI Rssi = BssidInfo->Rssi;
+ NDIS_802_11_NETWORK_INFRASTRUCTURE NetworkType =
BssidInfo->InfrastructureMode;
+ CHAR SsidBuffer[33];
+
+ /* SSID member is a non-null terminated ASCII string */
+ RtlCopyMemory(SsidBuffer, Ssid->Ssid, Ssid->SsidLength);
+ SsidBuffer[Ssid->SsidLength] = 0;
+
+ _tprintf(_T("\nSSID: %s\n"
+ "Encrypted: %s"
+ "Network Type: %s\n"
+ "RSSI: %i\n"
+ "Supported Rates: "),
+ SsidBuffer,
+ BssidInfo->Privacy == 0 ? "No" : "Yes",
+ NetworkType == Ndis802_11IBSS ? "Adhoc" :
"Infrastructure",
+ (int)Rssi);
+
+ for (j = 0; j < 16; j++)
+ {
+ if (SupportedRates[j] != 0)
+ {
+ /* SupportedRates are in units of .5 */
+ _tprintf(_T("%d "), (SupportedRates[j] << 2));
+ }
+ }
+ _tprintf(_T("\n"));
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, QueryOid);
+
+ return bSuccess;
+}
+
+VOID Usage()
+{
+ _tprintf(_T("\nConfigures a WLAN adapter.\n\n"
+ "WLANCONF [-c SSID] [-d] [-s]\n\n"
+ " -c SSID Connects to a supplied SSID.\n"
+ " -d Disconnects from the current AP.\n"
+ " -s Scans and displays a list of access points in
range.\n"));
+}
+
+
+BOOL ParseCmdline(int argc, char* argv[])
+{
+ INT i;
+
+ for (i = 1; i < argc; i++)
+ {
+ if ((argc > 1) && (argv[i][0] == '-'))
+ {
+ TCHAR c;
+
+ while ((c = *++argv[i]) != '\0')
+ {
+ switch (c)
+ {
+ case 's' :
+ bScan = TRUE;
+ break;
+ case 'd' :
+ bDisconnect = TRUE;
+ break;
+ case 'c' :
+ bConnect = TRUE;
+ sSsid = argv[++i];
+ break;
+ default :
+ Usage();
+ return FALSE;
+ }
+ }
+ }
+ }
+
+ if (!bScan && !bDisconnect && !bConnect)
+ {
+ Usage();
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+int main(int argc, char* argv[])
+{
+ HANDLE hAdapter;
+
+ if (!ParseCmdline(argc, argv))
+ return -1;
+
+ hAdapter = OpenWlanAdapter();
+ if (hAdapter == INVALID_HANDLE_VALUE)
+ {
+ DoFormatMessage(GetLastError());
+ return -1;
+ }
+
+ if (bScan)
+ {
+ if (!WlanScan(hAdapter))
+ {
+ DoFormatMessage(GetLastError());
+ CloseHandle(hAdapter);
+ return -1;
+ }
+ }
+ else if (bDisconnect)
+ {
+ if (!WlanDisconnect(hAdapter))
+ {
+ DoFormatMessage(GetLastError());
+ CloseHandle(hAdapter);
+ return -1;
+ }
+ }
+ else
+ {
+ if (!WlanConnect(hAdapter))
+ {
+ DoFormatMessage(GetLastError());
+ CloseHandle(hAdapter);
+ return -1;
+ }
+ }
+
+ CloseHandle(hAdapter);
+ return 0;
+}
Propchange: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rbuild (added)
+++ branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rbuild [iso-8859-1]
Sun Jan 8 03:02:58 2012
@@ -1,0 +1,8 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
+<module name="wlanconf" type="win32cui"
installbase="system32" installname="wlanconf.exe">
+ <include base="wlanconf">.</include>
+ <include base="ReactOS">include/reactos/drivers/ndisuio</include>
+ <file>wlanconf.c</file>
+ <file>wlanconf.rc</file>
+</module>
Propchange: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rbuild
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rc
URL:
http://svn.reactos.org/svn/reactos/branches/wlan-bringup/base/applications/…
==============================================================================
--- branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rc (added)
+++ branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rc [iso-8859-1] Sun
Jan 8 03:02:58 2012
@@ -1,0 +1,7 @@
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS WLAN Configuration Tool\0"
+#define REACTOS_STR_INTERNAL_NAME "wlanconf\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "wlanconf.exe\0"
+#define REACTOS_STR_ORIGINAL_COPYRIGHT "Cameron Gutman
(cameron.gutman(a)reactos.org)\0"
+#include <reactos/version.rc>
+
+
Propchange: branches/wlan-bringup/base/applications/network/wlanconf/wlanconf.rc
------------------------------------------------------------------------------
svn:eol-style = native