Skip to content

Commit 35631d6

Browse files
committed
[WLANWIZ] Early implementation of connection mode/state
1 parent e9f1f20 commit 35631d6

File tree

4 files changed

+110
-2
lines changed

4 files changed

+110
-2
lines changed

dll/shellext/wlanwiz/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ add_library(wlanwiz MODULE
2626
set_module_type(wlanwiz win32dll UNICODE)
2727
set_target_cpp_properties(wlanwiz WITH_EXCEPTIONS)
2828
target_link_libraries(wlanwiz cpprt cppstl uuid atl_classes)
29-
add_importlibs(wlanwiz version gdi32 user32 advapi32 comctl32 ole32 msvcrt msimg32 kernel32 shell32 shlwapi ntdll uxtheme wlanapi)
29+
add_importlibs(wlanwiz version gdi32 user32 advapi32 comctl32 ole32 msvcrt msimg32 kernel32 shell32 shlwapi ntdll uxtheme wlanapi xmllite)
3030
add_cd_file(TARGET wlanwiz DESTINATION reactos/system32 FOR all)
3131
set_property(TARGET wlanwiz PROPERTY CXX_STANDARD 20)

dll/shellext/wlanwiz/draw.cpp

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* COPYRIGHT: Copyright 2024-2025 Vitaly Orekhov <[email protected]>
66
*/
77
#include "main.h"
8+
#include <xmllite.h>
89

910
LRESULT CWlanWizard::OnMeasureItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
1011
{
@@ -97,7 +98,7 @@ LRESULT CWlanWizard::OnDrawItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& b
9798
HICON hSidebarIcon = NULL;
9899

99100
wParam == IDC_WLANWIZ_PREFERRED_APS
100-
? hSidebarIcon = LoadIconW(GetModuleHandleW(L"shell32.dll"), MAKEINTRESOURCE(44)) /* 'Favorites' icon */
101+
? hSidebarIcon = LoadIconW(GetModuleHandleW(L"shell32.dll"), MAKEINTRESOURCE(IDI_SHELL32_FAVORITES))
101102
: hSidebarIcon = LoadIconW(wlanwiz_hInstance, MAKEINTRESOURCEW(wParam + 20));
102103

103104
DrawIconEx(this->hThemeEB ? hDCBtn : pdis->hDC,
@@ -374,6 +375,82 @@ LRESULT CWlanWizard::OnDrawItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& b
374375
DrawTextW(pdis->hDC, cswExpandedText, cswExpandedText.GetLength(), &rcExpandedText, DT_WORDBREAK | DT_LEFT);
375376
}
376377

378+
/* Connection state or preference as set in saved profile */
379+
ATL::CStringW cswConnState;
380+
GUID interfaceGuid;
381+
LPWSTR pstrProfileXml = NULL;
382+
DWORD dwFlags = 0, dwGrantedAccess = WLAN_READ_ACCESS;
383+
IIDFromString(this->m_sGUID, &interfaceGuid);
384+
385+
if ( wcslen(pWlanNetwork->strProfileName)
386+
&& SUCCEEDED(WlanGetProfile(this->hWlanClient, &interfaceGuid, pWlanNetwork->strProfileName, NULL, &pstrProfileXml, &dwFlags, &dwGrantedAccess))
387+
&& pstrProfileXml != NULL)
388+
{
389+
ATL::CComPtr<IStream> xmlStream = CreateDataStream(pstrProfileXml, wcslen(pstrProfileXml));
390+
ATL::CComPtr<IXmlReader> xmlReader;
391+
WlanFreeMemory(pstrProfileXml);
392+
393+
CreateXmlReader(IID_IXmlReader, reinterpret_cast<LPVOID*>(&xmlReader), 0);
394+
xmlReader->SetInput(xmlStream);
395+
396+
bool bNodeFound = false;
397+
XmlNodeType xnType = XmlNodeType_None;
398+
while (!bNodeFound)
399+
{
400+
LPCWSTR pwszLocalName;
401+
xmlReader->Read(&xnType);
402+
403+
switch(xnType)
404+
{
405+
case XmlNodeType_Element:
406+
{
407+
xmlReader->GetLocalName(&pwszLocalName, NULL);
408+
409+
if (pwszLocalName && wcsicmp(pwszLocalName, L"connectionMode") == 0)
410+
{
411+
LPCWSTR pwszConnectionMode;
412+
xmlReader->GetValue(&pwszConnectionMode, NULL);
413+
414+
cswConnState.LoadStringW(wcsicmp(pwszConnectionMode, L"auto") == 0
415+
? IDS_WLANWIZ_CONNECTED_AUTO
416+
: IDS_WLANWIZ_CONNECTED_MANU);
417+
418+
RECT rcConnMode =
419+
{
420+
.left = pdis->rcItem.right - 70,
421+
.top = pdis->rcItem.top + 3,
422+
.right = pdis->rcItem.right - 25,
423+
.bottom = pdis->rcItem.top + 22
424+
};
425+
426+
DrawTextW(pdis->hDC, cswConnState, cswConnState.GetLength(), &rcConnMode, DT_RIGHT);
427+
428+
HICON hFav = LoadIconW(GetModuleHandleW(L"shell32.dll"), MAKEINTRESOURCE(IDI_SHELL32_FAVORITES));
429+
430+
DrawIconEx(pdis->hDC,
431+
pdis->rcItem.right - 20, pdis->rcItem.top + 3,
432+
hFav,
433+
16, 16,
434+
0,
435+
0,
436+
DI_NORMAL
437+
);
438+
439+
DestroyIcon(hFav);
440+
bNodeFound = true;
441+
}
442+
443+
break;
444+
}
445+
default:
446+
break;
447+
}
448+
}
449+
450+
xmlReader.Release();
451+
xmlStream.Release();
452+
}
453+
377454
SetTextColor(pdis->hDC, crItemText);
378455

379456
/* Shrink focus rectangle for listbox items */

dll/shellext/wlanwiz/helpers.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,33 @@ HWND CWlanWizard::CreateToolTip(_In_ int nID)
8282
hWndTip.SendMessageW(TTM_ADDTOOL, NULL, reinterpret_cast<LPARAM>(&toolInfo));
8383

8484
return hWndTip;
85+
}
86+
87+
ATL::CComPtr<IStream> CWlanWizard::CreateDataStream(const PVOID pvData, size_t size)
88+
{
89+
ATL::CComPtr<IStream> stream;
90+
HRESULT hr;
91+
92+
HGLOBAL hGlobal = GlobalAlloc(GHND, size);
93+
94+
if (FAILED(HRESULT_FROM_WIN32(GetLastError())))
95+
{
96+
DPRINT1("GlobalAlloc failed: 0x%lx\n", HRESULT_FROM_WIN32(GetLastError()));
97+
return nullptr;
98+
}
99+
100+
PVOID ptr = GlobalLock(hGlobal);
101+
memcpy(ptr, pvData, size);
102+
103+
hr = CreateStreamOnHGlobal(hGlobal, TRUE, &stream);
104+
105+
if (FAILED(hr))
106+
{
107+
DPRINT1("CreateStreamOnHGlobal failed: 0x%lx\n", hr);
108+
return nullptr;
109+
}
110+
111+
GlobalUnlock(hGlobal);
112+
113+
return stream;
85114
}

dll/shellext/wlanwiz/main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "resource.h"
3434

3535
#define IDT_SCANNING_NETWORKS 700
36+
#define IDI_SHELL32_FAVORITES 44
3637

3738
enum WLAN_SCAN_STATES
3839
{
@@ -200,6 +201,7 @@ class CWlanWizard : public CDialogImpl<CWlanWizard>
200201
HWND CreateToolTip(_In_ int toolID);
201202
static DWORD WINAPI ScanNetworksThread(_In_ LPVOID lpParameter);
202203
static ATL::CStringW APNameToUnicode(_In_ PDOT11_SSID dot11Ssid);
204+
static ATL::CComPtr<IStream> CreateDataStream(const PVOID pvData, size_t size);
203205
void TryInsertToAdHoc(_Inout_ std::set<DWORD>& setAdHoc, _In_ DWORD dwIndex);
204206
void TryInsertToKnown(_Inout_ std::set<DWORD>& setProfiles, _In_ DWORD dwIndex);
205207
DWORD TryFindConnected(_In_ DWORD dwIndex);

0 commit comments

Comments
 (0)