4 /// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E}
5 // IID B722BCCB-4E68-101B-A2BC-00AA00404770
7 #define WM_SHOWSTATUSDLG (WM_USER+10)
9 typedef struct tagNotificationItem
11 struct tagNotificationItem
*pNext
;
20 IOleCommandTarget
* lpVtbl
;
21 INetConnectionManager
* lpNetMan
;
23 NOTIFICATION_ITEM
* pHead
;
24 }ILanStatusImpl
, *LPILanStatusImpl
;
29 HWND hwndStatusDlg
; /* LanStatusDlg window */
30 HWND hwndDlg
; /* status dialog window */
47 LANSTATUSUI_CONTEXT
* pContext
)
49 WCHAR szFormat
[MAX_PATH
] = {0};
50 WCHAR szBuffer
[MAX_PATH
] = {0};
51 SYSTEMTIME TimeConnected
;
52 DWORD DurationSeconds
;
63 if (IfEntry
->dwSpeed
< 1000)
65 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_BIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
67 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
);
68 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
71 else if (IfEntry
->dwSpeed
< 1000000)
73 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_KBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
75 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000);
76 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
79 else if (IfEntry
->dwSpeed
< 1000000000)
81 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_MBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
83 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000);
84 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
89 if (LoadStringW(netshell_hInstance
, IDS_FORMAT_KBIT
, szFormat
, sizeof(szFormat
)/sizeof(WCHAR
)))
91 swprintf(szBuffer
, szFormat
, IfEntry
->dwSpeed
/1000000000);
92 SendDlgItemMessageW(hwndDlg
, IDC_SPEED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
96 if (StrFormatByteSizeW(IfEntry
->dwInOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
98 SendDlgItemMessageW(hwndDlg
, IDC_RECEIVED
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
101 if (StrFormatByteSizeW(IfEntry
->dwOutOctets
, szBuffer
, sizeof(szFormat
)/sizeof(WCHAR
)))
103 SendDlgItemMessageW(hwndDlg
, IDC_SEND
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
107 Ticks
= GetTickCount64();
109 Ticks
= GetTickCount();
112 DurationSeconds
= Ticks
/ 1000;
113 TimeConnected
.wSecond
= (DurationSeconds
% 60);
114 TimeConnected
.wMinute
= (DurationSeconds
/ 60) % 60;
115 TimeConnected
.wHour
= (DurationSeconds
/ (60 * 60)) % 24;
116 TimeConnected
.wDay
= DurationSeconds
/ (60 * 60 * 24);
118 if (!GetTimeFormatW(LOCALE_USER_DEFAULT
, 0, &TimeConnected
, L
"HH':'mm':'ss", LocBuffer
, sizeof(LocBuffer
) / sizeof(LocBuffer
[0])))
121 if (!TimeConnected
.wDay
)
123 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)LocBuffer
);
127 if (TimeConnected
.wDay
== 1)
129 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAY
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
130 DayBuffer
[0] = L
'\0';
134 if (!LoadStringW(netshell_hInstance
, IDS_DURATION_DAYS
, DayBuffer
, sizeof(DayBuffer
) / sizeof(DayBuffer
[0])))
135 DayBuffer
[0] = L
'\0';
137 swprintf(Buffer
, DayBuffer
, TimeConnected
.wDay
, LocBuffer
);
138 SendDlgItemMessageW(hwndDlg
, IDC_DURATION
, WM_SETTEXT
, 0, (LPARAM
)Buffer
);
144 UpdateLanStatus(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
147 HICON hIcon
, hOldIcon
= NULL
;
149 NETCON_PROPERTIES
* pProperties
= NULL
;
151 ZeroMemory(&IfEntry
, sizeof(IfEntry
));
152 IfEntry
.dwIndex
= pContext
->dwAdapterIndex
;
153 if(GetIfEntry(&IfEntry
) != NO_ERROR
)
159 if (IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_CONNECTED
|| IfEntry
.dwOperStatus
== MIB_IF_OPER_STATUS_OPERATIONAL
)
161 if (pContext
->dwInOctets
== IfEntry
.dwInOctets
&& pContext
->dwOutOctets
== IfEntry
.dwOutOctets
&& pContext
->Status
!= 0)
163 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
164 pContext
->Status
= 0;
166 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 1)
168 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANSREC
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
169 pContext
->Status
= 1;
171 else if (pContext
->dwInOctets
!= IfEntry
.dwInOctets
&& pContext
->Status
!= 2)
173 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_REC
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
174 pContext
->Status
= 2;
176 else if (pContext
->dwOutOctets
!= IfEntry
.dwOutOctets
&& pContext
->Status
!= 3)
178 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANS
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
179 pContext
->Status
= 3;
182 else if (IfEntry
.dwOperStatus
== (MIB_IF_OPER_STATUS_UNREACHABLE
| MIB_IF_OPER_STATUS_DISCONNECTED
))
184 if (pContext
->Status
!= 4)
186 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
187 pContext
->Status
= 4;
190 else if (MIB_IF_OPER_STATUS_NON_OPERATIONAL
)
192 if (pContext
->Status
!= 5)
194 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
), IMAGE_ICON
, 32, 32, LR_DEFAULTCOLOR
);
195 pContext
->Status
= 5;
199 if (hwndDlg
&& hIcon
)
201 hOldIcon
= (HICON
)SendDlgItemMessageW(hwndDlg
, IDC_NETSTAT
, STM_SETICON
, (WPARAM
)hIcon
, 0);
203 DestroyIcon(hOldIcon
);
206 ZeroMemory(&nid
, sizeof(nid
));
207 nid
.cbSize
= sizeof(nid
);
208 nid
.uID
= pContext
->uID
;
209 nid
.hWnd
= pContext
->hwndStatusDlg
;
212 if (INetConnection_GetProperties(pContext
->pNet
, &pProperties
) == NOERROR
)
214 if (pProperties
->dwCharacter
& NCCF_SHOW_ICON
)
217 nid
.hIcon
= CopyImage(hIcon
, IMAGE_ICON
, 16, 16, 0);
222 nid
.uFlags
|= NIF_ICON
;
224 nid
.uFlags
|= NIF_STATE
;
226 nid
.dwStateMask
= NIS_HIDDEN
;
228 if (pProperties
->pszwName
)
230 if (wcslen(pProperties
->pszwName
) * sizeof(WCHAR
) < sizeof(nid
.szTip
))
232 nid
.uFlags
|= NIF_TIP
;
233 wcscpy(nid
.szTip
, pProperties
->pszwName
);
237 CopyMemory(nid
.szTip
, pProperties
->pszwName
, sizeof(nid
.szTip
) - sizeof(WCHAR
));
238 nid
.szTip
[(sizeof(nid
.szTip
)/sizeof(WCHAR
))-1] = L
'\0';
239 nid
.uFlags
|= NIF_TIP
;
245 nid
.uFlags
|= NIF_STATE
;
246 nid
.dwState
= NIS_HIDDEN
;
247 nid
.dwStateMask
= NIS_HIDDEN
;
250 NcFreeNetconProperties(pProperties
);
253 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
255 if (nid
.uFlags
& NIF_ICON
)
256 DestroyIcon(nid
.hIcon
);
258 pContext
->dwInOctets
= IfEntry
.dwInOctets
;
259 pContext
->dwOutOctets
= IfEntry
.dwOutOctets
;
262 UpdateLanStatusUiDlg(hwndDlg
, &IfEntry
, pContext
);
267 InitializeLANStatusUiDlg(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
269 WCHAR szBuffer
[MAX_PATH
] = {0};
270 NETCON_PROPERTIES
* pProperties
;
272 if (INetConnection_GetProperties(pContext
->pNet
, &pProperties
) != NOERROR
)
275 if (pProperties
->Status
== NCS_DISCONNECTED
)
276 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, szBuffer
, MAX_PATH
);
277 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
278 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, szBuffer
, MAX_PATH
);
279 else if (pProperties
->Status
== NCS_CONNECTING
)
280 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, szBuffer
, MAX_PATH
);
281 else if (pProperties
->Status
== NCS_CONNECTED
)
282 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, szBuffer
, MAX_PATH
);
284 SendDlgItemMessageW(hwndDlg
, IDC_STATUS
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
286 pContext
->dwInOctets
= 0;
287 pContext
->dwOutOctets
= 0;
289 /* update adapter info */
290 pContext
->Status
= -1;
291 UpdateLanStatus(hwndDlg
, pContext
);
292 NcFreeNetconProperties(pProperties
);
296 InsertColumnToListView(
305 if (!LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
308 memset(&lc
, 0, sizeof(LV_COLUMN
) );
309 lc
.mask
= LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
310 lc
.iSubItem
= SubItem
;
311 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
313 lc
.cchTextMax
= wcslen(szBuffer
);
314 lc
.pszText
= szBuffer
;
316 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, SubItem
, (LPARAM
)&lc
);
320 AddIPAddressToListView(
322 PIP_ADDR_STRING pAddr
,
326 PIP_ADDR_STRING pCur
;
330 ZeroMemory(&li
, sizeof(LVITEMW
));
340 ZeroMemory(&li
, sizeof(LVITEMW
));
345 li
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
348 if (MultiByteToWideChar(CP_ACP
, 0, pCur
->IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
350 li
.pszText
= szBuffer
;
353 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
357 }while(pCur
&& pCur
->IpAddress
.String
[0]);
361 InsertItemToListView(
368 ZeroMemory(&li
, sizeof(LVITEMW
));
370 li
.iItem
= ListView_GetItemCount(hDlgCtrl
);
371 if (LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
373 li
.pszText
= szBuffer
;
374 return (INT
)SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
382 LANStatusUiDetailsDlg(
389 LANSTATUSUI_CONTEXT
* pContext
;
392 PIP_ADAPTER_INFO pAdapterInfo
, pCurAdapter
;
393 PIP_PER_ADAPTER_INFO pPerAdapter
;
400 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
402 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_DETAILS
);
403 InsertColumnToListView(hDlgCtrl
, IDS_PROPERTY
, 0, 80);
404 InsertColumnToListView(hDlgCtrl
, IDS_VALUE
, 1, 80);
409 if (GetAdaptersInfo(NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
411 pAdapterInfo
= (PIP_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
414 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) == NO_ERROR
)
416 pCurAdapter
= pAdapterInfo
;
417 while(pCurAdapter
&& pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
418 pCurAdapter
= pCurAdapter
->Next
;
420 if(pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
426 ZeroMemory(&li
, sizeof(LVITEMW
));
429 li
.pszText
= szBuffer
;
433 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_PHYSICAL_ADDRESS
);
436 swprintf(szBuffer
, L
"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter
->Address
[0], pCurAdapter
->Address
[1],
437 pCurAdapter
->Address
[2], pCurAdapter
->Address
[3], pCurAdapter
->Address
[4], pCurAdapter
->Address
[5]);
438 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
440 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_IP_ADDRESS
);
442 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
443 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
445 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_SUBNET_MASK
);
447 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpMask
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
448 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
450 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DEF_GATEWAY
);
451 if (li
.iItem
>= 0 && pCurAdapter
->GatewayList
.IpAddress
.String
[0] != '0')
453 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->GatewayList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
454 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
457 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_OBTAINED
);
458 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_EXPIRES
);
463 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
465 pPerAdapter
= (PIP_PER_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
468 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, pPerAdapter
, &dwSize
) == ERROR_SUCCESS
)
470 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DNS_SERVERS
);
472 AddIPAddressToListView(hDlgCtrl
, &pPerAdapter
->DnsServerList
, li
.iItem
);
474 CoTaskMemFree(pPerAdapter
);
480 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_WINS_SERVERS
);
481 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->PrimaryWinsServer
, li
.iItem
);
482 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->SecondaryWinsServer
, li
.iItem
+1);
485 CoTaskMemFree(pAdapterInfo
);
488 if (LOWORD(wParam
) == IDC_CLOSE
)
490 EndDialog(hwndDlg
, FALSE
);
499 LANStatusUiAdvancedDlg(
506 WCHAR szBuffer
[100] = {0};
508 LANSTATUSUI_CONTEXT
* pContext
;
515 page
= (PROPSHEETPAGE
*)lParam
;
516 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
517 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
518 if (pContext
->DHCPEnabled
)
519 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_DHCP
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
521 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_MANUAL
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
523 szBuffer
[(sizeof(szBuffer
)/sizeof(WCHAR
))-1] = L
'\0';
524 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSTYPE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
527 dwIpAddr
= ntohl(pContext
->IpAddress
);
528 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
529 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
530 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSIP
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
532 dwIpAddr
= ntohl(pContext
->SubnetMask
);
533 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
534 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
535 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSSUBNET
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
537 dwIpAddr
= ntohl(pContext
->Gateway
);
540 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
541 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
542 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSGATEWAY
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
546 if (LOWORD(wParam
) == IDC_DETAILS
)
548 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
551 DialogBoxParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS
), GetParent(hwndDlg
),
552 LANStatusUiDetailsDlg
, (LPARAM
)pContext
);
563 FindNetworkAdapter(HDEVINFO hInfo
, SP_DEVINFO_DATA
*pDevInfo
, LPWSTR pGuid
)
565 DWORD dwIndex
, dwSize
;
568 WCHAR szDetail
[200] = L
"SYSTEM\\CurrentControlSet\\Control\\Class\\";
574 ZeroMemory(pDevInfo
, sizeof(SP_DEVINFO_DATA
));
575 pDevInfo
->cbSize
= sizeof(SP_DEVINFO_DATA
);
577 /* get device info */
578 if (!SetupDiEnumDeviceInfo(hInfo
, dwIndex
++, pDevInfo
))
581 /* get device software registry path */
582 if (!SetupDiGetDeviceRegistryPropertyW(hInfo
, pDevInfo
, SPDRP_DRIVER
, NULL
, (LPBYTE
)&szDetail
[39], sizeof(szDetail
)/sizeof(WCHAR
) - 40, &dwSize
))
585 /* open device registry key */
586 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szDetail
, 0, KEY_READ
, &hSubKey
) != ERROR_SUCCESS
)
589 /* query NetCfgInstanceId for current device */
590 dwSize
= sizeof(szNetCfg
);
591 if (RegQueryValueExW(hSubKey
, L
"NetCfgInstanceId", NULL
, NULL
, (LPBYTE
)szNetCfg
, &dwSize
) != ERROR_SUCCESS
)
593 RegCloseKey(hSubKey
);
596 RegCloseKey(hSubKey
);
597 if (!_wcsicmp(pGuid
, szNetCfg
))
610 DisableNetworkAdapter(INetConnection
* pNet
, LANSTATUSUI_CONTEXT
* pContext
, HWND hwndDlg
)
613 NETCON_PROPERTIES
* pProperties
;
614 LPOLESTR pDisplayName
;
616 DWORD dwSize
, dwType
;
619 SP_DEVINFO_DATA DevInfo
;
620 SP_PROPCHANGE_PARAMS PropChangeParams
;
624 if (FAILED(INetConnection_GetProperties(pNet
, &pProperties
)))
628 hInfo
= SetupDiGetClassDevsW(&GUID_DEVCLASS_NET
, NULL
, NULL
, DIGCF_PRESENT
);
631 NcFreeNetconProperties(pProperties
);
635 if (FAILED(StringFromCLSID(&pProperties
->guidId
, &pDisplayName
)))
637 NcFreeNetconProperties(pProperties
);
638 SetupDiDestroyDeviceInfoList(hInfo
);
641 NcFreeNetconProperties(pProperties
);
643 if (FindNetworkAdapter(hInfo
, &DevInfo
, pDisplayName
))
645 PropChangeParams
.ClassInstallHeader
.cbSize
= sizeof(SP_CLASSINSTALL_HEADER
);
646 PropChangeParams
.ClassInstallHeader
.InstallFunction
= DIF_PROPERTYCHANGE
; //;
647 PropChangeParams
.StateChange
= DICS_DISABLE
;
648 PropChangeParams
.Scope
= DICS_FLAG_CONFIGSPECIFIC
;
649 PropChangeParams
.HwProfile
= 0;
651 if (SetupDiSetClassInstallParams(hInfo
, &DevInfo
, &PropChangeParams
.ClassInstallHeader
, sizeof(SP_PROPCHANGE_PARAMS
)))
653 if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE
, hInfo
, &DevInfo
))
657 SetupDiDestroyDeviceInfoList(hInfo
);
659 swprintf(szPath
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName
);
660 CoTaskMemFree(pDisplayName
);
662 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
666 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, NULL
, &dwSize
) != ERROR_SUCCESS
|| dwType
!= REG_SZ
)
672 pPnp
= (LPWSTR
)CoTaskMemAlloc(dwSize
);
679 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, (LPBYTE
)pPnp
, &dwSize
) != ERROR_SUCCESS
)
687 swprintf(szPath
, L
"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp
);
690 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, NULL
, 0, KEY_WRITE
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
693 dwSize
= 1; /* enable = 0, disable = 1 */
694 RegSetValueExW(hKey
, L
"CSConfigFlags", 0, REG_DWORD
, (LPBYTE
)&dwSize
, sizeof(DWORD
));
700 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_CANCEL
);
701 ZeroMemory(&nid
, sizeof(nid
));
702 nid
.cbSize
= sizeof(nid
);
703 nid
.uID
= pContext
->uID
;
704 nid
.hWnd
= pContext
->hwndDlg
;
705 nid
.uFlags
= NIF_STATE
;
706 nid
.dwState
= NIS_HIDDEN
;
707 nid
.dwStateMask
= NIS_HIDDEN
;
709 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
723 LANSTATUSUI_CONTEXT
* pContext
;
729 page
= (PROPSHEETPAGE
*)lParam
;
730 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
731 pContext
->hwndDlg
= hwndDlg
;
732 InitializeLANStatusUiDlg(hwndDlg
, pContext
);
733 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
736 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
737 if (LOWORD(wParam
) == IDC_STATUS_PROPERTIES
)
741 ShowNetConnectionProperties(pContext
->pNet
, GetParent(pContext
->hwndDlg
));
742 BringWindowToTop(GetParent(pContext
->hwndDlg
));
746 else if (LOWORD(wParam
) == IDC_ENDISABLE
)
748 DisableNetworkAdapter(pContext
->pNet
, pContext
, hwndDlg
);
752 lppsn
= (LPPSHNOTIFY
) lParam
;
753 if (lppsn
->hdr
.code
== PSN_APPLY
|| lppsn
->hdr
.code
== PSN_RESET
)
755 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
756 SetWindowLongPtr(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
757 pContext
->hwndDlg
= NULL
;
766 InitializePropertyDialog(
767 LANSTATUSUI_CONTEXT
* pContext
,
768 NETCON_PROPERTIES
* pProperties
)
770 DWORD dwSize
, dwAdapterIndex
, dwResult
;
772 IP_ADAPTER_INFO
* pAdapterInfo
, *pCurAdapter
;
774 if (FAILED(StringFromCLSID(&pProperties
->guidId
, &pStr
)))
779 /* get the IfTable */
781 dwResult
= GetAdaptersInfo(NULL
, &dwSize
);
782 if (dwResult
!= ERROR_BUFFER_OVERFLOW
)
788 pAdapterInfo
= (PIP_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
791 CoTaskMemFree(pAdapterInfo
);
796 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) != NO_ERROR
)
798 CoTaskMemFree(pAdapterInfo
);
803 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo
, pStr
, &dwAdapterIndex
))
805 CoTaskMemFree(pAdapterInfo
);
810 pCurAdapter
= pAdapterInfo
;
811 while(pCurAdapter
->Index
!= dwAdapterIndex
)
812 pCurAdapter
= pCurAdapter
->Next
;
815 pContext
->IpAddress
= inet_addr(pCurAdapter
->IpAddressList
.IpAddress
.String
);
816 pContext
->SubnetMask
= inet_addr(pCurAdapter
->IpAddressList
.IpMask
.String
);
817 pContext
->Gateway
= inet_addr(pCurAdapter
->GatewayList
.IpAddress
.String
);
818 pContext
->DHCPEnabled
= pCurAdapter
->DhcpEnabled
;
820 CoTaskMemFree(pAdapterInfo
);
821 pContext
->dwAdapterIndex
= dwAdapterIndex
;
825 ShowStatusPropertyDialog(
826 LANSTATUSUI_CONTEXT
* pContext
,
829 HPROPSHEETPAGE hppages
[2];
830 PROPSHEETHEADERW pinfo
;
831 NETCON_PROPERTIES
* pProperties
= NULL
;
833 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
834 ZeroMemory(hppages
, sizeof(hppages
));
835 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
836 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
837 pinfo
.u3
.phpage
= hppages
;
838 pinfo
.hwndParent
= hwndDlg
;
840 if (INetConnection_GetProperties(pContext
->pNet
, &pProperties
) == NOERROR
)
842 if (pProperties
->pszwName
)
844 pinfo
.pszCaption
= pProperties
->pszwName
;
845 pinfo
.dwFlags
|= PSH_PROPTITLE
;
847 InitializePropertyDialog(pContext
, pProperties
);
848 if (pProperties
->MediaType
== NCM_LAN
&& pProperties
->Status
== NCS_CONNECTED
)
850 hppages
[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS
), LANStatusUiDlg
, (LPARAM
)pContext
, NULL
);
854 hppages
[pinfo
.nPages
] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED
), LANStatusUiAdvancedDlg
, (LPARAM
)pContext
, NULL
);
855 if (hppages
[pinfo
.nPages
])
860 PropertySheetW(&pinfo
);
863 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
||
864 pProperties
->Status
== NCS_HARDWARE_DISABLED
)
866 ShowNetConnectionProperties(pContext
->pNet
, pContext
->hwndDlg
);
869 NcFreeNetconProperties(pProperties
);
882 LANSTATUSUI_CONTEXT
* pContext
;
887 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
888 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)lParam
);
889 pContext
->nIDEvent
= SetTimer(hwndDlg
, 0xFABC, 1000, NULL
);
892 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
893 if (wParam
== (WPARAM
)pContext
->nIDEvent
)
895 UpdateLanStatus(pContext
->hwndDlg
, pContext
);
898 case WM_SHOWSTATUSDLG
:
899 if (LOWORD(lParam
) == WM_LBUTTONDOWN
)
901 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
905 if (pContext
->hwndDlg
)
907 ShowWindow(GetParent(pContext
->hwndDlg
), SW_SHOW
);
908 BringWindowToTop(GetParent(pContext
->hwndDlg
));
912 ShowStatusPropertyDialog(pContext
, hwndDlg
);
922 InitializeNetTaskbarNotifications(
923 ILanStatusImpl
* This
)
927 INetConnectionManager
* INetConMan
;
928 IEnumNetConnection
* IEnumCon
;
929 INetConnection
* INetCon
;
930 NETCON_PROPERTIES
* pProps
;
934 NOTIFICATION_ITEM
* pItem
, *pLast
= NULL
;
935 LANSTATUSUI_CONTEXT
* pContext
;
942 hr
= INetConnection_GetProperties(pItem
->pNet
, &pProps
);
945 ZeroMemory(&nid
, sizeof(nid
));
946 nid
.cbSize
= sizeof(nid
);
947 nid
.uID
= pItem
->uID
;
948 nid
.hWnd
= pItem
->hwndDlg
;
949 nid
.uFlags
= NIF_STATE
;
950 if (pProps
->dwCharacter
& NCCF_SHOW_ICON
)
953 nid
.dwState
= NIS_HIDDEN
;
955 nid
.dwStateMask
= NIS_HIDDEN
;
956 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
957 NcFreeNetconProperties(pProps
);
959 pItem
= pItem
->pNext
;
963 /* get an instance to of IConnectionManager */
965 //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&INetConMan);
967 hr
= INetConnectionManager_Constructor(NULL
, &IID_INetConnectionManager
, (LPVOID
*)&INetConMan
);
971 hr
= INetConnectionManager_EnumConnections(INetConMan
, NCME_DEFAULT
, &IEnumCon
);
974 INetConnectionManager_Release(INetConMan
);
981 hr
= IEnumNetConnection_Next(IEnumCon
, 1, &INetCon
, &Count
);
984 pItem
= (NOTIFICATION_ITEM
*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM
));
988 pContext
= (LANSTATUSUI_CONTEXT
*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT
));
991 CoTaskMemFree(pItem
);
996 ZeroMemory(pContext
, sizeof(LANSTATUSUI_CONTEXT
));
997 pContext
->uID
= Index
;
998 pContext
->pNet
= INetCon
;
1000 pItem
->pNext
= NULL
;
1001 pItem
->pNet
= INetCon
;
1002 hwndDlg
= CreateDialogParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_STATUS
), NULL
, LANStatusDlg
, (LPARAM
)pContext
);
1005 ZeroMemory(&nid
, sizeof(nid
));
1006 nid
.cbSize
= sizeof(nid
);
1008 nid
.uFlags
= NIF_MESSAGE
;
1010 nid
.uCallbackMessage
= WM_SHOWSTATUSDLG
;
1013 hr
= INetConnection_GetProperties(INetCon
, &pProps
);
1016 CopyMemory(&pItem
->guidItem
, &pProps
->guidId
, sizeof(GUID
));
1017 if (!(pProps
->dwCharacter
& NCCF_SHOW_ICON
))
1019 nid
.dwState
= NIS_HIDDEN
;
1020 nid
.dwStateMask
= NIS_HIDDEN
;
1021 nid
.uFlags
|= NIF_STATE
;
1023 if (pProps
->Status
== NCS_MEDIA_DISCONNECTED
|| pProps
->Status
== NCS_DISCONNECTED
|| pProps
->Status
== NCS_HARDWARE_DISABLED
)
1024 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
));
1025 else if (pProps
->Status
== NCS_CONNECTED
)
1026 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
));
1029 nid
.uFlags
|= NIF_ICON
;
1031 wcscpy(nid
.szTip
, pProps
->pszwName
);
1032 nid
.uFlags
|= NIF_TIP
;
1034 pContext
->hwndStatusDlg
= hwndDlg
;
1035 pItem
->hwndDlg
= hwndDlg
;
1037 if (Shell_NotifyIconW(NIM_ADD
, &nid
))
1040 pLast
->pNext
= pItem
;
1042 This
->pHead
= pItem
;
1049 CoTaskMemFree(pItem
);
1052 if (nid
.uFlags
& NIF_ICON
)
1053 DestroyIcon(nid
.hIcon
);
1058 This
->lpNetMan
= INetConMan
;
1059 IEnumNetConnection_Release(IEnumCon
);
1064 ShowStatusDialogByCLSID(
1065 ILanStatusImpl
* This
,
1066 const GUID
*pguidCmdGroup
)
1068 NOTIFICATION_ITEM
* pItem
;
1070 pItem
= This
->pHead
;
1073 if (IsEqualGUID(&pItem
->guidItem
, pguidCmdGroup
))
1075 SendMessageW(pItem
->hwndDlg
, WM_SHOWSTATUSDLG
, 0, WM_LBUTTONDOWN
);
1078 pItem
= pItem
->pNext
;
1085 IOleCommandTarget_fnQueryInterface(
1086 IOleCommandTarget
* iface
,
1090 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1093 if (IsEqualIID (iid
, &IID_IUnknown
) ||
1094 IsEqualIID (iid
, &IID_IOleCommandTarget
))
1097 IUnknown_AddRef(iface
);
1100 MessageBoxW(NULL
, L
"IOleCommandTarget_fnQueryInterface", NULL
, MB_OK
);
1101 return E_NOINTERFACE
;
1107 IOleCommandTarget_fnAddRef(
1108 IOleCommandTarget
* iface
)
1110 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1111 ULONG refCount
= InterlockedIncrement(&This
->ref
);
1119 IOleCommandTarget_fnRelease(
1120 IOleCommandTarget
* iface
)
1123 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1124 ULONG refCount
= InterlockedDecrement(&This
->ref
);
1128 CoTaskMemFree (This
);
1139 IOleCommandTarget_fnQueryStatus(
1140 IOleCommandTarget
* iface
,
1141 const GUID
*pguidCmdGroup
,
1144 OLECMDTEXT
*pCmdText
)
1146 MessageBoxW(NULL
, pCmdText
->rgwz
, L
"IOleCommandTarget_fnQueryStatus", MB_OK
);
1153 IOleCommandTarget_fnExec(
1154 IOleCommandTarget
* iface
,
1155 const GUID
*pguidCmdGroup
,
1161 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1165 if (IsEqualIID(pguidCmdGroup
, &CGID_ShellServiceObject
))
1167 return InitializeNetTaskbarNotifications(This
);
1171 /* invoke status dialog */
1172 return ShowStatusDialogByCLSID(This
, pguidCmdGroup
);
1179 static const IOleCommandTargetVtbl vt_OleCommandTarget
=
1181 IOleCommandTarget_fnQueryInterface
,
1182 IOleCommandTarget_fnAddRef
,
1183 IOleCommandTarget_fnRelease
,
1184 IOleCommandTarget_fnQueryStatus
,
1185 IOleCommandTarget_fnExec
,
1189 HRESULT WINAPI
LanConnectStatusUI_Constructor (IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
1191 ILanStatusImpl
* This
;
1192 static volatile ILanStatusImpl
*cached_This
= NULL
;
1198 return CLASS_E_NOAGGREGATION
;
1200 This
= (ILanStatusImpl
*) CoTaskMemAlloc(sizeof (ILanStatusImpl
));
1202 return E_OUTOFMEMORY
;
1205 This
->lpVtbl
= (IOleCommandTarget
*)&vt_OleCommandTarget
;
1206 This
->lpNetMan
= NULL
;
1209 if (InterlockedCompareExchangePointer((void **)&cached_This
, This
, NULL
) != NULL
)
1211 CoTaskMemFree(This
);
1214 return IOleCommandTarget_fnQueryInterface ((IOleCommandTarget
*)cached_This
, riid
, ppv
);