Index: base/applications/network/wlanconf/CMakeLists.txt =================================================================== --- base/applications/network/wlanconf/CMakeLists.txt (revision 57533) +++ base/applications/network/wlanconf/CMakeLists.txt (working copy) @@ -4,5 +4,5 @@ ${REACTOS_SOURCE_DIR}/include/reactos/drivers/ndisuio) add_executable(wlanconf wlanconf.c wlanconf.rc) set_module_type(wlanconf win32cui) -add_importlibs(wlanconf msvcrt iphlpapi kernel32) +add_importlibs(wlanconf msvcrt user32 iphlpapi kernel32) add_cd_file(TARGET wlanconf DESTINATION reactos/system32 FOR all) Index: base/applications/network/wlanconf/lang/en_us.rc =================================================================== --- base/applications/network/wlanconf/lang/en_us.rc (revision 0) +++ base/applications/network/wlanconf/lang/en_us.rc (working copy) @@ -0,0 +1,40 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +STRINGTABLE DISCARDABLE +BEGIN +IDS_USAGE, "\nConfigure a WLAN adapter.\n\n\ +WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n\ +\t-c SSID\t\tConnects to a supplied SSID,\n\ +\t-w WEP\t\tSpecifies a WEP key to use.\n\ +\t-a\t\tSpecifies the target network is ad-hoc\n\ +\t-d\t\tDisconnects from the current AP.\n\ +\t-s\t\tScans and displays a list of access points\n\ +\t\t\tin range.\n\n\ +Passing no parameters will print information about the current WLAN connection\n" +/* === */ +IDS_NO_NETWORK, "No networks found in range\n" +IDS_NO_WLAN_ADAPTER, "Unable to find a WLAN adapter on the system\n" +IDS_SUCCESS, "The operation completed successfully.\n" +IDS_WLAN_DISCONNECT, "\nWLAN disconnected\n" +/* === */ +IDS_MSG_WEP_ENABLED, "WEP enabled: %s\n" +IDS_MSG_NETWORK_MODE, "Network mode: %s\n" +IDS_MSG_CURRENT_WIRELESS, "\nCurrent wireless configuration information:\n\n" +IDS_MSG_ENCRYPTED, "Encrypted: %s\n" +IDS_MSG_NETWORK_TYPE, "Network Type: %s\n" +IDS_MSG_RSSI, "RSSI: %i dBm\n" +IDS_MSG_SUPPORT_RATE, "Supported Rates (Mbps): " +IDS_MSG_TRANSMISSION_POWER, "Transmission power: %d mW\n" +IDS_MSG_ATTENNA_COUNT, "Antenna count: %d\n" +IDS_MSG_TRANSMIT_ATTENNA, "Transmit attenna: %d\n" +IDS_MSG_TRANSMIT_ATTENNA_ANY, "Transmit attenna: Any\n" +IDS_MSG_RECEIVE_ATTENNA, "Receive attenna: %d\n" +IDS_MSG_RECEIVE_ATTENNA_ANY, "Receive attenna: Any\n" +IDS_MSG_FRAGMENT_THRESHOLD, "Fragmentation threshold: %d bytes\n" +IDS_MSG_RTS_THRESHOLD, "RTS threshold: %d bytes\n" +/* === */ +IDS_YES, "Yes" +IDS_NO, "No" +IDS_NET_ADHOC, "Adhoc" +IDS_NET_INFRASTRUCTURE, "Infrastructure" +END Index: base/applications/network/wlanconf/resource.h =================================================================== --- base/applications/network/wlanconf/resource.h (revision 0) +++ base/applications/network/wlanconf/resource.h (working copy) @@ -0,0 +1,24 @@ +#define IDS_USAGE 0 +#define IDS_NO_NETWORK 1 +#define IDS_NO_WLAN_ADAPTER 2 +#define IDS_SUCCESS 3 +#define IDS_WLAN_DISCONNECT 4 +#define IDS_MSG_WEP_ENABLED 5 +#define IDS_MSG_NETWORK_MODE 6 +#define IDS_MSG_CURRENT_WIRELESS 7 +#define IDS_MSG_ENCRYPTED 8 +#define IDS_MSG_NETWORK_TYPE 9 +#define IDS_MSG_RSSI 10 +#define IDS_MSG_SUPPORT_RATE 11 +#define IDS_MSG_TRANSMISSION_POWER 12 +#define IDS_MSG_ATTENNA_COUNT 13 +#define IDS_MSG_TRANSMIT_ATTENNA 14 +#define IDS_MSG_TRANSMIT_ATTENNA_ANY 15 +#define IDS_MSG_RECEIVE_ATTENNA 16 +#define IDS_MSG_RECEIVE_ATTENNA_ANY 17 +#define IDS_MSG_FRAGMENT_THRESHOLD 18 +#define IDS_MSG_RTS_THRESHOLD 19 +#define IDS_YES 20 +#define IDS_NO 21 +#define IDS_NET_ADHOC 22 +#define IDS_NET_INFRASTRUCTURE 23 \ No newline at end of file Index: base/applications/network/wlanconf/wlanconf.c =================================================================== --- base/applications/network/wlanconf/wlanconf.c (revision 57533) +++ base/applications/network/wlanconf/wlanconf.c (working copy) @@ -14,6 +14,10 @@ #include #include +#include "resource.h" + +#define MAX_BUFFER_SIZE 5024 + BOOL bScan = FALSE; BOOL bConnect = FALSE; @@ -23,6 +27,41 @@ BOOL bDisconnect = FALSE; +/* This takes strings from a resource stringtable and outputs it to +the command prompt. */ +VOID PrintResourceString(INT resID, ...) +{ + TCHAR tmpBuffer[MAX_BUFFER_SIZE]; + va_list arg_ptr; + + va_start(arg_ptr, resID); + LoadString(GetModuleHandle(NULL), resID, tmpBuffer, MAX_BUFFER_SIZE); + _vtprintf(tmpBuffer, arg_ptr); + va_end(arg_ptr); +} + +DWORD +FormatString( + DWORD dwFlags, + DWORD dwStringId, + LPTSTR lpBuffer) +{ + DWORD dwRet; + int len; + TCHAR Buffer[64]; + + len = LoadString(GetModuleHandle(NULL), dwStringId, (LPTSTR)Buffer, 64); + + if (len) + { + dwFlags |= FORMAT_MESSAGE_FROM_STRING; + dwFlags &= ~(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM); + dwRet = FormatMessage(dwFlags, Buffer, 0, 0, lpBuffer, 0, NULL); + return dwRet; + } + return 0; +} + DWORD DoFormatMessage(DWORD ErrorCode) { LPVOID lpMsgBuf; @@ -83,7 +122,7 @@ CloseHandle(hDriver); return INVALID_HANDLE_VALUE; } - + return hDriver; } @@ -256,7 +295,7 @@ if (!bSuccess) return FALSE; - _tprintf(_T("The operation completed successfully.\n")); + PrintResourceString(IDS_SUCCESS); return TRUE; } @@ -360,13 +399,13 @@ NULL); if (SsidInfo->SsidLength == 0 || !bSuccess) { - _tprintf(_T("\nWLAN disconnected\n")); + PrintResourceString(IDS_WLAN_DISCONNECT); HeapFree(GetProcessHeap(), 0, QueryOid); return TRUE; } else { - _tprintf(_T("\nCurrent wireless configuration information:\n\n")); + PrintResourceString(IDS_MSG_CURRENT_WIRELESS); } _tprintf(_T("SSID: %s\n"), SsidBuffer); @@ -405,7 +444,7 @@ return FALSE; } - _tprintf(_T("Network mode: %s\n"), (*(PUINT)QueryOid->Data == Ndis802_11IBSS) ? "Adhoc" : "Infrastructure"); + PrintResourceString(IDS_MSG_NETWORK_MODE, ((*(PUINT)QueryOid->Data == Ndis802_11IBSS) ? "Adhoc" : "Infrastructure")); QueryOid->Oid = OID_802_11_WEP_STATUS; @@ -423,9 +462,9 @@ return FALSE; } - _tprintf(_T("WEP enabled: %s\n"), (*(PUINT)QueryOid->Data == Ndis802_11WEPEnabled) ? "Yes" : "No"); + PrintResourceString(IDS_MSG_WEP_ENABLED, ((*(PUINT)QueryOid->Data == Ndis802_11WEPEnabled) ? "Yes" : "No")); - _tprintf("\n"); + _tprintf(_T("\n")); QueryOid->Oid = OID_802_11_RSSI; bSuccess = DeviceIoControl(hAdapter, @@ -455,7 +494,8 @@ if (bSuccess) { /* This OID is optional */ - _tprintf(_T("Transmission power: %d mW\n"), *(PUINT)QueryOid->Data); + + PrintResourceString(IDS_MSG_TRANSMISSION_POWER, *(PUINT)QueryOid->Data); } _tprintf(_T("\n")); @@ -473,7 +513,7 @@ if (bSuccess) { /* This OID is optional */ - _tprintf(_T("Antenna count: %d\n"), *(PUINT)QueryOid->Data); + PrintResourceString(IDS_MSG_ATTENNA_COUNT, *(PUINT)QueryOid->Data); } QueryOid->Oid = OID_802_11_TX_ANTENNA_SELECTED; @@ -491,9 +531,9 @@ UINT TransmitAntenna = *(PUINT)QueryOid->Data; if (TransmitAntenna != 0xFFFFFFFF) - _tprintf(_T("Transmit antenna: %d\n"), TransmitAntenna); + PrintResourceString(IDS_MSG_TRANSMIT_ATTENNA, TransmitAntenna); else - _tprintf(_T("Transmit antenna: Any\n")); + PrintResourceString(IDS_MSG_TRANSMIT_ATTENNA_ANY); } QueryOid->Oid = OID_802_11_RX_ANTENNA_SELECTED; @@ -511,9 +551,9 @@ UINT ReceiveAntenna = *(PUINT)QueryOid->Data; if (ReceiveAntenna != 0xFFFFFFFF) - _tprintf(_T("Receive antenna: %d\n"), ReceiveAntenna); + PrintResourceString(IDS_MSG_RECEIVE_ATTENNA, ReceiveAntenna); else - _tprintf(_T("Receive antenna: Any\n")); + PrintResourceString(IDS_MSG_RECEIVE_ATTENNA_ANY); } _tprintf(_T("\n")); @@ -531,7 +571,7 @@ if (bSuccess) { /* This OID is optional */ - _tprintf(_T("Fragmentation threshold: %d bytes\n"), *(PUINT)QueryOid->Data); + PrintResourceString(IDS_MSG_FRAGMENT_THRESHOLD, *(PUINT)QueryOid->Data); } QueryOid->Oid = OID_802_11_RTS_THRESHOLD; @@ -547,7 +587,7 @@ if (bSuccess) { /* This OID is optional */ - _tprintf(_T("RTS threshold: %d bytes\n"), *(PUINT)QueryOid->Data); + PrintResourceString(IDS_MSG_RTS_THRESHOLD, *(PUINT)QueryOid->Data); } HeapFree(GetProcessHeap(), 0, QueryOid); @@ -720,7 +760,7 @@ if (!bSuccess) return FALSE; - _tprintf(_T("The operation completed successfully.\n")); + PrintResourceString(IDS_SUCCESS); return TRUE; } @@ -734,6 +774,18 @@ DWORD QueryOidSize; PNDIS_802_11_BSSID_LIST BssidList; DWORD i, j; + + /* Strings used for yes/no and adhoc/infrastructure */ + HLOCAL strYes = NULL; + HLOCAL strNo = NULL; + HLOCAL strAdhoc = NULL; + HLOCAL strInf = NULL; + + /* Process the strings so we can use them later on */ + FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER, IDS_YES, (LPTSTR)&strYes); + FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER, IDS_NO, (LPTSTR)&strNo); + FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER, IDS_NET_ADHOC, (LPTSTR)&strAdhoc); + FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER, IDS_NET_INFRASTRUCTURE, (LPTSTR)&strInf); SetOid.Oid = OID_802_11_BSSID_LIST_SCAN; @@ -747,13 +799,29 @@ &dwBytesReturned, NULL); if (!bSuccess) - return FALSE; + { + /* Frees the strings from memory */ + LocalFree(strYes); + LocalFree(strNo); + LocalFree(strAdhoc); + LocalFree(strInf); + + return FALSE; + } /* Allocate space for 15 networks to be returned */ QueryOidSize = sizeof(NDISUIO_QUERY_OID) + (sizeof(NDIS_WLAN_BSSID) * 15); QueryOid = HeapAlloc(GetProcessHeap(), 0, QueryOidSize); if (!QueryOid) - return FALSE; + { + /* Frees the strings from memory */ + LocalFree(strYes); + LocalFree(strNo); + LocalFree(strAdhoc); + LocalFree(strInf); + + return FALSE; + } QueryOid->Oid = OID_802_11_BSSID_LIST; BssidList = (PNDIS_802_11_BSSID_LIST)QueryOid->Data; @@ -769,12 +837,19 @@ if (!bSuccess) { HeapFree(GetProcessHeap(), 0, QueryOid); + + /* Frees the strings from memory */ + LocalFree(strYes); + LocalFree(strNo); + LocalFree(strAdhoc); + LocalFree(strInf); + return FALSE; } if (BssidList->NumberOfItems == 0) { - _tprintf(_T("No networks found in range\n")); + PrintResourceString(IDS_NO_NETWORK); } else { @@ -807,13 +882,10 @@ } _tprintf(_T("\n")); - _tprintf(_T("Encrypted: %s\n" - "Network Type: %s\n" - "RSSI: %i dBm\n" - "Supported Rates (Mbps): "), - BssidInfo->Privacy == 0 ? "No" : "Yes", - NetworkType == Ndis802_11IBSS ? "Adhoc" : "Infrastructure", - (int)Rssi); + PrintResourceString(IDS_MSG_ENCRYPTED, (BssidInfo->Privacy == 0 ? strNo : strYes)); + PrintResourceString(IDS_MSG_NETWORK_TYPE, (NetworkType == Ndis802_11IBSS ? strAdhoc : strInf)); + PrintResourceString(IDS_MSG_RSSI, (int)Rssi); + PrintResourceString(IDS_MSG_SUPPORT_RATE); for (j = 0; j < NDIS_802_11_LENGTH_RATES; j++) { @@ -844,20 +916,19 @@ } HeapFree(GetProcessHeap(), 0, QueryOid); + + /* Frees the strings from memory */ + LocalFree(strYes); + LocalFree(strNo); + LocalFree(strAdhoc); + LocalFree(strInf); return bSuccess; } VOID Usage() { - _tprintf(_T("\nConfigures a WLAN adapter.\n\n" - "WLANCONF [-c SSID [-w WEP] [-a]] [-d] [-s]\n\n" - " -c SSID Connects to a supplied SSID.\n" - " -w WEP Specifies a WEP key to use.\n" - " -a Specifies the target network is ad-hoc\n" - " -d Disconnects from the current AP.\n" - " -s Scans and displays a list of access points in range.\n\n" - " Passing no parameters will print information about the current WLAN connection\n")); + PrintResourceString(IDS_USAGE); } @@ -913,7 +984,7 @@ return TRUE; } -int main(int argc, char* argv[]) +int main(int argc, char *argv[]) { HANDLE hAdapter; IP_ADAPTER_INDEX_MAP IpInfo; @@ -923,7 +994,7 @@ if (!OpenWlanAdapter(&hAdapter, &IpInfo)) { - _tprintf(_T("Unable to find a WLAN adapter on the system\n")); + PrintResourceString(IDS_NO_WLAN_ADAPTER); return -1; } Index: base/applications/network/wlanconf/wlanconf.rc =================================================================== --- base/applications/network/wlanconf/wlanconf.rc (revision 57533) +++ base/applications/network/wlanconf/wlanconf.rc (working copy) @@ -1,3 +1,9 @@ +#include "resource.h" + +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + #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" @@ -4,4 +10,8 @@ #define REACTOS_STR_ORIGINAL_COPYRIGHT "Cameron Gutman (cameron.gutman@reactos.org)\0" #include - +// UTF-8 +#pragma code_page(65001) +#ifdef LANGUAGE_EN_US + #include "lang/en_us.rc" +#endif