6 /// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E}
7 // IID B722BCCB-4E68-101B-A2BC-00AA00404770
9 #define WM_SHOWSTATUSDLG (WM_USER+10)
11 typedef struct tagNotificationItem
13 struct tagNotificationItem
*pNext
;
23 HWND hwndStatusDlg
; /* LanStatusDlg window */
24 HWND hwndDlg
; /* status dialog window */
35 } LANSTATUSUI_CONTEXT
;
37 class CLanStatus final
:
38 public IOleCommandTarget
44 virtual HRESULT WINAPI
QueryInterface(REFIID riid
, LPVOID
*ppvOut
);
45 virtual ULONG WINAPI
AddRef();
46 virtual ULONG WINAPI
Release();
49 virtual HRESULT WINAPI
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD
*prgCmds
, OLECMDTEXT
*pCmdText
);
50 virtual HRESULT WINAPI
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
53 HRESULT
InitializeNetTaskbarNotifications();
54 HRESULT
ShowStatusDialogByCLSID(const GUID
*pguidCmdGroup
);
56 INetConnectionManager
*m_lpNetMan
;
58 NOTIFICATION_ITEM
*m_pHead
;
61 CLanStatus::CLanStatus() :
72 LANSTATUSUI_CONTEXT
*pContext
)
74 WCHAR szFormat
[MAX_PATH
] = {0};
75 WCHAR szBuffer
[MAX_PATH
] = {0};
76 SYSTEMTIME TimeConnected
;
77 DWORD DurationSeconds
;
88 if (IfEntry
->dwSpeed
< 1000)
90 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_BIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
92 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
);
93 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
96 else if (IfEntry
->dwSpeed
< 1000000)
98 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_KBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
100 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000);
101 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
104 else if (IfEntry
->dwSpeed
< 1000000000)
106 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_MBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
108 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000);
109 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
114 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_GBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
116 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000000);
117 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
121 if (StrFormatByteSizeW(IfEntry
->dwInOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
123 SendDlgItemMessageW(hwndDlg
, IDC_RECEIVED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
126 if (StrFormatByteSizeW(IfEntry
->dwOutOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
128 SendDlgItemMessageW(hwndDlg
, IDC_SEND
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
132 Ticks
= GetTickCount64();
134 Ticks
= GetTickCount();
137 DurationSeconds
= Ticks
/ 1000;
138 TimeConnected
.wSecond
= (DurationSeconds
% 60);
139 TimeConnected
.wMinute
= (DurationSeconds
/ 60) % 60;
140 TimeConnected
.wHour
= (DurationSeconds
/ (60 * 60)) % 24;
141 TimeConnected
.wDay
= DurationSeconds
/ (60 * 60 * 24);
143 if (!GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &TimeConnected
, L
"HH':'mm':'ss", LocBuffer
, sizeof(LocBuffer
) / sizeof(LocBuffer
[0])))
146 if (!TimeConnected
.wDay
)
148 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)LocBuffer
);
152 if (TimeConnected
.wDay
== 1)
154 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAY
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
155 DayBuffer
[0] = L
'\0';
159 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAYS
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
160 DayBuffer
[0] = L
'\0';
162 swprintf(Buffer
, DayBuffer
, TimeConnected
.wDay
, LocBuffer
);
163 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)Buffer
);
169 UpdateLanStatus(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
172 HICON hIcon
, hOldIcon
= NULL
;
174 NETCON_PROPERTIES
* pProperties
= NULL
;
176 ZeroMemory(&IfEntry
, sizeof(IfEntry
));
177 IfEntry
.dwIndex
= pContext
->dwAdapterIndex
;
178 if (GetIfEntry(&IfEntry
) != NO_ERROR
)
184 if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_CONNECTED
|| IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_OPERATIONAL
)
186 if (pContext
->dwInOctets
== IfEntry
.dwInOctets
&& pContext
->dwOutOctets
== IfEntry
.dwOutOctets
&& pContext
->Status
!= 0)
188 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_SHARED
);
189 pContext
->Status
= 0;
191 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 1)
193 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANSREC
), IMAGE_ICON
, 32, 32, LR_SHARED
);
194 pContext
->Status
= 1;
196 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->Status
!= 2)
198 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_REC
), IMAGE_ICON
, 32, 32, LR_SHARED
);
199 pContext
->Status
= 2;
201 else if (pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 3)
203 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANS
), IMAGE_ICON
, 32, 32, LR_SHARED
);
204 pContext
->Status
= 3;
207 else if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_UNREACHABLE
|| IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_DISCONNECTED
)
209 if (pContext
->Status
!= 4)
211 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_SHARED
);
212 pContext
->Status
= 4;
215 else if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_NON_OPERATIONAL
)
217 if (pContext
->Status
!= 5)
219 hIcon
= (HICON
)LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_SHARED
);
220 pContext
->Status
= 5;
224 if (hwndDlg
&& hIcon
)
226 hOldIcon
= (HICON
)SendDlgItemMessageW(hwndDlg
, IDC_NETSTAT
, STM_SETICON
, (WPARAM
)hIcon
, 0);
228 DestroyIcon(hOldIcon
);
231 ZeroMemory(&nid
, sizeof(nid
));
232 nid
.cbSize
= sizeof(nid
);
233 nid
.uID
= pContext
->uID
;
234 nid
.hWnd
= pContext
->hwndStatusDlg
;
235 nid
.uVersion
= NOTIFYICON_VERSION
;
237 if (pContext
->pNet
->GetProperties(&pProperties
) == S_OK
)
239 if (pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
242 nid
.hIcon
= (HICON
)CopyImage(hIcon
, IMAGE_ICON
, 16, 16, LR_COPYFROMRESOURCE
);
247 nid
.uFlags
|= NIF_ICON
;
249 nid
.uFlags
|= NIF_STATE
;
251 nid
.dwStateMask
= NIS_HIDDEN
;
253 if (pProperties
->pszwName
)
255 if (wcslen(pProperties
->pszwName
) * sizeof(WCHAR
) < sizeof(nid
.szTip
))
257 nid
.uFlags
|= NIF_TIP
;
258 wcscpy(nid
.szTip
, pProperties
->pszwName
);
262 CopyMemory(nid
.szTip
, pProperties
->pszwName
, sizeof(nid
.szTip
) - sizeof(WCHAR
));
263 nid
.szTip
[(sizeof(nid
.szTip
)/sizeof(WCHAR
))-1] = L
'\0';
264 nid
.uFlags
|= NIF_TIP
;
270 nid
.uFlags
|= NIF_STATE
;
271 nid
.dwState
= NIS_HIDDEN
;
272 nid
.dwStateMask
= NIS_HIDDEN
;
275 NcFreeNetconProperties(pProperties
);
278 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
280 if (nid
.uFlags
& NIF_ICON
)
281 DestroyIcon(nid
.hIcon
);
283 pContext
->dwInOctets
= IfEntry
.dwInOctets
;
284 pContext
->dwOutOctets
= IfEntry
.dwOutOctets
;
287 UpdateLanStatusUiDlg(hwndDlg
, &IfEntry
, pContext
);
292 InitializeLANStatusUiDlg(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
294 WCHAR szBuffer
[MAX_PATH
] = {0};
295 NETCON_PROPERTIES
* pProperties
;
297 if (pContext
->pNet
->GetProperties(&pProperties
) != S_OK
)
300 if (pProperties
->Status
== NCS_DISCONNECTED
)
301 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, szBuffer
, MAX_PATH
);
302 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
303 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, szBuffer
, MAX_PATH
);
304 else if (pProperties
->Status
== NCS_CONNECTING
)
305 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, szBuffer
, MAX_PATH
);
306 else if (pProperties
->Status
== NCS_CONNECTED
)
307 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, szBuffer
, MAX_PATH
);
309 SendDlgItemMessageW(hwndDlg
, IDC_STATUS
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
311 pContext
->dwInOctets
= 0;
312 pContext
->dwOutOctets
= 0;
314 /* update adapter info */
315 pContext
->Status
= -1;
316 UpdateLanStatus(hwndDlg
, pContext
);
317 NcFreeNetconProperties(pProperties
);
322 InsertColumnToListView(
331 if (!LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
334 memset(&lc
, 0, sizeof(LV_COLUMN
) );
335 lc
.mask
= LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
336 lc
.iSubItem
= SubItem
;
337 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
339 lc
.cchTextMax
= wcslen(szBuffer
);
340 lc
.pszText
= szBuffer
;
342 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, SubItem
, (LPARAM
)&lc
);
347 AddIPAddressToListView(
349 PIP_ADDR_STRING pAddr
,
353 PIP_ADDR_STRING pCur
;
357 ZeroMemory(&li
, sizeof(LVITEMW
));
367 ZeroMemory(&li
, sizeof(LVITEMW
));
371 li
.pszText
= (LPWSTR
)L
"";
372 li
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
375 if (MultiByteToWideChar(CP_ACP
, 0, pCur
->IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
377 li
.pszText
= szBuffer
;
380 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
384 } while (pCur
&& pCur
->IpAddress
.String
[0]);
389 InsertItemToListView(
396 ZeroMemory(&li
, sizeof(LVITEMW
));
398 li
.iItem
= ListView_GetItemCount(hDlgCtrl
);
399 if (LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
401 li
.pszText
= szBuffer
;
402 return (INT
)SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
410 LANStatusUiDetailsDlg(
417 LANSTATUSUI_CONTEXT
* pContext
;
420 PIP_ADAPTER_INFO pAdapterInfo
, pCurAdapter
;
421 PIP_PER_ADAPTER_INFO pPerAdapter
;
429 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
431 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_DETAILS
);
433 /* get client rect */
434 GetClientRect(hDlgCtrl
, &rect
);
436 /* calculate column width */
437 dwSize
= rect
.right
/ 2;
439 InsertColumnToListView(hDlgCtrl
, IDS_PROPERTY
, 0, dwSize
);
440 InsertColumnToListView(hDlgCtrl
, IDS_VALUE
, 1, dwSize
);
445 if (GetAdaptersInfo(NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
447 pAdapterInfo
= static_cast<PIP_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
450 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) == NO_ERROR
)
452 pCurAdapter
= pAdapterInfo
;
453 while (pCurAdapter
&& pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
454 pCurAdapter
= pCurAdapter
->Next
;
456 if (pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
462 ZeroMemory(&li
, sizeof(LVITEMW
));
465 li
.pszText
= szBuffer
;
469 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_PHYSICAL_ADDRESS
);
472 swprintf(szBuffer
, L
"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter
->Address
[0], pCurAdapter
->Address
[1],
473 pCurAdapter
->Address
[2], pCurAdapter
->Address
[3], pCurAdapter
->Address
[4], pCurAdapter
->Address
[5]);
474 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
476 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_IP_ADDRESS
);
478 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
479 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
481 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_SUBNET_MASK
);
483 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpMask
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
484 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
486 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DEF_GATEWAY
);
487 if (li
.iItem
>= 0 && pCurAdapter
->GatewayList
.IpAddress
.String
[0] != '0')
489 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->GatewayList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
490 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
493 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_OBTAINED
);
494 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_EXPIRES
);
499 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
501 pPerAdapter
= static_cast<PIP_PER_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
504 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, pPerAdapter
, &dwSize
) == ERROR_SUCCESS
)
506 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DNS_SERVERS
);
508 AddIPAddressToListView(hDlgCtrl
, &pPerAdapter
->DnsServerList
, li
.iItem
);
510 CoTaskMemFree(pPerAdapter
);
516 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_WINS_SERVERS
);
517 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->PrimaryWinsServer
, li
.iItem
);
518 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->SecondaryWinsServer
, li
.iItem
+1);
521 CoTaskMemFree(pAdapterInfo
);
524 if (LOWORD(wParam
) == IDC_CLOSE
)
526 EndDialog(hwndDlg
, FALSE
);
535 LANStatusUiAdvancedDlg(
541 WCHAR szBuffer
[100] = {0};
543 LANSTATUSUI_CONTEXT
* pContext
;
550 page
= (PROPSHEETPAGE
*)lParam
;
551 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
552 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
553 if (pContext
->DHCPEnabled
)
554 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_DHCP
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
556 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_MANUAL
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
558 szBuffer
[(sizeof(szBuffer
)/sizeof(WCHAR
))-1] = L
'\0';
559 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSTYPE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
562 dwIpAddr
= ntohl(pContext
->IpAddress
);
563 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
564 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
565 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSIP
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
567 dwIpAddr
= ntohl(pContext
->SubnetMask
);
568 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
569 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
570 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSSUBNET
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
572 dwIpAddr
= ntohl(pContext
->Gateway
);
575 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
576 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
577 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSGATEWAY
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
581 if (LOWORD(wParam
) == IDC_DETAILS
)
583 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
586 DialogBoxParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS
), GetParent(hwndDlg
),
587 LANStatusUiDetailsDlg
, (LPARAM
)pContext
);
598 FindNetworkAdapter(HDEVINFO hInfo
, SP_DEVINFO_DATA
*pDevInfo
, LPWSTR pGuid
)
600 DWORD dwIndex
, dwSize
;
603 WCHAR szDetail
[200] = L
"SYSTEM\\CurrentControlSet\\Control\\Class\\";
609 ZeroMemory(pDevInfo
, sizeof(SP_DEVINFO_DATA
));
610 pDevInfo
->cbSize
= sizeof(SP_DEVINFO_DATA
);
612 /* get device info */
613 if (!SetupDiEnumDeviceInfo(hInfo
, dwIndex
++, pDevInfo
))
616 /* get device software registry path */
617 if (!SetupDiGetDeviceRegistryPropertyW(hInfo
, pDevInfo
, SPDRP_DRIVER
, NULL
, (LPBYTE
)&szDetail
[39], sizeof(szDetail
)/sizeof(WCHAR
) - 40, &dwSize
))
620 /* open device registry key */
621 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szDetail
, 0, KEY_READ
, &hSubKey
) != ERROR_SUCCESS
)
624 /* query NetCfgInstanceId for current device */
625 dwSize
= sizeof(szNetCfg
);
626 if (RegQueryValueExW(hSubKey
, L
"NetCfgInstanceId", NULL
, NULL
, (LPBYTE
)szNetCfg
, &dwSize
) != ERROR_SUCCESS
)
628 RegCloseKey(hSubKey
);
631 RegCloseKey(hSubKey
);
632 if (!_wcsicmp(pGuid
, szNetCfg
))
642 DisableNetworkAdapter(INetConnection
* pNet
, LANSTATUSUI_CONTEXT
* pContext
, HWND hwndDlg
)
645 NETCON_PROPERTIES
* pProperties
;
646 LPOLESTR pDisplayName
;
648 DWORD dwSize
, dwType
;
651 SP_DEVINFO_DATA DevInfo
;
652 SP_PROPCHANGE_PARAMS PropChangeParams
;
656 if (FAILED(pNet
->GetProperties(&pProperties
)))
660 hInfo
= SetupDiGetClassDevsW(&GUID_DEVCLASS_NET
, NULL
, NULL
, DIGCF_PRESENT
);
663 NcFreeNetconProperties(pProperties
);
667 if (FAILED(StringFromCLSID((CLSID
)pProperties
->guidId
, &pDisplayName
)))
669 NcFreeNetconProperties(pProperties
);
670 SetupDiDestroyDeviceInfoList(hInfo
);
673 NcFreeNetconProperties(pProperties
);
675 if (FindNetworkAdapter(hInfo
, &DevInfo
, pDisplayName
))
677 PropChangeParams
.ClassInstallHeader
.cbSize
= sizeof(SP_CLASSINSTALL_HEADER
);
678 PropChangeParams
.ClassInstallHeader
.InstallFunction
= DIF_PROPERTYCHANGE
; //;
679 PropChangeParams
.StateChange
= DICS_DISABLE
;
680 PropChangeParams
.Scope
= DICS_FLAG_CONFIGSPECIFIC
;
681 PropChangeParams
.HwProfile
= 0;
683 if (SetupDiSetClassInstallParams(hInfo
, &DevInfo
, &PropChangeParams
.ClassInstallHeader
, sizeof(SP_PROPCHANGE_PARAMS
)))
685 if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE
, hInfo
, &DevInfo
))
689 SetupDiDestroyDeviceInfoList(hInfo
);
691 swprintf(szPath
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName
);
692 CoTaskMemFree(pDisplayName
);
694 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
698 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, NULL
, &dwSize
) != ERROR_SUCCESS
|| dwType
!= REG_SZ
)
704 pPnp
= static_cast<PWSTR
>(CoTaskMemAlloc(dwSize
));
711 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, (LPBYTE
)pPnp
, &dwSize
) != ERROR_SUCCESS
)
719 swprintf(szPath
, L
"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp
);
722 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, NULL
, 0, KEY_WRITE
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
725 dwSize
= 1; /* enable = 0, disable = 1 */
726 RegSetValueExW(hKey
, L
"CSConfigFlags", 0, REG_DWORD
, (LPBYTE
)&dwSize
, sizeof(DWORD
));
732 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_CANCEL
);
733 ZeroMemory(&nid
, sizeof(nid
));
734 nid
.cbSize
= sizeof(nid
);
735 nid
.uID
= pContext
->uID
;
736 nid
.hWnd
= pContext
->hwndDlg
;
737 nid
.uFlags
= NIF_STATE
;
738 nid
.dwState
= NIS_HIDDEN
;
739 nid
.dwStateMask
= NIS_HIDDEN
;
741 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
754 LANSTATUSUI_CONTEXT
* pContext
;
760 page
= (PROPSHEETPAGE
*)lParam
;
761 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
762 pContext
->hwndDlg
= hwndDlg
;
763 InitializeLANStatusUiDlg(hwndDlg
, pContext
);
764 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
767 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
768 if (LOWORD(wParam
) == IDC_STATUS_PROPERTIES
)
772 ShowNetConnectionProperties(pContext
->pNet
, GetParent(pContext
->hwndDlg
));
773 BringWindowToTop(GetParent(pContext
->hwndDlg
));
777 else if (LOWORD(wParam
) == IDC_ENDISABLE
)
779 DisableNetworkAdapter(pContext
->pNet
, pContext
, hwndDlg
);
783 lppsn
= (LPPSHNOTIFY
) lParam
;
784 if (lppsn
->hdr
.code
== PSN_APPLY
|| lppsn
->hdr
.code
== PSN_RESET
)
786 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
787 SetWindowLongPtr(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
788 pContext
->hwndDlg
= NULL
;
797 InitializePropertyDialog(
798 LANSTATUSUI_CONTEXT
* pContext
,
799 NETCON_PROPERTIES
* pProperties
)
801 DWORD dwSize
, dwAdapterIndex
, dwResult
;
803 IP_ADAPTER_INFO
*pAdapterInfo
, *pCurAdapter
;
805 if (FAILED(StringFromCLSID((CLSID
)pProperties
->guidId
, &pStr
)))
810 /* get the IfTable */
812 dwResult
= GetAdaptersInfo(NULL
, &dwSize
);
813 if (dwResult
!= ERROR_BUFFER_OVERFLOW
)
819 pAdapterInfo
= static_cast<PIP_ADAPTER_INFO
>(CoTaskMemAlloc(dwSize
));
822 CoTaskMemFree(pAdapterInfo
);
827 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) != NO_ERROR
)
829 CoTaskMemFree(pAdapterInfo
);
834 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo
, pStr
, &dwAdapterIndex
))
836 CoTaskMemFree(pAdapterInfo
);
841 pCurAdapter
= pAdapterInfo
;
842 while (pCurAdapter
->Index
!= dwAdapterIndex
)
843 pCurAdapter
= pCurAdapter
->Next
;
846 pContext
->IpAddress
= inet_addr(pCurAdapter
->IpAddressList
.IpAddress
.String
);
847 pContext
->SubnetMask
= inet_addr(pCurAdapter
->IpAddressList
.IpMask
.String
);
848 pContext
->Gateway
= inet_addr(pCurAdapter
->GatewayList
.IpAddress
.String
);
849 pContext
->DHCPEnabled
= pCurAdapter
->DhcpEnabled
;
851 CoTaskMemFree(pAdapterInfo
);
852 pContext
->dwAdapterIndex
= dwAdapterIndex
;
856 ShowStatusPropertyDialog(
857 LANSTATUSUI_CONTEXT
*pContext
,
860 HPROPSHEETPAGE hppages
[2];
861 PROPSHEETHEADERW pinfo
;
862 NETCON_PROPERTIES
* pProperties
= NULL
;
864 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
865 ZeroMemory(hppages
, sizeof(hppages
));
866 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
867 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
868 pinfo
.phpage
= hppages
;
869 pinfo
.hwndParent
= hwndDlg
;
871 if (pContext
->pNet
->GetProperties(&pProperties
) == S_OK
)
873 if (pProperties
->pszwName
)
875 pinfo
.pszCaption
= pProperties
->pszwName
;
876 pinfo
.dwFlags
|= PSH_PROPTITLE
;
878 InitializePropertyDialog(pContext
, pProperties
);
879 if (pProperties
->MediaType
== NCM_LAN
&& pProperties
->Status
== NCS_CONNECTED
)
881 hppages
[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS
), LANStatusUiDlg
, (LPARAM
)pContext
, NULL
);
885 hppages
[pinfo
.nPages
] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED
), LANStatusUiAdvancedDlg
, (LPARAM
)pContext
, NULL
);
886 if (hppages
[pinfo
.nPages
])
891 PropertySheetW(&pinfo
);
894 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
||
895 pProperties
->Status
== NCS_HARDWARE_DISABLED
)
897 ShowNetConnectionProperties(pContext
->pNet
, pContext
->hwndDlg
);
900 NcFreeNetconProperties(pProperties
);
912 LANSTATUSUI_CONTEXT
* pContext
;
917 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
918 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)lParam
);
919 pContext
->nIDEvent
= SetTimer(hwndDlg
, 0xFABC, 1000, NULL
);
922 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
923 if (wParam
== (WPARAM
)pContext
->nIDEvent
)
925 UpdateLanStatus(pContext
->hwndDlg
, pContext
);
928 case WM_SHOWSTATUSDLG
:
929 if (LOWORD(lParam
) == WM_LBUTTONDOWN
)
931 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
935 if (pContext
->hwndDlg
)
937 ShowWindow(GetParent(pContext
->hwndDlg
), SW_SHOW
);
938 BringWindowToTop(GetParent(pContext
->hwndDlg
));
942 ShowStatusPropertyDialog(pContext
, hwndDlg
);
952 CLanStatus::InitializeNetTaskbarNotifications()
956 INetConnectionManager
*pNetConMan
;
957 IEnumNetConnection
*pEnumCon
;
958 INetConnection
*pNetCon
;
959 NETCON_PROPERTIES
* pProps
;
963 NOTIFICATION_ITEM
* pItem
, *pLast
= NULL
;
964 LANSTATUSUI_CONTEXT
* pContext
;
966 TRACE("InitializeNetTaskbarNotifications\n");
973 hr
= pItem
->pNet
->GetProperties(&pProps
);
976 ZeroMemory(&nid
, sizeof(nid
));
977 nid
.cbSize
= sizeof(nid
);
978 nid
.uID
= pItem
->uID
;
979 nid
.hWnd
= pItem
->hwndDlg
;
980 nid
.uFlags
= NIF_STATE
;
981 if (pProps
->dwCharacter
& NCCF_SHOW_ICON
)
984 nid
.dwState
= NIS_HIDDEN
;
986 nid
.dwStateMask
= NIS_HIDDEN
;
987 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
988 NcFreeNetconProperties(pProps
);
990 pItem
= pItem
->pNext
;
994 /* get an instance to of IConnectionManager */
996 //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan);
998 hr
= INetConnectionManager_Constructor(NULL
, IID_INetConnectionManager
, (LPVOID
*)&pNetConMan
);
1001 ERR("INetConnectionManager_Constructor failed\n");
1005 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
1008 ERR("EnumConnections failed\n");
1009 pNetConMan
->Release();
1016 hr
= pEnumCon
->Next(1, &pNetCon
, &Count
);
1019 TRACE("new connection\n");
1020 pItem
= static_cast<NOTIFICATION_ITEM
*>(CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM
)));
1024 pContext
= static_cast<LANSTATUSUI_CONTEXT
*>(CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT
)));
1027 CoTaskMemFree(pItem
);
1031 ZeroMemory(pContext
, sizeof(LANSTATUSUI_CONTEXT
));
1032 pContext
->uID
= Index
;
1033 pContext
->pNet
= pNetCon
;
1035 pItem
->pNext
= NULL
;
1036 pItem
->pNet
= pNetCon
;
1037 hwndDlg
= CreateDialogParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_STATUS
), NULL
, LANStatusDlg
, (LPARAM
)pContext
);
1040 ZeroMemory(&nid
, sizeof(nid
));
1041 nid
.cbSize
= sizeof(nid
);
1043 nid
.uFlags
= NIF_MESSAGE
;
1044 nid
.uVersion
= NOTIFYICON_VERSION
;
1045 nid
.uCallbackMessage
= WM_SHOWSTATUSDLG
;
1048 hr
= pNetCon
->GetProperties(&pProps
);
1051 CopyMemory(&pItem
->guidItem
, &pProps
->guidId
, sizeof(GUID
));
1052 if (!(pProps
->dwCharacter
& NCCF_SHOW_ICON
))
1054 nid
.dwState
= NIS_HIDDEN
;
1055 nid
.dwStateMask
= NIS_HIDDEN
;
1056 nid
.uFlags
|= NIF_STATE
;
1058 if (pProps
->Status
== NCS_MEDIA_DISCONNECTED
|| pProps
->Status
== NCS_DISCONNECTED
|| pProps
->Status
== NCS_HARDWARE_DISABLED
)
1059 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
));
1060 else if (pProps
->Status
== NCS_CONNECTED
)
1061 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
));
1064 nid
.uFlags
|= NIF_ICON
;
1066 wcscpy(nid
.szTip
, pProps
->pszwName
);
1067 nid
.uFlags
|= NIF_TIP
;
1069 pContext
->hwndStatusDlg
= hwndDlg
;
1070 pItem
->hwndDlg
= hwndDlg
;
1072 if (Shell_NotifyIconW(NIM_ADD
, &nid
))
1075 pLast
->pNext
= pItem
;
1084 ERR("Shell_NotifyIconW failed\n");
1085 CoTaskMemFree(pItem
);
1088 if (nid
.uFlags
& NIF_ICON
)
1089 DestroyIcon(nid
.hIcon
);
1091 ERR("CreateDialogParamW failed\n");
1093 } while (hr
== S_OK
);
1095 m_lpNetMan
= pNetConMan
;
1096 pEnumCon
->Release();
1101 CLanStatus::ShowStatusDialogByCLSID(const GUID
*pguidCmdGroup
)
1103 NOTIFICATION_ITEM
*pItem
;
1108 if (IsEqualGUID(pItem
->guidItem
, *pguidCmdGroup
))
1110 SendMessageW(pItem
->hwndDlg
, WM_SHOWSTATUSDLG
, 0, WM_LBUTTONDOWN
);
1113 pItem
= pItem
->pNext
;
1122 CLanStatus::QueryInterface(
1128 if (IsEqualIID(iid
, IID_IUnknown
) ||
1129 IsEqualIID(iid
, IID_IOleCommandTarget
))
1136 return E_NOINTERFACE
;
1141 CLanStatus::AddRef()
1143 ULONG refCount
= InterlockedIncrement(&m_ref
);
1150 CLanStatus::Release()
1152 ULONG refCount
= InterlockedDecrement(&m_ref
);
1162 CLanStatus::QueryStatus(
1163 const GUID
*pguidCmdGroup
,
1166 OLECMDTEXT
*pCmdText
)
1168 MessageBoxW(NULL
, pCmdText
->rgwz
, L
"IOleCommandTarget_fnQueryStatus", MB_OK
);
1175 const GUID
*pguidCmdGroup
,
1183 if (IsEqualGUID(*pguidCmdGroup
, CGID_ShellServiceObject
))
1185 return InitializeNetTaskbarNotifications();
1189 /* invoke status dialog */
1190 return ShowStatusDialogByCLSID(pguidCmdGroup
);
1196 HRESULT WINAPI
LanConnectStatusUI_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1198 TRACE("LanConnectStatusUI_Constructor\n");
1204 return CLASS_E_NOAGGREGATION
;
1206 CLanStatus
*pLanStatus
= new CLanStatus
;
1208 return E_OUTOFMEMORY
;
1210 pLanStatus
->AddRef();
1211 static volatile CLanStatus
*pCachedLanStatus
= NULL
;
1212 if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus
, pLanStatus
, NULL
) != NULL
)
1213 pLanStatus
->Release();
1215 return ((CLanStatus
*)pCachedLanStatus
)->QueryInterface(riid
, ppv
);