ReactOS 0.4.16-dev-2613-g9533ad7
tcpipconf_notify.c
Go to the documentation of this file.
1#include "precomp.h"
2
3#include <winnls.h>
4#include <winsock.h>
5#include <iphlpapi.h>
6#include <dhcpcsdk.h>
7#include <dhcpcapi.h>
8
10
11typedef struct
12{
14 LPWSTR szTCPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\TCPAllowedPorts
15 LPWSTR szUDPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\UDPAllowedPorts
16 LPWSTR szRawIPAllowedProtocols; // KEY: Tcpip\Parameter\{InstanceGuid}\RawIPAllowedProtocols
21
22// KEY: Tcpip\Parameter\{InstanceGuid}\IpAddress | DhcpIpAddress
23// KEY: Tcpip\Parameter\{InstanceGuid}\SubnetMask | DhcpSubnetMask
24// KEY: Tcpip\Parameter\{InstanceGuid}\DefaultGateway | DhcpDefaultGateway
25// KEY: Tcpip\Parameter\{InstanceGuid}\NameServer | DhcpNameServer
26// KEY: Services\NetBT\Parameters\Interfaces\Tcpip_{INSTANCE_GUID}
27
28typedef struct
29{
33 WCHAR szDomain[100];
36
37typedef struct tagIP_ADDR
38{
40 union
41 {
44 } u;
48
49typedef enum
50{
51 METRIC = 1,
53 IPADDR = 3
55
56typedef struct
57{
64
65typedef struct
66{
70
79
80typedef struct
81{
82 const INetCfgComponentControl *lpVtbl;
83 const INetCfgComponentPropertyUi *lpVtblCompPropertyUi;
84 const INetCfgComponentSetup *lpVtblCompSetup;
87 INetCfg *pNCfg;
88 INetCfgComponent *pNComp;
93
94typedef struct
95{
98 WCHAR szIP[16];
101
102typedef struct
103{
106 WCHAR szIP[16];
107 WCHAR szMask[16];
109
110typedef struct
111{
114 WCHAR szIP[16];
116
117typedef struct
118{
123
124typedef struct
125{
130
132{
133 return (TcpipConfNotifyImpl*)((char *)iface - FIELD_OFFSET(TcpipConfNotifyImpl, lpVtblCompPropertyUi));
134}
135
137{
138 return (TcpipConfNotifyImpl*)((char *)iface - FIELD_OFFSET(TcpipConfNotifyImpl, lpVtblCompSetup));
139}
140
141INT GetSelectedItem(HWND hDlgCtrl);
143VOID InsertColumnToListView(HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size);
147
148VOID
149DisplayError(UINT ResTxt, UINT ResTitle, UINT Type)
150{
151 WCHAR szBuffer[300];
152 WCHAR szTitle[100];
153
154 if (LoadStringW(netcfgx_hInstance, ResTxt, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
155 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
156 else
157 szBuffer[0] = L'\0';
158
159 if (LoadStringW(netcfgx_hInstance, ResTitle, szTitle, sizeof(szTitle)/sizeof(WCHAR)))
160 szTitle[(sizeof(szTitle)/sizeof(WCHAR))-1] = L'\0';
161 else
162 szTitle[0] = L'\0';
163
164 MessageBoxW(NULL, szBuffer, szTitle, Type);
165}
166
167
168/***************************************************************
169 * TCP/IP Filter Dialog
170 *
171 */
172
176 HWND hwndDlg,
177 UINT uMsg,
180)
181{
182 TcpipPortSettings * pPort;
183 UINT Num;
185 LVITEMW li;
186 WCHAR szBuffer[100];
187
188 switch(uMsg)
189 {
190 case WM_INITDIALOG:
191 pPort = (TcpipPortSettings*)lParam;
192 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pPort);
193 if (LoadStringW(netcfgx_hInstance, pPort->ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
194 {
195 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
196 SendDlgItemMessageW(hwndDlg, IDC_PORT_DESC, WM_SETTEXT, 0, (LPARAM)szBuffer);
197 }
198
199 if (pPort->MaxNum == 65536)
201 else
203
204 return TRUE;
205 case WM_COMMAND:
206 if (LOWORD(wParam) == IDCANCEL)
207 {
208 EndDialog(hwndDlg, FALSE);
209 break;
210 }
211 else if (LOWORD(wParam) == IDC_OK)
212 {
213 pPort = (TcpipPortSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
214 Num = GetDlgItemInt(hwndDlg, IDC_PORT_VAL, NULL, TRUE);
215 if (Num > pPort->MaxNum || Num == 0)
216 {
217 if (pPort->MaxNum == 65536)
219 else
221
223 break;
224 }
225 if (GetWindowTextW(GetDlgItem(hwndDlg, IDC_PORT_VAL), szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
226 {
227 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
228 ZeroMemory(&find, sizeof(LVFINDINFOW));
229 find.flags = LVFI_STRING;
230 find.psz = szBuffer;
231 if (SendMessageW(pPort->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1)
232 {
233 ZeroMemory(&li, sizeof(LVITEMW));
234 li.mask = LVIF_TEXT;
235 li.iItem = ListView_GetItemCount(pPort->hDlgCtrl);
236 li.pszText = szBuffer;
237 SendMessageW(pPort->hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
238 EndDialog(hwndDlg, TRUE);
239 break;
240 }
243 break;
244 }
245 }
246 }
247 return FALSE;
248}
249
250VOID
251InitFilterListBox(LPWSTR pData, HWND hwndDlg, HWND hDlgCtrl, UINT AllowButton, UINT RestrictButton, UINT AddButton, UINT DelButton)
252{
253 LVITEMW li;
254 LPWSTR pCur;
255 INT iItem;
256
257 if (!pData || !_wtoi(pData))
258 {
259 CheckDlgButton(hwndDlg, AllowButton, BST_CHECKED);
261 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE);
262 return;
263 }
264
265 pCur = pData;
266 memset(&li, 0x0, sizeof(LVITEMW));
267 li.mask = LVIF_TEXT;
268 iItem = 0;
269
270 while(pCur[0])
271 {
272 li.pszText = pCur;
273 li.iItem = iItem;
274 SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
275 iItem++;
276 pCur += wcslen(pCur) + 1;
277 }
278
279 if (!iItem)
280 CheckDlgButton(hwndDlg, AllowButton, BST_CHECKED);
281 else
282 CheckDlgButton(hwndDlg, RestrictButton, BST_CHECKED);
283}
284
285LPWSTR
287 HWND hDlgCtrl,
289{
290 INT iCount, iIndex;
291 LVITEMW li;
294 WCHAR szBuffer[10];
295
296 iCount = ListView_GetItemCount(hDlgCtrl);
297 if (!iCount)
298 {
299 pData = (LPWSTR)CoTaskMemAlloc(3 * sizeof(WCHAR));
300 if (!pData)
301 return NULL;
302 pData[0] = L'0';
303 pData[1] = L'\0';
304 pData[2] = L'\0';
305 *Size = 3 * sizeof(WCHAR);
306 return pData;
307 }
308
309 pData = CoTaskMemAlloc((6 * iCount + 1) * sizeof(WCHAR));
310 if (!pData)
311 return NULL;
312
313 pCur = pData;
314 dwSize = 0;
315 for(iIndex = 0; iIndex < iCount; iIndex++)
316 {
317 ZeroMemory(&li, sizeof(LVITEMW));
318 li.mask = LVIF_TEXT;
319 li.iItem = iIndex;
320 li.pszText = szBuffer;
321 li.cchTextMax = sizeof(szBuffer) /sizeof(WCHAR);
322 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
323 {
324 wcscpy(pCur, szBuffer);
325 dwSize += wcslen(szBuffer) + 1;
326 pCur += wcslen(szBuffer) + 1;
327 }
328 }
329 pCur[0] = L'\0';
330 *Size = (dwSize+1) * sizeof(WCHAR);
331 return pData;
332}
333
336 HWND hwndDlg)
337{
338 TcpFilterSettings * pFilter;
339
340 pFilter = CoTaskMemAlloc(sizeof(TcpFilterSettings));
341 if (!pFilter)
342 return NULL;
343
345 pFilter->EnableSecurityFilters = TRUE;
346 else
347 pFilter->EnableSecurityFilters = FALSE;
348
349 pFilter->szTCPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_TCP_LIST), &pFilter->TCPSize);
350 pFilter->szUDPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_UDP_LIST), &pFilter->UDPSize);
352
353 return pFilter;
354}
355
356static
357VOID
359 HWND hwndDlg,
360 HWND hDlgCtrl,
361 UINT MaxItem,
362 UINT ResId)
363{
365
366 Port.MaxNum = MaxItem;
367 Port.hDlgCtrl = hDlgCtrl;
368 Port.ResId = ResId;
369
371}
372
373static
374VOID
376 HWND hDlgCtrl)
377{
378 INT iIndex = GetSelectedItem(hDlgCtrl);
379
380 if (iIndex != -1)
381 {
382 (void)ListView_DeleteItem(hDlgCtrl, iIndex);
383 return;
384 }
386}
387
391 HWND hwndDlg,
392 UINT uMsg,
395)
396{
397 TcpipConfNotifyImpl *pContext;
398 TcpFilterSettings *pFilter;
399
400 switch(uMsg)
401 {
402 case WM_INITDIALOG:
403 pContext = (TcpipConfNotifyImpl*)lParam;
407 if (pContext->pCurrentConfig->pFilter)
408 {
414 }
415 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
416 return TRUE;
417 case WM_COMMAND:
418 if (HIWORD(wParam) == BN_CLICKED)
419 {
420 switch (LOWORD(wParam))
421 {
424 {
429 }
430 break;
431 case IDC_TCP_RESTRICT:
433 {
438 }
439 break;
442 {
447 }
448 break;
449 case IDC_UDP_RESTRICT:
451 {
456 }
457 break;
458 case IDC_IP_ALLOW_ALL:
460 {
465 }
466 break;
467 case IDC_IP_RESTRICT:
469 {
474 }
475 break;
476 case IDC_USE_FILTER:
479
480 break;
481 }
482 }
483 switch(LOWORD(wParam))
484 {
485 case IDC_OK:
486 pContext = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
487 pFilter = StoreTcpipFilterSettings(hwndDlg);
488 if (pFilter)
489 {
490 if (pContext->pCurrentConfig->pFilter)
491 {
492 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szTCPAllowedPorts);
493 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szUDPAllowedPorts);
494 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szRawIPAllowedProtocols);
495 CoTaskMemFree(pContext->pCurrentConfig->pFilter);
496 }
497 pContext->pCurrentConfig->pFilter = pFilter;
498 }
499 EndDialog(hwndDlg, (INT_PTR)TRUE);
500 break;
501 case IDCANCEL:
502 EndDialog(hwndDlg, FALSE);
503 break;
504 case IDC_TCP_ADD:
505 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_TCP_LIST), 65536, IDS_TCP_PORTS);
506 break;
507 case IDC_TCP_DEL:
509 break;
510 case IDC_UDP_ADD:
511 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_UDP_LIST), 65536, IDS_UDP_PORTS);
512 break;
513 case IDC_UDP_DEL:
515 break;
516 case IDC_IP_ADD:
517 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_IP_LIST), 256, IDS_IP_PROTO);
518 break;
519 case IDC_IP_DEL:
520 DelItem(GetDlgItem(hwndDlg, IDC_IP_LIST));
521 break;
522 default:
523 break;
524 }
525 default:
526 break;
527 }
528
529 return FALSE;
530}
531
532
535{
536 PROPSHEETPAGEW ppage;
537
538 memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW));
539 ppage.dwSize = sizeof(PROPSHEETPAGEW);
540 ppage.dwFlags = PSP_DEFAULT;
541 ppage.u.pszTemplate = resname;
542 ppage.pfnDlgProc = dlgproc;
543 ppage.lParam = lParam;
545 if (szTitle)
546 {
547 ppage.dwFlags |= PSP_USETITLE;
548 ppage.pszTitle = szTitle;
549 }
550 return CreatePropertySheetPageW(&ppage);
551}
552
553/***************************************************************
554 * TCP/IP Advanced Option Dialog
555 *
556 */
557
558VOID
560 HWND hwndDlg,
562{
563 WCHAR szText[500];
564 /* store context */
566
567 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTER, szText, sizeof(szText)/sizeof(WCHAR)))
568 {
569 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
570 if (SendDlgItemMessageW(hwndDlg, IDC_OPTLIST, LB_ADDSTRING, 0, (LPARAM)szText) != LB_ERR)
572 }
573
574 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTERDESC, szText, sizeof(szText)/sizeof(WCHAR)))
575 {
576 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
577 SendDlgItemMessageW(hwndDlg, IDC_OPTDESC, WM_SETTEXT, 0, (LPARAM)szText);
578 }
579}
580
581
582
586 HWND hwndDlg,
587 UINT uMsg,
590)
591{
594
595 switch(uMsg)
596 {
597 case WM_INITDIALOG:
599 This = (TcpipConfNotifyImpl*)page->lParam;
601 return TRUE;
602 case WM_COMMAND:
603 if (LOWORD(wParam) == IDC_OPTPROP)
604 {
607 GetParent(hwndDlg),
610 break;
611 }
612 }
613 return FALSE;
614}
615
616VOID
618 HWND hDlgCtrl,
619 UINT ResId,
620 UINT SubItem,
621 UINT Size)
622{
623 WCHAR szBuffer[200];
624 LVCOLUMNW lc;
625
626 if (!LoadStringW(netcfgx_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
627 return;
628
629 memset(&lc, 0, sizeof(LV_COLUMN) );
631 lc.iSubItem = SubItem;
632 lc.fmt = LVCFMT_FIXED_WIDTH;
633 lc.cx = Size;
634 lc.cchTextMax = wcslen(szBuffer);
635 lc.pszText = szBuffer;
636
637 (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc);
638}
639
640VOID
642 HWND hDlgCtrl,
643 IP_ADDR * pAddr,
644 BOOL bSubMask)
645{
646 WCHAR szBuffer[70];
647 DWORD dwIpAddr;
648 UINT itemCount = 0;
649 LVITEMW li;
650
651 while(pAddr)
652 {
653 ZeroMemory(&li, sizeof(li));
654 li.mask = LVIF_TEXT;
655 li.iItem = itemCount;
656 li.iSubItem = 0;
657 dwIpAddr = pAddr->IpAddress;
658 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
659 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
660
661 li.pszText = szBuffer;
662 li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
663 if (li.iItem != -1)
664 {
665 if (bSubMask)
666 {
667 dwIpAddr = pAddr->u.Subnetmask;
668 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
669 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
670 }
671 else
672 {
673 if (pAddr->u.Metric)
674 swprintf(szBuffer, L"%u", pAddr->u.Metric);
675 else
676 LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR));
677 }
678
679 li.mask = LVIF_TEXT;
680 li.iSubItem = 1;
681 li.pszText = szBuffer;
682 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
683 }
684 itemCount++;
685 pAddr = pAddr->Next;
686 }
687}
688
689VOID
691 HWND hwndDlg,
693{
694 RECT rect;
695 LVITEMW li;
696 WCHAR szBuffer[100];
697
701
702 if (This->pCurrentConfig->DhcpEnabled)
703 {
704 if (LoadStringW(netcfgx_hInstance, IDS_DHCPACTIVE, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
705 {
706 ZeroMemory(&li, sizeof(LVITEMW));
707 li.mask = LVIF_TEXT;
708 li.pszText = szBuffer;
710 }
712 }
713 else
714 {
715 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_IPLIST), This->pCurrentConfig->Ip, TRUE);
716 }
717
720
724
725 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_GWLIST), This->pCurrentConfig->Gw, FALSE);
726
729
731 if (This->pCurrentConfig->Metric)
732 {
734 SetDlgItemInt(hwndDlg, IDC_IFMETRIC, This->pCurrentConfig->Metric, FALSE);
735 }
736 else
737 {
740 }
741}
742
746 HWND hwndDlg,
747 UINT uMsg,
750)
751{
752 WCHAR szBuffer[70];
753 TcpipGwSettings *pGwSettings;
754 DWORD dwIpAddr;
755 LPNMIPADDRESS lpnmipa;
757
758 switch(uMsg)
759 {
760 case WM_INITDIALOG:
761 pGwSettings = (TcpipGwSettings *)lParam;
763
768
769 if (pGwSettings->bAdd)
770 {
771 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
772 {
773 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
774 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
775 }
778 }
779 else
780 {
781 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
782 {
783 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
784 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
785 }
786
788
789 if (pGwSettings->Metric)
790 {
791 SetDlgItemInt(hwndDlg, IDC_GWMETRIC, pGwSettings->Metric, FALSE);
794 }
795 else
796 {
800 }
801 }
802 return TRUE;
803 case WM_COMMAND:
805 {
807 {
811 }
812 else
813 {
816 }
817 break;
818 }
819 else if (LOWORD(wParam) == IDCANCEL)
820 {
821 EndDialog(hwndDlg, FALSE);
822 break;
823 }
824 else if (LOWORD(wParam) == IDC_OK)
825 {
826 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
827 {
828 pGwSettings = (TcpipGwSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
829 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pGwSettings->szIP);
830
831 ZeroMemory(&find, sizeof(LVFINDINFOW));
832 find.flags = LVFI_STRING;
833 find.psz = pGwSettings->szIP;
834
836 pGwSettings->Metric = GetDlgItemInt(hwndDlg, IDC_GWMETRIC, NULL, FALSE);
837 else
838 pGwSettings->Metric = 0;
839
840
841 if (SendMessageW(pGwSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1)
842 {
843 EndDialog(hwndDlg, TRUE);
844 break;
845 }
846 if (!pGwSettings->bAdd)
847 {
848 EndDialog(hwndDlg, FALSE);
849 break;
850 }
852 }
853 break;
854 }
855 break;
856 case WM_NOTIFY:
857 lpnmipa = (LPNMIPADDRESS) lParam;
858 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
859 {
860 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
861 {
862 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
864 }
865 }
866 break;
867 }
868 return FALSE;
869}
870
871BOOL
872GetGWListEntry(HWND hDlgCtrl, INT Index, TcpipGwSettings * pGwSettings)
873{
874 LVITEMW li;
875 WCHAR szBuffer[30];
876 BOOL bRet;
877
878 ZeroMemory(&li, sizeof(LVITEMW));
879 li.mask = LVIF_TEXT;
880 li.cchTextMax = 16;
881 li.pszText = pGwSettings->szIP;
882 li.iItem = Index;
883
884 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
885 return FALSE;
886 li.pszText = szBuffer;
887 li.cchTextMax = 30;
888 li.iSubItem = 1;
889
890 bRet = SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
891 if (bRet)
892 {
893 pGwSettings->Metric = _wtoi(szBuffer);
894 }
895
896 return bRet;
897}
898
902 HWND hwndDlg,
903 UINT uMsg,
906)
907{
908 LPNMIPADDRESS lpnmipa;
909 DWORD dwIpAddr;
910 TcpipIpSettings *pIpSettings;
911 WCHAR szBuffer[50];
913 LRESULT lResult;
914
915 switch(uMsg)
916 {
917 case WM_INITDIALOG:
918 pIpSettings = (TcpipIpSettings*)lParam;
920
929
930 if (pIpSettings->bAdd)
931 {
932 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
933 {
934 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
935 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
936 }
938 }
939 else
940 {
941 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
942 {
943 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
944 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
945 }
946
949 }
950 return TRUE;
951 case WM_NOTIFY:
952 lpnmipa = (LPNMIPADDRESS) lParam;
953 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
954 {
955 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
956 {
957 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
958 {
959 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
961 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
963 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
964 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
966 }
967 }
968 }
969 break;
970 case WM_COMMAND:
971 if (LOWORD(wParam) == IDC_OK)
972 {
973 pIpSettings = (TcpipIpSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
974 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pIpSettings->szIP);
975 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_GETTEXT, 16, (LPARAM)pIpSettings->szMask);
976
977 ZeroMemory(&find, sizeof(LVFINDINFOW));
978 find.flags = LVFI_STRING;
979 find.psz = pIpSettings->szIP;
980 lResult = SendMessageW(pIpSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find);
981
982 if (lResult == -1)
983 {
984 EndDialog(hwndDlg, TRUE);
985 break;
986 }
987 else if (!pIpSettings->bAdd)
988 {
989 EndDialog(hwndDlg, FALSE);
990 break;
991 }
993 break;
994 }
995 else if (LOWORD(wParam) == IDCANCEL)
996 {
997 EndDialog(hwndDlg, FALSE);
998 }
999 break;
1000 }
1001 return FALSE;
1002}
1003
1004BOOL
1006 LPWSTR szName)
1007{
1008 UINT Index;
1010
1011 for(Index = 0; Index < Length; Index++)
1012 if (iswalnum(szName[Index]) == 0 && szName[Index] != '.' && szName[Index] != '-')
1013 return FALSE;
1014
1015 return TRUE;
1016}
1017
1018INT_PTR
1021 HWND hwndDlg,
1022 UINT uMsg,
1023 WPARAM wParam,
1025)
1026{
1027 WCHAR szBuffer[100];
1028 TcpipSuffixSettings * pSettings;
1029 LRESULT lLength;
1030
1031 switch(uMsg)
1032 {
1033 case WM_INITDIALOG:
1034 pSettings = (TcpipSuffixSettings*)lParam;
1035 if (!pSettings->bAdd)
1036 {
1037 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)pSettings->Suffix);
1038 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1039 {
1040 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1041 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1042 }
1043 CoTaskMemFree(pSettings->Suffix);
1044 pSettings->Suffix = NULL;
1045 }
1046 else
1047 {
1048 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1049 {
1050 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1051 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1052 }
1053 }
1054 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pSettings);
1055 return TRUE;
1056 case WM_COMMAND:
1057 if (LOWORD(wParam) == IDCANCEL)
1058 {
1059 EndDialog(hwndDlg, FALSE);
1060 break;
1061 }
1062 else if (LOWORD(wParam) == IDC_OK)
1063 {
1064 lLength = SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXTLENGTH, 0, 0);
1065 if (lLength)
1066 {
1067 pSettings = (TcpipSuffixSettings*) GetWindowLongPtr(hwndDlg, DWLP_USER);
1068 pSettings->Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1)* sizeof(WCHAR));
1069 if (pSettings->Suffix)
1070 {
1071 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, lLength + 1, (LPARAM)pSettings->Suffix);
1072 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->Suffix) != LB_ERR)
1073 {
1075 CoTaskMemFree(pSettings->Suffix);
1076 break;
1077 }
1078
1079 if (!VerifyDNSSuffix(pSettings->Suffix))
1080 {
1082 CoTaskMemFree(pSettings->Suffix);
1083 break;
1084 }
1085 EndDialog(hwndDlg, TRUE);
1086 }
1087 }
1088 break;
1089 }
1090 }
1091 return FALSE;
1092}
1093
1094
1095INT
1097{
1098 LVITEMW li;
1099 UINT iItemCount, iIndex;
1100
1101 iItemCount = ListView_GetItemCount(hDlgCtrl);
1102 if (!iItemCount)
1103 return -1;
1104
1105 for (iIndex = 0; iIndex < iItemCount; iIndex++)
1106 {
1107 ZeroMemory(&li, sizeof(LVITEMW));
1108 li.mask = LVIF_STATE;
1109 li.stateMask = (UINT)-1;
1110 li.iItem = iIndex;
1111 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1112 {
1113 if (li.state & LVIS_SELECTED)
1114 return iIndex;
1115 }
1116 }
1117 return -1;
1118}
1119
1120
1121BOOL
1123{
1124 LVITEMW li;
1125
1126 ZeroMemory(&li, sizeof(LVITEMW));
1127 li.mask = LVIF_TEXT;
1128 li.cchTextMax = 16;
1129 li.pszText = pIpSettings->szIP;
1130 li.iItem = Index;
1131
1132 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1133 return FALSE;
1134
1135 ZeroMemory(&li, sizeof(LVITEMW));
1136 li.mask = LVIF_TEXT;
1137 li.cchTextMax = 16;
1138 li.pszText = pIpSettings->szMask;
1139 li.iSubItem = 1;
1140 li.iItem = Index;
1141
1142 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1143}
1144
1145VOID
1147{
1148 LVITEMW li;
1149
1150 memset(&li, 0x0, sizeof(LVITEMW));
1151 li.iItem = GetSelectedItem(hDlgCtrl);
1152 if (li.iItem < 0)
1153 {
1155 SetFocus(hDlgCtrl);
1156 }
1157 else
1158 {
1159 (void)ListView_DeleteItem(hDlgCtrl, li.iItem);
1160 }
1161}
1162
1163UINT
1165 WCHAR * szBuffer)
1166{
1167 DWORD dwIpAddr = 0;
1168 INT Val;
1169 UINT Index = 3;
1170 LPWSTR pLast = szBuffer;
1171 LPWSTR pNext = szBuffer;
1172
1173
1174 while((pNext = wcschr(pNext, L'.')))
1175 {
1176 pNext[0] = L'\0';
1177 Val = _wtoi(pLast);
1178 dwIpAddr |= (Val << Index * 8);
1179 Index--;
1180 pNext++;
1181 pLast = pNext;
1182 }
1183 dwIpAddr |= _wtoi(pLast);
1184
1185 return dwIpAddr;
1186}
1187
1188UINT
1190 char * sBuffer)
1191{
1192 WCHAR szIp[16];
1193
1194 if (MultiByteToWideChar(CP_ACP, 0, sBuffer, -1, szIp, 16))
1195 {
1196 szIp[15] = L'\0';
1197 return GetIpAddressFromStringW(szIp);
1198 }
1199 return (UINT)-1;
1200}
1201
1202
1203VOID
1205{
1206 IP_ADDR *pNext;
1207
1208 if (!pAddr)
1209 return;
1210
1211 while(pAddr)
1212 {
1213 pNext = pAddr->Next;
1215 pAddr = pNext;
1216 }
1217}
1218
1219BOOL
1220GetListViewItem(HWND hDlgCtrl, UINT Index, UINT SubIndex, WCHAR * szBuffer, UINT BufferSize)
1221{
1222 LVITEMW li;
1223
1224 ZeroMemory(&li, sizeof(LVITEMW));
1225 li.mask = LVIF_TEXT;
1226 li.pszText = szBuffer;
1227 li.iItem = Index;
1228 li.iSubItem = SubIndex;
1229 li.cchTextMax = BufferSize;
1230 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1231}
1232
1233VOID
1235 HWND hDlgCtrl,
1237 BOOL bSubmask)
1238{
1239 WCHAR szBuffer[30];
1240
1241 INT iIndex, iCount;
1242 IP_ADDR *pCur, *pLast;
1243
1244 iCount = ListView_GetItemCount(hDlgCtrl);
1245 if (!iCount)
1246 {
1247 return;
1248 }
1249
1250 pLast = NULL;
1251 for(iIndex = 0; iIndex < iCount; iIndex++)
1252 {
1253 if (GetListViewItem(hDlgCtrl, iIndex, 0, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1254 {
1255 pCur = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
1256 if (!pCur)
1257 break;
1258 ZeroMemory(pCur, sizeof(IP_ADDR));
1259
1260 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1261 pCur->IpAddress = GetIpAddressFromStringW(szBuffer);
1262
1263 if (GetListViewItem(hDlgCtrl, iIndex, 1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR) ))
1264 {
1265 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1266 if (bSubmask)
1267 pCur->u.Subnetmask = GetIpAddressFromStringW(szBuffer);
1268 else
1269 pCur->u.Metric = _wtoi(szBuffer);
1270 }
1271
1272 if (!pLast)
1273 {
1274 if (bSubmask)
1275 This->pCurrentConfig->Ip = pCur;
1276 else
1277 This->pCurrentConfig->Gw = pCur;
1278 }
1279 else
1280 {
1281 pLast->Next = pCur;
1282 }
1283
1284 pLast = pCur;
1285 }
1286 }
1287}
1288
1289
1290INT_PTR
1293 HWND hwndDlg,
1294 UINT uMsg,
1295 WPARAM wParam,
1297)
1298{
1301 INT_PTR res;
1302 WCHAR szBuffer[200];
1303 LPPSHNOTIFY lppsn;
1305 TcpipIpSettings Ip;
1306
1307 LVITEMW li;
1308
1309 switch(uMsg)
1310 {
1311 case WM_INITDIALOG:
1313 This = (TcpipConfNotifyImpl*)page->lParam;
1316 return TRUE;
1317 case WM_NOTIFY:
1318 lppsn = (LPPSHNOTIFY) lParam;
1319 if (lppsn->hdr.code == LVN_ITEMCHANGED)
1320 {
1322 BOOL bEnable;
1323
1324 if (lplv->hdr.idFrom == IDC_IPLIST)
1325 {
1327
1328 bEnable = ((lplv->uNewState & LVIS_SELECTED) != 0) &&
1329 (!This->pCurrentConfig->DhcpEnabled);
1330
1333 }
1334 else if (lplv->hdr.idFrom == IDC_GWLIST)
1335 {
1336 bEnable = ((lplv->uNewState & LVIS_SELECTED) != 0);
1337
1340 }
1341 }
1342 else if (lppsn->hdr.code == PSN_KILLACTIVE)
1343 {
1345 if (!This->pCurrentConfig->DhcpEnabled && ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST)) == 0)
1346 {
1349 return TRUE;
1350 }
1351
1353 {
1355 if ((val < 1) || (val > 9999))
1356 {
1359 return TRUE;
1360 }
1361 }
1362 }
1363 else if (lppsn->hdr.code == PSN_APPLY)
1364 {
1366 FreeIPAddr(This->pCurrentConfig->Gw);
1367 This->pCurrentConfig->Gw = NULL;
1368 FreeIPAddr(This->pCurrentConfig->Ip);
1369 This->pCurrentConfig->Ip = NULL;
1372
1374 This->pCurrentConfig->Metric = 0;
1375 else
1376 This->pCurrentConfig->Metric = GetDlgItemInt(hwndDlg, IDC_IFMETRIC, NULL, FALSE);
1377
1379 return TRUE;
1380 }
1381 break;
1382 case WM_COMMAND:
1384 {
1387 else
1389 }
1390 else if (LOWORD(wParam) == IDC_IPADD)
1391 {
1392 Ip.bAdd = TRUE;
1393 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1395 if (res)
1396 {
1397 memset(&li, 0x0, sizeof(LVITEMW));
1398 li.mask = LVIF_TEXT | LVIF_PARAM;
1399 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST));
1400 li.pszText = Ip.szIP;
1401 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1402 if (li.iItem != -1)
1403 {
1404 li.mask = LVIF_TEXT;
1405 li.iSubItem = 1;
1406 li.pszText = Ip.szMask;
1408 }
1409 }
1410 }
1411 else if (LOWORD(wParam) == IDC_IPMOD)
1412 {
1413 memset(&li, 0x0, sizeof(LVITEMW));
1414 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_IPLIST));
1415 if (li.iItem < 0)
1416 {
1417 /* no item selected */
1419 SetFocus(GetDlgItem(hwndDlg, IDC_IPLIST));
1420 break;
1421 }
1422 Ip.bAdd = FALSE;
1423 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1424 if (GetIPListEntry(GetDlgItem(hwndDlg, IDC_IPLIST), li.iItem, &Ip))
1425 {
1427 if (res)
1428 {
1429 li.mask = LVIF_TEXT;
1430 li.pszText = Ip.szIP;
1432 li.pszText = Ip.szMask;
1433 li.iSubItem = 1;
1435 }
1436 }
1437 }
1438 else if (LOWORD(wParam) == IDC_IPDEL)
1439 {
1441 break;
1442 }
1443 else if (LOWORD(wParam) == IDC_GWADD)
1444 {
1445 Gw.bAdd = TRUE;
1446 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1448 if (res)
1449 {
1450 memset(&li, 0x0, sizeof(LVITEMW));
1451 li.mask = LVIF_TEXT;
1452 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_GWLIST));
1453 li.pszText = Gw.szIP;
1454 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1455 if (li.iItem >= 0)
1456 {
1457 if (Gw.Metric)
1458 {
1459 swprintf(szBuffer, L"%u", Gw.Metric);
1460 li.iSubItem = 1;
1461 li.pszText = szBuffer;
1463 }
1464 else
1465 {
1466 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1467 {
1468 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1469 li.iSubItem = 1;
1470 li.pszText = szBuffer;
1472 }
1473 }
1474 }
1475 }
1476 break;
1477 }
1478 else if (LOWORD(wParam) == IDC_GWMOD)
1479 {
1480 memset(&li, 0x0, sizeof(LVITEMW));
1481 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_GWLIST));
1482 if (li.iItem < 0)
1483 {
1484 /* no item selected */
1486 SetFocus(GetDlgItem(hwndDlg, IDC_GWLIST));
1487 break;
1488 }
1489 if (GetGWListEntry(GetDlgItem(hwndDlg, IDC_GWLIST), li.iItem, &Gw))
1490 {
1491 Gw.bAdd = FALSE;
1492 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1494 if (res)
1495 {
1496 li.mask = LVIF_TEXT;
1497 li.pszText = Gw.szIP;
1499 if (Gw.Metric)
1500 {
1501 swprintf(szBuffer, L"%u", Gw.Metric);
1502 li.iSubItem = 1;
1503 li.pszText = szBuffer;
1505 }
1506 else
1507 {
1508 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1509 {
1510 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1511 li.iSubItem = 1;
1512 li.pszText = szBuffer;
1514 }
1515 }
1516 }
1517 }
1518 break;
1519 }
1520 else if (LOWORD(wParam) == IDC_GWDEL)
1521 {
1523 break;
1524 }
1525 break;
1526 }
1527 return FALSE;
1528}
1529
1530INT_PTR
1533 HWND hwndDlg,
1534 UINT uMsg,
1535 WPARAM wParam,
1537)
1538{
1539 TcpipDnsSettings * pSettings;
1540 WCHAR szBuffer[100];
1541 DWORD dwIpAddr;
1542 LPNMIPADDRESS lpnmipa;
1543
1544 switch(uMsg)
1545 {
1546 case WM_INITDIALOG:
1547 pSettings = (TcpipDnsSettings*)lParam;
1549 if (!pSettings->bAdd)
1550 {
1551 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1552 {
1553 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1554 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1555 }
1556 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pSettings->szIP);
1557 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1558 }
1559 else
1560 {
1561 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1562 {
1563 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1564 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1565 }
1566 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
1567 }
1568 return TRUE;
1569 case WM_COMMAND:
1570 if (LOWORD(wParam) == IDCANCEL)
1571 {
1572 EndDialog(hwndDlg, FALSE);
1573 break;
1574 }
1575 else if (LOWORD(wParam) == IDC_OK)
1576 {
1577 pSettings = (TcpipDnsSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1578 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pSettings->szIP);
1579 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->szIP) == LB_ERR)
1580 {
1581 if (pSettings->bAdd)
1582 SendMessageW(pSettings->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)pSettings->szIP);
1583 EndDialog(hwndDlg, TRUE);
1584 break;
1585 }
1586 if (!pSettings->bAdd)
1587 {
1588 EndDialog(hwndDlg, FALSE);
1589 break;
1590 }
1592 break;
1593 }
1594 break;
1595 case WM_NOTIFY:
1596 lpnmipa = (LPNMIPADDRESS) lParam;
1597 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
1598 {
1599 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
1600 {
1601 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
1602 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1603 }
1604 }
1605 break;
1606 }
1607 return FALSE;
1608}
1609
1610
1611
1612VOID
1614 HWND hwndDlg,
1616{
1617 WCHAR szBuffer[200];
1618 LPWSTR pFirst, pSep, pList;
1619 IP_ADDR * pAddr;
1620 DWORD dwIpAddr;
1621
1622 /* insert DNS addresses */
1623 pAddr = This->pCurrentConfig->Ns;
1624 while(pAddr)
1625 {
1626 dwIpAddr = pAddr->IpAddress;
1627 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
1628 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
1629
1630 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_ADDSTRING, 0, (LPARAM)szBuffer);
1631 pAddr = pAddr->Next;
1632 }
1634
1635 if (!This->pCurrentConfig->pDNS)
1636 return;
1637
1638 if (This->pCurrentConfig->pDNS->RegisterAdapterName)
1640 else
1642
1643 if (This->pCurrentConfig->pDNS->RegistrationEnabled)
1645
1646 if (This->pCurrentConfig->pDNS->szDomain[0])
1647 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)szBuffer);
1648
1649 if (This->pCurrentConfig->pDNS->UseDomainNameDevolution)
1651
1652 if (!This->pCurrentConfig->pDNS->szSearchList || (wcslen(This->pCurrentConfig->pDNS->szSearchList) == 0))
1653 {
1656
1657 return;
1658 }
1659
1660 pList = This->pCurrentConfig->pDNS->szSearchList;
1661 if (wcslen(pList))
1662 {
1663 pFirst = pList;
1664 do
1665 {
1666 pSep = wcschr(pFirst, L',');
1667 if (pSep)
1668 {
1669 pSep[0] = L'\0';
1671 pFirst = pSep + 1;
1672 pSep[0] = L',';
1673 }
1674 else
1675 {
1677 break;
1678 }
1679 }while(TRUE);
1680
1684 }
1685}
1686
1687VOID
1688ToggleUpDown(HWND hwndDlg, HWND hDlgCtrl, UINT UpButton, UINT DownButton, UINT ModButton, UINT DelButton)
1689{
1690 LRESULT lResult, lCount;
1691
1692 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1693 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1694 if (lResult != LB_ERR)
1695 {
1696 if (lResult == 0)
1697 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1698 else
1699 EnableWindow(GetDlgItem(hwndDlg, UpButton), TRUE);
1700
1701 if (lResult < lCount -1)
1702 EnableWindow(GetDlgItem(hwndDlg, DownButton), TRUE);
1703 else
1704 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1705 }
1706
1707 if (lCount)
1708 {
1709 EnableWindow(GetDlgItem(hwndDlg, ModButton), TRUE);
1710 EnableWindow(GetDlgItem(hwndDlg, DelButton), TRUE);
1711 }
1712 else
1713 {
1714 EnableWindow(GetDlgItem(hwndDlg, ModButton), FALSE);
1715 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE);
1716 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1717 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1718 }
1719}
1720
1721VOID
1723 HWND hDlgCtrl,
1724 INT pos)
1725{
1726 WCHAR szBuffer[100];
1727 LRESULT lResult;
1728
1729 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1730 if (lResult != LB_ERR)
1731 {
1732 if (SendMessageW(hDlgCtrl, LB_GETTEXTLEN, (WPARAM)lResult, 0) < sizeof(szBuffer)/sizeof(WCHAR) - 1)
1733 {
1734 if (SendMessageW(hDlgCtrl, LB_GETTEXT, (WPARAM)lResult, (LPARAM)szBuffer) != LB_ERR)
1735 {
1736 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1737 SendMessageW(hDlgCtrl, LB_INSERTSTRING, (WPARAM)lResult + pos, (LPARAM)szBuffer);
1738 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult + pos, 0);
1739 }
1740 }
1741 }
1742}
1743VOID
1745 HWND hDlgCtrl)
1746{
1747 LRESULT lResult, lCount;
1748
1749 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1750 if (lResult != LB_ERR)
1751 {
1752 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1753 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1754 if (lResult + 1 < lCount)
1755 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult, 0);
1756 else
1757 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lCount-1, 0);
1758 }
1759}
1760
1761LPWSTR
1763 HWND hDlgCtrl)
1764{
1765 DWORD dwSize;
1766 INT iCount, iIndex;
1767 INT_PTR lResult;
1768 LPWSTR pszSearchList, pItem;
1769
1770 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1771 if (!iCount || iCount == LB_ERR)
1772 return NULL; //BUGBUG
1773
1774 dwSize = 0;
1775
1776 for (iIndex = 0; iIndex < iCount; iIndex++)
1777 {
1778 lResult = SendMessageW(hDlgCtrl, LB_GETTEXTLEN, iIndex, 0);
1779 if (lResult == LB_ERR)
1780 return NULL;
1781
1782 dwSize += lResult + 1;
1783 }
1784
1785 pszSearchList = (LPWSTR)CoTaskMemAlloc((dwSize + 1) * sizeof(WCHAR));
1786 if (!pszSearchList)
1787 return NULL;
1788
1789 pItem = pszSearchList;
1790 for (iIndex = 0; iIndex < iCount; iIndex++)
1791 {
1792 lResult = SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)pItem);
1793 if (lResult == LB_ERR)
1794 {
1795 CoTaskMemFree(pszSearchList);
1796 return NULL;
1797 }
1798 dwSize -= lResult + 1;
1799 pItem += wcslen(pItem);
1800 if (iIndex != iCount -1)
1801 {
1802 pItem[0] = L',';
1803 pItem++;
1804 }
1805 }
1806 pItem[0] = L'\0';
1807 return pszSearchList;
1808}
1809
1810VOID
1812 HWND hDlgCtrl,
1814{
1815 INT iCount, iIndex;
1816 WCHAR Ip[16];
1817 IP_ADDR *pCur, *pLast;
1818
1819 FreeIPAddr(This->pCurrentConfig->Ns);
1820 This->pCurrentConfig->Ns = NULL;
1821
1822 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1823 if (!iCount || iCount == LB_ERR)
1824 {
1825 return;
1826 }
1827
1828 pLast = NULL;
1829 for(iIndex = 0; iIndex < iCount; iIndex++)
1830 {
1831 if (SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)Ip) == LB_ERR)
1832 break;
1833
1834 pCur = CoTaskMemAlloc(sizeof(IP_ADDR));
1835 if (!pCur)
1836 break;
1837 ZeroMemory(pCur, sizeof(IP_ADDR));
1838 pCur->IpAddress = GetIpAddressFromStringW(Ip);
1839
1840 if (!pLast)
1841 This->pCurrentConfig->Ns = pCur;
1842 else
1843 pLast->Next = pCur;
1844
1845 pLast = pCur;
1846 pCur = pCur->Next;
1847 }
1848}
1849
1850INT_PTR
1853 HWND hwndDlg,
1854 UINT uMsg,
1855 WPARAM wParam,
1857)
1858{
1861 TcpipDnsSettings Dns;
1862 LRESULT lIndex, lLength;
1863 TcpipSuffixSettings Suffix;
1864 LPPSHNOTIFY lppsn;
1865 WCHAR szSuffix[100];
1866 WCHAR szFormat[200];
1867 WCHAR szBuffer[300];
1868
1869
1870 switch(uMsg)
1871 {
1872 case WM_INITDIALOG:
1874 This = (TcpipConfNotifyImpl*)page->lParam;
1879 return TRUE;
1880 case WM_NOTIFY:
1881 lppsn = (LPPSHNOTIFY) lParam;
1882 if (lppsn->hdr.code == PSN_KILLACTIVE)
1883 {
1884 if (IsDlgButtonChecked(hwndDlg, IDC_SELSUFFIX) == BST_CHECKED &&
1886 {
1889 return TRUE;
1890 }
1891 if (SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, sizeof(szSuffix)/sizeof(WCHAR), (LPARAM)szSuffix))
1892 {
1893 szSuffix[(sizeof(szSuffix)/sizeof(WCHAR))-1] = L'\0';
1894 if (VerifyDNSSuffix(szSuffix) == FALSE)
1895 {
1896 if (LoadStringW(netcfgx_hInstance, IDS_DNS_SUFFIX, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1897 {
1898 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1899 swprintf(szBuffer, szFormat, szSuffix);
1900 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1901 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1902 else
1903 szFormat[0] = L'\0';
1904
1905 MessageBoxW(hwndDlg, szBuffer, szFormat, MB_ICONWARNING);
1907 SetFocus(GetDlgItem(hwndDlg, IDC_SUFFIX));
1908 return TRUE;
1909 }
1910 }
1911 }
1912 }
1913 else if (lppsn->hdr.code == PSN_APPLY)
1914 {
1916 if (!This->pCurrentConfig->pDNS)
1917 break;
1918
1921 {
1922 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1923 This->pCurrentConfig->pDNS->szSearchList = NULL;
1925 This->pCurrentConfig->pDNS->UseDomainNameDevolution = TRUE;
1926 else
1927 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1928 }
1929 else
1930 {
1931 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1932 This->pCurrentConfig->pDNS->szSearchList = NULL;
1933 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1934 This->pCurrentConfig->pDNS->szSearchList = GetListViewEntries(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1935 }
1936
1938 {
1939 This->pCurrentConfig->pDNS->RegisterAdapterName = TRUE;
1941 This->pCurrentConfig->pDNS->RegistrationEnabled = TRUE;
1942 else
1943 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1944 }
1945 else
1946 {
1947 This->pCurrentConfig->pDNS->RegisterAdapterName = FALSE;
1948 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1949 }
1950 }
1951 break;
1952 case WM_COMMAND:
1954 {
1956 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1957 break;
1958 }
1960 {
1962 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1963 break;
1964 }
1965 else if (LOWORD(wParam) == IDC_PRIMSUFFIX && HIWORD(wParam) == BN_CLICKED)
1966 {
1968 {
1976 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1977 }
1978 }
1979 else if (LOWORD(wParam) == IDC_SELSUFFIX && HIWORD(wParam) == BN_CLICKED)
1980 {
1982 {
1986 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1987 }
1988 break;
1989 }
1990 else if (LOWORD(wParam) == IDC_REGSUFFIX && HIWORD(wParam) == BN_CLICKED)
1991 {
1994 else
1996 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1997 }
1998 else if (LOWORD(wParam) == IDC_DNSADDRUP && HIWORD(wParam) == BN_CLICKED)
1999 {
2000 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), -1);
2003 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2004 break;
2005 }
2007 {
2008 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), 1);
2011 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2012 break;
2013 }
2015 {
2016 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), -1);
2019 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2020 break;
2021 }
2023 {
2027 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2028 break;
2029 }
2030 else if (LOWORD(wParam) == IDC_DNSADDRDEL && HIWORD(wParam) == BN_CLICKED)
2031 {
2035 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2036 break;
2037 }
2039 {
2043 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2044 break;
2045 }
2046 else if (LOWORD(wParam) == IDC_DNSADDRADD && HIWORD(wParam) == BN_CLICKED)
2047 {
2048 Dns.bAdd = TRUE;
2049 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
2051 {
2053 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2054 }
2055 break;
2056 }
2057 else if (LOWORD(wParam) == IDC_DNSADDRMOD && HIWORD(wParam) == BN_CLICKED)
2058 {
2059 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSADDRLIST, LB_GETCURSEL, 0, 0);
2060 if (lIndex != LB_ERR)
2061 {
2062 Dns.bAdd = FALSE;
2063 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
2066 {
2068 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_INSERTSTRING, lIndex, (LPARAM)Dns.szIP);
2069 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, lIndex, 0);
2071 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2072 }
2073 }
2074 break;
2075 }
2077 {
2078 Suffix.bAdd = TRUE;
2079 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2080 Suffix.Suffix = NULL;
2082 {
2084 lIndex = SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)Suffix.Suffix);
2085 if (lIndex != LB_ERR)
2088 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2089 CoTaskMemFree(Suffix.Suffix);
2090 }
2091 break;
2092 }
2094 {
2095 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCURSEL, 0, 0);
2096 if (lIndex != LB_ERR)
2097 {
2098 Suffix.bAdd = FALSE;
2099 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2100 lLength = SendMessageW(Suffix.hDlgCtrl, LB_GETTEXTLEN, lIndex, 0);
2101 if (lLength != LB_ERR)
2102 {
2103 Suffix.Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1) * sizeof(WCHAR));
2104 if (Suffix.Suffix)
2105 {
2106 SendMessageW(Suffix.hDlgCtrl, LB_GETTEXT, lIndex, (LPARAM)Suffix.Suffix);
2107 Suffix.Suffix[lLength] = L'\0';
2109 {
2110 if (Suffix.Suffix)
2111 {
2113 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_INSERTSTRING, lIndex, (LPARAM)Suffix.Suffix);
2116 CoTaskMemFree(Suffix.Suffix);
2117 }
2119 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2120 }
2121 }
2122 }
2123 }
2124 break;
2125 }
2126 }
2127 return FALSE;
2128}
2129
2130static int CALLBACK
2132{
2133 // NOTE: This callback is needed to set large icon correctly.
2134 HICON hIcon;
2135 switch (uMsg)
2136 {
2137 case PSCB_INITIALIZED:
2138 {
2140 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
2141 break;
2142 }
2143 }
2144 return 0;
2145}
2146
2147VOID
2149 HWND hwndDlg,
2151{
2152 PROPSHEETHEADERW pinfo;
2153 HPROPSHEETPAGE hppages[3];
2154 WCHAR szBuffer[100];
2155
2159
2160
2161 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
2162 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
2163 else
2164 szBuffer[0] = L'\0';
2165
2166 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW));
2167 pinfo.dwSize = sizeof(PROPSHEETHEADERW);
2168 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW |
2170 pinfo.u3.phpage = hppages;
2171 pinfo.nPages = 3;
2172 pinfo.hwndParent = hwndDlg;
2174 pinfo.pszCaption = szBuffer;
2176 pinfo.pfnCallback = PropSheetProc;
2177
2179 if (PropertySheetW(&pinfo) > 0)
2180 {
2181 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2182 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2183 }
2184}
2185
2186INT_PTR
2188 HWND hwndDlg,
2190 BOOL bApply)
2191{
2192 DWORD dwAddr;
2193
2195 {
2196 if (SendDlgItemMessageW(hwndDlg, IDC_ALTIPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) != 4)
2197 {
2198 if (bApply)
2199 {
2202 return E_FAIL;
2203 }
2204 }
2205
2206 if (SendDlgItemMessageW(hwndDlg, IDC_ALTSUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) != 4)
2207 {
2208 if (bApply)
2210 if (SendDlgItemMessageW(hwndDlg, IDC_ALTIPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2211 {
2212 if (dwAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2213 dwAddr = MAKEIPADDRESS(255, 0, 0, 0);
2214 else if (dwAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2215 dwAddr = MAKEIPADDRESS(255, 255, 0, 0);
2216 else if (dwAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2217 dwAddr = MAKEIPADDRESS(255, 255, 255, 0);
2218
2220 }
2221 if (bApply)
2222 {
2224 return E_FAIL;
2225 }
2226 }
2227
2228 if (SendDlgItemMessageW(hwndDlg, IDC_ALTIPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2229 This->pCurrentConfig->AltConfig.IpAddress = dwAddr;
2230
2231 if (SendDlgItemMessageW(hwndDlg, IDC_ALTSUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2232 This->pCurrentConfig->AltConfig.SubnetMask = dwAddr;
2233
2234 if (SendDlgItemMessageW(hwndDlg, IDC_ALTDEFGATEWAY, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2235 This->pCurrentConfig->AltConfig.DefaultGateway = dwAddr;
2236
2237 if (SendDlgItemMessageW(hwndDlg, IDC_ALTDNS1, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2238 This->pCurrentConfig->AltConfig.DnsServer1 = dwAddr;
2239
2240 if (SendDlgItemMessageW(hwndDlg, IDC_ALTDNS2, IPM_GETADDRESS, 0, (LPARAM)&dwAddr) == 4)
2241 This->pCurrentConfig->AltConfig.DnsServer2 = dwAddr;
2242 }
2243 else
2244 {
2245 ZeroMemory(&This->pCurrentConfig->AltConfig, sizeof(AlternateConfiguration));
2246 }
2247
2248 return S_OK;
2249}
2250
2251
2252
2253HRESULT
2255 HWND hwndDlg,
2256 TcpipSettings *pCurSettings)
2257{
2262
2267
2272
2277
2282
2283 if (pCurSettings->AltConfig.IpAddress == 0)
2284 {
2291 }
2292 else
2293 {
2295
2296 /* Set ip address */
2297 if (pCurSettings->AltConfig.IpAddress)
2299
2300 /* Set subnet mask */
2301 if (pCurSettings->AltConfig.SubnetMask)
2303
2304 /* Set default gateway */
2305 if (pCurSettings->AltConfig.DefaultGateway)
2307
2308 /* Set primary dns server */
2309 if (pCurSettings->AltConfig.DnsServer1)
2311
2312 /* Set secondary dns server */
2313 if (pCurSettings->AltConfig.DnsServer2)
2315 }
2316
2317 return S_OK;
2318}
2319
2320INT_PTR
2323 HWND hwndDlg,
2324 UINT uMsg,
2325 WPARAM wParam,
2326 LPARAM lParam)
2327{
2330 LPNMIPADDRESS lpnmipa;
2331 LPPSHNOTIFY lppsn;
2332
2333 switch (uMsg)
2334 {
2335 case WM_INITDIALOG:
2336 {
2338 This = (TcpipConfNotifyImpl*)page->lParam;
2340 if (This->pCurrentConfig)
2341 InitializeTcpipAltDlgCtrls(hwndDlg, This->pCurrentConfig);
2342 return TRUE;
2343 }
2344 case WM_NOTIFY:
2345 lppsn = (LPPSHNOTIFY) lParam;
2346 lpnmipa = (LPNMIPADDRESS) lParam;
2347 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
2348 {
2349 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2350 if (lpnmipa->hdr.idFrom == IDC_ALTIPADDR)
2351 {
2352 DWORD dwIpAddr;
2353
2354 if (SendDlgItemMessageW(hwndDlg, IDC_ALTIPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2355 {
2356 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2358 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2360 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2362 }
2363 }
2364 }
2365 else if (lppsn->hdr.code == PSN_APPLY)
2366 {
2370 else
2372
2373 return TRUE;
2374 }
2375 break;
2376
2377 case WM_COMMAND:
2378 {
2379 switch (LOWORD(wParam))
2380 {
2381 case IDC_ALTAPIPA:
2382 case IDC_ALTSTATIC:
2383 {
2384 if (HIWORD(wParam) == BN_CLICKED)
2385 {
2386 BOOL bStatic = (IsDlgButtonChecked(hwndDlg, IDC_ALTSTATIC) == BST_CHECKED);
2387 if (bStatic)
2388 {
2394 }
2395
2396 EnableWindow(GetDlgItem(hwndDlg, IDC_ALTIPADDR), bStatic);
2397 EnableWindow(GetDlgItem(hwndDlg, IDC_ALTSUBNETMASK), bStatic);
2398 EnableWindow(GetDlgItem(hwndDlg, IDC_ALTDEFGATEWAY), bStatic);
2399 EnableWindow(GetDlgItem(hwndDlg, IDC_ALTDNS1), bStatic);
2400 EnableWindow(GetDlgItem(hwndDlg, IDC_ALTDNS2), bStatic);
2401
2402 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2403 }
2404 break;
2405 }
2406 }
2407 break;
2408 }
2409 }
2410 return FALSE;
2411}
2412
2413VOID
2415 HWND hDlg,
2417{
2418 HPROPSHEETPAGE hpage;
2419
2421 if (!hpage)
2422 return;
2423
2424 SendMessageW(hDlg, PSM_INSERTPAGE, 1, (LPARAM)hpage);
2425}
2426
2427INT_PTR
2429 HWND hwndDlg,
2431 BOOL bApply)
2432{
2433 DWORD dwIpAddr;
2434
2435 if (IsDlgButtonChecked(hwndDlg, IDC_NODHCP) == BST_CHECKED)
2436 {
2437 This->pCurrentConfig->DhcpEnabled = FALSE;
2438
2439 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2440 {
2441 if (bApply)
2442 {
2444 SetFocus(GetDlgItem(hwndDlg, IDC_IPADDR));
2445 return E_FAIL;
2446 }
2447 }
2448 if (!This->pCurrentConfig->Ip)
2449 {
2450 This->pCurrentConfig->Ip = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2451 if (!This->pCurrentConfig->Ip)
2452 return E_OUTOFMEMORY;
2453 ZeroMemory(This->pCurrentConfig->Ip, sizeof(IP_ADDR));
2454 }
2455 This->pCurrentConfig->Ip->IpAddress = dwIpAddr;
2456
2457 if (SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2458 {
2459 if (bApply)
2461 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2462 {
2463 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2464 dwIpAddr = MAKEIPADDRESS(255, 0, 0, 0);
2465 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2466 dwIpAddr = MAKEIPADDRESS(255, 255, 0, 0);
2467 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2468 dwIpAddr = MAKEIPADDRESS(255, 255, 255, 0);
2469
2471 }
2472 if (bApply)
2473 {
2475 return E_FAIL;
2476 }
2477 }
2478 /* store subnetmask */
2479 This->pCurrentConfig->Ip->u.Subnetmask = dwIpAddr;
2480
2481 if (SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2482 {
2483 if (!This->pCurrentConfig->Gw)
2484 {
2485 This->pCurrentConfig->Gw = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2486 if (!This->pCurrentConfig->Gw)
2487 return E_OUTOFMEMORY;
2488 ZeroMemory(This->pCurrentConfig->Gw, sizeof(IP_ADDR));
2489 }
2490
2491 /* store default gateway */
2492 This->pCurrentConfig->Gw->IpAddress = dwIpAddr;
2493 }
2494 }
2495 else
2496 {
2497 This->pCurrentConfig->DhcpEnabled = TRUE;
2498
2499 /* Delete all configured ip addresses */
2500 if (This->pCurrentConfig->Ip)
2501 {
2502 IP_ADDR * pNextIp = This->pCurrentConfig->Ip->Next;
2503 CoTaskMemFree(This->pCurrentConfig->Ip);
2504 This->pCurrentConfig->Ip = pNextIp;
2505 }
2506
2507 /* Delete all configured gateway addresses */
2508 if (This->pCurrentConfig->Gw)
2509 {
2510 IP_ADDR * pNextGw = This->pCurrentConfig->Gw->Next;
2511 CoTaskMemFree(This->pCurrentConfig->Gw);
2512 This->pCurrentConfig->Gw = pNextGw;
2513 }
2514 }
2515
2517 {
2518 This->pCurrentConfig->DnsDhcpEnabled = FALSE;
2519
2520 BOOL bSkip = FALSE;
2521 if (SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2522 {
2523 if (!This->pCurrentConfig->Ns)
2524 {
2525 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2526 if (!This->pCurrentConfig->Ns)
2527 return E_OUTOFMEMORY;
2528 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2529 }
2530 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2531 }
2532 else if (This->pCurrentConfig->Ns)
2533 {
2534 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next;
2535
2536 CoTaskMemFree(This->pCurrentConfig->Ns);
2537 This->pCurrentConfig->Ns = pTemp;
2538 bSkip = TRUE;
2539 }
2540
2541 if (SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2542 {
2543 if (!This->pCurrentConfig->Ns || bSkip)
2544 {
2545 if (!This->pCurrentConfig->Ns)
2546 {
2547 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2548 if (!This->pCurrentConfig->Ns)
2549 return E_OUTOFMEMORY;
2550 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2551 }
2552 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2553 }
2554 else if (!This->pCurrentConfig->Ns->Next)
2555 {
2556 This->pCurrentConfig->Ns->Next = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2557 if (!This->pCurrentConfig->Ns->Next)
2558 return E_OUTOFMEMORY;
2559 ZeroMemory(This->pCurrentConfig->Ns->Next, sizeof(IP_ADDR));
2560 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2561 }
2562 else
2563 {
2564 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2565 }
2566 }
2567 else
2568 {
2569 if (This->pCurrentConfig->Ns && This->pCurrentConfig->Ns->Next)
2570 {
2571 if (This->pCurrentConfig->Ns->Next->Next)
2572 {
2573 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next->Next;
2574 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2575 This->pCurrentConfig->Ns->Next = pTemp;
2576 }
2577 else
2578 {
2579 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2580 This->pCurrentConfig->Ns->Next = NULL;
2581 }
2582 }
2583 }
2584 }
2585 else
2586 {
2587 This->pCurrentConfig->DnsDhcpEnabled = TRUE;
2588
2589 /* Delete all configured name server addresses */
2590 if (This->pCurrentConfig->Ns)
2591 {
2592 IP_ADDR * pNextNs = This->pCurrentConfig->Ns->Next;
2593 CoTaskMemFree(This->pCurrentConfig->Ns);
2594 This->pCurrentConfig->Ns = pNextNs;
2595 }
2596 }
2597
2598 return S_OK;
2599}
2600
2601HRESULT
2603 HWND hwndDlg,
2604 TcpipSettings * pCurSettings)
2605{
2610
2615
2620
2625
2630
2631 if (pCurSettings->DhcpEnabled)
2632 {
2638 }
2639 else
2640 {
2642
2643 if (pCurSettings->Ip)
2644 {
2645 /* set current ip address */
2646 SendDlgItemMessageA(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->IpAddress);
2647 /* set current hostmask */
2648 SendDlgItemMessageA(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->u.Subnetmask);
2649 }
2650
2651 if (pCurSettings->Gw && pCurSettings->Gw->IpAddress)
2652 {
2653 /* set current gateway */
2654 SendDlgItemMessageA(hwndDlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Gw->IpAddress);
2655 }
2656 }
2657
2658 if (pCurSettings->DnsDhcpEnabled)
2659 {
2663 }
2664 else
2665 {
2669 if (pCurSettings->Ns)
2670 {
2671 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress);
2672 if (pCurSettings->Ns->Next)
2673 {
2674 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->Next->IpAddress);
2675 }
2676 else
2677 {
2679 }
2680 }
2681 else
2682 {
2685 }
2686 }
2687
2688 return S_OK;
2689}
2690
2691HRESULT
2693 IP_ADDR_STRING * pSrc,
2694 IP_ADDR ** pTarget,
2696 LPWSTR szMetric)
2697{
2698 IP_ADDR_STRING * pCurrent;
2699 IP_ADDR *pNew, *pLast;
2700
2701 pCurrent = pSrc;
2702 pLast = NULL;
2703
2704 while(pCurrent)
2705 {
2706 pNew = CoTaskMemAlloc(sizeof(IP_ADDR));
2707 if (!pNew)
2708 {
2709 break;
2710 }
2711 ZeroMemory(pNew, sizeof(IP_ADDR));
2713 if (!pNew->IpAddress)
2714 {
2715 CoTaskMemFree(pNew);
2716 return E_FAIL;
2717 }
2718
2719 if (Type == SUBMASK)
2720 {
2722 pNew->NTEContext = pCurrent->Context;
2723 }
2724 else if (Type == METRIC)
2725 {
2726 if (szMetric && szMetric[0] != L'\0')
2727 {
2728 pNew->u.Metric = _wtoi(szMetric);
2729 szMetric += wcslen(szMetric) + 1;
2730 }
2731 }
2732
2733 if (!pLast)
2734 *pTarget = pNew;
2735 else
2736 pLast->Next = pNew;
2737
2738 pLast = pNew;
2739 pCurrent = pCurrent->Next;
2740
2741 }
2742 pLast->Next = NULL;
2743 return S_OK;
2744}
2745
2746
2747
2748INT_PTR
2751 HWND hwndDlg,
2752 UINT uMsg,
2753 WPARAM wParam,
2755)
2756{
2759 LPNMIPADDRESS lpnmipa;
2760 LPPSHNOTIFY lppsn;
2761 DWORD dwIpAddr;
2762
2763
2764 switch(uMsg)
2765 {
2766 case WM_INITDIALOG:
2768 This = (TcpipConfNotifyImpl*)page->lParam;
2769 if (This->pCurrentConfig)
2770 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2772 return TRUE;
2773 case WM_NOTIFY:
2774 lppsn = (LPPSHNOTIFY) lParam;
2775 lpnmipa = (LPNMIPADDRESS) lParam;
2776 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
2777 {
2778 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2779 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
2780 {
2781 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2782 {
2783 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2785 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2787 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2788 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
2789 }
2790 }
2791 }
2792 else if (lppsn->hdr.code == PSN_APPLY)
2793 {
2797 else
2799
2800 return TRUE;
2801 }
2802 break;
2803 case WM_COMMAND:
2804 if (HIWORD(wParam) == BN_CLICKED)
2805 {
2806 switch (LOWORD(wParam))
2807 {
2808 case IDC_USEDHCP:
2809 if (SendMessageW(GetParent(hwndDlg), PSM_INDEXTOID, 1, 0) == 0)
2810 {
2811 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2820 }
2821 break;
2822 case IDC_NODHCP:
2823 if (SendMessageW(GetParent(hwndDlg), PSM_INDEXTOID, 1, 0) != 0)
2824 {
2825 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2830 {
2832 }
2837 SendMessageW(GetParent(hwndDlg), PSM_REMOVEPAGE, 1, 0);
2838 }
2839 break;
2840 case IDC_AUTODNS:
2841 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2846 break;
2847 case IDC_FIXEDDNS:
2848 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2851 break;
2852 case IDC_ADVANCED:
2854 break;
2855 }
2856 break;
2857 }
2858 default:
2859 break;
2860
2861 }
2862 return FALSE;
2863}
2864
2865VOID
2867 TcpFilterSettings *pFilter)
2868{
2869 if (pFilter == NULL)
2870 return;
2871
2872 if (pFilter->szTCPAllowedPorts)
2874
2875 if (pFilter->szUDPAllowedPorts)
2877
2878 if (pFilter->szRawIPAllowedProtocols)
2880
2881 CoTaskMemFree(pFilter);
2882}
2883
2884VOID
2887{
2888 if (pDNS == NULL)
2889 return;
2890
2891 if (pDNS->szSearchList)
2893
2894 CoTaskMemFree(pDNS);
2895}
2896
2897VOID
2899 TcpipSettings *pSettings)
2900{
2901 IP_ADDR *NextIp;
2902
2903 if (pSettings == NULL)
2904 return;
2905
2906 /* Free IpAdresses */
2907 while (pSettings->Ip)
2908 {
2909 NextIp = pSettings->Ip->Next;
2910 CoTaskMemFree(pSettings->Ip);
2911 pSettings->Ip = NextIp;
2912 }
2913
2914 /* Free NameServers */
2915 while (pSettings->Ns)
2916 {
2917 NextIp = pSettings->Ns->Next;
2918 CoTaskMemFree(pSettings->Ns);
2919 pSettings->Ns = NextIp;
2920 }
2921
2922 /* Free Gateways */
2923 while (pSettings->Gw)
2924 {
2925 NextIp = pSettings->Gw->Next;
2926 CoTaskMemFree(pSettings->Gw);
2927 pSettings->Gw = NextIp;
2928 }
2929
2930 /* Free Filter Settings */
2931 if (pSettings->pFilter)
2932 FreeFilterSettings(pSettings->pFilter);
2933
2934 /* Free DNS Settings */
2935 if (pSettings->pDNS)
2936 FreeDNSSettings(pSettings->pDNS);
2937
2938 CoTaskMemFree(pSettings);
2939}
2940
2941
2942/***************************************************************
2943 * INetCfgComponentPropertyUi interface
2944 */
2945
2946HRESULT
2947WINAPI
2949 INetCfgComponentPropertyUi *iface,
2950 REFIID iid,
2951 LPVOID *ppvObj)
2952{
2953 TRACE("INetCfgComponentPropertyUi_fnQueryInterface()\n");
2955 return INetCfgComponentControl_QueryInterface((INetCfgComponentControl*)This, iid, ppvObj);
2956}
2957
2958ULONG
2959WINAPI
2961 INetCfgComponentPropertyUi *iface)
2962{
2963 TRACE("INetCfgComponentPropertyUi_fnAddRef()\n");
2965 return INetCfgComponentControl_AddRef((INetCfgComponentControl*)This);
2966}
2967
2968ULONG
2969WINAPI
2971 INetCfgComponentPropertyUi *iface)
2972{
2973 TRACE("INetCfgComponentPropertyUi_fnRelease()\n");
2975 return INetCfgComponentControl_Release((INetCfgComponentControl*)This);
2976}
2977
2978HRESULT
2979WINAPI
2981 INetCfgComponentPropertyUi * iface,
2983{
2984 TRACE("INetCfgComponentPropertyUi_fnQueryPropertyUi()\n");
2985
2986 INetLanConnectionUiInfo * pLanInfo;
2987 HRESULT hr;
2989
2990 hr = IUnknown_QueryInterface(pUnkReserved, &IID_INetLanConnectionUiInfo, (LPVOID*)&pLanInfo);
2991 if (FAILED(hr))
2992 return hr;
2993
2994 INetLanConnectionUiInfo_GetDeviceGuid(pLanInfo, &This->NetCfgInstanceId);
2995
2996 //FIXME
2997 // check if tcpip is enabled on that binding */
2998 IUnknown_Release(pUnkReserved);
2999 return S_OK;
3000}
3001
3002HRESULT
3003WINAPI
3005 INetCfgComponentPropertyUi * iface,
3007{
3008 TRACE("INetCfgComponentPropertyUi_fnSetContext()\n");
3010
3011 if (!iface || !pUnkReserved)
3012 return E_POINTER;
3013
3014 This->pUnknown = pUnkReserved;
3015 return S_OK;
3016}
3017
3018HRESULT
3020 TcpipSettings *pSettings,
3021 LPOLESTR pAdapterName,
3022 IP_ADAPTER_INFO *pAdapterInfo,
3023 IP_PER_ADAPTER_INFO *pPerAdapterInfo)
3024{
3025 HKEY hInterfaceKey, hConfigKey;
3026 WCHAR szBuffer[200];
3027 DWORD dwSize;
3028 HRESULT hr = S_OK;
3029
3030
3031 pSettings->DhcpEnabled = pAdapterInfo->DhcpEnabled;
3032 pSettings->Index = pAdapterInfo->Index;
3033
3034 if (!pAdapterInfo->DhcpEnabled)
3035 {
3036 CopyIpAddrString(&pAdapterInfo->IpAddressList, &pSettings->Ip, SUBMASK, NULL);
3037 }
3038
3039 CopyIpAddrString(&pAdapterInfo->GatewayList, &pSettings->Gw, METRIC, NULL);
3040
3041 CopyIpAddrString(&pPerAdapterInfo->DnsServerList, &pSettings->Ns, IPADDR, NULL);
3042
3043 pSettings->DnsDhcpEnabled = (pSettings->DhcpEnabled && (pSettings->Ns == NULL));
3044
3045 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pAdapterName);
3046 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hInterfaceKey) != ERROR_SUCCESS)
3047 {
3048 return E_FAIL;
3049 }
3050
3051 /* InterfaceMetric */
3052 dwSize = sizeof(DWORD);
3053 if (RegQueryValueExW(hInterfaceKey, L"InterfaceMetric", NULL, NULL, (LPBYTE)&pSettings->Metric, &dwSize) != ERROR_SUCCESS)
3054 pSettings->Metric = 0;
3055
3056
3057 /* Read the alternate configuration, if available */
3058 dwSize = 0;
3059 RegQueryValueExW(hInterfaceKey, L"ActiveConfigurations", NULL, NULL, NULL, &dwSize);
3060 if (dwSize)
3061 {
3062 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\DHCP\\Configurations\\Alternate_%s", pAdapterName);
3063 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hConfigKey) == ERROR_SUCCESS)
3064 {
3066 RegQueryValueExW(hConfigKey, L"Options", NULL, NULL, (LPBYTE)&pSettings->AltConfig, &dwSize);
3067 RegCloseKey(hConfigKey);
3068 }
3069 }
3070
3071 RegCloseKey(hInterfaceKey);
3072
3073 return hr;
3074}
3075
3076HRESULT
3078 TcpipSettings *pSettings,
3079 LPOLESTR pAdapterName)
3080{
3082 WCHAR szBuffer[200];
3083 HKEY hKey;
3084 DWORD dwSize;
3085
3087 if (!pDNS)
3088 return E_FAIL;
3089
3091
3092 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pAdapterName);
3094 {
3095 dwSize = sizeof(DWORD);
3096 RegQueryValueExW(hKey, L"RegisterAdapterName", NULL, NULL, (LPBYTE)&pDNS->RegisterAdapterName, &dwSize);
3097
3098 dwSize = sizeof(DWORD);
3099 RegQueryValueExW(hKey, L"RegistrationEnabled", NULL, NULL, (LPBYTE)&pDNS->RegistrationEnabled, &dwSize);
3100
3101 dwSize = sizeof(pDNS->szDomain);
3102 RegQueryValueExW(hKey, L"Domain", NULL, NULL, (LPBYTE)pDNS->szDomain, &dwSize);
3103
3105 }
3106
3107 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
3108 {
3109 dwSize = sizeof(DWORD);
3110 RegQueryValueExW(hKey, L"UseDomainNameDevolution", NULL, NULL, (LPBYTE)&pDNS->UseDomainNameDevolution, &dwSize);
3111
3112 dwSize = 0;
3113 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
3114 {
3116 if (pDNS->szSearchList)
3117 {
3118 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, (LPBYTE)pDNS->szSearchList, &dwSize) != ERROR_SUCCESS)
3119 {
3121 pDNS->szSearchList = NULL;
3122 }
3123 }
3124 }
3126 }
3127
3128 pSettings->pDNS = pDNS;
3129
3130 return S_OK;
3131}
3132
3133LPWSTR
3135{
3136 DWORD dwSize;
3137 LPWSTR pData;
3138
3140 return NULL;
3141
3143 if (!pData)
3144 return NULL;
3145
3147 {
3149 return NULL;
3150 }
3151 *Size = dwSize;
3152 return pData;
3153}
3154
3155HRESULT
3157 TcpipSettings *pSettings,
3158 LPOLESTR pAdapterName)
3159{
3160 HKEY hKey;
3161 TcpFilterSettings *pFilter;
3162 WCHAR szBuffer[200];
3163 DWORD dwVal, dwSize;
3164
3166 if (!pFilter)
3167 return E_FAIL;
3168
3169 ZeroMemory(pFilter, sizeof(TcpFilterSettings));
3170
3171 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
3172 {
3173 dwSize = sizeof(DWORD);
3174 if (RegQueryValueExW(hKey, L"EnableSecurityFilters", NULL, NULL, (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
3175 pFilter->EnableSecurityFilters = dwVal;
3177 }
3178 else
3179 {
3180 pFilter->EnableSecurityFilters = FALSE;
3181 }
3182
3183 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pAdapterName);
3185 {
3186 pFilter->szTCPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"TCPAllowedPorts", &pFilter->TCPSize);
3187 pFilter->szUDPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"UDPAllowedPorts", &pFilter->UDPSize);
3188 pFilter->szRawIPAllowedProtocols = LoadTcpFilterSettingsFromRegistry(hKey, L"RawIPAllowedProtocols", &pFilter->IPSize);
3190 }
3191
3192 pSettings->pFilter = pFilter;
3193
3194 return S_OK;
3195}
3196
3197
3198HRESULT
3200{
3201 DWORD dwSize;
3202 WCHAR szBuffer[50];
3203 IP_ADAPTER_INFO * pCurrentAdapter;
3204 IP_ADAPTER_INFO *pInfo = NULL;
3205 PIP_PER_ADAPTER_INFO pPerAdapterInfo = NULL;
3206 LPOLESTR pAdapterName = NULL;
3207 HRESULT hr;
3208 BOOL bFound;
3209 TcpipSettings *pCurrentConfig = NULL, *pOldConfig = NULL;
3210 ULONG uLength;
3211
3212 if (This->pCurrentConfig)
3213 return S_OK;
3214
3215 hr = StringFromCLSID(&This->NetCfgInstanceId, &pAdapterName);
3216 if (FAILED(hr))
3217 return hr;
3218
3219 dwSize = 0;
3221 {
3222 CoTaskMemFree(pAdapterName);
3223 return E_FAIL;
3224 }
3225
3226 pInfo = CoTaskMemAlloc(dwSize);
3227 if (!pInfo)
3228 {
3229 CoTaskMemFree(pAdapterName);
3230 return E_FAIL;
3231 }
3232
3233 if (GetAdaptersInfo(pInfo, &dwSize) != ERROR_SUCCESS)
3234 {
3235 CoTaskMemFree(pAdapterName);
3236 CoTaskMemFree(pInfo);
3237 return E_FAIL;
3238 }
3239
3240 pCurrentAdapter = pInfo;
3241 bFound = FALSE;
3242 while(pCurrentAdapter)
3243 {
3244 szBuffer[0] = L'\0';
3245 if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0])))
3246 {
3247 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
3248 }
3249 if (!_wcsicmp(szBuffer, pAdapterName))
3250 {
3251 bFound = TRUE;
3252 break;
3253 }
3254 pCurrentAdapter = pCurrentAdapter->Next;
3255 }
3256
3257 if (!bFound)
3258 {
3259 CoTaskMemFree(pAdapterName);
3260 CoTaskMemFree(pInfo);
3261 return E_FAIL;
3262 }
3263
3264 pPerAdapterInfo = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(sizeof(IP_PER_ADAPTER_INFO));
3265 ZeroMemory(pPerAdapterInfo, sizeof(IP_PER_ADAPTER_INFO));
3266
3267 if (GetPerAdapterInfo(pCurrentAdapter->Index, pPerAdapterInfo, &uLength) == ERROR_BUFFER_OVERFLOW)
3268 {
3269 CoTaskMemFree(pPerAdapterInfo);
3270 pPerAdapterInfo = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(uLength);
3271 if (pPerAdapterInfo)
3272 {
3273 ZeroMemory(pPerAdapterInfo, uLength);
3274 GetPerAdapterInfo(pCurrentAdapter->Index, pPerAdapterInfo, &uLength);
3275 }
3276 }
3277
3278 pCurrentConfig = CoTaskMemAlloc(sizeof(TcpipSettings));
3279 if (!pCurrentConfig)
3280 {
3281 hr = E_FAIL;
3282 goto done;
3283 }
3284
3285 ZeroMemory(pCurrentConfig, sizeof(TcpipSettings));
3286
3287 pOldConfig = CoTaskMemAlloc(sizeof(TcpipSettings));
3288 if (!pOldConfig)
3289 {
3290 hr = E_FAIL;
3291 goto done;
3292 }
3293
3294 ZeroMemory(pOldConfig, sizeof(TcpipSettings));
3295
3296 hr = LoadTcpIpSettings(pCurrentConfig, pAdapterName, pCurrentAdapter, pPerAdapterInfo);
3297 if (FAILED(hr))
3298 goto done;
3299
3300 hr = LoadFilterSettings(pCurrentConfig, pAdapterName);
3301 if (FAILED(hr))
3302 goto done;
3303
3304 hr = LoadDNSSettings(pCurrentConfig, pAdapterName);
3305 if (FAILED(hr))
3306 goto done;
3307
3308 hr = LoadTcpIpSettings(pOldConfig, pAdapterName, pCurrentAdapter, pPerAdapterInfo);
3309 if (FAILED(hr))
3310 goto done;
3311
3312 hr = LoadFilterSettings(pOldConfig, pAdapterName);
3313 if (FAILED(hr))
3314 goto done;
3315
3316 hr = LoadDNSSettings(pOldConfig, pAdapterName);
3317 if (FAILED(hr))
3318 goto done;
3319
3320done:
3321 if (pPerAdapterInfo)
3322 CoTaskMemFree(pPerAdapterInfo);
3323
3324 CoTaskMemFree(pInfo);
3325
3326 if (pAdapterName)
3327 CoTaskMemFree(pAdapterName);
3328
3329 if (FAILED(hr))
3330 {
3331 if (pCurrentConfig)
3332 FreeSettings(pCurrentConfig);
3333
3334 if (pOldConfig)
3335 FreeSettings(pOldConfig);
3336 }
3337 else
3338 {
3339 This->pCurrentConfig = pCurrentConfig;
3340 This->pOldConfig = pOldConfig;
3341 }
3342
3343 return hr;
3344}
3345
3346HRESULT
3347WINAPI
3349 INetCfgComponentPropertyUi * iface,
3350 DWORD *pdwDefPages,
3351 BYTE **pahpspPrivate,
3352 UINT *pcPages,
3354 LPCWSTR *pszStartPage)
3355{
3356 TRACE("INetCfgComponentPropertyUi_fnMergePropPages()\n");
3357 HPROPSHEETPAGE * hppages;
3358 UINT NumPages;
3360
3361 if (This->pCurrentConfig->DhcpEnabled)
3362 NumPages = 2;
3363 else
3364 NumPages = 1;
3365
3366 hppages = (HPROPSHEETPAGE*) CoTaskMemAlloc(sizeof(HPROPSHEETPAGE) * NumPages);
3367 if (!hppages)
3368 return E_FAIL;
3369
3371 if (!hppages[0])
3372 {
3373 CoTaskMemFree(hppages);
3374 return E_FAIL;
3375 }
3376 if (NumPages == 2)
3377 {
3379 if (!hppages[1])
3380 {
3381 DestroyPropertySheetPage(hppages[0]);
3382 CoTaskMemFree(hppages);
3383 return E_FAIL;
3384 }
3385 }
3386
3387 *pahpspPrivate = (BYTE*)hppages;
3388 *pcPages = NumPages;
3389
3390 return S_OK;
3391}
3392
3393HRESULT
3394WINAPI
3396 INetCfgComponentPropertyUi * iface,
3397 HWND hwndDlg)
3398{
3399 TRACE("INetCfgComponentPropertyUi_fnValidateProperties()\n");
3400 return S_OK;
3401}
3402
3403HRESULT
3404WINAPI
3406 INetCfgComponentPropertyUi * iface)
3407{
3408 TRACE("INetCfgComponentPropertyUi_fnApplyProperties()\n");
3409 return S_OK;
3410}
3411
3412HRESULT
3413WINAPI
3415 INetCfgComponentPropertyUi * iface)
3416{
3417 TRACE("INetCfgComponentPropertyUi_fnCancelProperties()\n");
3418 return S_OK;
3419}
3420
3421static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi =
3422{
3432};
3433
3434/***************************************************************
3435 * INetCfgComponentControl interface
3436 */
3437
3438HRESULT
3439WINAPI
3441 INetCfgComponentControl *iface,
3442 REFIID iid,
3443 LPVOID *ppvObj)
3444{
3445 TRACE("INetCfgComponentControl_fnQueryInterface()\n");
3447
3448 *ppvObj = NULL;
3449
3450 if (IsEqualIID (iid, &IID_IUnknown) ||
3452 {
3453 *ppvObj = This;
3455 return S_OK;
3456 }
3458 {
3459 *ppvObj = (LPVOID*)&This->lpVtblCompPropertyUi;
3461 return S_OK;
3462 }
3463 else if (IsEqualIID(iid, &IID_INetCfgComponentSetup))
3464 {
3465 *ppvObj = (LPVOID*)&This->lpVtblCompSetup;
3467 return S_OK;
3468 }
3469
3470 return E_NOINTERFACE;
3471}
3472
3473ULONG
3474WINAPI
3476 INetCfgComponentControl *iface)
3477{
3478 TRACE("INetCfgComponentControl_fnAddRef()\n");
3480 ULONG refCount = InterlockedIncrement(&This->ref);
3481
3482 return refCount;
3483}
3484
3485ULONG
3486WINAPI
3488 INetCfgComponentControl *iface)
3489{
3490 TRACE("INetCfgComponentControl_fnRelease()\n");
3492 ULONG refCount = InterlockedDecrement(&This->ref);
3493
3494 if (!refCount)
3495 {
3496 if (This->pCurrentConfig)
3497 FreeSettings(This->pCurrentConfig);
3498 if (This->pOldConfig)
3499 FreeSettings(This->pOldConfig);
3501 }
3502 return refCount;
3503}
3504
3505HRESULT
3506WINAPI
3508 INetCfgComponentControl *iface,
3509 INetCfgComponent *pIComp,
3510 INetCfg *pINetCfg,
3511 BOOL fInstalling)
3512{
3513 TRACE("INetCfgComponentControl_fnInitialize()\n");
3515 HRESULT hr;
3516
3517 This->pNCfg = pINetCfg;
3518 This->pNComp = pIComp;
3519
3520 hr = Initialize(This);
3521 if (FAILED(hr))
3522 {
3523 ERR("INetCfgComponentControl_fnInitialize failed\n");
3524 return hr;
3525 }
3526
3527 TRACE("INetCfgComponentControl_fnInitialize success\n");
3528
3529 return S_OK;
3530}
3531
3532static
3533LPWSTR
3535{
3536 LPWSTR pStr, pRet;
3537 DWORD dwSize, dwIpAddr;
3538 WCHAR szBuffer[30];
3539 IP_ADDR *pTemp = pAddr;
3540
3541
3542 dwSize = 0;
3543 while(pTemp)
3544 {
3545 if (Type == IPADDR)
3546 {
3547 dwIpAddr = pTemp->IpAddress;
3548 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3549 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3550 }else if (Type == SUBMASK)
3551 {
3552 dwIpAddr = pTemp->u.Subnetmask;
3553 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3554 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3555 }
3556 else if (Type == METRIC)
3557 {
3558 swprintf(szBuffer, L"%u", pTemp->u.Metric);
3559 }
3560
3561 dwSize += wcslen(szBuffer) + 1;
3562 pTemp = pTemp->Next;
3563 }
3564
3565 if (!dwSize)
3566 return NULL;
3567
3568 pStr = pRet = CoTaskMemAlloc((dwSize+1) * sizeof(WCHAR));
3569 if(!pStr)
3570 return NULL;
3571
3572 pTemp = pAddr;
3573 while(pTemp)
3574 {
3575 if (Type == IPADDR)
3576 {
3577 dwIpAddr = pTemp->IpAddress;
3578 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3579 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3580 }else if (Type == SUBMASK)
3581 {
3582 dwIpAddr = pTemp->u.Subnetmask;
3583 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3584 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3585 }
3586 else if (Type == METRIC)
3587 {
3588 swprintf(pStr, L"%u", pTemp->u.Metric);
3589 }
3590
3591 if (bComma)
3592 {
3593 pStr += wcslen(pStr);
3594 if (pTemp->Next)
3595 {
3596 pStr[0] = L',';
3597 pStr++;
3598 }
3599 }
3600 else
3601 {
3602 pStr += wcslen(pStr) + 1;
3603 }
3604 pTemp = pTemp->Next;
3605 }
3606 pStr[0] = L'\0';
3607 *Size = (dwSize+1) * sizeof(WCHAR);
3608 return pRet;
3609}
3610
3611
3612HRESULT
3613WINAPI
3615 INetCfgComponentControl * iface)
3616{
3617 HKEY hKey;
3618 LPOLESTR pStr, pAdapterName;
3619 DWORD dwSize;
3620 WCHAR szBuffer[200];
3621 TcpipSettings *pCurrentConfig, *pOldConfig;
3622
3623 TRACE("INetCfgComponentControl_fnApplyRegistryChanges()\n");
3624
3626
3627 pCurrentConfig = This->pCurrentConfig;
3628 pOldConfig = This->pOldConfig;
3629
3630 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
3631 {
3632 if (pCurrentConfig->pDNS)
3633 {
3634 RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD));
3635 RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)pCurrentConfig->pDNS->szSearchList,
3636 (wcslen(pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR));
3637 }
3638 if (pCurrentConfig->pFilter)
3639 {
3640 RegSetValueExW(hKey, L"EnableSecurityFilters", 0, REG_DWORD,
3641 (LPBYTE)&pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD));
3642 }
3644 }
3645
3646 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pAdapterName)))
3647 {
3648 return E_FAIL;
3649 }
3650
3651 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pAdapterName);
3652
3654 {
3655 if (pCurrentConfig->Metric)
3656 RegSetValueExW(hKey, L"InterfaceMetric", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->Metric, sizeof(DWORD));
3657 else
3658 RegDeleteValueW(hKey, L"InterfaceMetric");
3659
3660 if (pCurrentConfig->pDNS)
3661 {
3662 RegSetValueExW(hKey, L"RegisterAdapterName", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, sizeof(DWORD));
3663 RegSetValueExW(hKey, L"RegistrationEnabled", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, sizeof(DWORD));
3664 RegSetValueExW(hKey, L"Domain", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szDomain,
3665 (wcslen(This->pCurrentConfig->pDNS->szDomain)+1) * sizeof(WCHAR));
3666 }
3667#if 0
3668 if (pCurrentConfig->pFilter)
3669 {
3670 if (pCurrentConfig->pFilter->szTCPAllowedPorts)
3671 {
3672 RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ,
3673 (LPBYTE)pCurrentConfig->pFilter->szTCPAllowedPorts,
3674 pCurrentConfig->pFilter->TCPSize);
3675 }
3676 if (pCurrentConfig->pFilter->szUDPAllowedPorts)
3677 {
3678 RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ,
3679 (LPBYTE)pCurrentConfig->pFilter->szUDPAllowedPorts,
3680 pCurrentConfig->pFilter->UDPSize);
3681 }
3682 if (pCurrentConfig->pFilter->szRawIPAllowedProtocols)
3683 {
3684 RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ,
3685 (LPBYTE)pCurrentConfig->pFilter->szRawIPAllowedProtocols,
3686 pCurrentConfig->pFilter->IPSize);
3687 }
3688 }
3689#endif
3690 RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->DhcpEnabled, sizeof(DWORD));
3691 if (pCurrentConfig->DhcpEnabled)
3692 {
3693 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3694 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3695 }
3696 else
3697 {
3698 pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
3699 if(pStr)
3700 {
3701 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3702 CoTaskMemFree(pStr);
3703 }
3704
3705 pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
3706 if(pStr)
3707 {
3708 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3709 CoTaskMemFree(pStr);
3710 }
3711 }
3712
3713 if (pCurrentConfig->Gw)
3714 {
3715 pStr = CreateMultiSzString(pCurrentConfig->Gw, IPADDR, &dwSize, FALSE);
3716 if(pStr)
3717 {
3718 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3719 CoTaskMemFree(pStr);
3720 }
3721
3722 pStr = CreateMultiSzString(pCurrentConfig->Gw, METRIC, &dwSize, FALSE);
3723 if(pStr)
3724 {
3725 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3726 CoTaskMemFree(pStr);
3727 }
3728 }
3729 else
3730 {
3731 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
3732 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2);
3733 }
3734
3735 if (!pCurrentConfig->Ns)
3736 {
3737 RegDeleteValueW(hKey, L"NameServer");
3738 }
3739 else
3740 {
3741 pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE);
3742 if(pStr)
3743 {
3744 RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize);
3745 //RegDeleteValueW(hKey, L"DhcpNameServer");
3746 CoTaskMemFree(pStr);
3747 }
3748 }
3749
3750 if (!RtlEqualMemory(&pCurrentConfig->AltConfig, &pOldConfig->AltConfig, sizeof(AlternateConfiguration)))
3751 {
3752 if (pCurrentConfig->AltConfig.IpAddress == 0)
3753 {
3754 RegDeleteValueW(hKey, L"ActiveConfigurations");
3755 }
3756 else
3757 {
3758 HKEY hConfigKey;
3759
3760 dwSize = (wcslen(L"Alternate_") + wcslen(pAdapterName) + 2) * sizeof(WCHAR);
3761 pStr = CoTaskMemAlloc(dwSize);
3762 if (pStr)
3763 {
3764 ZeroMemory(pStr, dwSize);
3765 _swprintf(pStr, L"Alternate_%s", pAdapterName);
3766 RegSetValueExW(hKey, L"ActiveConfigurations", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3767 CoTaskMemFree(pStr);
3768 }
3769
3770 _swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\DHCP\\Configurations\\Alternate_%s", pAdapterName);
3771 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hConfigKey, NULL) == ERROR_SUCCESS)
3772 {
3773 RegSetValueExW(hConfigKey, L"Options", 0, REG_BINARY, (LPBYTE)&pCurrentConfig->AltConfig, sizeof(AlternateConfiguration));
3774 RegCloseKey(hConfigKey);
3775 }
3776 }
3777 }
3778
3780 }
3781
3782 CoTaskMemFree(pAdapterName);
3783
3784 return S_OK;
3785}
3786
3787HRESULT
3788WINAPI
3790 INetCfgComponentControl *iface,
3791 INetCfgPnpReconfigCallback *pICallback)
3792{
3793 TcpipSettings *pCurrentConfig, *pOldConfig;
3794 LPOLESTR pAdapterName;
3795 ULONG NTEInstance;
3796 DWORD DhcpApiVersion;
3797 DWORD dwSize;
3798
3799 TRACE("INetCfgComponentControl_fnApplyPnpChanges()\n");
3800
3802
3803 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pAdapterName)))
3804 {
3805 return E_FAIL;
3806 }
3807
3808 pCurrentConfig = This->pCurrentConfig;
3809 pOldConfig = This->pOldConfig;
3810
3811 if (pCurrentConfig->DhcpEnabled)
3812 {
3813 if (!pOldConfig->DhcpEnabled)
3814 {
3815 /* Delete this adapter's current IP address */
3816 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3817
3818 /* Delete all default routes for this adapter */
3819 dwSize = 0;
3821 {
3822 DWORD Index;
3824 if (pIpForwardTable)
3825 {
3826 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3827 {
3828 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3829 {
3830 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3831 pIpForwardTable->table[Index].dwForwardDest == 0)
3832 {
3833 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3834 }
3835 }
3836 }
3837 CoTaskMemFree(pIpForwardTable);
3838 }
3839 }
3840 }
3841 }
3842 else
3843 {
3844 /* Open the DHCP API if DHCP is enabled */
3845 if (pOldConfig->DhcpEnabled && DhcpCApiInitialize(&DhcpApiVersion) == NO_ERROR)
3846 {
3847 /* We have to tell DHCP about this */
3848 DhcpStaticRefreshParams(pCurrentConfig->Index,
3849 htonl(pCurrentConfig->Ip->IpAddress),
3850 htonl(pCurrentConfig->Ip->u.Subnetmask));
3851
3852 /* Close the API */
3854 }
3855 else
3856 {
3857 /* Delete this adapter's current static IP address */
3858 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3859
3860 /* Add the static IP address via the standard IPHLPAPI function */
3861 AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress),
3862 htonl(pCurrentConfig->Ip->u.Subnetmask),
3863 pCurrentConfig->Index,
3864 &pCurrentConfig->Ip->NTEContext,
3865 &NTEInstance);
3866 }
3867
3868 /* Delete all default routes for this adapter */
3869 dwSize = 0;
3871 {
3872 DWORD Index;
3874 if (pIpForwardTable)
3875 {
3876 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3877 {
3878 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3879 {
3880 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3881 pIpForwardTable->table[Index].dwForwardDest == 0)
3882 {
3883 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3884 }
3885 }
3886 }
3887 CoTaskMemFree(pIpForwardTable);
3888 }
3889 }
3890 }
3891
3892 if (pCurrentConfig->Gw)
3893 {
3894 MIB_IPFORWARDROW RouterMib;
3895 ZeroMemory(&RouterMib, sizeof(MIB_IPFORWARDROW));
3896
3897 RouterMib.dwForwardMetric1 = 1;
3898 RouterMib.dwForwardIfIndex = pOldConfig->Index;
3899 RouterMib.dwForwardNextHop = htonl(pCurrentConfig->Gw->IpAddress);
3900
3901 //TODO
3902 // add multiple gw addresses when required
3903 CreateIpForwardEntry(&RouterMib);
3904 }
3905
3906
3907 /* Notify the DHCP client of the changed alternate configuration */
3908 if (!RtlEqualMemory(&pCurrentConfig->AltConfig, &pOldConfig->AltConfig, sizeof(AlternateConfiguration)))
3909 {
3910 HMODULE hDhcpModule = LoadLibraryW(L"dhcpcsvc.dll");
3911 if (hDhcpModule)
3912 {
3913 PDHCPFALLBACKREFRESHPARAMS pFunc = (PDHCPFALLBACKREFRESHPARAMS)GetProcAddress(hDhcpModule, "DhcpFallbackRefreshParams");
3914 (pFunc)(pAdapterName);
3915
3916 FreeLibrary(hDhcpModule);
3917 }
3918 }
3919
3920 return S_OK;
3921}
3922
3923HRESULT
3924WINAPI
3926 INetCfgComponentControl * iface)
3927{
3928 TRACE("INetCfgComponentControl_fnCancelChanges()\n");
3929 return S_OK;
3930}
3931
3932static const INetCfgComponentControlVtbl vt_NetCfgComponentControl =
3933{
3941};
3942
3943
3944/***************************************************************
3945 * INetCfgComponentSetup interface
3946 */
3947
3948HRESULT
3949WINAPI
3951 INetCfgComponentSetup *iface,
3952 REFIID iid,
3953 LPVOID *ppvObj)
3954{
3955 TRACE("INetCfgComponentSetup_fnQueryInterface()\n");
3957 return INetCfgComponentControl_QueryInterface((INetCfgComponentControl*)This, iid, ppvObj);
3958}
3959
3960ULONG
3961WINAPI
3963 INetCfgComponentSetup *iface)
3964{
3965 TRACE("INetCfgComponentSetup_fnAddRef()\n");
3967 return INetCfgComponentControl_AddRef((INetCfgComponentControl*)This);
3968}
3969
3970ULONG
3971WINAPI
3973 INetCfgComponentSetup *iface)
3974{
3975 TRACE("INetCfgComponentSetup_fnRelease()\n");
3977 return INetCfgComponentControl_Release((INetCfgComponentControl*)This);
3978}
3979
3980HRESULT
3981WINAPI
3983 INetCfgComponentSetup *iface,
3984 DWORD dwSetupFlags)
3985{
3986 TRACE("INetCfgComponentSetup_fnInstall()\n");
3987 return S_OK;
3988}
3989
3990HRESULT
3991WINAPI
3993 INetCfgComponentSetup *iface,
3994 DWORD dwSetupFlags,
3995 DWORD dwUpgradeFromBuildNo)
3996{
3997 TRACE("INetCfgComponentSetup_fnUpgrade()\n");
3998 return S_OK;
3999}
4000
4001HRESULT
4002WINAPI
4004 INetCfgComponentSetup *iface,
4005 LPCWSTR pszwAnswerFile,
4006 LPCWSTR pszwAnswerSections)
4007{
4008 TRACE("INetCfgComponentSetup_fnReadAnswerFile()\n");
4009 return S_OK;
4010}
4011
4012HRESULT
4013WINAPI
4015 INetCfgComponentSetup *iface)
4016{
4017 TRACE("INetCfgComponentSetup_fnRemoving()\n");
4018 return S_OK;
4019}
4020
4021static const INetCfgComponentSetupVtbl vt_NetCfgComponentSetup =
4022{
4030};
4031
4032HRESULT
4033WINAPI
4035{
4037
4038 if (!ppv)
4039 return E_POINTER;
4040
4042 if (!This)
4043 return E_OUTOFMEMORY;
4044
4045 This->ref = 1;
4046 This->lpVtbl = (const INetCfgComponentControl*)&vt_NetCfgComponentControl;
4047 This->lpVtblCompPropertyUi = (const INetCfgComponentPropertyUi*)&vt_NetCfgComponentPropertyUi;
4048 This->lpVtblCompSetup = (const INetCfgComponentSetup*)&vt_NetCfgComponentSetup;
4049 This->pNCfg = NULL;
4050 This->pUnknown = NULL;
4051 This->pNComp = NULL;
4052 This->pCurrentConfig = NULL;
4053
4054 if (!SUCCEEDED (INetCfgComponentControl_QueryInterface ((INetCfgComponentControl*)This, riid, ppv)))
4055 {
4056 INetCfgComponentControl_Release((INetCfgComponentControl*)This);
4057 return E_NOINTERFACE;
4058 }
4059
4060 INetCfgComponentControl_Release((INetCfgComponentControl*)This);
4061 return S_OK;
4062}
Type
Definition: Type.h:7
#define __inline
Definition: _wctype.cpp:15
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define IDC_OK
Definition: resource.h:59
static void AddButton(HWND hwndToolBar, int nImage, int nCommand)
Definition: wordpad.c:155
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
RECT rect
Definition: combotst.c:67
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static HWND hwndParent
Definition: cryptui.c:300
static TAGID TAGID find
Definition: db.cpp:156
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define BufferSize
Definition: mmc.h:75
HRESULT hr
Definition: delayimp.cpp:573
#define DLGPROC
Definition: maze.c:62
#define ERROR_SUCCESS
Definition: deptool.c:10
DWORD APIENTRY DhcpCApiInitialize(_Out_ LPDWORD Version)
Definition: dhcpcsvc.c:213
DWORD APIENTRY DhcpStaticRefreshParams(DWORD AdapterIndex, DWORD Address, DWORD Netmask)
Definition: dhcpcsvc.c:626
VOID APIENTRY DhcpCApiCleanup(VOID)
Definition: dhcpcsvc.c:227
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_METRIC
Definition: resource.h:77
#define IDC_ADVANCED
Definition: resource.h:11
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
HRESULT WINAPI StringFromCLSID(REFCLSID clsid, LPOLESTR *str)
Definition: combase.c:1515
HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
Definition: propsheet.c:3086
INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh)
Definition: propsheet.c:2916
BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
Definition: propsheet.c:3155
#define wcschr
Definition: compat.h:17
#define CP_ACP
Definition: compat.h:109
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
#define CALLBACK
Definition: compat.h:35
#define MultiByteToWideChar
Definition: compat.h:110
#define LoadLibraryW(x)
Definition: compat.h:747
_ACRTIMP int __cdecl _wtoi(const wchar_t *)
Definition: wcs.c:2773
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:159
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
int WINAPIV _swprintf(wchar_t *str, const wchar_t *format,...)
Definition: wcs.c:1687
HINSTANCE netcfgx_hInstance
Definition: netcfgx.c:15
#define IDC_ALTDNS2
Definition: resource.h:40
#define IDC_NODHCP
Definition: resource.h:24
#define IDS_TCPFILTERDESC
Definition: resource.h:110
#define IDC_IPDEL
Definition: resource.h:45
#define IDS_DISABLE_FILTER
Definition: resource.h:128
#define IDC_GWADD
Definition: resource.h:47
#define IDC_IP_RESTRICT
Definition: resource.h:91
#define IDC_DNS1
Definition: resource.h:30
#define IDC_DNSADDRMOD
Definition: resource.h:61
#define IDD_TCPIP_ADVOPT_DLG
Definition: resource.h:12
#define IDC_OPTLIST
Definition: resource.h:76
#define IDC_DNSSUFFIXLIST
Definition: resource.h:66
#define IDS_PROT_RANGE
Definition: resource.h:126
#define IDS_TCP_PORTS
Definition: resource.h:122
#define IDD_TCPIPADDIP_DLG
Definition: resource.h:14
#define IDC_PORT_VAL
Definition: resource.h:97
#define IDC_IP_DEL
Definition: resource.h:94
#define IDC_DNSSUFFIXUP
Definition: resource.h:67
#define IDC_DNSSUFFIXDEL
Definition: resource.h:71
#define IDC_GWDEL
Definition: resource.h:49
#define IDC_IP_ALLOW_ALL
Definition: resource.h:90
#define IDS_SUBMASK
Definition: resource.h:113
#define IDS_DUP_GW
Definition: resource.h:134
#define IDC_DNSSUFFIXDOWN
Definition: resource.h:68
#define IDS_NOITEMSEL
Definition: resource.h:118
#define IDD_TCPIP_ALTCF_DLG
Definition: resource.h:9
#define IDC_USEDHCP
Definition: resource.h:23
#define IDC_SUBNETMASK
Definition: resource.h:26
#define IDC_FIXEDDNS
Definition: resource.h:29
#define IDD_TCPIP_FILTER_DLG
Definition: resource.h:13
#define IDC_SUFFIX
Definition: resource.h:72
#define IDD_TCPIPDNS_DLG
Definition: resource.h:16
#define IDC_IPLIST
Definition: resource.h:42
#define IDC_OPTPROP
Definition: resource.h:77
#define IDC_ALTSTATIC
Definition: resource.h:35
#define IDC_USESUFFIX
Definition: resource.h:74
#define IDC_DNSADDRADD
Definition: resource.h:60
#define IDC_USE_FILTER
Definition: resource.h:95
#define IDC_IP_LIST
Definition: resource.h:92
#define IDD_TCPIPGW_DLG
Definition: resource.h:15
#define IDC_AUTODNS
Definition: resource.h:28
#define IDD_TCPIP_ADVIP_DLG
Definition: resource.h:10
#define IDC_UDP_LIST
Definition: resource.h:87
#define IDS_IP_PROTO
Definition: resource.h:124
#define IDC_TCP_RESTRICT
Definition: resource.h:81
#define IDC_GWMOD
Definition: resource.h:48
#define IDS_AUTOMATIC
Definition: resource.h:117
#define IDC_DNS2
Definition: resource.h:31
#define IDC_TCP_ADD
Definition: resource.h:83
#define IDS_DHCPACTIVE
Definition: resource.h:116
#define IDS_TCPIP
Definition: resource.h:119
#define IDC_ALTIPADDR
Definition: resource.h:36
#define IDC_ALTDNS1
Definition: resource.h:39
#define IDC_DEFGATEWAY
Definition: resource.h:27
#define IDC_UDP_DEL
Definition: resource.h:89
#define IDC_IP_ADD
Definition: resource.h:93
#define IDS_DOMAIN_SUFFIX
Definition: resource.h:130
#define IDC_DNSADDRDEL
Definition: resource.h:62
#define IDS_UDP_PORTS
Definition: resource.h:123
#define IDC_UDP_ALLOW_ALL
Definition: resource.h:85
#define IDC_TCP_ALLOW_ALL
Definition: resource.h:80
#define IDC_DNSADDRUP
Definition: resource.h:58
#define IDS_NO_SUBMASK_SET
Definition: resource.h:109
#define IDS_TCPFILTER
Definition: resource.h:111
#define IDS_DUP_NUMBER
Definition: resource.h:127
#define IDC_GWMETRICTXT
Definition: resource.h:53
#define IDC_REGSUFFIX
Definition: resource.h:73
#define IDC_PRIMSUFFIX
Definition: resource.h:63
#define IDS_NO_SUFFIX
Definition: resource.h:129
#define IDC_ALTAPIPA
Definition: resource.h:34
#define IDS_METRIC_RANGE
Definition: resource.h:135
#define IDC_GWMETRIC
Definition: resource.h:54
#define IDC_GWAUTOMETRIC
Definition: resource.h:52
#define IDD_TCPIP_BASIC_DLG
Definition: resource.h:8
#define IDS_GATEWAY
Definition: resource.h:114
#define IDD_TCPIPSUFFIX_DLG
Definition: resource.h:17
#define IDS_PORT_RANGE
Definition: resource.h:125
#define IDC_IPADD
Definition: resource.h:43
#define IDC_IPMOD
Definition: resource.h:44
#define IDD_TCPIP_ADVDNS_DLG
Definition: resource.h:11
#define IDC_ALTSUBNETMASK
Definition: resource.h:37
#define IDC_TCP_LIST
Definition: resource.h:82
#define IDS_ADD
Definition: resource.h:120
#define IDC_UDP_ADD
Definition: resource.h:88
#define IDS_DUP_IPADDR
Definition: resource.h:133
#define IDC_UDP_RESTRICT
Definition: resource.h:86
#define IDC_SELSUFFIX
Definition: resource.h:65
#define IDS_MOD
Definition: resource.h:121
#define IDC_IPADDR
Definition: resource.h:25
#define IDI_NETWORK
Definition: resource.h:4
#define IDS_DUP_SUFFIX
Definition: resource.h:132
#define IDC_DNSADDRDOWN
Definition: resource.h:59
#define IDS_IPADDR
Definition: resource.h:112
#define IDC_PORT_DESC
Definition: resource.h:96
#define IDS_DNS_SUFFIX
Definition: resource.h:131
#define IDS_NO_IPADDR_SET
Definition: resource.h:108
#define IDC_OPTDESC
Definition: resource.h:78
#define IDC_IFAUTOMETRIC
Definition: resource.h:50
#define IDC_DNSADDRLIST
Definition: resource.h:57
#define IDC_TOPPRIMSUFFIX
Definition: resource.h:64
#define IDC_GWLIST
Definition: resource.h:46
#define IDC_TCP_DEL
Definition: resource.h:84
#define IDC_IFMETRIC
Definition: resource.h:51
#define IDD_TCPIP_PORT_DLG
Definition: resource.h:18
#define IDC_DNSSUFFIXMOD
Definition: resource.h:70
#define IDC_DNSSUFFIXADD
Definition: resource.h:69
#define IDC_ALTDEFGATEWAY
Definition: resource.h:38
#define swprintf
Definition: precomp.h:40
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER pAddr
FxIoTarget * pTarget
Definition: fxdeviceapi.cpp:97
SINGLE_LIST_ENTRY * pCur
FxAutoRegKey hKey
LARGE_INTEGER li
Definition: fxtimerapi.cpp:235
GLuint res
Definition: glext.h:9613
GLuint GLfloat * val
Definition: glext.h:7180
CPPORT Port[4]
Definition: headless.c:38
#define Gw
Definition: i386-dis.c:364
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
DWORD WINAPI AddIPAddress(IPAddr Address, IPMask Netmask, DWORD IfIndex, PULONG NteContext, PULONG NteInstance)
Definition: iphlpapi_main.c:67
DWORD WINAPI GetIpForwardTable(PMIB_IPFORWARDTABLE pIpForwardTable, PULONG pdwSize, BOOL bOrder)
DWORD WINAPI DeleteIpForwardEntry(PMIB_IPFORWARDROW pRoute)
DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen)
DWORD WINAPI GetPerAdapterInfo(ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen)
DWORD WINAPI CreateIpForwardEntry(PMIB_IPFORWARDROW pRoute)
DWORD WINAPI DeleteIPAddress(ULONG NTEContext)
struct _MIB_IPFORWARDTABLE * PMIB_IPFORWARDTABLE
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
#define REG_SZ
Definition: layer.c:22
if(dx< 0)
Definition: linetemp.h:194
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define htonl(x)
Definition: module.h:214
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HICON
Definition: imagelist.c:80
static IUnknown * pUnkReserved
Definition: asmenum.c:33
static BSTR *static LPOLESTR
Definition: varformat.c:44
HICON hIcon
Definition: msconfig.c:44
struct _PSP * HPROPSHEETPAGE
Definition: mstask.idl:90
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
unsigned int UINT
Definition: ndis.h:50
EXTERN_C const IID IID_INetCfgComponentPropertyUi
Definition: netcfgn.h:88
EXTERN_C const IID IID_INetCfgComponentControl
Definition: netcfgn.h:57
EXTERN_C const IID IID_INetLanConnectionUiInfo
Definition: netcfgn.h:234
#define INetCfgComponentControl_QueryInterface(p, a, b)
Definition: netcfgn.h:48
#define INetCfgComponentControl_Release(p)
Definition: netcfgn.h:50
EXTERN_C const IID IID_INetCfgComponentSetup
Definition: netcfgn.h:165
#define INetCfgComponentControl_AddRef(p)
Definition: netcfgn.h:49
#define INetLanConnectionUiInfo_GetDeviceGuid(p, a)
Definition: netcfgn.h:231
#define REG_BINARY
Definition: nt_native.h:1499
#define KEY_READ
Definition: nt_native.h:1026
#define REG_MULTI_SZ
Definition: nt_native.h:1504
#define KEY_WRITE
Definition: nt_native.h:1034
#define DWORD
Definition: nt_native.h:44
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static const WCHAR szName[]
Definition: powrprof.c:45
#define PSH_PROPTITLE
Definition: prsht.h:40
#define PropSheet_Changed(d, w)
Definition: prsht.h:344
#define PSNRET_INVALID
Definition: prsht.h:130
#define PSM_REMOVEPAGE
Definition: prsht.h:166
#define PSH_USECALLBACK
Definition: prsht.h:48
#define PSP_USETITLE
Definition: prsht.h:26
#define PSP_DEFAULT
Definition: prsht.h:22
#define PSN_KILLACTIVE
Definition: prsht.h:116
#define PSN_APPLY
Definition: prsht.h:117
struct _PROPSHEETPAGEW PROPSHEETPAGEW
#define PSNRET_NOERROR
Definition: prsht.h:129
#define LPPROPSHEETPAGE
Definition: prsht.h:390
#define PSH_USEICONID
Definition: prsht.h:42
#define PSCB_INITIALIZED
Definition: prsht.h:75
struct _PROPSHEETHEADERW PROPSHEETHEADERW
struct _PSHNOTIFY * LPPSHNOTIFY
#define PSH_NOAPPLYNOW
Definition: prsht.h:47
#define FOURTH_IPADDRESS(x)
Definition: commctrl.h:4496
struct tagNMIPADDRESS * LPNMIPADDRESS
#define MAKEIPADDRESS(b1, b2, b3, b4)
Definition: commctrl.h:4491
#define FIRST_IPADDRESS(x)
Definition: commctrl.h:4493
#define LVFI_STRING
Definition: commctrl.h:2442
#define LVIF_STATE
Definition: commctrl.h:2317
#define MAKEIPRANGE(low, high)
Definition: commctrl.h:4489
#define LVM_FINDITEMW
Definition: commctrl.h:2471
#define LVCF_WIDTH
Definition: commctrl.h:2592
#define LVM_SETITEMW
Definition: commctrl.h:2402
#define IPM_SETADDRESS
Definition: commctrl.h:4471
#define ListView_GetItemCount(hwnd)
Definition: commctrl.h:2312
#define IPN_FIELDCHANGED
Definition: commctrl.h:4482
#define SECOND_IPADDRESS(x)
Definition: commctrl.h:4494
#define LVIS_SELECTED
Definition: commctrl.h:2324
#define LVIF_PARAM
Definition: commctrl.h:2316
struct tagNMLISTVIEW * LPNMLISTVIEW
#define LVM_INSERTCOLUMNW
Definition: commctrl.h:2637
#define LVIF_TEXT
Definition: commctrl.h:2314
#define LVCF_FMT
Definition: commctrl.h:2591
#define THIRD_IPADDRESS(x)
Definition: commctrl.h:4495
#define LVCF_SUBITEM
Definition: commctrl.h:2594
#define IPM_CLEARADDRESS
Definition: commctrl.h:4470
#define IPM_GETADDRESS
Definition: commctrl.h:4472
#define ListView_DeleteItem(hwnd, i)
Definition: commctrl.h:2416
#define LVN_ITEMCHANGED
Definition: commctrl.h:3136
#define LVM_INSERTITEMW
Definition: commctrl.h:2409
#define LVCF_TEXT
Definition: commctrl.h:2593
#define LVM_GETITEMW
Definition: commctrl.h:2395
#define IPM_SETRANGE
Definition: commctrl.h:4473
#define LV_COLUMN
Definition: commctrl.h:2552
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
IP_PER_ADAPTER_INFO_W2KSP1 * PIP_PER_ADAPTER_INFO
Definition: iptypes.h:70
ULONG IPADDR
Definition: rassapi.h:53
#define WM_NOTIFY
Definition: richedit.h:61
#define REG_DWORD
Definition: sdbapi.c:615
#define iswalnum(_c)
Definition: ctype.h:671
wcscpy
#define LoadStringW
Definition: utils.h:64
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
char String[4 *4]
Definition: iptypes.h:31
LPWSTR szRawIPAllowedProtocols
INetCfgComponent * pNComp
const INetCfgComponentControl * lpVtbl
const INetCfgComponentSetup * lpVtblCompSetup
const INetCfgComponentPropertyUi * lpVtblCompPropertyUi
TcpipSettings * pOldConfig
TcpipSettings * pCurrentConfig
AlternateConfiguration AltConfig
TcpipAdvancedDNSDlgSettings * pDNS
TcpFilterSettings * pFilter
struct _IP_ADAPTER_INFO * Next
Definition: iptypes.h:42
IP_ADDR_STRING IpAddressList
Definition: iptypes.h:52
char AdapterName[MAX_ADAPTER_NAME_LENGTH+4]
Definition: iptypes.h:44
IP_ADDR_STRING GatewayList
Definition: iptypes.h:53
UINT DhcpEnabled
Definition: iptypes.h:50
struct _IP_ADDR_STRING * Next
Definition: iptypes.h:35
IP_ADDRESS_STRING IpAddress
Definition: iptypes.h:36
IP_MASK_STRING IpMask
Definition: iptypes.h:37
DWORD Context
Definition: iptypes.h:38
IP_ADDR_STRING DnsServerList
Definition: iptypes.h:66
DWORD dwForwardNextHop
Definition: ipmib.h:74
DWORD dwForwardMetric1
Definition: ipmib.h:88
IF_INDEX dwForwardIfIndex
Definition: ipmib.h:75
DWORD dwForwardDest
Definition: ipmib.h:71
DWORD dwNumEntries
Definition: ipmib.h:97
MIB_IPFORWARDROW table[1]
Definition: ipmib.h:98
HINSTANCE hInstance
Definition: prsht.h:296
DWORD dwSize
Definition: prsht.h:293
DWORD dwFlags
Definition: prsht.h:294
LPCWSTR pszIcon
Definition: prsht.h:299
HWND hwndParent
Definition: prsht.h:295
PFNPROPSHEETCALLBACK pfnCallback
Definition: prsht.h:311
HPROPSHEETPAGE * phpage
Definition: prsht.h:309
LPCWSTR pszCaption
Definition: prsht.h:301
DLGPROC pfnDlgProc
Definition: prsht.h:226
DWORD dwSize
Definition: prsht.h:214
DWORD dwFlags
Definition: prsht.h:215
LPARAM lParam
Definition: prsht.h:227
LPCWSTR pszTemplate
Definition: prsht.h:218
LPCWSTR pszTitle
Definition: prsht.h:225
HINSTANCE hInstance
Definition: prsht.h:216
NMHDR hdr
Definition: prsht.h:330
struct _SINGLE_LIST_ENTRY * Next
Definition: ntbasedef.h:641
Definition: module.h:576
union tagIP_ADDR::@542 u
struct tagIP_ADDR * Next
int cchTextMax
Definition: commctrl.h:2573
LPWSTR pszText
Definition: commctrl.h:2572
UINT_PTR idFrom
Definition: winuser.h:3266
UINT code
Definition: winuser.h:3267
UINT uNewState
Definition: commctrl.h:3041
LONG right
Definition: windef.h:108
LONG left
Definition: windef.h:106
INT_PTR CALLBACK TcpipFilterSettingsDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
HRESULT WINAPI INetCfgComponentPropertyUi_fnCancelProperties(INetCfgComponentPropertyUi *iface)
HRESULT InitializeTcpipBasicDlgCtrls(HWND hwndDlg, TcpipSettings *pCurSettings)
struct tagIP_ADDR IP_ADDR
HRESULT CopyIpAddrString(IP_ADDR_STRING *pSrc, IP_ADDR **pTarget, COPY_TYPE Type, LPWSTR szMetric)
HRESULT WINAPI INetCfgComponentPropertyUi_fnMergePropPages(INetCfgComponentPropertyUi *iface, DWORD *pdwDefPages, BYTE **pahpspPrivate, UINT *pcPages, HWND hwndParent, LPCWSTR *pszStartPage)
UINT GetIpAddressFromStringW(WCHAR *szBuffer)
VOID DisplayError(UINT ResTxt, UINT ResTitle, UINT Type)
VOID InitializeTcpipAdvancedIpDlg(HWND hwndDlg, TcpipConfNotifyImpl *This)
HRESULT WINAPI INetCfgComponentControl_fnQueryInterface(INetCfgComponentControl *iface, REFIID iid, LPVOID *ppvObj)
VOID FreeDNSSettings(TcpipAdvancedDNSDlgSettings *pDNS)
VOID FreeIPAddr(IP_ADDR *pAddr)
LPWSTR LoadTcpFilterSettingsFromRegistry(HKEY hKey, LPCWSTR szName, LPDWORD Size)
HRESULT LoadDNSSettings(TcpipSettings *pSettings, LPOLESTR pAdapterName)
VOID InsertIpAddressToListView(HWND hDlgCtrl, IP_ADDR *pAddr, BOOL bSubMask)
VOID StoreIPSettings(HWND hDlgCtrl, TcpipConfNotifyImpl *This, BOOL bSubmask)
VOID LaunchAdvancedTcpipSettings(HWND hwndDlg, TcpipConfNotifyImpl *This)
LPWSTR CreateFilterList(HWND hDlgCtrl, LPDWORD Size)
HRESULT LoadFilterSettings(TcpipSettings *pSettings, LPOLESTR pAdapterName)
VOID DeleteItemFromList(HWND hDlgCtrl)
BOOL GetGWListEntry(HWND hDlgCtrl, INT Index, TcpipGwSettings *pGwSettings)
static int CALLBACK PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
VOID AddAlternativeDialog(HWND hDlg, TcpipConfNotifyImpl *This)
HRESULT WINAPI INetCfgComponentPropertyUi_fnQueryPropertyUi(INetCfgComponentPropertyUi *iface, IUnknown *pUnkReserved)
static VOID DelItem(HWND hDlgCtrl)
ULONG WINAPI INetCfgComponentSetup_fnAddRef(INetCfgComponentSetup *iface)
UINT GetIpAddressFromStringA(char *sBuffer)
INT_PTR CALLBACK TcpipAdvancedDnsDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
COPY_TYPE
@ METRIC
@ SUBMASK
HRESULT WINAPI INetCfgComponentControl_fnCancelChanges(INetCfgComponentControl *iface)
HRESULT WINAPI INetCfgComponentSetup_fnInstall(INetCfgComponentSetup *iface, DWORD dwSetupFlags)
HRESULT WINAPI INetCfgComponentControl_fnInitialize(INetCfgComponentControl *iface, INetCfgComponent *pIComp, INetCfg *pINetCfg, BOOL fInstalling)
BOOL VerifyDNSSuffix(LPWSTR szName)
VOID InsertColumnToListView(HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size)
VOID MoveItem(HWND hDlgCtrl, INT pos)
HRESULT WINAPI INetCfgComponentControl_fnApplyPnpChanges(INetCfgComponentControl *iface, INetCfgPnpReconfigCallback *pICallback)
INT GetSelectedItem(HWND hDlgCtrl)
HRESULT WINAPI INetCfgComponentSetup_fnUpgrade(INetCfgComponentSetup *iface, DWORD dwSetupFlags, DWORD dwUpgradeFromBuildNo)
HRESULT WINAPI INetCfgComponentSetup_fnRemoving(INetCfgComponentSetup *iface)
ULONG WINAPI INetCfgComponentPropertyUi_fnAddRef(INetCfgComponentPropertyUi *iface)
INT_PTR CALLBACK TcpipFilterPortDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
TcpFilterSettings * StoreTcpipFilterSettings(HWND hwndDlg)
DWORD(WINAPI * PDHCPFALLBACKREFRESHPARAMS)(PWSTR pAdapterName)
ULONG WINAPI INetCfgComponentSetup_fnRelease(INetCfgComponentSetup *iface)
BOOL GetListViewItem(HWND hDlgCtrl, UINT Index, UINT SubIndex, WCHAR *szBuffer, UINT BufferSize)
HRESULT WINAPI INetCfgComponentPropertyUi_fnApplyProperties(INetCfgComponentPropertyUi *iface)
HRESULT WINAPI INetCfgComponentPropertyUi_fnSetContext(INetCfgComponentPropertyUi *iface, IUnknown *pUnkReserved)
VOID RemoveItem(HWND hDlgCtrl)
static LPWSTR CreateMultiSzString(IP_ADDR *pAddr, COPY_TYPE Type, LPDWORD Size, BOOL bComma)
INT_PTR CALLBACK TcpipAddSuffixDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
INT_PTR CALLBACK TcpipAdvancedOptDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
INT_PTR StoreTcpipBasicSettings(HWND hwndDlg, TcpipConfNotifyImpl *This, BOOL bApply)
HRESULT WINAPI INetCfgComponentPropertyUi_fnValidateProperties(INetCfgComponentPropertyUi *iface, HWND hwndDlg)
HRESULT WINAPI INetCfgComponentPropertyUi_fnQueryInterface(INetCfgComponentPropertyUi *iface, REFIID iid, LPVOID *ppvObj)
ULONG WINAPI INetCfgComponentPropertyUi_fnRelease(INetCfgComponentPropertyUi *iface)
HRESULT LoadTcpIpSettings(TcpipSettings *pSettings, LPOLESTR pAdapterName, IP_ADAPTER_INFO *pAdapterInfo, IP_PER_ADAPTER_INFO *pPerAdapterInfo)
HRESULT WINAPI INetCfgComponentSetup_fnReadAnswerFile(INetCfgComponentSetup *iface, LPCWSTR pszwAnswerFile, LPCWSTR pszwAnswerSections)
HRESULT InitializeTcpipAltDlgCtrls(HWND hwndDlg, TcpipSettings *pCurSettings)
static const INetCfgComponentSetupVtbl vt_NetCfgComponentSetup
VOID FreeFilterSettings(TcpFilterSettings *pFilter)
static const INetCfgComponentControlVtbl vt_NetCfgComponentControl
VOID InitializeTcpipAdvancedDNSDlg(HWND hwndDlg, TcpipConfNotifyImpl *This)
INT_PTR CALLBACK TcpipAdvancedIpDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
INT_PTR StoreTcpipAlternateSettings(HWND hwndDlg, TcpipConfNotifyImpl *This, BOOL bApply)
VOID InitFilterListBox(LPWSTR pData, HWND hwndDlg, HWND hDlgCtrl, UINT AllowButton, UINT RestrictButton, UINT AddButton, UINT DelButton)
VOID StoreDNSSettings(HWND hDlgCtrl, TcpipConfNotifyImpl *This)
INT_PTR CALLBACK TcpipAltConfDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
VOID ToggleUpDown(HWND hwndDlg, HWND hDlgCtrl, UINT UpButton, UINT DownButton, UINT ModButton, UINT DelButton)
HRESULT WINAPI INetCfgComponentSetup_fnQueryInterface(INetCfgComponentSetup *iface, REFIID iid, LPVOID *ppvObj)
INT_PTR CALLBACK TcpipAddDNSDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
VOID InitializeTcpipAdvancedOptDlg(HWND hwndDlg, TcpipConfNotifyImpl *This)
static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi
ULONG WINAPI INetCfgComponentControl_fnRelease(INetCfgComponentControl *iface)
static __inline LPTcpipConfNotifyImpl impl_from_INetCfgComponentSetup(INetCfgComponentSetup *iface)
INT_PTR CALLBACK TcpipAddIpDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
HRESULT WINAPI TcpipConfigNotify_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv)
ULONG WINAPI INetCfgComponentControl_fnAddRef(INetCfgComponentControl *iface)
HRESULT WINAPI INetCfgComponentControl_fnApplyRegistryChanges(INetCfgComponentControl *iface)
VOID FreeSettings(TcpipSettings *pSettings)
LPWSTR GetListViewEntries(HWND hDlgCtrl)
BOOL GetIPListEntry(HWND hDlgCtrl, INT Index, TcpipIpSettings *pIpSettings)
INT_PTR CALLBACK TcpipAdvGwDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
INT_PTR CALLBACK TcpipBasicDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
static __inline LPTcpipConfNotifyImpl impl_from_INetCfgComponentPropertyUi(INetCfgComponentPropertyUi *iface)
struct TcpipConfNotifyImpl * LPTcpipConfNotifyImpl
#define ICON_BIG
Definition: tnclass.cpp:51
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define AddItem
Definition: userenv.h:209
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1382
_In_ BOOL bEnable
Definition: winddi.h:3426
#define WINAPI
Definition: msvc.h:6
#define ERROR_BUFFER_OVERFLOW
Definition: winerror.h:307
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define LB_ERR
Definition: winuser.h:2468
#define LB_GETCOUNT
Definition: winuser.h:2067
#define WM_GETTEXTLENGTH
Definition: winuser.h:1647
#define EM_LIMITTEXT
Definition: winuser.h:2029
#define DWLP_USER
Definition: winuser.h:883
BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT)
#define IDCANCEL
Definition: winuser.h:842
#define LB_GETTEXT
Definition: winuser.h:2085
#define BST_UNCHECKED
Definition: winuser.h:199
#define WM_COMMAND
Definition: winuser.h:1768
#define WM_GETTEXT
Definition: winuser.h:1646
#define WM_INITDIALOG
Definition: winuser.h:1767
#define LB_ADDSTRING
Definition: winuser.h:2060
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define MB_ICONERROR
Definition: winuser.h:798
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define WM_SETTEXT
Definition: winuser.h:1645
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetDlgItemInt(_In_ HWND, _In_ int, _In_ UINT, _In_ BOOL)
#define LB_RESETCONTENT
Definition: winuser.h:2091
#define LB_DELETESTRING
Definition: winuser.h:2061
HWND WINAPI SetFocus(_In_opt_ HWND)
#define LB_FINDSTRING
Definition: winuser.h:2063
#define LB_INSERTSTRING
Definition: winuser.h:2089
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define MB_OK
Definition: winuser.h:801
#define LB_GETTEXTLEN
Definition: winuser.h:2086
#define MB_ICONWARNING
Definition: winuser.h:797
HWND WINAPI GetParent(_In_ HWND)
#define LBN_SELCHANGE
Definition: winuser.h:2111
BOOL WINAPI CheckRadioButton(_In_ HWND, _In_ int, _In_ int, _In_ int)
#define DWLP_MSGRESULT
Definition: winuser.h:881
#define MB_ICONINFORMATION
Definition: winuser.h:813
#define BN_CLICKED
Definition: winuser.h:1954
#define LB_SETCURSEL
Definition: winuser.h:2099
UINT WINAPI GetDlgItemInt(_In_ HWND, _In_ int, _Out_opt_ PBOOL, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define LB_GETCURSEL
Definition: winuser.h:2068
#define SendDlgItemMessage
Definition: winuser.h:6008
LRESULT WINAPI SendDlgItemMessageA(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2444
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define BM_GETCHECK
Definition: winuser.h:1947
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
static void Initialize()
Definition: xlate.c:212
unsigned char BYTE
Definition: xxhash.c:193