diff --git a/Plugins/PluginWifiStatus/PluginWifiStatus.vcxproj b/Plugins/PluginWifiStatus/PluginWifiStatus.vcxproj index ab4a993f..83f55653 100644 --- a/Plugins/PluginWifiStatus/PluginWifiStatus.vcxproj +++ b/Plugins/PluginWifiStatus/PluginWifiStatus.vcxproj @@ -105,6 +105,7 @@ MachineX86 ..\..\Library\x32\$(Configuration);%(AdditionalLibraryDirectories) $(IntDir)$(TargetName).pdb + Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies) @@ -136,6 +137,7 @@ MachineX64 ..\..\Library\x64\$(Configuration);%(AdditionalLibraryDirectories) $(IntDir)$(TargetName).pdb + Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies) @@ -154,7 +156,7 @@ 0x0409 - Rainmeter.lib;%(AdditionalDependencies) + Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies) ../../TestBench/x32/Release/Plugins/WifiStatus.dll ..\..\Library\x32\$(Configuration);%(AdditionalLibraryDirectories) false @@ -183,7 +185,7 @@ 0x0409 - Rainmeter.lib;%(AdditionalDependencies) + Rainmeter.lib;wlanapi.lib;%(AdditionalDependencies) ../../TestBench/x64/Release/Plugins/WifiStatus.dll ..\..\Library\x64\$(Configuration);%(AdditionalLibraryDirectories) false diff --git a/Plugins/PluginWifiStatus/WifiStatus.cpp b/Plugins/PluginWifiStatus/WifiStatus.cpp index c9b03b35..f30d1f91 100644 --- a/Plugins/PluginWifiStatus/WifiStatus.cpp +++ b/Plugins/PluginWifiStatus/WifiStatus.cpp @@ -16,349 +16,376 @@ */ #include -#include #include -#include #include -#pragma comment( lib, "wlanapi.lib") -#include "../../Library/Export.h" // Rainmeter's exported functions - +#include "../API/RainmeterAPI.h" #include "../../Library/DisableThreadLibraryCalls.h" // contains DllMain entry point -/* The exported functions */ -extern "C" -{ -__declspec( dllexport ) UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id); -__declspec( dllexport ) void Finalize(HMODULE instance, UINT id); -__declspec( dllexport ) UINT Update(UINT id); -__declspec( dllexport ) LPCTSTR GetString(UINT id, UINT flags); -__declspec( dllexport ) UINT GetPluginVersion(); -__declspec( dllexport ) LPCTSTR GetPluginAuthor(); - -} - -//Function that translates DOT11 ENUMs to output strings -LPCTSTR getDot11str(int,int); - enum MEASURETYPE { + UNINITIALIZED, UNKNOWN, SSID, QUALITY, ENCRYPTION, AUTH, LIST, - PHY, + PHY }; -//Struct for storing current meter's settings -typedef struct meas_data { +struct MeasureData +{ MEASURETYPE type; UINT listStyle; UINT listMax; - WCHAR * netlist; - bool listInit; -} meas_data_t; + std::wstring statusString; + MeasureData() : type(UNINITIALIZED), listStyle(), listMax(5) {} +}; -std::map g_meas_data; -int g_Instances = 0; -/* Globals that store system's wifi interface/adapter structs */ -/* These are initialized in Initialize(), used during each update*/ -HANDLE hClient = NULL; -PWLAN_INTERFACE_INFO pInterface = NULL; -PWLAN_INTERFACE_INFO_LIST pIntfList = NULL; +UINT g_Instances = 0; -/* - This function is called when the measure is initialized. - The function must return the maximum value that can be measured. - The return value can also be 0, which means that Rainmeter will - track the maximum value automatically. The parameters for this - function are: +// Globals that store system's wifi interface/adapter structs +// These are initialized in Initialize(), used during each update +HANDLE g_hClient = NULL; +PWLAN_INTERFACE_INFO g_pInterface = NULL; +PWLAN_INTERFACE_INFO_LIST g_pIntfList = NULL; - instance The instance of this DLL - iniFile The name of the ini-file (usually Rainmeter.ini) - section The name of the section in the ini-file for this measure - id The identifier for the measure. This is used to identify the measures that use the same plugin. -*/ -UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id) +// Function that translates DOT11 ENUMs to output strings +LPCWSTR GetDot11Str(int, int); + +std::wstring ConvertToWide(LPCSTR str, int strLen) { - /* initialize interface/adapter structs */ - DWORD dwNegotiatedVersion = 0; - DWORD dwErr; - g_Instances++; - //Create WINLAN API Handle - if (hClient == NULL){ - dwErr = WlanOpenHandle( WLAN_API_VERSION, NULL, &dwNegotiatedVersion, &hClient ); - if ( ERROR_SUCCESS != dwErr ){ - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: Unable to open WLAN API Handle. Error code (%d): %s",(int)dwErr,getDot11str(dwErr,5)); - LSLog(LOG_ERROR, NULL, buffer); - return 0; - } - } - //Query list of WLAN interfaces - if (pIntfList == NULL){ - dwErr= WlanEnumInterfaces(hClient, NULL, &pIntfList); - if (( ERROR_SUCCESS != dwErr) || (&pIntfList->dwNumberOfItems <= 0)){ - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: Unable to find any WLAN interfaces/adapters. Error code %d",(int) dwErr); - LSLog(LOG_ERROR, NULL, buffer); - return 0; - } - } - //Select a WLAN interface, default 0. - LPCTSTR data = ReadConfigString(section, L"WifiIntfID", L""); + std::wstring szWide; - if ((data != NULL) && *data){ - if (_wtoi(data) < (int)pIntfList->dwNumberOfItems){ - pInterface = &pIntfList->InterfaceInfo[_wtoi(data)]; - } else { - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: Adapter (WifiIntfID=%s) not valid", data); - LSLog(LOG_ERROR, NULL, buffer); - pInterface = &pIntfList->InterfaceInfo[0]; + if (str && *str) + { + int bufLen = MultiByteToWideChar(CP_ACP, 0, str, strLen, NULL, 0); + if (bufLen > 0) + { + szWide.resize(bufLen); + MultiByteToWideChar(CP_ACP, 0, str, strLen, &szWide[0], bufLen); } - } else { - pInterface = &pIntfList->InterfaceInfo[0]; } - //Select LIST style - data = ReadConfigString(section, L"WifiListStyle", L""); + return szWide; +} - if ((data != NULL) && *data){ - if ( (_wtoi(data) >= 0) && (_wtoi(data) <= 3)){ - g_meas_data[id].listStyle = _wtoi(data); - } else { - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: WifiListStyle=%s not valid",data); - LSLog(LOG_WARNING, NULL, buffer); - g_meas_data[id].listStyle = 0; - } - } else { - g_meas_data[id].listStyle = 0; +void FinalizeHandle() +{ + g_pInterface = NULL; + + if (g_pIntfList != NULL) + { + WlanFreeMemory(g_pIntfList); + g_pIntfList = NULL; } - //Set maxmimum number of list items - data = ReadConfigString(section, L"WifiListLimit", L""); - g_meas_data[id].listInit = false; - if ((data != NULL) && *data){ - if (_wtoi(data) > 0){ - g_meas_data[id].listMax = _wtoi(data); - } else { - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: WifiListLimit=%s not valid.",data); - LSLog(LOG_WARNING, NULL, buffer); - g_meas_data[id].listMax = 5; - } - } else { - g_meas_data[id].listMax = 5; + if (g_hClient != NULL) + { + WlanCloseHandle(g_hClient, NULL); + g_hClient = NULL; } - //Select type of measure +} + +PLUGIN_EXPORT void Initialize(void** data, void* rm) +{ + MeasureData* measure = new MeasureData; + *data = measure; + + ++g_Instances; + + if (g_Instances == 1) + { + WCHAR buffer[256]; + + // Create WINLAN API Handle + if (g_hClient == NULL) + { + DWORD dwNegotiatedVersion = 0; + DWORD dwErr = WlanOpenHandle(WLAN_API_VERSION, NULL, &dwNegotiatedVersion, &g_hClient); + if (ERROR_SUCCESS != dwErr) + { + FinalizeHandle(); + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Unable to open WLAN API Handle. Error code (%u): %s", dwErr, GetDot11Str((int)dwErr, 5)); + RmLog(LOG_ERROR, buffer); + return; + } + } + + // Query list of WLAN interfaces + if (g_pIntfList == NULL) + { + DWORD dwErr = WlanEnumInterfaces(g_hClient, NULL, &g_pIntfList); + if (ERROR_SUCCESS != dwErr) + { + FinalizeHandle(); + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Unable to find any WLAN interfaces/adapters. Error code %u", dwErr); + RmLog(LOG_ERROR, buffer); + return; + } + else if (g_pIntfList->dwNumberOfItems == 0) + { + FinalizeHandle(); + RmLog(LOG_ERROR, L"WifiStatus.dll: No WLAN interfaces/adapters available."); + return; + } + } + } +} + +PLUGIN_EXPORT void Reload(void* data, void* rm, double* maxValue) +{ + if (g_hClient == NULL) return; + + MeasureData* measure = (MeasureData*)data; + WCHAR buffer[256]; + bool changed = false; + + // Select a WLAN interface, default 0. + int value = RmReadInt(rm, L"WifiIntfID", 0); + if (value >= (int)g_pIntfList->dwNumberOfItems) + { + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: Adapter (WifiIntfID=%i) not valid.", value); + RmLog(LOG_ERROR, buffer); + + value = 0; + } + g_pInterface = &g_pIntfList->InterfaceInfo[value]; + + // Select LIST style + value = RmReadInt(rm, L"WifiListStyle", 0); + if (value < 0 || value > 3) + { + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiListStyle=%i not valid.", value); + RmLog(LOG_WARNING, buffer); + + value = 0; + } + measure->listStyle = value; + + // Set maxmimum number of list items + value = RmReadInt(rm, L"WifiListLimit", 5); + if (value <= 0) + { + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiListLimit=%i not valid.", data); + RmLog(LOG_WARNING, buffer); + + value = 5; + } + measure->listMax = value; + + // Select type of measure MEASURETYPE infoType = UNKNOWN; - LPCTSTR type = ReadConfigString(section, L"WifiInfoType", L""); - if (type){ - if (_wcsicmp(L"SSID", type) == 0){ - infoType=SSID; - } - else if (_wcsicmp(L"QUALITY", type) == 0){ - infoType=QUALITY; - } - else if (_wcsicmp(L"ENCRYPTION", type) == 0){ - infoType=ENCRYPTION; - } - else if (_wcsicmp(L"AUTH", type) == 0){ - infoType=AUTH; - } - else if (_wcsicmp(L"LIST", type) == 0){ - infoType=LIST; - } - else if (_wcsicmp(L"PHY", type) == 0){ - infoType=PHY; - } else { - WCHAR buffer[256]; - wsprintf(buffer, L"WifiStatus.dll: WifiInfoType=%d not valid",type); - LSLog(LOG_ERROR, NULL, buffer); - } - g_meas_data[id].type = infoType; + LPCWSTR type = RmReadString(rm, L"WifiInfoType", L""); + if (_wcsicmp(L"SSID", type) == 0) + { + infoType = SSID; } + else if (_wcsicmp(L"QUALITY", type) == 0) + { + infoType = QUALITY; + } + else if (_wcsicmp(L"ENCRYPTION", type) == 0) + { + infoType = ENCRYPTION; + } + else if (_wcsicmp(L"AUTH", type) == 0) + { + infoType = AUTH; + } + else if (_wcsicmp(L"LIST", type) == 0) + { + infoType = LIST; + } + else if (_wcsicmp(L"PHY", type) == 0) + { + infoType = PHY; + } + else + { + _snwprintf_s(buffer, _TRUNCATE, L"WifiStatus.dll: WifiInfoType=%s not valid.", type); + RmLog(LOG_ERROR, buffer); + } + if (infoType != measure->type) + { + changed = true; + } + measure->type = infoType; - switch(infoType){ + if (changed) + { + measure->statusString.clear(); + + switch (infoType) + { case SSID: case ENCRYPTION: case AUTH: - return 0; + *maxValue = 0; + break; case QUALITY: - return 100; + *maxValue = 100; + break; + } } - - return 0; } -/* - This function is called when new value should be measured. - The function returns the new value. -*/ -UINT Update(UINT id) +PLUGIN_EXPORT double Update(void* data) { - if (pInterface == NULL) return NULL; + if (g_pInterface == NULL) return 0; - //Get measure id, and identify type - //std::map::iterator typeIter = g_Types.find(id); - //if (typeIter == g_Types.end()) return NULL; - MEASURETYPE current_type = g_meas_data[id].type; - switch(current_type) + MeasureData* measure = (MeasureData*)data; + double value = 0; + + if (measure->type != UNKNOWN) { - case QUALITY: - //Set up variables for WLAN query - ULONG outsize = 0; - PWLAN_CONNECTION_ATTRIBUTES wlan_cattr=NULL; - DWORD dwErr; - GUID& intfGUID = pInterface->InterfaceGuid; - dwErr = WlanQueryInterface( hClient, &intfGUID, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL ); - if ( ERROR_SUCCESS != dwErr){ - return 0; + if (measure->type == LIST) + { + PWLAN_AVAILABLE_NETWORK_LIST pwnl = NULL; + DWORD dwErr = WlanGetAvailableNetworkList(g_hClient, &g_pInterface->InterfaceGuid, NULL, NULL, &pwnl); + + if (ERROR_SUCCESS != dwErr) + { + measure->statusString = L"Error"; } - int retval = (int)wlan_cattr->wlanAssociationAttributes.wlanSignalQuality; - if (wlan_cattr!=NULL)WlanFreeMemory(wlan_cattr); - return retval; + else + { + // Size of network name can be up to 64 chars, set to 80 to add room for delimiters + measure->statusString.clear(); + measure->statusString.reserve(80 * measure->listMax); - //Transfer rates will go here - } - return NULL; -} + UINT printed = 0; // count of how many networks have been printed already + // Check all items in WLAN NETWORK LIST + for (size_t i = 0; i < pwnl->dwNumberOfItems ; ++i) + { + if (printed == measure->listMax) break; -LPCTSTR GetString(UINT id, UINT flags) -{ - if (pInterface == NULL) return NULL; + // SSID is in UCHAR, convert to WCHAR + std::wstring ssid = ConvertToWide((LPCSTR)pwnl->Network[i].dot11Ssid.ucSSID, (int)pwnl->Network[i].dot11Ssid.uSSIDLength); - //Some variables for data manipulation in this function - static WCHAR buffer[128]; - bool bNetList = false; //whether to return buffer or netlist - bool bInvalidType = false; - bool bIntfError = false; - unsigned int listStyle = 0; - memset(buffer,'\0',128); - listStyle = g_meas_data[id].listStyle; - int printed = 0; //count of how many networks have been printed already - - //Set up variables for WLAN queries - ULONG outsize = 0; - PWLAN_CONNECTION_ATTRIBUTES wlan_cattr=NULL; - PWLAN_AVAILABLE_NETWORK_LIST pwnl=NULL; - DWORD dwCErr, dwLErr; - GUID& intfGUID = pInterface->InterfaceGuid; - - //Initialize WLAN structs with queries, break if no interface found - dwCErr= WlanQueryInterface( hClient, &intfGUID, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL ); - dwLErr= WlanGetAvailableNetworkList(hClient,&intfGUID,NULL,NULL,&pwnl); - MEASURETYPE current_type = g_meas_data[id].type; - UINT listMax = g_meas_data[id].listMax; - - switch(current_type) - { - case LIST: - if (ERROR_SUCCESS != dwLErr){return L"Error";} - - if (!g_meas_data[id].listInit){//Check if netlist has memory allocated already - //Size of network name can be up to 64 chars, set to 80 to add room for delimiters - g_meas_data[id].netlist = (WCHAR*)malloc( 80 * sizeof(WCHAR) * g_meas_data[id].listMax); - if (g_meas_data[id].netlist == NULL){ - LSLog(LOG_ERROR, NULL, L"WifiStatus.dll: Unable to allocate network list memory"); - g_meas_data[id].listInit = false; - free(g_meas_data[id].netlist); - return NULL; + // Prevent duplicates that result from profiles, check using SSID + if (!ssid.empty() && ssid[0] && wcsstr(measure->statusString.c_str(), ssid.c_str()) == NULL) + { + ++printed; + measure->statusString += ssid; + if (measure->listStyle > 0) + { + if (measure->listStyle == 1 || measure->listStyle == 3) + { + // ADD PHY type + measure->statusString += L" @"; + measure->statusString += GetDot11Str(pwnl->Network[i].dot11PhyTypes[0], 4); + } + if (measure->listStyle == 2 || measure->listStyle == 3) + { + // ADD cipher and authentication + measure->statusString += L" ("; + measure->statusString += GetDot11Str(pwnl->Network[i].dot11DefaultCipherAlgorithm, 1); + measure->statusString += L':'; + measure->statusString += GetDot11Str(pwnl->Network[i].dot11DefaultAuthAlgorithm, 2); + measure->statusString += L')'; + } + } + measure->statusString += L'\n'; + } } - g_meas_data[id].listInit = true; + + WlanFreeMemory(pwnl); } + } + else + { + ULONG outsize = 0; + PWLAN_CONNECTION_ATTRIBUTES wlan_cattr = NULL; + DWORD dwErr = WlanQueryInterface(g_hClient, &g_pInterface->InterfaceGuid, wlan_intf_opcode_current_connection, NULL, &outsize, (PVOID*)&wlan_cattr, NULL); - memset(g_meas_data[id].netlist,'\0', (80 * sizeof(WCHAR) * g_meas_data[id].listMax)); - memset(buffer,'\0',128); - - //Check all items in WLAN NETWORK LIST - for (int i=0; i < (int)pwnl->dwNumberOfItems ; i++){ - if (printed == g_meas_data[id].listMax) + if (ERROR_SUCCESS != dwErr) + { + switch (measure->type) + { + case SSID: + case PHY: + case ENCRYPTION: + case AUTH: + measure->statusString = L"-1"; + break; + } + } + else + { + switch (measure->type) + { + case QUALITY: + value = (double)wlan_cattr->wlanAssociationAttributes.wlanSignalQuality; break; - //SSID is in UCHAR, convert to WCHAR - mbstowcs(buffer,(char*)pwnl->Network[i].dot11Ssid.ucSSID,pwnl->Network[i].dot11Ssid.uSSIDLength); + case SSID: + // Need to convert ucSSID to wchar from uchar + measure->statusString = ConvertToWide((LPCSTR)wlan_cattr->wlanAssociationAttributes.dot11Ssid.ucSSID, (int)wlan_cattr->wlanAssociationAttributes.dot11Ssid.uSSIDLength); + // If not connected yet add current status + measure->statusString += GetDot11Str(wlan_cattr->isState, 3); + break; - //Prevent duplicates that result from profiles, check using SSID - if ((wcsstr(g_meas_data[id].netlist,buffer)== NULL)&&(_wcsicmp(L"", buffer) != 0)){ - printed++; - if (listStyle > 0){ - wsprintf(g_meas_data[id].netlist,L"%s%s",g_meas_data[id].netlist,buffer); - memset(buffer,'\0',128); - if (listStyle == 1 || listStyle == 3){ - //ADD PHY type - wsprintf(buffer,L" @%s", getDot11str(pwnl->Network[i].dot11PhyTypes[0],4)); - } - if (listStyle == 2 || listStyle == 3){ - //ADD cipher and authentication - wsprintf(buffer,L"%s (%s:%s)",buffer,getDot11str(pwnl->Network[i].dot11DefaultCipherAlgorithm,1) - ,getDot11str(pwnl->Network[i].dot11DefaultAuthAlgorithm,2)); - } - } - wsprintf(g_meas_data[id].netlist,L"%s%s\n",g_meas_data[id].netlist,buffer); + case PHY: + measure->statusString = GetDot11Str(wlan_cattr->wlanAssociationAttributes.dot11PhyType, 4); + break; + + case ENCRYPTION: + measure->statusString = GetDot11Str(wlan_cattr->wlanSecurityAttributes.dot11CipherAlgorithm, 1); + break; + + case AUTH: + measure->statusString = GetDot11Str(wlan_cattr->wlanSecurityAttributes.dot11AuthAlgorithm, 2); + break; + + default: // Invalid type + measure->statusString.clear(); + break; } - memset(buffer,'\0',128); - }//end for - bNetList=true; - break; - - case SSID: - if (ERROR_SUCCESS != dwCErr){ - bIntfError = true; - break; + WlanFreeMemory(wlan_cattr); } - //Need to convert ucSSID to wchar from uchar - mbstowcs(buffer,(char *)wlan_cattr->wlanAssociationAttributes.dot11Ssid.ucSSID,wlan_cattr->wlanAssociationAttributes.dot11Ssid.uSSIDLength); - //If not connected yet add current status - wcscat(buffer,getDot11str(wlan_cattr->isState,3)); - break; - - case PHY: - if (ERROR_SUCCESS != dwCErr){ - bIntfError = true; - break; - } - wcscpy(buffer,getDot11str(wlan_cattr->wlanAssociationAttributes.dot11PhyType,4)); - break; - - case ENCRYPTION: - if (ERROR_SUCCESS != dwCErr){ - bIntfError = true; - break; - } - wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11CipherAlgorithm,1)); - break; - - case AUTH: - if (ERROR_SUCCESS != dwCErr){ - bIntfError = true; - break; - } - wcscpy(buffer,getDot11str(wlan_cattr->wlanSecurityAttributes.dot11AuthAlgorithm,2)); - break; - - default: //InfoType does not refer to a string measure - bInvalidType= true; - break; - + } } - if (wlan_cattr!=NULL)WlanFreeMemory(wlan_cattr); - if (pwnl!=NULL)WlanFreeMemory(pwnl); - if (bNetList) - return g_meas_data[id].netlist; - if (bIntfError) - return L"-1"; - else { - if (bInvalidType) - return NULL; - else - return buffer; + return value; +} + + +PLUGIN_EXPORT LPCWSTR GetString(void* data) +{ + if (g_pInterface == NULL) return NULL; + + MeasureData* measure = (MeasureData*)data; + + switch (measure->type) + { + case LIST: + case SSID: + case PHY: + case ENCRYPTION: + case AUTH: + return measure->statusString.c_str(); + + default: + return NULL; + } +} + +PLUGIN_EXPORT void Finalize(void* data) +{ + MeasureData* measure = (MeasureData*)data; + delete measure; + + if (g_Instances > 0) + { + --g_Instances; + + if (g_Instances == 0) + { + FinalizeHandle(); + } } } @@ -368,134 +395,101 @@ LPCTSTR GetString(UINT id, UINT flags) -type of ENUM (cipher=1, auth=2, status=3, phy=4, otherwise=error strings) out: String to be returned by measure */ -LPCTSTR getDot11str(int dot11enum,int type){ - if (type ==1){ - switch(dot11enum){ - case DOT11_CIPHER_ALGO_NONE: - return L"NONE"; - case DOT11_CIPHER_ALGO_WEP40: - return L"WEP40"; - case DOT11_CIPHER_ALGO_TKIP: - return L"TKIP"; - case DOT11_CIPHER_ALGO_CCMP: - return L"AES"; - case DOT11_CIPHER_ALGO_WEP104: - return L"WEP104"; - case DOT11_CIPHER_ALGO_WPA_USE_GROUP: - return L"WPA-GROUP"; - case DOT11_CIPHER_ALGO_WEP: - return L"WEP"; - default: - return L"???"; - } - } - else if (type == 2){ - switch(dot11enum){ - case DOT11_AUTH_ALGO_80211_OPEN: - return L"Open"; - case DOT11_AUTH_ALGO_80211_SHARED_KEY: - return L"Shared"; - case DOT11_AUTH_ALGO_WPA_NONE: - return L"WPA-NONE"; - case DOT11_AUTH_ALGO_WPA: - return L"WPA-Enterprise"; - case DOT11_AUTH_ALGO_WPA_PSK: - return L"WPA-Personal"; - case DOT11_AUTH_ALGO_RSNA: - return L"WPA2-Enterprise"; - case DOT11_AUTH_ALGO_RSNA_PSK: - return L"WPA2-Personal"; - default: - return L"???"; - } - } - else if (type==3){ - switch(dot11enum){ - case wlan_interface_state_connected: - return L""; - case wlan_interface_state_authenticating: - return L"(authorizing...)"; - default: - return L"(connecting...)"; - } - } - else if (type==4){ - switch(dot11enum){ - case dot11_phy_type_unknown: - return L"???"; - case dot11_phy_type_dsss: - return L"DSSS"; - case dot11_phy_type_erp: - return L"802.11g"; - case dot11_phy_type_fhss: - return L"FHSS"; - case dot11_phy_type_hrdsss: - return L"802.11b"; - case dot11_phy_type_irbaseband: - return L"IR-Band"; - case dot11_phy_type_ofdm: - return L"802.11a"; - //Case below appears as dot11_phy_type_ht on MSDN - //However its not supported in winlanapi.h ??? - case 7: - return L"802.11n"; - default: - return L"???"; - } - } - else{ - switch(dot11enum){ - case ERROR_INVALID_PARAMETER: - return L"Invalid parameters"; - case ERROR_NOT_ENOUGH_MEMORY: - return L"Not enough memory"; - case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED: - return L"Too many handles already issued"; - default: - return L"Unknown error code"; - } - } -} - -/* - If the measure needs to free resources before quitting. - The plugin can export Finalize function, which is called - when Rainmeter quits (or refreshes). -*/ -void Finalize(HMODULE instance, UINT id) +LPCWSTR GetDot11Str(int dot11enum, int type) { - std::map::iterator i1 = g_meas_data.find(id); - if (i1 != g_meas_data.end()) + if (type == 1) { - free(g_meas_data[id].netlist); - g_meas_data[id].listInit = false; - g_meas_data.erase(i1); + switch (dot11enum) + { + case DOT11_CIPHER_ALGO_NONE: + return L"NONE"; + case DOT11_CIPHER_ALGO_WEP40: + return L"WEP40"; + case DOT11_CIPHER_ALGO_TKIP: + return L"TKIP"; + case DOT11_CIPHER_ALGO_CCMP: + return L"AES"; + case DOT11_CIPHER_ALGO_WEP104: + return L"WEP104"; + case DOT11_CIPHER_ALGO_WPA_USE_GROUP: + return L"WPA-GROUP"; + case DOT11_CIPHER_ALGO_WEP: + return L"WEP"; + default: + return L"???"; + } } - g_Instances--; - if (hClient != NULL && g_Instances == 0){ - WlanCloseHandle(hClient, NULL); - hClient = NULL; + else if (type == 2) + { + switch (dot11enum) + { + case DOT11_AUTH_ALGO_80211_OPEN: + return L"Open"; + case DOT11_AUTH_ALGO_80211_SHARED_KEY: + return L"Shared"; + case DOT11_AUTH_ALGO_WPA_NONE: + return L"WPA-NONE"; + case DOT11_AUTH_ALGO_WPA: + return L"WPA-Enterprise"; + case DOT11_AUTH_ALGO_WPA_PSK: + return L"WPA-Personal"; + case DOT11_AUTH_ALGO_RSNA: + return L"WPA2-Enterprise"; + case DOT11_AUTH_ALGO_RSNA_PSK: + return L"WPA2-Personal"; + default: + return L"???"; + } } - if (pIntfList != NULL && g_Instances == 0){ - WlanFreeMemory(pIntfList); - pIntfList = NULL; + else if (type == 3) + { + switch (dot11enum) + { + case wlan_interface_state_connected: + return L""; + case wlan_interface_state_authenticating: + return L"(authorizing...)"; + default: + return L"(connecting...)"; + } + } + else if (type == 4) + { + switch (dot11enum) + { + case dot11_phy_type_unknown: + default: + return L"???"; + case dot11_phy_type_dsss: + return L"DSSS"; + case dot11_phy_type_erp: + return L"802.11g"; + case dot11_phy_type_fhss: + return L"FHSS"; + case dot11_phy_type_hrdsss: + return L"802.11b"; + case dot11_phy_type_irbaseband: + return L"IR-Band"; + case dot11_phy_type_ofdm: + return L"802.11a"; + //Case below appears as dot11_phy_type_ht on MSDN + //However its not supported in winlanapi.h ??? + case 7: + return L"802.11n"; + } + } + else + { + switch (dot11enum) + { + case ERROR_INVALID_PARAMETER: + return L"Invalid parameters"; + case ERROR_NOT_ENOUGH_MEMORY: + return L"Not enough memory"; + case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED: + return L"Too many handles already issued"; + default: + return L"Unknown error code"; + } } } - -/* - Returns the version number of the plugin. The value - can be calculated like this: Major * 1000 + Minor. - So, e.g. 2.31 would be 2031. -*/ -UINT GetPluginVersion() -{ - return 1009; -} - -/* - Returns the author of the plugin for the about dialog. -*/ -LPCTSTR GetPluginAuthor() -{ - return L"nvme (shaivya.m@gmail.com)"; -}