Skip to content

Commit 10daaae

Browse files
committed
[WLANWIZ] Start working on filtering scan results
1 parent fb46bd1 commit 10daaae

File tree

2 files changed

+89
-22
lines changed

2 files changed

+89
-22
lines changed

dll/shellext/wlanwiz/main.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
*/
77

88
#pragma once
9+
#include <set>
10+
911
#include <atlbase.h>
1012
#include <atlcoll.h>
1113
#include <atlconv.h>
@@ -168,6 +170,9 @@ class CWlanWizard : public CDialogImpl<CWlanWizard>
168170

169171
HWND CreateToolTip(int toolID);
170172
static DWORD WINAPI ScanNetworksThread(_In_ LPVOID lpParameter);
173+
void TryInsertToAdHoc(std::set<DWORD>& setAdHoc, DWORD dwIndex);
174+
void TryInsertToKnown(std::set<DWORD>& setProfiles, DWORD dwIndex);
175+
DWORD TryFindConnected(DWORD dwIndex);
171176

172177
LRESULT OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
173178
LRESULT OnDrawItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

dll/shellext/wlanwiz/scan.cpp

Lines changed: 84 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,51 @@
99

1010
#include <algorithm>
1111
#include <numeric>
12-
#include <set>
1312
#include <string>
1413
#include <vector>
1514

15+
/* Convert SSID from UTF-8 to UTF-16 */
16+
static ATL::CStringW APNameToUnicode(PDOT11_SSID dot11Ssid)
17+
{
18+
int iSSIDLengthWide = MultiByteToWideChar(CP_UTF8, 0, reinterpret_cast<LPCSTR>(dot11Ssid->ucSSID), dot11Ssid->uSSIDLength, NULL, 0);
19+
20+
ATL::CStringW cswSSID = ATL::CStringW(L"", iSSIDLengthWide);
21+
MultiByteToWideChar(CP_UTF8, 0, reinterpret_cast<LPCSTR>(dot11Ssid->ucSSID), dot11Ssid->uSSIDLength, cswSSID.GetBuffer(), iSSIDLengthWide);
22+
23+
return cswSSID;
24+
}
25+
26+
void CWlanWizard::TryInsertToKnown(std::set<DWORD>& setProfiles, DWORD dwIndex)
27+
{
28+
PWLAN_AVAILABLE_NETWORK pWlanNetwork = &this->lstWlanNetworks->Network[dwIndex];
29+
30+
if ((pWlanNetwork->dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE) == WLAN_AVAILABLE_NETWORK_HAS_PROFILE)
31+
{
32+
std::wstring_view wsvSSID = APNameToUnicode(&pWlanNetwork->dot11Ssid);
33+
34+
if (wsvSSID == pWlanNetwork->strProfileName)
35+
setProfiles.insert(dwIndex);
36+
}
37+
}
38+
39+
void CWlanWizard::TryInsertToAdHoc(std::set<DWORD>& setAdHoc, DWORD dwIndex)
40+
{
41+
PWLAN_AVAILABLE_NETWORK pWlanNetwork = &this->lstWlanNetworks->Network[dwIndex];
42+
43+
if (pWlanNetwork->dot11BssType == dot11_BSS_type_independent)
44+
setAdHoc.insert(dwIndex);
45+
}
46+
47+
DWORD CWlanWizard::TryFindConnected(DWORD dwIndex)
48+
{
49+
PWLAN_AVAILABLE_NETWORK pWlanNetwork = &this->lstWlanNetworks->Network[dwIndex];
50+
51+
if ((pWlanNetwork->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED) == WLAN_AVAILABLE_NETWORK_CONNECTED)
52+
return dwIndex;
53+
54+
return MAXDWORD;
55+
}
56+
1657
LRESULT CWlanWizard::OnScanNetworks(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
1758
{
1859
MSG msg;
@@ -90,54 +131,75 @@ LRESULT CWlanWizard::OnScanNetworks(WORD wNotifyCode, WORD wID, HWND hWndCtl, BO
90131

91132
m_SidebarButtonAS.EnableWindow();
92133
m_SidebarButtonSN.EnableWindow();
93-
94-
DPRINT("Discovered %lu access points\n", this->lstWlanNetworks->dwNumberOfItems);
95134

96135
if (this->lstWlanNetworks->dwNumberOfItems > 0)
97136
{
98137
auto vecIndexesBySignalQuality = std::vector<DWORD>(this->lstWlanNetworks->dwNumberOfItems);
99138
DWORD dwConnectedTo = MAXDWORD;
100139
std::set<DWORD> setDiscoveredAdHocIndexes;
140+
std::set<DWORD> setAPsWithProfiles;
101141
std::iota(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), 0);
102142

103143
/* Sort networks by signal level */
104-
std::sort(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), [&](DWORD left, DWORD right)
144+
std::sort(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), [&](auto left, auto right)
105145
{
106-
WLAN_AVAILABLE_NETWORK wlanLeft = this->lstWlanNetworks->Network[left];
107-
WLAN_AVAILABLE_NETWORK wlanRight = this->lstWlanNetworks->Network[right];
146+
TryInsertToAdHoc(setDiscoveredAdHocIndexes, left);
147+
TryInsertToAdHoc(setDiscoveredAdHocIndexes, right);
148+
149+
/* Try to determine if we are connected currently to anything.
150+
* Once found, these two steps are skipped. */
151+
if (dwConnectedTo == MAXDWORD)
152+
dwConnectedTo = TryFindConnected(left);
108153

109-
if (wlanLeft.dot11BssType == dot11_BSS_type_independent)
110-
setDiscoveredAdHocIndexes.insert(left);
154+
if (dwConnectedTo == MAXDWORD)
155+
dwConnectedTo = TryFindConnected(right);
111156

112-
if (wlanLeft.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)
113-
dwConnectedTo = left;
157+
/* Count network as known if it fully matches SSID with profile name */
158+
TryInsertToKnown(setAPsWithProfiles, left);
159+
TryInsertToKnown(setAPsWithProfiles, right);
114160

115-
return wlanLeft.wlanSignalQuality > wlanRight.wlanSignalQuality;
161+
return this->lstWlanNetworks->Network[left].wlanSignalQuality > this->lstWlanNetworks->Network[right].wlanSignalQuality;
116162
});
117163

118-
/* Shift all ad hoc networks to end */
119-
if (setDiscoveredAdHocIndexes.size() > 0)
164+
/* Remove networks that do not have profile name exactly matching SSID */
165+
for (const auto& dwKnownAPIdx : setAPsWithProfiles)
120166
{
121-
for (const auto& dwAdHocIdx : setDiscoveredAdHocIndexes)
167+
WLAN_AVAILABLE_NETWORK wlanNetWithProfile = this->lstWlanNetworks->Network[dwKnownAPIdx];
168+
169+
vecIndexesBySignalQuality.erase(std::remove_if(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), [&](const DWORD& dwAP)
122170
{
123-
auto iter = std::find(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), dwAdHocIdx);
171+
bool bSameNetwork = dwKnownAPIdx == dwAP;
172+
bool bProfileNameIsSSID = std::wstring_view(wlanNetWithProfile.strProfileName) == std::wstring_view(APNameToUnicode(&this->lstWlanNetworks->Network[dwAP].dot11Ssid));
173+
174+
return !bSameNetwork && !bProfileNameIsSSID;
175+
}), vecIndexesBySignalQuality.end());
176+
}
177+
178+
DPRINT("Discovered %lu access points (%d are known)\n", this->lstWlanNetworks->dwNumberOfItems, setAPsWithProfiles.size());
179+
180+
/* Shift all ad hoc networks to end */
181+
for (const auto& dwAdHocIdx : setDiscoveredAdHocIndexes)
182+
{
183+
auto iter = std::find(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), dwAdHocIdx);
124184

125-
if (iter != vecIndexesBySignalQuality.end())
126-
{
127-
auto idx = iter - vecIndexesBySignalQuality.begin();
128-
std::rotate(vecIndexesBySignalQuality.begin() + idx, vecIndexesBySignalQuality.begin() + idx + 1, vecIndexesBySignalQuality.end());
129-
}
185+
if (iter != vecIndexesBySignalQuality.end())
186+
{
187+
auto idx = iter - vecIndexesBySignalQuality.begin();
188+
std::rotate(vecIndexesBySignalQuality.begin() + idx, vecIndexesBySignalQuality.begin() + idx + 1, vecIndexesBySignalQuality.end());
130189
}
131190
}
132191

133192
/* Finally, move currently connected network to beginning */
134193
if (dwConnectedTo != MAXDWORD)
135194
{
136195
auto connectedIdx = std::find(vecIndexesBySignalQuality.begin(), vecIndexesBySignalQuality.end(), dwConnectedTo) - vecIndexesBySignalQuality.begin();
137-
std::rotate(vecIndexesBySignalQuality.begin() + connectedIdx, vecIndexesBySignalQuality.begin() + connectedIdx + 1, vecIndexesBySignalQuality.end());
196+
auto middle = connectedIdx + 1 <= vecIndexesBySignalQuality.size()
197+
? vecIndexesBySignalQuality.begin() + connectedIdx + 1
198+
: vecIndexesBySignalQuality.end();
199+
200+
std::rotate(vecIndexesBySignalQuality.begin() + connectedIdx, middle, vecIndexesBySignalQuality.end());
138201
}
139202

140-
/* TODO: remove networks that do not have a saved profile matching the SSID */
141203
for (const auto& dwNetwork : vecIndexesBySignalQuality)
142204
{
143205
WLAN_AVAILABLE_NETWORK wlanNetwork = this->lstWlanNetworks->Network[dwNetwork];

0 commit comments

Comments
 (0)