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
;
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
*lpNetMan
;
58 NOTIFICATION_ITEM
*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
;
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
= (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
= (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
))
643 DisableNetworkAdapter(INetConnection
* pNet
, LANSTATUSUI_CONTEXT
* pContext
, HWND hwndDlg
)
646 NETCON_PROPERTIES
* pProperties
;
647 LPOLESTR pDisplayName
;
649 DWORD dwSize
, dwType
;
652 SP_DEVINFO_DATA DevInfo
;
653 SP_PROPCHANGE_PARAMS PropChangeParams
;
657 if (FAILED(pNet
->GetProperties(&pProperties
)))
661 hInfo
= SetupDiGetClassDevsW(&GUID_DEVCLASS_NET
, NULL
, NULL
, DIGCF_PRESENT
);
664 NcFreeNetconProperties(pProperties
);
668 if (FAILED(StringFromCLSID((CLSID
)pProperties
->guidId
, &pDisplayName
)))
670 NcFreeNetconProperties(pProperties
);
671 SetupDiDestroyDeviceInfoList(hInfo
);
674 NcFreeNetconProperties(pProperties
);
676 if (FindNetworkAdapter(hInfo
, &DevInfo
, pDisplayName
))
678 PropChangeParams
.ClassInstallHeader
.cbSize
= sizeof(SP_CLASSINSTALL_HEADER
);
679 PropChangeParams
.ClassInstallHeader
.InstallFunction
= DIF_PROPERTYCHANGE
; //;
680 PropChangeParams
.StateChange
= DICS_DISABLE
;
681 PropChangeParams
.Scope
= DICS_FLAG_CONFIGSPECIFIC
;
682 PropChangeParams
.HwProfile
= 0;
684 if (SetupDiSetClassInstallParams(hInfo
, &DevInfo
, &PropChangeParams
.ClassInstallHeader
, sizeof(SP_PROPCHANGE_PARAMS
)))
686 if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE
, hInfo
, &DevInfo
))
690 SetupDiDestroyDeviceInfoList(hInfo
);
692 swprintf(szPath
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName
);
693 CoTaskMemFree(pDisplayName
);
695 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
699 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, NULL
, &dwSize
) != ERROR_SUCCESS
|| dwType
!= REG_SZ
)
705 pPnp
= (LPWSTR
)CoTaskMemAlloc(dwSize
);
712 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, (LPBYTE
)pPnp
, &dwSize
) != ERROR_SUCCESS
)
720 swprintf(szPath
, L
"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp
);
723 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, NULL
, 0, KEY_WRITE
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
726 dwSize
= 1; /* enable = 0, disable = 1 */
727 RegSetValueExW(hKey
, L
"CSConfigFlags", 0, REG_DWORD
, (LPBYTE
)&dwSize
, sizeof(DWORD
));
733 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_CANCEL
);
734 ZeroMemory(&nid
, sizeof(nid
));
735 nid
.cbSize
= sizeof(nid
);
736 nid
.uID
= pContext
->uID
;
737 nid
.hWnd
= pContext
->hwndDlg
;
738 nid
.uFlags
= NIF_STATE
;
739 nid
.dwState
= NIS_HIDDEN
;
740 nid
.dwStateMask
= NIS_HIDDEN
;
742 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
755 LANSTATUSUI_CONTEXT
* pContext
;
761 page
= (PROPSHEETPAGE
*)lParam
;
762 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
763 pContext
->hwndDlg
= hwndDlg
;
764 InitializeLANStatusUiDlg(hwndDlg
, pContext
);
765 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
768 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
769 if (LOWORD(wParam
) == IDC_STATUS_PROPERTIES
)
773 ShowNetConnectionProperties(pContext
->pNet
, GetParent(pContext
->hwndDlg
));
774 BringWindowToTop(GetParent(pContext
->hwndDlg
));
778 else if (LOWORD(wParam
) == IDC_ENDISABLE
)
780 DisableNetworkAdapter(pContext
->pNet
, pContext
, hwndDlg
);
784 lppsn
= (LPPSHNOTIFY
) lParam
;
785 if (lppsn
->hdr
.code
== PSN_APPLY
|| lppsn
->hdr
.code
== PSN_RESET
)
787 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
788 SetWindowLongPtr(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
789 pContext
->hwndDlg
= NULL
;
798 InitializePropertyDialog(
799 LANSTATUSUI_CONTEXT
* pContext
,
800 NETCON_PROPERTIES
* pProperties
)
802 DWORD dwSize
, dwAdapterIndex
, dwResult
;
804 IP_ADAPTER_INFO
*pAdapterInfo
, *pCurAdapter
;
806 if (FAILED(StringFromCLSID((CLSID
)pProperties
->guidId
, &pStr
)))
811 /* get the IfTable */
813 dwResult
= GetAdaptersInfo(NULL
, &dwSize
);
814 if (dwResult
!= ERROR_BUFFER_OVERFLOW
)
820 pAdapterInfo
= (PIP_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
823 CoTaskMemFree(pAdapterInfo
);
828 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) != NO_ERROR
)
830 CoTaskMemFree(pAdapterInfo
);
835 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo
, pStr
, &dwAdapterIndex
))
837 CoTaskMemFree(pAdapterInfo
);
842 pCurAdapter
= pAdapterInfo
;
843 while(pCurAdapter
->Index
!= dwAdapterIndex
)
844 pCurAdapter
= pCurAdapter
->Next
;
847 pContext
->IpAddress
= inet_addr(pCurAdapter
->IpAddressList
.IpAddress
.String
);
848 pContext
->SubnetMask
= inet_addr(pCurAdapter
->IpAddressList
.IpMask
.String
);
849 pContext
->Gateway
= inet_addr(pCurAdapter
->GatewayList
.IpAddress
.String
);
850 pContext
->DHCPEnabled
= pCurAdapter
->DhcpEnabled
;
852 CoTaskMemFree(pAdapterInfo
);
853 pContext
->dwAdapterIndex
= dwAdapterIndex
;
857 ShowStatusPropertyDialog(
858 LANSTATUSUI_CONTEXT
*pContext
,
861 HPROPSHEETPAGE hppages
[2];
862 PROPSHEETHEADERW pinfo
;
863 NETCON_PROPERTIES
* pProperties
= NULL
;
865 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
866 ZeroMemory(hppages
, sizeof(hppages
));
867 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
868 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
869 pinfo
.phpage
= hppages
;
870 pinfo
.hwndParent
= hwndDlg
;
872 if (pContext
->pNet
->GetProperties(&pProperties
) == S_OK
)
874 if (pProperties
->pszwName
)
876 pinfo
.pszCaption
= pProperties
->pszwName
;
877 pinfo
.dwFlags
|= PSH_PROPTITLE
;
879 InitializePropertyDialog(pContext
, pProperties
);
880 if (pProperties
->MediaType
== NCM_LAN
&& pProperties
->Status
== NCS_CONNECTED
)
882 hppages
[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS
), LANStatusUiDlg
, (LPARAM
)pContext
, NULL
);
886 hppages
[pinfo
.nPages
] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED
), LANStatusUiAdvancedDlg
, (LPARAM
)pContext
, NULL
);
887 if (hppages
[pinfo
.nPages
])
892 PropertySheetW(&pinfo
);
895 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
||
896 pProperties
->Status
== NCS_HARDWARE_DISABLED
)
898 ShowNetConnectionProperties(pContext
->pNet
, pContext
->hwndDlg
);
901 NcFreeNetconProperties(pProperties
);
913 LANSTATUSUI_CONTEXT
* pContext
;
918 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
919 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)lParam
);
920 pContext
->nIDEvent
= SetTimer(hwndDlg
, 0xFABC, 1000, NULL
);
923 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
924 if (wParam
== (WPARAM
)pContext
->nIDEvent
)
926 UpdateLanStatus(pContext
->hwndDlg
, pContext
);
929 case WM_SHOWSTATUSDLG
:
930 if (LOWORD(lParam
) == WM_LBUTTONDOWN
)
932 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
936 if (pContext
->hwndDlg
)
938 ShowWindow(GetParent(pContext
->hwndDlg
), SW_SHOW
);
939 BringWindowToTop(GetParent(pContext
->hwndDlg
));
943 ShowStatusPropertyDialog(pContext
, hwndDlg
);
953 CLanStatus::InitializeNetTaskbarNotifications()
957 INetConnectionManager
*pNetConMan
;
958 IEnumNetConnection
*pEnumCon
;
959 INetConnection
*pNetCon
;
960 NETCON_PROPERTIES
* pProps
;
964 NOTIFICATION_ITEM
* pItem
, *pLast
= NULL
;
965 LANSTATUSUI_CONTEXT
* pContext
;
967 TRACE("InitializeNetTaskbarNotifications\n");
974 hr
= pItem
->pNet
->GetProperties(&pProps
);
977 ZeroMemory(&nid
, sizeof(nid
));
978 nid
.cbSize
= sizeof(nid
);
979 nid
.uID
= pItem
->uID
;
980 nid
.hWnd
= pItem
->hwndDlg
;
981 nid
.uFlags
= NIF_STATE
;
982 if (pProps
->dwCharacter
& NCCF_SHOW_ICON
)
985 nid
.dwState
= NIS_HIDDEN
;
987 nid
.dwStateMask
= NIS_HIDDEN
;
988 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
989 NcFreeNetconProperties(pProps
);
991 pItem
= pItem
->pNext
;
995 /* get an instance to of IConnectionManager */
997 //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan);
999 hr
= INetConnectionManager_Constructor(NULL
, IID_INetConnectionManager
, (LPVOID
*)&pNetConMan
);
1002 ERR("INetConnectionManager_Constructor failed\n");
1006 hr
= pNetConMan
->EnumConnections(NCME_DEFAULT
, &pEnumCon
);
1009 ERR("EnumConnections failed\n");
1010 pNetConMan
->Release();
1017 hr
= pEnumCon
->Next(1, &pNetCon
, &Count
);
1020 TRACE("new connection\n");
1021 pItem
= (NOTIFICATION_ITEM
*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM
));
1025 pContext
= (LANSTATUSUI_CONTEXT
*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT
));
1028 CoTaskMemFree(pItem
);
1032 ZeroMemory(pContext
, sizeof(LANSTATUSUI_CONTEXT
));
1033 pContext
->uID
= Index
;
1034 pContext
->pNet
= pNetCon
;
1036 pItem
->pNext
= NULL
;
1037 pItem
->pNet
= pNetCon
;
1038 hwndDlg
= CreateDialogParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_STATUS
), NULL
, LANStatusDlg
, (LPARAM
)pContext
);
1041 ZeroMemory(&nid
, sizeof(nid
));
1042 nid
.cbSize
= sizeof(nid
);
1044 nid
.uFlags
= NIF_MESSAGE
;
1046 nid
.uCallbackMessage
= WM_SHOWSTATUSDLG
;
1049 hr
= pNetCon
->GetProperties(&pProps
);
1052 CopyMemory(&pItem
->guidItem
, &pProps
->guidId
, sizeof(GUID
));
1053 if (!(pProps
->dwCharacter
& NCCF_SHOW_ICON
))
1055 nid
.dwState
= NIS_HIDDEN
;
1056 nid
.dwStateMask
= NIS_HIDDEN
;
1057 nid
.uFlags
|= NIF_STATE
;
1059 if (pProps
->Status
== NCS_MEDIA_DISCONNECTED
|| pProps
->Status
== NCS_DISCONNECTED
|| pProps
->Status
== NCS_HARDWARE_DISABLED
)
1060 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
));
1061 else if (pProps
->Status
== NCS_CONNECTED
)
1062 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
));
1065 nid
.uFlags
|= NIF_ICON
;
1067 wcscpy(nid
.szTip
, pProps
->pszwName
);
1068 nid
.uFlags
|= NIF_TIP
;
1070 pContext
->hwndStatusDlg
= hwndDlg
;
1071 pItem
->hwndDlg
= hwndDlg
;
1073 if (Shell_NotifyIconW(NIM_ADD
, &nid
))
1076 pLast
->pNext
= pItem
;
1085 ERR("Shell_NotifyIconW failed\n");
1086 CoTaskMemFree(pItem
);
1089 if (nid
.uFlags
& NIF_ICON
)
1090 DestroyIcon(nid
.hIcon
);
1092 ERR("CreateDialogParamW failed\n");
1094 } while(hr
== S_OK
);
1096 lpNetMan
= pNetConMan
;
1097 pEnumCon
->Release();
1102 CLanStatus::ShowStatusDialogByCLSID(const GUID
*pguidCmdGroup
)
1104 NOTIFICATION_ITEM
*pItem
;
1109 if (IsEqualGUID(pItem
->guidItem
, *pguidCmdGroup
))
1111 SendMessageW(pItem
->hwndDlg
, WM_SHOWSTATUSDLG
, 0, WM_LBUTTONDOWN
);
1114 pItem
= pItem
->pNext
;
1123 CLanStatus::QueryInterface(
1129 if (IsEqualIID(iid
, IID_IUnknown
) ||
1130 IsEqualIID(iid
, IID_IOleCommandTarget
))
1136 MessageBoxW(NULL
, L
"IOleCommandTarget_fnQueryInterface", NULL
, MB_OK
);
1137 return E_NOINTERFACE
;
1142 CLanStatus::AddRef()
1144 ULONG refCount
= InterlockedIncrement(&ref
);
1151 CLanStatus::Release()
1154 ULONG refCount
= InterlockedDecrement(&ref
);
1167 CLanStatus::QueryStatus(
1168 const GUID
*pguidCmdGroup
,
1171 OLECMDTEXT
*pCmdText
)
1173 MessageBoxW(NULL
, pCmdText
->rgwz
, L
"IOleCommandTarget_fnQueryStatus", MB_OK
);
1180 const GUID
*pguidCmdGroup
,
1188 if (IsEqualGUID(*pguidCmdGroup
, CGID_ShellServiceObject
))
1190 return InitializeNetTaskbarNotifications();
1194 /* invoke status dialog */
1195 return ShowStatusDialogByCLSID(pguidCmdGroup
);
1201 HRESULT WINAPI
LanConnectStatusUI_Constructor(IUnknown
*pUnkOuter
, REFIID riid
, LPVOID
*ppv
)
1203 TRACE("LanConnectStatusUI_Constructor\n");
1209 return CLASS_E_NOAGGREGATION
;
1211 CLanStatus
*pLanStatus
= new CLanStatus
;
1213 return E_OUTOFMEMORY
;
1215 pLanStatus
->AddRef();
1216 static volatile CLanStatus
*pCachedLanStatus
= NULL
;
1217 if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus
, pLanStatus
, NULL
) != NULL
)
1218 pLanStatus
->Release();
1220 return ((CLanStatus
*)pCachedLanStatus
)->QueryInterface(riid
, ppv
);