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 pContext
->Status
= 1;
169 hIcon
= LoadImage(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_TRANSREC
), IMAGE_ICON
, 0, 0, LR_DEFAULTCOLOR
);
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;
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 pContext
->dwInOctets
= IfEntry
.dwInOctets
;
256 pContext
->dwOutOctets
= IfEntry
.dwOutOctets
;
259 UpdateLanStatusUiDlg(hwndDlg
, &IfEntry
, pContext
);
264 InitializeLANStatusUiDlg(HWND hwndDlg
, LANSTATUSUI_CONTEXT
* pContext
)
266 WCHAR szBuffer
[MAX_PATH
] = {0};
267 NETCON_PROPERTIES
* pProperties
;
269 if (INetConnection_GetProperties(pContext
->pNet
, &pProperties
) != NOERROR
)
272 if (pProperties
->Status
== NCS_DISCONNECTED
)
273 LoadStringW(netshell_hInstance
, IDS_STATUS_UNREACHABLE
, szBuffer
, MAX_PATH
);
274 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
)
275 LoadStringW(netshell_hInstance
, IDS_STATUS_DISCONNECTED
, szBuffer
, MAX_PATH
);
276 else if (pProperties
->Status
== NCS_CONNECTING
)
277 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTING
, szBuffer
, MAX_PATH
);
278 else if (pProperties
->Status
== NCS_CONNECTED
)
279 LoadStringW(netshell_hInstance
, IDS_STATUS_CONNECTED
, szBuffer
, MAX_PATH
);
281 SendDlgItemMessageW(hwndDlg
, IDC_STATUS
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
283 pContext
->dwInOctets
= 0;
284 pContext
->dwOutOctets
= 0;
286 /* update adapter info */
287 pContext
->Status
= -1;
288 UpdateLanStatus(hwndDlg
, pContext
);
289 NcFreeNetconProperties(pProperties
);
293 InsertColumnToListView(
302 if (!LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
305 memset(&lc
, 0, sizeof(LV_COLUMN
) );
306 lc
.mask
= LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
307 lc
.iSubItem
= SubItem
;
308 lc
.fmt
= LVCFMT_FIXED_WIDTH
;
310 lc
.cchTextMax
= wcslen(szBuffer
);
311 lc
.pszText
= szBuffer
;
313 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, SubItem
, (LPARAM
)&lc
);
317 AddIPAddressToListView(
319 PIP_ADDR_STRING pAddr
,
323 PIP_ADDR_STRING pCur
;
327 ZeroMemory(&li
, sizeof(LVITEMW
));
337 ZeroMemory(&li
, sizeof(LVITEMW
));
342 li
.iItem
= SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
345 if (MultiByteToWideChar(CP_ACP
, 0, pCur
->IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
347 li
.pszText
= szBuffer
;
350 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
354 }while(pCur
&& pCur
->IpAddress
.String
[0]);
358 InsertItemToListView(
365 ZeroMemory(&li
, sizeof(LVITEMW
));
367 li
.iItem
= ListView_GetItemCount(hDlgCtrl
);
368 if (LoadStringW(netshell_hInstance
, ResId
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
370 li
.pszText
= szBuffer
;
371 return (INT
)SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&li
);
379 LANStatusUiDetailsDlg(
386 LANSTATUSUI_CONTEXT
* pContext
;
389 PIP_ADAPTER_INFO pAdapterInfo
, pCurAdapter
;
390 PIP_PER_ADAPTER_INFO pPerAdapter
;
397 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
399 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_DETAILS
);
400 InsertColumnToListView(hDlgCtrl
, IDS_PROPERTY
, 0, 80);
401 InsertColumnToListView(hDlgCtrl
, IDS_VALUE
, 1, 80);
406 if (GetAdaptersInfo(NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
408 pAdapterInfo
= (PIP_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
411 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) == NO_ERROR
)
413 pCurAdapter
= pAdapterInfo
;
414 while(pCurAdapter
&& pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
415 pCurAdapter
= pCurAdapter
->Next
;
417 if(pCurAdapter
->Index
!= pContext
->dwAdapterIndex
)
423 ZeroMemory(&li
, sizeof(LVITEMW
));
426 li
.pszText
= szBuffer
;
430 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_PHYSICAL_ADDRESS
);
433 swprintf(szBuffer
, L
"%02x-%02x-%02x-%02x-%02x-%02x",pCurAdapter
->Address
[0], pCurAdapter
->Address
[1],
434 pCurAdapter
->Address
[2], pCurAdapter
->Address
[3], pCurAdapter
->Address
[4], pCurAdapter
->Address
[5]);
435 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
437 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_IP_ADDRESS
);
439 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
440 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
442 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_SUBNET_MASK
);
444 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->IpAddressList
.IpMask
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
445 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
447 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DEF_GATEWAY
);
448 if (li
.iItem
>= 0 && pCurAdapter
->GatewayList
.IpAddress
.String
[0] != '0')
450 if (MultiByteToWideChar(CP_ACP
, 0, pCurAdapter
->GatewayList
.IpAddress
.String
, -1, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
)))
451 SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&li
);
454 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_OBTAINED
);
455 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_LEASE_EXPIRES
);
460 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, NULL
, &dwSize
) == ERROR_BUFFER_OVERFLOW
)
462 pPerAdapter
= (PIP_PER_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
465 if (GetPerAdapterInfo(pContext
->dwAdapterIndex
, pPerAdapter
, &dwSize
) == ERROR_SUCCESS
)
467 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_DNS_SERVERS
);
469 AddIPAddressToListView(hDlgCtrl
, &pPerAdapter
->DnsServerList
, li
.iItem
);
471 CoTaskMemFree(pPerAdapter
);
477 li
.iItem
= InsertItemToListView(hDlgCtrl
, IDS_WINS_SERVERS
);
478 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->PrimaryWinsServer
, li
.iItem
);
479 AddIPAddressToListView(hDlgCtrl
, &pCurAdapter
->SecondaryWinsServer
, li
.iItem
+1);
482 CoTaskMemFree(pAdapterInfo
);
485 if (LOWORD(wParam
) == IDC_CLOSE
)
487 EndDialog(hwndDlg
, FALSE
);
496 LANStatusUiAdvancedDlg(
503 WCHAR szBuffer
[100] = {0};
505 LANSTATUSUI_CONTEXT
* pContext
;
512 page
= (PROPSHEETPAGE
*)lParam
;
513 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
514 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
515 if (pContext
->DHCPEnabled
)
516 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_DHCP
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
518 LoadStringW(netshell_hInstance
, IDS_ASSIGNED_MANUAL
, szBuffer
, sizeof(szBuffer
)/sizeof(WCHAR
));
520 szBuffer
[(sizeof(szBuffer
)/sizeof(WCHAR
))-1] = L
'\0';
521 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSTYPE
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
524 dwIpAddr
= ntohl(pContext
->IpAddress
);
525 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
526 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
527 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSIP
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
529 dwIpAddr
= ntohl(pContext
->SubnetMask
);
530 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
531 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
532 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSSUBNET
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
534 dwIpAddr
= ntohl(pContext
->Gateway
);
537 swprintf(szBuffer
, L
"%u.%u.%u.%u", FIRST_IPADDRESS(dwIpAddr
), SECOND_IPADDRESS(dwIpAddr
),
538 THIRD_IPADDRESS(dwIpAddr
), FOURTH_IPADDRESS(dwIpAddr
));
539 SendDlgItemMessageW(hwndDlg
, IDC_DETAILSGATEWAY
, WM_SETTEXT
, 0, (LPARAM
)szBuffer
);
543 if (LOWORD(wParam
) == IDC_DETAILS
)
545 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
548 DialogBoxParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_LAN_NETSTATUSDETAILS
), GetParent(hwndDlg
),
549 LANStatusUiDetailsDlg
, (LPARAM
)pContext
);
560 FindNetworkAdapter(HDEVINFO hInfo
, SP_DEVINFO_DATA
*pDevInfo
, LPWSTR pGuid
)
562 DWORD dwIndex
, dwSize
;
565 WCHAR szDetail
[200] = L
"SYSTEM\\CurrentControlSet\\Control\\Class\\";
571 ZeroMemory(pDevInfo
, sizeof(SP_DEVINFO_DATA
));
572 pDevInfo
->cbSize
= sizeof(SP_DEVINFO_DATA
);
574 /* get device info */
575 if (!SetupDiEnumDeviceInfo(hInfo
, dwIndex
++, pDevInfo
))
578 /* get device software registry path */
579 if (!SetupDiGetDeviceRegistryPropertyW(hInfo
, pDevInfo
, SPDRP_DRIVER
, NULL
, (LPBYTE
)&szDetail
[39], sizeof(szDetail
)/sizeof(WCHAR
) - 40, &dwSize
))
582 /* open device registry key */
583 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szDetail
, 0, KEY_READ
, &hSubKey
) != ERROR_SUCCESS
)
586 /* query NetCfgInstanceId for current device */
587 dwSize
= sizeof(szNetCfg
);
588 if (RegQueryValueExW(hSubKey
, L
"NetCfgInstanceId", NULL
, NULL
, (LPBYTE
)szNetCfg
, &dwSize
) != ERROR_SUCCESS
)
590 RegCloseKey(hSubKey
);
593 RegCloseKey(hSubKey
);
594 if (!_wcsicmp(pGuid
, szNetCfg
))
607 DisableNetworkAdapter(INetConnection
* pNet
, LANSTATUSUI_CONTEXT
* pContext
, HWND hwndDlg
)
610 NETCON_PROPERTIES
* pProperties
;
611 LPOLESTR pDisplayName
;
613 DWORD dwSize
, dwType
;
616 SP_DEVINFO_DATA DevInfo
;
617 SP_PROPCHANGE_PARAMS PropChangeParams
;
621 if (FAILED(INetConnection_GetProperties(pNet
, &pProperties
)))
625 hInfo
= SetupDiGetClassDevsW(&GUID_DEVCLASS_NET
, NULL
, NULL
, DIGCF_PRESENT
);
628 NcFreeNetconProperties(pProperties
);
632 if (FAILED(StringFromCLSID(&pProperties
->guidId
, &pDisplayName
)))
634 NcFreeNetconProperties(pProperties
);
635 SetupDiDestroyDeviceInfoList(hInfo
);
638 NcFreeNetconProperties(pProperties
);
640 if (FindNetworkAdapter(hInfo
, &DevInfo
, pDisplayName
))
642 PropChangeParams
.ClassInstallHeader
.cbSize
= sizeof(SP_CLASSINSTALL_HEADER
);
643 PropChangeParams
.ClassInstallHeader
.InstallFunction
= DIF_PROPERTYCHANGE
; //;
644 PropChangeParams
.StateChange
= DICS_DISABLE
;
645 PropChangeParams
.Scope
= DICS_FLAG_CONFIGSPECIFIC
;
646 PropChangeParams
.HwProfile
= 0;
648 if (SetupDiSetClassInstallParams(hInfo
, &DevInfo
, &PropChangeParams
.ClassInstallHeader
, sizeof(SP_PROPCHANGE_PARAMS
)))
650 if (SetupDiCallClassInstaller(DIF_PROPERTYCHANGE
, hInfo
, &DevInfo
))
654 SetupDiDestroyDeviceInfoList(hInfo
);
656 swprintf(szPath
, L
"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pDisplayName
);
657 CoTaskMemFree(pDisplayName
);
659 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
663 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, NULL
, &dwSize
) != ERROR_SUCCESS
|| dwType
!= REG_SZ
)
669 pPnp
= (LPWSTR
)CoTaskMemAlloc(dwSize
);
676 if (RegQueryValueExW(hKey
, L
"PnpInstanceID", NULL
, &dwType
, (LPBYTE
)pPnp
, &dwSize
) != ERROR_SUCCESS
)
684 swprintf(szPath
, L
"System\\CurrentControlSet\\Hardware Profiles\\Current\\System\\CurrentControlSet\\Enum\\%s", pPnp
);
687 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, szPath
, 0, NULL
, 0, KEY_WRITE
, NULL
, &hKey
, NULL
) != ERROR_SUCCESS
)
690 dwSize
= 1; /* enable = 0, disable = 1 */
691 RegSetValueExW(hKey
, L
"CSConfigFlags", 0, REG_DWORD
, (LPBYTE
)&dwSize
, sizeof(DWORD
));
697 PropSheet_PressButton(GetParent(hwndDlg
), PSBTN_CANCEL
);
698 ZeroMemory(&nid
, sizeof(nid
));
699 nid
.cbSize
= sizeof(nid
);
700 nid
.uID
= pContext
->uID
;
701 nid
.hWnd
= pContext
->hwndDlg
;
702 nid
.uFlags
= NIF_STATE
;
703 nid
.dwState
= NIS_HIDDEN
;
704 nid
.dwStateMask
= NIS_HIDDEN
;
706 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
720 LANSTATUSUI_CONTEXT
* pContext
;
726 page
= (PROPSHEETPAGE
*)lParam
;
727 pContext
= (LANSTATUSUI_CONTEXT
*)page
->lParam
;
728 pContext
->hwndDlg
= hwndDlg
;
729 InitializeLANStatusUiDlg(hwndDlg
, pContext
);
730 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pContext
);
733 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
734 if (LOWORD(wParam
) == IDC_STATUS_PROPERTIES
)
738 ShowNetConnectionProperties(pContext
->pNet
, GetParent(pContext
->hwndDlg
));
739 BringWindowToTop(GetParent(pContext
->hwndDlg
));
743 else if (LOWORD(wParam
) == IDC_ENDISABLE
)
745 DisableNetworkAdapter(pContext
->pNet
, pContext
, hwndDlg
);
749 lppsn
= (LPPSHNOTIFY
) lParam
;
750 if (lppsn
->hdr
.code
== PSN_APPLY
|| lppsn
->hdr
.code
== PSN_RESET
)
752 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
753 SetWindowLongPtr(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
754 pContext
->hwndDlg
= NULL
;
763 InitializePropertyDialog(
764 LANSTATUSUI_CONTEXT
* pContext
,
765 NETCON_PROPERTIES
* pProperties
)
767 DWORD dwSize
, dwAdapterIndex
, dwResult
;
769 IP_ADAPTER_INFO
* pAdapterInfo
, *pCurAdapter
;
771 if (FAILED(StringFromCLSID(&pProperties
->guidId
, &pStr
)))
776 /* get the IfTable */
778 dwResult
= GetAdaptersInfo(NULL
, &dwSize
);
779 if (dwResult
!= ERROR_BUFFER_OVERFLOW
)
785 pAdapterInfo
= (PIP_ADAPTER_INFO
)CoTaskMemAlloc(dwSize
);
788 CoTaskMemFree(pAdapterInfo
);
793 if (GetAdaptersInfo(pAdapterInfo
, &dwSize
) != NO_ERROR
)
795 CoTaskMemFree(pAdapterInfo
);
800 if (!GetAdapterIndexFromNetCfgInstanceId(pAdapterInfo
, pStr
, &dwAdapterIndex
))
802 CoTaskMemFree(pAdapterInfo
);
807 pCurAdapter
= pAdapterInfo
;
808 while(pCurAdapter
->Index
!= dwAdapterIndex
)
809 pCurAdapter
= pCurAdapter
->Next
;
812 pContext
->IpAddress
= inet_addr(pCurAdapter
->IpAddressList
.IpAddress
.String
);
813 pContext
->SubnetMask
= inet_addr(pCurAdapter
->IpAddressList
.IpMask
.String
);
814 pContext
->Gateway
= inet_addr(pCurAdapter
->GatewayList
.IpAddress
.String
);
815 pContext
->DHCPEnabled
= pCurAdapter
->DhcpEnabled
;
817 CoTaskMemFree(pAdapterInfo
);
818 pContext
->dwAdapterIndex
= dwAdapterIndex
;
822 ShowStatusPropertyDialog(
823 LANSTATUSUI_CONTEXT
* pContext
,
826 HPROPSHEETPAGE hppages
[2];
827 PROPSHEETHEADERW pinfo
;
828 NETCON_PROPERTIES
* pProperties
= NULL
;
830 ZeroMemory(&pinfo
, sizeof(PROPSHEETHEADERW
));
831 ZeroMemory(hppages
, sizeof(hppages
));
832 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
833 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
| PSH_PROPTITLE
| PSH_NOAPPLYNOW
;
834 pinfo
.u3
.phpage
= hppages
;
835 pinfo
.hwndParent
= hwndDlg
;
837 if (INetConnection_GetProperties(pContext
->pNet
, &pProperties
) == NOERROR
)
839 if (pProperties
->pszwName
)
841 pinfo
.pszCaption
= pProperties
->pszwName
;
842 pinfo
.dwFlags
|= PSH_PROPTITLE
;
844 InitializePropertyDialog(pContext
, pProperties
);
845 if (pProperties
->MediaType
== NCM_LAN
&& pProperties
->Status
== NCS_CONNECTED
)
847 hppages
[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUS
), LANStatusUiDlg
, (LPARAM
)pContext
, NULL
);
851 hppages
[pinfo
.nPages
] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_LAN_NETSTATUSADVANCED
), LANStatusUiAdvancedDlg
, (LPARAM
)pContext
, NULL
);
852 if (hppages
[pinfo
.nPages
])
857 PropertySheetW(&pinfo
);
860 else if (pProperties
->Status
== NCS_MEDIA_DISCONNECTED
|| pProperties
->Status
== NCS_DISCONNECTED
||
861 pProperties
->Status
== NCS_HARDWARE_DISABLED
)
863 ShowNetConnectionProperties(pContext
->pNet
, pContext
->hwndDlg
);
866 NcFreeNetconProperties(pProperties
);
879 LANSTATUSUI_CONTEXT
* pContext
;
884 pContext
= (LANSTATUSUI_CONTEXT
*)lParam
;
885 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)lParam
);
886 pContext
->nIDEvent
= SetTimer(hwndDlg
, 0xFABC, 1000, NULL
);
889 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
890 if (wParam
== (WPARAM
)pContext
->nIDEvent
)
892 UpdateLanStatus(pContext
->hwndDlg
, pContext
);
895 case WM_SHOWSTATUSDLG
:
896 if (LOWORD(lParam
) == WM_LBUTTONDOWN
)
898 pContext
= (LANSTATUSUI_CONTEXT
*)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
902 if (pContext
->hwndDlg
)
904 ShowWindow(GetParent(pContext
->hwndDlg
), SW_SHOW
);
905 BringWindowToTop(GetParent(pContext
->hwndDlg
));
909 ShowStatusPropertyDialog(pContext
, hwndDlg
);
919 InitializeNetTaskbarNotifications(
920 ILanStatusImpl
* This
)
924 INetConnectionManager
* INetConMan
;
925 IEnumNetConnection
* IEnumCon
;
926 INetConnection
* INetCon
;
927 NETCON_PROPERTIES
* pProps
;
931 NOTIFICATION_ITEM
* pItem
, *pLast
= NULL
;
932 LANSTATUSUI_CONTEXT
* pContext
;
939 hr
= INetConnection_GetProperties(pItem
->pNet
, &pProps
);
942 ZeroMemory(&nid
, sizeof(nid
));
943 nid
.cbSize
= sizeof(nid
);
944 nid
.uID
= pItem
->uID
;
945 nid
.hWnd
= pItem
->hwndDlg
;
946 nid
.uFlags
= NIF_STATE
;
947 if (pProps
->dwCharacter
& NCCF_SHOW_ICON
)
950 nid
.dwState
= NIS_HIDDEN
;
952 nid
.dwStateMask
= NIS_HIDDEN
;
953 Shell_NotifyIconW(NIM_MODIFY
, &nid
);
954 NcFreeNetconProperties(pProps
);
956 pItem
= pItem
->pNext
;
960 /* get an instance to of IConnectionManager */
962 //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&INetConMan);
964 hr
= INetConnectionManager_Constructor(NULL
, &IID_INetConnectionManager
, (LPVOID
*)&INetConMan
);
968 hr
= INetConnectionManager_EnumConnections(INetConMan
, NCME_DEFAULT
, &IEnumCon
);
971 INetConnectionManager_Release(INetConMan
);
978 hr
= IEnumNetConnection_Next(IEnumCon
, 1, &INetCon
, &Count
);
981 pItem
= (NOTIFICATION_ITEM
*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM
));
985 pContext
= (LANSTATUSUI_CONTEXT
*)CoTaskMemAlloc(sizeof(LANSTATUSUI_CONTEXT
));
988 CoTaskMemFree(pItem
);
993 ZeroMemory(pContext
, sizeof(LANSTATUSUI_CONTEXT
));
994 pContext
->uID
= Index
;
995 pContext
->pNet
= INetCon
;
998 pItem
->pNet
= INetCon
;
999 hwndDlg
= CreateDialogParamW(netshell_hInstance
, MAKEINTRESOURCEW(IDD_STATUS
), NULL
, LANStatusDlg
, (LPARAM
)pContext
);
1002 ZeroMemory(&nid
, sizeof(nid
));
1003 nid
.cbSize
= sizeof(nid
);
1005 nid
.uFlags
= NIF_ICON
| NIF_MESSAGE
;
1007 nid
.uCallbackMessage
= WM_SHOWSTATUSDLG
;
1010 hr
= INetConnection_GetProperties(INetCon
, &pProps
);
1013 CopyMemory(&pItem
->guidItem
, &pProps
->guidId
, sizeof(GUID
));
1014 if (!(pProps
->dwCharacter
& NCCF_SHOW_ICON
))
1016 nid
.dwState
= NIS_HIDDEN
;
1017 nid
.dwStateMask
= NIS_HIDDEN
;
1018 nid
.uFlags
|= NIF_STATE
;
1020 if (pProps
->Status
== NCS_MEDIA_DISCONNECTED
|| pProps
->Status
== NCS_DISCONNECTED
|| pProps
->Status
== NCS_HARDWARE_DISABLED
)
1021 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_OFF
));
1022 else if (pProps
->Status
== NCS_CONNECTED
)
1023 nid
.hIcon
= LoadIcon(netshell_hInstance
, MAKEINTRESOURCE(IDI_NET_IDLE
));
1026 wcscpy(nid
.szTip
, pProps
->pszwName
);
1027 nid
.uFlags
|= NIF_TIP
;
1029 pContext
->hwndStatusDlg
= hwndDlg
;
1030 pItem
->hwndDlg
= hwndDlg
;
1032 if (Shell_NotifyIconW(NIM_ADD
, &nid
))
1035 pLast
->pNext
= pItem
;
1037 This
->pHead
= pItem
;
1044 CoTaskMemFree(pItem
);
1050 This
->lpNetMan
= INetConMan
;
1051 IEnumNetConnection_Release(IEnumCon
);
1056 ShowStatusDialogByCLSID(
1057 ILanStatusImpl
* This
,
1058 const GUID
*pguidCmdGroup
)
1060 NOTIFICATION_ITEM
* pItem
;
1062 pItem
= This
->pHead
;
1065 if (IsEqualGUID(&pItem
->guidItem
, pguidCmdGroup
))
1067 SendMessageW(pItem
->hwndDlg
, WM_SHOWSTATUSDLG
, 0, WM_LBUTTONDOWN
);
1070 pItem
= pItem
->pNext
;
1077 IOleCommandTarget_fnQueryInterface(
1078 IOleCommandTarget
* iface
,
1082 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1085 if (IsEqualIID (iid
, &IID_IUnknown
) ||
1086 IsEqualIID (iid
, &IID_IOleCommandTarget
))
1089 IUnknown_AddRef(iface
);
1092 MessageBoxW(NULL
, L
"IOleCommandTarget_fnQueryInterface", NULL
, MB_OK
);
1093 return E_NOINTERFACE
;
1099 IOleCommandTarget_fnAddRef(
1100 IOleCommandTarget
* iface
)
1102 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1103 ULONG refCount
= InterlockedIncrement(&This
->ref
);
1111 IOleCommandTarget_fnRelease(
1112 IOleCommandTarget
* iface
)
1115 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1116 ULONG refCount
= InterlockedDecrement(&This
->ref
);
1120 CoTaskMemFree (This
);
1131 IOleCommandTarget_fnQueryStatus(
1132 IOleCommandTarget
* iface
,
1133 const GUID
*pguidCmdGroup
,
1136 OLECMDTEXT
*pCmdText
)
1138 MessageBoxW(NULL
, pCmdText
->rgwz
, L
"IOleCommandTarget_fnQueryStatus", MB_OK
);
1145 IOleCommandTarget_fnExec(
1146 IOleCommandTarget
* iface
,
1147 const GUID
*pguidCmdGroup
,
1153 ILanStatusImpl
* This
= (ILanStatusImpl
*)iface
;
1157 if (IsEqualIID(pguidCmdGroup
, &CGID_ShellServiceObject
))
1159 return InitializeNetTaskbarNotifications(This
);
1163 /* invoke status dialog */
1164 return ShowStatusDialogByCLSID(This
, pguidCmdGroup
);
1171 static const IOleCommandTargetVtbl vt_OleCommandTarget
=
1173 IOleCommandTarget_fnQueryInterface
,
1174 IOleCommandTarget_fnAddRef
,
1175 IOleCommandTarget_fnRelease
,
1176 IOleCommandTarget_fnQueryStatus
,
1177 IOleCommandTarget_fnExec
,
1181 HRESULT WINAPI
LanConnectStatusUI_Constructor (IUnknown
* pUnkOuter
, REFIID riid
, LPVOID
* ppv
)
1183 ILanStatusImpl
* This
;
1184 static volatile ILanStatusImpl
*cached_This
= NULL
;
1190 return CLASS_E_NOAGGREGATION
;
1192 This
= (ILanStatusImpl
*) CoTaskMemAlloc(sizeof (ILanStatusImpl
));
1194 return E_OUTOFMEMORY
;
1197 This
->lpVtbl
= (IOleCommandTarget
*)&vt_OleCommandTarget
;
1198 This
->lpNetMan
= NULL
;
1201 if (InterlockedCompareExchangePointer((void **)&cached_This
, This
, NULL
) != NULL
)
1203 CoTaskMemFree(This
);
1206 return IOleCommandTarget_fnQueryInterface ((IOleCommandTarget
*)cached_This
, riid
, ppv
);