* Sync up to trunk HEAD (r62286).
[reactos.git] / dll / win32 / netcfgx / tcpipconf_notify.c
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
9 typedef struct
10 {
11 DWORD EnableSecurityFilters;
12 LPWSTR szTCPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\TCPAllowedPorts
13 LPWSTR szUDPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\UDPAllowedPorts
14 LPWSTR szRawIPAllowedProtocols; // KEY: Tcpip\Parameter\{InstanceGuid}\RawIPAllowedProtocols
15 DWORD IPSize;
16 DWORD TCPSize;
17 DWORD UDPSize;
18 }TcpFilterSettings;
19
20 // KEY: Tcpip\Parameter\{InstanceGuid}\IpAddress | DhcpIpAddress
21 // KEY: Tcpip\Parameter\{InstanceGuid}\SubnetMask | DhcpSubnetMask
22 // KEY: Tcpip\Parameter\{InstanceGuid}\DefaultGateway | DhcpDefaultGateway
23 // KEY: Tcpip\Parameter\{InstanceGuid}\NameServer | DhcpNameServer
24 // KEY: Services\NetBT\Parameters\Interfaces\Tcpip_{INSTANCE_GUID}
25
26 typedef struct
27 {
28 DWORD RegisterAdapterName;
29 DWORD RegistrationEnabled;
30 DWORD UseDomainNameDevolution;
31 WCHAR szDomain[100];
32 LPWSTR szSearchList;
33 }TcpipAdvancedDNSDlgSettings;
34
35 typedef struct tagIP_ADDR
36 {
37 DWORD IpAddress;
38 union
39 {
40 DWORD Subnetmask;
41 USHORT Metric;
42 }u;
43 ULONG NTEContext;
44 struct tagIP_ADDR * Next;
45 }IP_ADDR;
46
47 typedef enum
48 {
49 METRIC = 1,
50 SUBMASK = 2,
51 IPADDR = 3
52 }COPY_TYPE;
53
54 typedef struct
55 {
56 IP_ADDR * Ip;
57 IP_ADDR * Ns;
58 IP_ADDR * Gw;
59
60 UINT DhcpEnabled;
61 UINT AutoconfigActive;
62 DWORD Index;
63 TcpFilterSettings * pFilter;
64 TcpipAdvancedDNSDlgSettings * pDNS;
65 }TcpipSettings;
66
67 typedef struct
68 {
69 const INetCfgComponentPropertyUi * lpVtbl;
70 const INetCfgComponentControl * lpVtblCompControl;
71 LONG ref;
72 IUnknown * pUnknown;
73 INetCfg * pNCfg;
74 INetCfgComponent * pNComp;
75 TcpipSettings *pCurrentConfig;
76 CLSID NetCfgInstanceId;
77 }TcpipConfNotifyImpl, *LPTcpipConfNotifyImpl;
78
79 typedef struct
80 {
81 BOOL bAdd;
82 HWND hDlgCtrl;
83 WCHAR szIP[16];
84 UINT Metric;
85 }TcpipGwSettings;
86
87 typedef struct
88 {
89 BOOL bAdd;
90 HWND hDlgCtrl;
91 WCHAR szIP[16];
92 WCHAR szMask[16];
93 }TcpipIpSettings;
94
95 typedef struct
96 {
97 BOOL bAdd;
98 HWND hDlgCtrl;
99 WCHAR szIP[16];
100 }TcpipDnsSettings;
101
102 typedef struct
103 {
104 BOOL bAdd;
105 HWND hDlgCtrl;
106 LPWSTR Suffix;
107 }TcpipSuffixSettings;
108
109 typedef struct
110 {
111 HWND hDlgCtrl;
112 UINT ResId;
113 UINT MaxNum;
114 }TcpipPortSettings;
115
116 static __inline LPTcpipConfNotifyImpl impl_from_INetCfgComponentControl(INetCfgComponentControl *iface)
117 {
118 return (TcpipConfNotifyImpl*)((char *)iface - FIELD_OFFSET(TcpipConfNotifyImpl, lpVtblCompControl));
119 }
120
121 INT GetSelectedItem(HWND hDlgCtrl);
122 HRESULT InitializeTcpipBasicDlgCtrls(HWND hwndDlg, TcpipSettings * pCurSettings);
123 VOID InsertColumnToListView(HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size);
124 INT_PTR StoreTcpipBasicSettings(HWND hwndDlg, TcpipConfNotifyImpl * This, BOOL bApply);
125 HRESULT Initialize(TcpipConfNotifyImpl * This);
126
127 VOID
128 DisplayError(UINT ResTxt, UINT ResTitle, UINT Type)
129 {
130 WCHAR szBuffer[300];
131 WCHAR szTitle[100];
132
133 if (LoadStringW(netcfgx_hInstance, ResTxt, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
134 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
135 else
136 szBuffer[0] = L'\0';
137
138 if (LoadStringW(netcfgx_hInstance, ResTitle, szTitle, sizeof(szTitle)/sizeof(WCHAR)))
139 szTitle[(sizeof(szTitle)/sizeof(WCHAR))-1] = L'\0';
140 else
141 szTitle[0] = L'\0';
142
143 MessageBoxW(NULL, szBuffer, szTitle, Type);
144 }
145
146
147 /***************************************************************
148 * TCP/IP Filter Dialog
149 *
150 */
151
152 INT_PTR
153 CALLBACK
154 TcpipFilterPortDlg(
155 HWND hwndDlg,
156 UINT uMsg,
157 WPARAM wParam,
158 LPARAM lParam
159 )
160 {
161 TcpipPortSettings * pPort;
162 UINT Num;
163 LVFINDINFOW find;
164 LVITEMW li;
165 WCHAR szBuffer[100];
166
167 switch(uMsg)
168 {
169 case WM_INITDIALOG:
170 pPort = (TcpipPortSettings*)lParam;
171 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pPort);
172 if (LoadStringW(netcfgx_hInstance, pPort->ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
173 {
174 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
175 SendDlgItemMessageW(hwndDlg, IDC_PORT_DESC, WM_SETTEXT, 0, (LPARAM)szBuffer);
176 }
177
178 if (pPort->MaxNum == 65536)
179 SendDlgItemMessageW(hwndDlg, IDC_PORT_VAL, EM_LIMITTEXT, 5, 0);
180 else
181 SendDlgItemMessageW(hwndDlg, IDC_PORT_VAL, EM_LIMITTEXT, 3, 0);
182
183 return TRUE;
184 case WM_COMMAND:
185 if (LOWORD(wParam) == IDCANCEL)
186 {
187 EndDialog(hwndDlg, FALSE);
188 break;
189 }
190 else if (LOWORD(wParam) == IDC_OK)
191 {
192 pPort = (TcpipPortSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
193 Num = GetDlgItemInt(hwndDlg, IDC_PORT_VAL, NULL, TRUE);
194 if (Num > pPort->MaxNum || Num == 0)
195 {
196 if (pPort->MaxNum == 65536)
197 DisplayError(IDS_PORT_RANGE, IDS_TCPIP, MB_ICONWARNING);
198 else
199 DisplayError(IDS_PROT_RANGE, IDS_TCPIP, MB_ICONWARNING);
200
201 SetFocus(GetDlgItem(hwndDlg, IDC_PORT_VAL));
202 break;
203 }
204 if (GetWindowTextW(GetDlgItem(hwndDlg, IDC_PORT_VAL), szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
205 {
206 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
207 ZeroMemory(&find, sizeof(LVFINDINFOW));
208 find.flags = LVFI_STRING;
209 find.psz = szBuffer;
210 if (SendMessageW(pPort->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1)
211 {
212 ZeroMemory(&li, sizeof(LVITEMW));
213 li.mask = LVIF_TEXT;
214 li.iItem = ListView_GetItemCount(pPort->hDlgCtrl);
215 li.pszText = szBuffer;
216 SendMessageW(pPort->hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
217 EndDialog(hwndDlg, TRUE);
218 break;
219 }
220 DisplayError(IDS_DUP_NUMBER, IDS_PROT_RANGE, MB_ICONWARNING);
221 SetFocus(GetDlgItem(hwndDlg, IDC_PORT_VAL));
222 break;
223 }
224 }
225 }
226 return FALSE;
227 }
228
229 VOID
230 InitFilterListBox(LPWSTR pData, HWND hwndDlg, HWND hDlgCtrl, UINT AllowButton, UINT RestrictButton, UINT AddButton, UINT DelButton)
231 {
232 LVITEMW li;
233 LPWSTR pCur;
234 INT iItem;
235
236 if (!pData || !_wtoi(pData))
237 {
238 SendDlgItemMessageW(hwndDlg, AllowButton, BM_SETCHECK, BST_CHECKED, 0);
239 EnableWindow(GetDlgItem(hwndDlg, AddButton), FALSE);
240 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE);
241 return;
242 }
243
244 pCur = pData;
245 memset(&li, 0x0, sizeof(LVITEMW));
246 li.mask = LVIF_TEXT;
247 iItem = 0;
248
249 while(pCur[0])
250 {
251 li.pszText = pCur;
252 li.iItem = iItem;
253 SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
254 iItem++;
255 pCur += wcslen(pCur) + 1;
256 }
257
258 if (!iItem)
259 SendDlgItemMessageW(hwndDlg, AllowButton, BM_SETCHECK, BST_CHECKED, 0);
260 else
261 SendDlgItemMessageW(hwndDlg, RestrictButton, BM_SETCHECK, BST_CHECKED, 0);
262 }
263
264 LPWSTR
265 CreateFilterList(
266 HWND hDlgCtrl,
267 LPDWORD Size)
268 {
269 INT iCount, iIndex;
270 LVITEMW li;
271 LPWSTR pData, pCur;
272 DWORD dwSize;
273 WCHAR szBuffer[10];
274
275 iCount = ListView_GetItemCount(hDlgCtrl);
276 if (!iCount)
277 {
278 pData = (LPWSTR)CoTaskMemAlloc(3 * sizeof(WCHAR));
279 if (!pData)
280 return NULL;
281 pData[0] = L'0';
282 pData[1] = L'\0';
283 pData[2] = L'\0';
284 *Size = 3 * sizeof(WCHAR);
285 return pData;
286 }
287
288 pData = CoTaskMemAlloc((6 * iCount + 1) * sizeof(WCHAR));
289 if (!pData)
290 return NULL;
291
292 pCur = pData;
293 dwSize = 0;
294 for(iIndex = 0; iIndex < iCount; iIndex++)
295 {
296 ZeroMemory(&li, sizeof(LVITEMW));
297 li.mask = LVIF_TEXT;
298 li.iItem = iIndex;
299 li.pszText = szBuffer;
300 li.cchTextMax = sizeof(szBuffer) /sizeof(WCHAR);
301 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
302 {
303 wcscpy(pCur, szBuffer);
304 dwSize += wcslen(szBuffer) + 1;
305 pCur += wcslen(szBuffer) + 1;
306 }
307 }
308 pCur[0] = L'\0';
309 *Size = (dwSize+1) * sizeof(WCHAR);
310 return pData;
311 }
312
313 TcpFilterSettings *
314 StoreTcpipFilterSettings(
315 HWND hwndDlg)
316 {
317 TcpFilterSettings * pFilter;
318
319 pFilter = CoTaskMemAlloc(sizeof(TcpFilterSettings));
320 if (!pFilter)
321 return NULL;
322
323 if (SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_GETCHECK, 0, 0) == BST_CHECKED)
324 pFilter->EnableSecurityFilters = TRUE;
325 else
326 pFilter->EnableSecurityFilters = FALSE;
327
328 pFilter->szTCPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_TCP_LIST), &pFilter->TCPSize);
329 pFilter->szUDPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_UDP_LIST), &pFilter->UDPSize);
330 pFilter->szRawIPAllowedProtocols = CreateFilterList(GetDlgItem(hwndDlg, IDC_IP_LIST), &pFilter->IPSize);
331
332 return pFilter;
333 }
334
335 static
336 VOID
337 AddItem(
338 HWND hwndDlg,
339 HWND hDlgCtrl,
340 UINT MaxItem,
341 UINT ResId)
342 {
343 TcpipPortSettings Port;
344
345 Port.MaxNum = MaxItem;
346 Port.hDlgCtrl = hDlgCtrl;
347 Port.ResId = ResId;
348
349 DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIP_PORT_DLG), hwndDlg, TcpipFilterPortDlg, (LPARAM)&Port);
350 }
351
352 static
353 VOID
354 DelItem(
355 HWND hDlgCtrl)
356 {
357 INT iIndex = GetSelectedItem(hDlgCtrl);
358
359 if (iIndex != -1)
360 {
361 (void)ListView_DeleteItem(hDlgCtrl, iIndex);
362 return;
363 }
364 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONWARNING);
365 }
366
367 INT_PTR
368 CALLBACK
369 TcpipFilterSettingsDlg(
370 HWND hwndDlg,
371 UINT uMsg,
372 WPARAM wParam,
373 LPARAM lParam
374 )
375 {
376 TcpipConfNotifyImpl *pContext;
377 TcpFilterSettings *pFilter;
378
379 switch(uMsg)
380 {
381 case WM_INITDIALOG:
382 pContext = (TcpipConfNotifyImpl*)lParam;
383 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_TCP_LIST), IDS_TCP_PORTS, 0, 100);
384 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_UDP_LIST), IDS_UDP_PORTS, 0, 100);
385 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IP_LIST), IDS_IP_PROTO, 0, 100);
386 if (pContext->pCurrentConfig->pFilter)
387 {
388 InitFilterListBox(pContext->pCurrentConfig->pFilter->szTCPAllowedPorts, hwndDlg, GetDlgItem(hwndDlg, IDC_TCP_LIST), IDC_TCP_ALLOW_ALL, IDC_TCP_RESTRICT, IDC_TCP_ADD, IDC_TCP_DEL);
389 InitFilterListBox(pContext->pCurrentConfig->pFilter->szUDPAllowedPorts, hwndDlg, GetDlgItem(hwndDlg, IDC_UDP_LIST), IDC_UDP_ALLOW_ALL, IDC_UDP_RESTRICT, IDC_UDP_ADD, IDC_UDP_DEL);
390 InitFilterListBox(pContext->pCurrentConfig->pFilter->szRawIPAllowedProtocols, hwndDlg, GetDlgItem(hwndDlg, IDC_IP_LIST), IDC_IP_ALLOW_ALL, IDC_IP_RESTRICT, IDC_IP_ADD, IDC_IP_DEL);
391 if (pContext->pCurrentConfig->pFilter->EnableSecurityFilters)
392 SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_SETCHECK, BST_CHECKED, 0);
393 }
394 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
395 return TRUE;
396 case WM_COMMAND:
397 if (HIWORD(wParam) == BN_CLICKED)
398 {
399 switch (LOWORD(wParam))
400 {
401 case IDC_TCP_ALLOW_ALL:
402 if (SendDlgItemMessageW(hwndDlg, IDC_TCP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
403 {
404 SendDlgItemMessageW(hwndDlg, IDC_TCP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0);
405 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_LIST), FALSE);
406 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_ADD), FALSE);
407 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_DEL), FALSE);
408 }
409 break;
410 case IDC_TCP_RESTRICT:
411 if (SendDlgItemMessageW(hwndDlg, IDC_TCP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED)
412 {
413 SendDlgItemMessageW(hwndDlg, IDC_TCP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0);
414 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_LIST), TRUE);
415 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_ADD), TRUE);
416 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_DEL), TRUE);
417 }
418 break;
419 case IDC_UDP_ALLOW_ALL:
420 if (SendDlgItemMessageW(hwndDlg, IDC_UDP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
421 {
422 SendDlgItemMessageW(hwndDlg, IDC_UDP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0);
423 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_LIST), FALSE);
424 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_ADD), FALSE);
425 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_DEL), FALSE);
426 }
427 break;
428 case IDC_UDP_RESTRICT:
429 if (SendDlgItemMessageW(hwndDlg, IDC_UDP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED)
430 {
431 SendDlgItemMessageW(hwndDlg, IDC_UDP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0);
432 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_LIST), TRUE);
433 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_ADD), TRUE);
434 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_DEL), TRUE);
435 }
436 break;
437 case IDC_IP_ALLOW_ALL:
438 if (SendDlgItemMessageW(hwndDlg, IDC_IP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED)
439 {
440 SendDlgItemMessageW(hwndDlg, IDC_IP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0);
441 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_LIST), FALSE);
442 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_ADD), FALSE);
443 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_DEL), FALSE);
444 }
445 break;
446 case IDC_IP_RESTRICT:
447 if (SendDlgItemMessageW(hwndDlg, IDC_IP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED)
448 {
449 SendDlgItemMessageW(hwndDlg, IDC_IP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0);
450 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_LIST), TRUE);
451 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_ADD), TRUE);
452 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_DEL), TRUE);
453 }
454 break;
455 case IDC_USE_FILTER:
456 if (SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
457 DisplayError(IDS_DISABLE_FILTER, IDS_TCPIP, MB_OK);
458
459 break;
460 }
461 }
462 switch(LOWORD(wParam))
463 {
464 case IDC_OK:
465 pContext = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
466 pFilter = StoreTcpipFilterSettings(hwndDlg);
467 if (pFilter)
468 {
469 if (pContext->pCurrentConfig->pFilter)
470 {
471 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szTCPAllowedPorts);
472 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szUDPAllowedPorts);
473 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szRawIPAllowedProtocols);
474 CoTaskMemFree(pContext->pCurrentConfig->pFilter);
475 }
476 pContext->pCurrentConfig->pFilter = pFilter;
477 }
478 EndDialog(hwndDlg, (INT_PTR)TRUE);
479 break;
480 case IDCANCEL:
481 EndDialog(hwndDlg, FALSE);
482 break;
483 case IDC_TCP_ADD:
484 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_TCP_LIST), 65536, IDS_TCP_PORTS);
485 break;
486 case IDC_TCP_DEL:
487 DelItem(GetDlgItem(hwndDlg, IDC_TCP_LIST));
488 break;
489 case IDC_UDP_ADD:
490 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_UDP_LIST), 65536, IDS_UDP_PORTS);
491 break;
492 case IDC_UDP_DEL:
493 DelItem(GetDlgItem(hwndDlg, IDC_UDP_LIST));
494 break;
495 case IDC_IP_ADD:
496 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_IP_LIST), 256, IDS_IP_PROTO);
497 break;
498 case IDC_IP_DEL:
499 DelItem(GetDlgItem(hwndDlg, IDC_IP_LIST));
500 break;
501 default:
502 break;
503 }
504 default:
505 break;
506 }
507
508 return FALSE;
509 }
510
511
512 HPROPSHEETPAGE
513 InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle)
514 {
515 PROPSHEETPAGEW ppage;
516
517 memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW));
518 ppage.dwSize = sizeof(PROPSHEETPAGEW);
519 ppage.dwFlags = PSP_DEFAULT;
520 ppage.u.pszTemplate = resname;
521 ppage.pfnDlgProc = dlgproc;
522 ppage.lParam = lParam;
523 ppage.hInstance = netcfgx_hInstance;
524 if (szTitle)
525 {
526 ppage.dwFlags |= PSP_USETITLE;
527 ppage.pszTitle = szTitle;
528 }
529 return CreatePropertySheetPageW(&ppage);
530 }
531
532 /***************************************************************
533 * TCP/IP Advanced Option Dialog
534 *
535 */
536
537 VOID
538 InitializeTcpipAdvancedOptDlg(
539 HWND hwndDlg,
540 TcpipConfNotifyImpl * This)
541 {
542 WCHAR szText[500];
543 /* store context */
544 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This);
545
546 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTER, szText, sizeof(szText)/sizeof(WCHAR)))
547 {
548 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
549 if (SendDlgItemMessageW(hwndDlg, IDC_OPTLIST, LB_ADDSTRING, 0, (LPARAM)szText) != LB_ERR)
550 SendDlgItemMessageW(hwndDlg, IDC_OPTLIST, LB_SETCURSEL, 0, 0);
551 }
552
553 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTERDESC, szText, sizeof(szText)/sizeof(WCHAR)))
554 {
555 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0';
556 SendDlgItemMessageW(hwndDlg, IDC_OPTDESC, WM_SETTEXT, 0, (LPARAM)szText);
557 }
558 }
559
560
561
562 INT_PTR
563 CALLBACK
564 TcpipAdvancedOptDlg(
565 HWND hwndDlg,
566 UINT uMsg,
567 WPARAM wParam,
568 LPARAM lParam
569 )
570 {
571 TcpipConfNotifyImpl * This;
572 LPPROPSHEETPAGE page;
573
574 switch(uMsg)
575 {
576 case WM_INITDIALOG:
577 page = (LPPROPSHEETPAGE)lParam;
578 This = (TcpipConfNotifyImpl*)page->lParam;
579 InitializeTcpipAdvancedOptDlg(hwndDlg, This);
580 return TRUE;
581 case WM_COMMAND:
582 if (LOWORD(wParam) == IDC_OPTPROP)
583 {
584 DialogBoxParamW(netcfgx_hInstance,
585 MAKEINTRESOURCEW(IDD_TCPIP_FILTER_DLG),
586 GetParent(hwndDlg),
587 TcpipFilterSettingsDlg,
588 (LPARAM)GetWindowLongPtr(hwndDlg, DWLP_USER));
589 break;
590 }
591 }
592 return FALSE;
593 }
594
595 VOID
596 InsertColumnToListView(
597 HWND hDlgCtrl,
598 UINT ResId,
599 UINT SubItem,
600 UINT Size)
601 {
602 WCHAR szBuffer[200];
603 LVCOLUMNW lc;
604
605 if (!LoadStringW(netcfgx_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
606 return;
607
608 memset(&lc, 0, sizeof(LV_COLUMN) );
609 lc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT;
610 lc.iSubItem = SubItem;
611 lc.fmt = LVCFMT_FIXED_WIDTH;
612 lc.cx = Size;
613 lc.cchTextMax = wcslen(szBuffer);
614 lc.pszText = szBuffer;
615
616 (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc);
617 }
618
619 VOID
620 InsertIpAddressToListView(
621 HWND hDlgCtrl,
622 IP_ADDR * pAddr,
623 BOOL bSubMask)
624 {
625 WCHAR szBuffer[70];
626 DWORD dwIpAddr;
627 UINT itemCount = 0;
628 LVITEMW li;
629
630 while(pAddr)
631 {
632 ZeroMemory(&li, sizeof(li));
633 li.mask = LVIF_TEXT;
634 li.iItem = itemCount;
635 li.iSubItem = 0;
636 dwIpAddr = pAddr->IpAddress;
637 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
638 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
639
640 li.pszText = szBuffer;
641 li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li);
642 if (li.iItem != -1)
643 {
644 if (bSubMask)
645 {
646 dwIpAddr = pAddr->u.Subnetmask;
647 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
648 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
649 }
650 else
651 {
652 if (pAddr->u.Metric)
653 swprintf(szBuffer, L"%u", pAddr->u.Metric);
654 else
655 LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR));
656 }
657
658 li.mask = LVIF_TEXT;
659 li.iSubItem = 1;
660 li.pszText = szBuffer;
661 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li);
662 }
663 itemCount++;
664 pAddr = pAddr->Next;
665 }
666 }
667
668
669 VOID
670 InitializeTcpipAdvancedIpDlg(
671 HWND hwndDlg,
672 TcpipConfNotifyImpl * This)
673 {
674
675 RECT rect;
676 LVITEMW li;
677 WCHAR szBuffer[100];
678
679 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IPLIST), IDS_IPADDR, 0, 100);
680 GetClientRect(GetDlgItem(hwndDlg, IDC_IPLIST), &rect);
681 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IPLIST), IDS_SUBMASK, 1, (rect.right - rect.left - 100));
682
683 if (This->pCurrentConfig->DhcpEnabled)
684 {
685 if (LoadStringW(netcfgx_hInstance, IDS_DHCPACTIVE, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
686 {
687 ZeroMemory(&li, sizeof(LVITEMW));
688 li.mask = LVIF_TEXT;
689 li.pszText = szBuffer;
690 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
691 }
692 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADD), FALSE);
693 EnableWindow(GetDlgItem(hwndDlg, IDC_IPMOD), FALSE);
694 EnableWindow(GetDlgItem(hwndDlg, IDC_IPDEL), FALSE);
695 }
696 else
697 {
698 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_IPLIST), This->pCurrentConfig->Ip, TRUE);
699 }
700
701 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_GWLIST), IDS_GATEWAY, 0, 100);
702 GetClientRect(GetDlgItem(hwndDlg, IDC_IPLIST), &rect);
703 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_GWLIST), IDS_METRIC, 1, (rect.right - rect.left - 100));
704
705 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_GWLIST), This->pCurrentConfig->Gw, FALSE);
706 SendDlgItemMessageW(hwndDlg, IDC_METRIC, EM_LIMITTEXT, 4, 0);
707
708 }
709
710 INT_PTR
711 CALLBACK
712 TcpipAdvGwDlg(
713 HWND hwndDlg,
714 UINT uMsg,
715 WPARAM wParam,
716 LPARAM lParam
717 )
718 {
719 WCHAR szBuffer[70];
720 TcpipGwSettings *pGwSettings;
721 DWORD dwIpAddr;
722 LPNMIPADDRESS lpnmipa;
723 LVFINDINFOW find;
724
725 switch(uMsg)
726 {
727 case WM_INITDIALOG:
728 pGwSettings = (TcpipGwSettings *)lParam;
729 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
730 if (pGwSettings->bAdd)
731 {
732 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
733 {
734 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
735 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
736 }
737 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
738 SendDlgItemMessageW(hwndDlg, IDC_USEMETRIC, BM_SETCHECK, BST_CHECKED, 0);
739 }
740 else
741 {
742 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
743 {
744 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
745 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
746 }
747 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pGwSettings->szIP);
748 if (pGwSettings->Metric)
749 {
750 SetDlgItemInt(hwndDlg, IDC_METRIC, pGwSettings->Metric, FALSE);
751 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
752 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE);
753 }
754 else
755 {
756 SendDlgItemMessageW(hwndDlg, IDC_USEMETRIC, BM_SETCHECK, BST_CHECKED, 0);
757 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
758 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE);
759 }
760 }
761 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
762 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
763 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
764 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
765 return TRUE;
766 case WM_COMMAND:
767 if (LOWORD(wParam) == IDC_USEMETRIC)
768 {
769 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED)
770 {
771 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
772 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE);
773 SendDlgItemMessageW(hwndDlg, IDC_METRIC, WM_SETTEXT, 0, (LPARAM)L"");
774 }
775 else
776 {
777 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
778 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE);
779 }
780 break;
781 }
782 else if (LOWORD(wParam) == IDCANCEL)
783 {
784 EndDialog(hwndDlg, FALSE);
785 break;
786 }
787 else if (LOWORD(wParam) == IDC_OK)
788 {
789 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
790 {
791 pGwSettings = (TcpipGwSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
792 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pGwSettings->szIP);
793
794 ZeroMemory(&find, sizeof(LVFINDINFOW));
795 find.flags = LVFI_STRING;
796 find.psz = pGwSettings->szIP;
797
798 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
799 pGwSettings->Metric = GetDlgItemInt(hwndDlg, IDC_METRIC, NULL, FALSE);
800 else
801 pGwSettings->Metric = 0;
802
803
804 if (SendMessageW(pGwSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1)
805 {
806 EndDialog(hwndDlg, TRUE);
807 break;
808 }
809 if (!pGwSettings->bAdd)
810 {
811 EndDialog(hwndDlg, FALSE);
812 break;
813 }
814 DisplayError(IDS_DUP_GW, IDS_TCPIP, MB_ICONINFORMATION);
815 }
816 break;
817 }
818 break;
819 case WM_NOTIFY:
820 lpnmipa = (LPNMIPADDRESS) lParam;
821 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
822 {
823 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
824 {
825 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
826 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
827 }
828 }
829 break;
830 }
831 return FALSE;
832 }
833
834 BOOL
835 GetGWListEntry(HWND hDlgCtrl, INT Index, TcpipGwSettings * pGwSettings)
836 {
837 LVITEMW li;
838 WCHAR szBuffer[30];
839 BOOL bRet;
840
841 ZeroMemory(&li, sizeof(LVITEMW));
842 li.mask = LVIF_TEXT;
843 li.cchTextMax = 16;
844 li.pszText = pGwSettings->szIP;
845 li.iItem = Index;
846
847 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
848 return FALSE;
849 li.pszText = szBuffer;
850 li.cchTextMax = 30;
851 li.iSubItem = 1;
852
853 bRet = SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
854 if (bRet)
855 {
856 pGwSettings->Metric = _wtoi(szBuffer);
857 }
858
859 return bRet;
860 }
861
862 INT_PTR
863 CALLBACK
864 TcpipAddIpDlg(
865 HWND hwndDlg,
866 UINT uMsg,
867 WPARAM wParam,
868 LPARAM lParam
869 )
870 {
871 LPNMIPADDRESS lpnmipa;
872 DWORD dwIpAddr;
873 TcpipIpSettings *pIpSettings;
874 WCHAR szBuffer[50];
875 LVFINDINFOW find;
876 LRESULT lResult;
877
878 switch(uMsg)
879 {
880 case WM_INITDIALOG:
881 pIpSettings = (TcpipIpSettings*)lParam;
882 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
883
884 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
885 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
886 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
887 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
888 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255));
889 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
890 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
891 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
892
893 if (pIpSettings->bAdd)
894 {
895 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
896 {
897 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
898 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
899 }
900 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
901 }
902 else
903 {
904 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
905 {
906 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
907 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
908 }
909 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pIpSettings->szIP);
910 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_SETTEXT, 0, (LPARAM)pIpSettings->szMask);
911 }
912 return TRUE;
913 case WM_NOTIFY:
914 lpnmipa = (LPNMIPADDRESS) lParam;
915 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
916 {
917 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
918 {
919 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
920 {
921 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
922 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0));
923 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
924 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0));
925 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
926 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
927 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
928 }
929 }
930 }
931 break;
932 case WM_COMMAND:
933 if (LOWORD(wParam) == IDC_OK)
934 {
935 pIpSettings = (TcpipIpSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
936 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pIpSettings->szIP);
937 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_GETTEXT, 16, (LPARAM)pIpSettings->szMask);
938
939 ZeroMemory(&find, sizeof(LVFINDINFOW));
940 find.flags = LVFI_STRING;
941 find.psz = pIpSettings->szIP;
942 lResult = SendMessageW(pIpSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find);
943
944 if (lResult == -1)
945 {
946 EndDialog(hwndDlg, TRUE);
947 break;
948 }
949 else if (!pIpSettings->bAdd)
950 {
951 EndDialog(hwndDlg, FALSE);
952 break;
953 }
954 DisplayError(IDS_DUP_IPADDR, IDS_TCPIP, MB_ICONINFORMATION);
955 break;
956 }
957 else if (LOWORD(wParam) == IDCANCEL)
958 {
959 EndDialog(hwndDlg, FALSE);
960 }
961 break;
962 }
963 return FALSE;
964 }
965
966 BOOL
967 VerifyDNSSuffix(
968 LPWSTR szName)
969 {
970 UINT Index;
971 UINT Length = wcslen(szName);
972
973 for(Index = 0; Index < Length; Index++)
974 if (iswalnum(szName[Index]) == 0 && szName[Index] != '.' && szName[Index] != '-')
975 return FALSE;
976
977 return TRUE;
978 }
979
980 INT_PTR
981 CALLBACK
982 TcpipAddSuffixDlg(
983 HWND hwndDlg,
984 UINT uMsg,
985 WPARAM wParam,
986 LPARAM lParam
987 )
988 {
989 WCHAR szBuffer[100];
990 TcpipSuffixSettings * pSettings;
991 LRESULT lLength;
992
993 switch(uMsg)
994 {
995 case WM_INITDIALOG:
996 pSettings = (TcpipSuffixSettings*)lParam;
997 if (!pSettings->bAdd)
998 {
999 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)pSettings->Suffix);
1000 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1001 {
1002 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1003 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1004 }
1005 CoTaskMemFree(pSettings->Suffix);
1006 pSettings->Suffix = NULL;
1007 }
1008 else
1009 {
1010 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1011 {
1012 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1013 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1014 }
1015 }
1016 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pSettings);
1017 return TRUE;
1018 case WM_COMMAND:
1019 if (LOWORD(wParam) == IDCANCEL)
1020 {
1021 EndDialog(hwndDlg, FALSE);
1022 break;
1023 }
1024 else if (LOWORD(wParam) == IDC_OK)
1025 {
1026 lLength = SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXTLENGTH, 0, 0);
1027 if (lLength)
1028 {
1029 pSettings = (TcpipSuffixSettings*) GetWindowLongPtr(hwndDlg, DWLP_USER);
1030 pSettings->Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1)* sizeof(WCHAR));
1031 if (pSettings->Suffix)
1032 {
1033 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, lLength + 1, (LPARAM)pSettings->Suffix);
1034 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->Suffix) != LB_ERR)
1035 {
1036 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1037 CoTaskMemFree(pSettings->Suffix);
1038 break;
1039 }
1040
1041 if (!VerifyDNSSuffix(pSettings->Suffix))
1042 {
1043 DisplayError(IDS_DOMAIN_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1044 CoTaskMemFree(pSettings->Suffix);
1045 break;
1046 }
1047 EndDialog(hwndDlg, TRUE);
1048 }
1049 }
1050 break;
1051 }
1052 }
1053 return FALSE;
1054 }
1055
1056
1057
1058 INT
1059 GetSelectedItem(HWND hDlgCtrl)
1060 {
1061 LVITEMW li;
1062 UINT iItemCount, iIndex;
1063
1064 iItemCount = ListView_GetItemCount(hDlgCtrl);
1065 if (!iItemCount)
1066 return -1;
1067
1068 for (iIndex = 0; iIndex < iItemCount; iIndex++)
1069 {
1070 ZeroMemory(&li, sizeof(LVITEMW));
1071 li.mask = LVIF_STATE;
1072 li.stateMask = (UINT)-1;
1073 li.iItem = iIndex;
1074 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1075 {
1076 if (li.state & LVIS_SELECTED)
1077 return iIndex;
1078 }
1079 }
1080 return -1;
1081 }
1082
1083
1084 BOOL
1085 GetIPListEntry(HWND hDlgCtrl, INT Index, TcpipIpSettings * pIpSettings)
1086 {
1087 LVITEMW li;
1088
1089 ZeroMemory(&li, sizeof(LVITEMW));
1090 li.mask = LVIF_TEXT;
1091 li.cchTextMax = 16;
1092 li.pszText = pIpSettings->szIP;
1093 li.iItem = Index;
1094
1095 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1096 return FALSE;
1097
1098 ZeroMemory(&li, sizeof(LVITEMW));
1099 li.mask = LVIF_TEXT;
1100 li.cchTextMax = 16;
1101 li.pszText = pIpSettings->szMask;
1102 li.iSubItem = 1;
1103 li.iItem = Index;
1104
1105 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1106 }
1107
1108 VOID
1109 DeleteItemFromList(HWND hDlgCtrl)
1110 {
1111 LVITEMW li;
1112
1113 memset(&li, 0x0, sizeof(LVITEMW));
1114 li.iItem = GetSelectedItem(hDlgCtrl);
1115 if (li.iItem < 0)
1116 {
1117 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1118 SetFocus(hDlgCtrl);
1119 }
1120 else
1121 {
1122 (void)ListView_DeleteItem(hDlgCtrl, li.iItem);
1123 }
1124 }
1125
1126 UINT
1127 GetIpAddressFromStringW(
1128 WCHAR * szBuffer)
1129 {
1130 DWORD dwIpAddr = 0;
1131 INT Val;
1132 UINT Index = 3;
1133 LPWSTR pLast = szBuffer;
1134 LPWSTR pNext = szBuffer;
1135
1136
1137 while((pNext = wcschr(pNext, L'.')))
1138 {
1139 pNext[0] = L'\0';
1140 Val = _wtoi(pLast);
1141 dwIpAddr |= (Val << Index * 8);
1142 Index--;
1143 pNext++;
1144 pLast = pNext;
1145 }
1146 dwIpAddr |= _wtoi(pLast);
1147
1148 return dwIpAddr;
1149 }
1150
1151 UINT
1152 GetIpAddressFromStringA(
1153 char * sBuffer)
1154 {
1155 WCHAR szIp[16];
1156
1157 if (MultiByteToWideChar(CP_ACP, 0, sBuffer, -1, szIp, 16))
1158 {
1159 szIp[15] = L'\0';
1160 return GetIpAddressFromStringW(szIp);
1161 }
1162 return (UINT)-1;
1163 }
1164
1165
1166 VOID
1167 FreeIPAddr(IP_ADDR *pAddr)
1168 {
1169 IP_ADDR *pNext;
1170
1171 if (!pAddr)
1172 return;
1173
1174 while(pAddr)
1175 {
1176 pNext = pAddr->Next;
1177 CoTaskMemFree(pAddr);
1178 pAddr = pNext;
1179 }
1180 }
1181
1182 BOOL
1183 GetListViewItem(HWND hDlgCtrl, UINT Index, UINT SubIndex, WCHAR * szBuffer, UINT BufferSize)
1184 {
1185 LVITEMW li;
1186
1187 ZeroMemory(&li, sizeof(LVITEMW));
1188 li.mask = LVIF_TEXT;
1189 li.pszText = szBuffer;
1190 li.iItem = Index;
1191 li.iSubItem = SubIndex;
1192 li.cchTextMax = BufferSize;
1193 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1194 }
1195
1196 VOID
1197 StoreIPSettings(
1198 HWND hDlgCtrl,
1199 TcpipConfNotifyImpl * This,
1200 BOOL bSubmask)
1201 {
1202 WCHAR szBuffer[30];
1203
1204 INT iIndex, iCount;
1205 IP_ADDR *pCur, *pLast;
1206
1207 iCount = ListView_GetItemCount(hDlgCtrl);
1208 if (!iCount)
1209 {
1210 return;
1211 }
1212
1213 pLast = NULL;
1214 for(iIndex = 0; iIndex < iCount; iIndex++)
1215 {
1216 if (GetListViewItem(hDlgCtrl, iIndex, 0, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1217 {
1218 pCur = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
1219 if (!pCur)
1220 break;
1221 ZeroMemory(pCur, sizeof(IP_ADDR));
1222
1223 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1224 pCur->IpAddress = GetIpAddressFromStringW(szBuffer);
1225
1226 if (GetListViewItem(hDlgCtrl, iIndex, 1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR) ))
1227 {
1228 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1229 if (bSubmask)
1230 pCur->u.Subnetmask = GetIpAddressFromStringW(szBuffer);
1231 else
1232 pCur->u.Metric = _wtoi(szBuffer);
1233 }
1234
1235 if (!pLast)
1236 {
1237 if (bSubmask)
1238 This->pCurrentConfig->Ip = pCur;
1239 else
1240 This->pCurrentConfig->Gw = pCur;
1241 }
1242 else
1243 {
1244 pLast->Next = pCur;
1245 }
1246
1247 pLast = pCur;
1248 }
1249 }
1250 }
1251
1252
1253 INT_PTR
1254 CALLBACK
1255 TcpipAdvancedIpDlg(
1256 HWND hwndDlg,
1257 UINT uMsg,
1258 WPARAM wParam,
1259 LPARAM lParam
1260 )
1261 {
1262 TcpipConfNotifyImpl * This;
1263 LPPROPSHEETPAGE page;
1264 INT_PTR res;
1265 WCHAR szBuffer[200];
1266 LPPSHNOTIFY lppsn;
1267 TcpipGwSettings Gw;
1268 TcpipIpSettings Ip;
1269
1270 LVITEMW li;
1271
1272 switch(uMsg)
1273 {
1274 case WM_INITDIALOG:
1275 page = (LPPROPSHEETPAGE)lParam;
1276 This = (TcpipConfNotifyImpl*)page->lParam;
1277 InitializeTcpipAdvancedIpDlg(hwndDlg, This);
1278 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This);
1279 return TRUE;
1280 case WM_NOTIFY:
1281 lppsn = (LPPSHNOTIFY) lParam;
1282 if (lppsn->hdr.code == PSN_KILLACTIVE)
1283 {
1284 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1285 if (!This->pCurrentConfig->DhcpEnabled && ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST)) == 0)
1286 {
1287 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING);
1288 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1289 return TRUE;
1290 }
1291 }
1292 else if (lppsn->hdr.code == PSN_APPLY)
1293 {
1294 This = (TcpipConfNotifyImpl*) GetWindowLongPtr(hwndDlg, DWLP_USER);
1295 FreeIPAddr(This->pCurrentConfig->Gw);
1296 This->pCurrentConfig->Gw = NULL;
1297 FreeIPAddr(This->pCurrentConfig->Ip);
1298 This->pCurrentConfig->Ip = NULL;
1299 StoreIPSettings(GetDlgItem(hwndDlg, IDC_IPLIST), This, TRUE);
1300 StoreIPSettings(GetDlgItem(hwndDlg, IDC_GWLIST), This, FALSE);
1301 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
1302 return TRUE;
1303 }
1304 break;
1305 case WM_COMMAND:
1306 if (LOWORD(wParam) == IDC_AUTOMETRIC)
1307 {
1308 if (SendDlgItemMessageW(hwndDlg, IDC_AUTOMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED)
1309 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
1310 else
1311 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
1312 }
1313 else if (LOWORD(wParam) == IDC_IPADD)
1314 {
1315 Ip.bAdd = TRUE;
1316 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1317 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip);
1318 if (res)
1319 {
1320 memset(&li, 0x0, sizeof(LVITEMW));
1321 li.mask = LVIF_TEXT | LVIF_PARAM;
1322 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST));
1323 li.pszText = Ip.szIP;
1324 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1325 if (li.iItem != -1)
1326 {
1327 li.mask = LVIF_TEXT;
1328 li.iSubItem = 1;
1329 li.pszText = Ip.szMask;
1330 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1331 }
1332 }
1333 }
1334 else if (LOWORD(wParam) == IDC_IPMOD)
1335 {
1336 memset(&li, 0x0, sizeof(LVITEMW));
1337 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_IPLIST));
1338 if (li.iItem < 0)
1339 {
1340 /* no item selected */
1341 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1342 SetFocus(GetDlgItem(hwndDlg, IDC_IPLIST));
1343 break;
1344 }
1345 Ip.bAdd = FALSE;
1346 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1347 if (GetIPListEntry(GetDlgItem(hwndDlg, IDC_IPLIST), li.iItem, &Ip))
1348 {
1349 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip);
1350 if (res)
1351 {
1352 li.mask = LVIF_TEXT;
1353 li.pszText = Ip.szIP;
1354 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1355 li.pszText = Ip.szMask;
1356 li.iSubItem = 1;
1357 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1358 }
1359 }
1360 }
1361 else if (LOWORD(wParam) == IDC_IPDEL)
1362 {
1363 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_IPLIST));
1364 break;
1365 }
1366 else if (LOWORD(wParam) == IDC_GWADD)
1367 {
1368 Gw.bAdd = TRUE;
1369 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1370 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw);
1371 if (res)
1372 {
1373 memset(&li, 0x0, sizeof(LVITEMW));
1374 li.mask = LVIF_TEXT;
1375 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_GWLIST));
1376 li.pszText = Gw.szIP;
1377 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1378 if (li.iItem >= 0)
1379 {
1380 if (Gw.Metric)
1381 {
1382 swprintf(szBuffer, L"%u", Gw.Metric);
1383 li.iSubItem = 1;
1384 li.pszText = szBuffer;
1385 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1386 }
1387 else
1388 {
1389 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1390 {
1391 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1392 li.iSubItem = 1;
1393 li.pszText = szBuffer;
1394 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1395 }
1396 }
1397 }
1398 }
1399 break;
1400 }
1401 else if (LOWORD(wParam) == IDC_GWMOD)
1402 {
1403 memset(&li, 0x0, sizeof(LVITEMW));
1404 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_GWLIST));
1405 if (li.iItem < 0)
1406 {
1407 /* no item selected */
1408 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1409 SetFocus(GetDlgItem(hwndDlg, IDC_GWLIST));
1410 break;
1411 }
1412 if (GetGWListEntry(GetDlgItem(hwndDlg, IDC_GWLIST), li.iItem, &Gw))
1413 {
1414 Gw.bAdd = FALSE;
1415 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1416 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw);
1417 if (res)
1418 {
1419 li.mask = LVIF_TEXT;
1420 li.pszText = Gw.szIP;
1421 (void)SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1422 if (Gw.Metric)
1423 {
1424 swprintf(szBuffer, L"%u", Gw.Metric);
1425 li.iSubItem = 1;
1426 li.pszText = szBuffer;
1427 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1428 }
1429 else
1430 {
1431 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1432 {
1433 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1434 li.iSubItem = 1;
1435 li.pszText = szBuffer;
1436 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1437 }
1438 }
1439 }
1440 }
1441 break;
1442 }
1443 else if (LOWORD(wParam) == IDC_GWDEL)
1444 {
1445 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_GWLIST));
1446 break;
1447 }
1448 }
1449 return FALSE;
1450 }
1451
1452 INT_PTR
1453 CALLBACK
1454 TcpipAddDNSDlg(
1455 HWND hwndDlg,
1456 UINT uMsg,
1457 WPARAM wParam,
1458 LPARAM lParam
1459 )
1460 {
1461 TcpipDnsSettings * pSettings;
1462 WCHAR szBuffer[100];
1463 DWORD dwIpAddr;
1464 LPNMIPADDRESS lpnmipa;
1465
1466 switch(uMsg)
1467 {
1468 case WM_INITDIALOG:
1469 pSettings = (TcpipDnsSettings*)lParam;
1470 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
1471 if (!pSettings->bAdd)
1472 {
1473 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1474 {
1475 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1476 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1477 }
1478 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pSettings->szIP);
1479 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1480 }
1481 else
1482 {
1483 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1484 {
1485 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1486 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1487 }
1488 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
1489 }
1490 return TRUE;
1491 case WM_COMMAND:
1492 if (LOWORD(wParam) == IDCANCEL)
1493 {
1494 EndDialog(hwndDlg, FALSE);
1495 break;
1496 }
1497 else if (LOWORD(wParam) == IDC_OK)
1498 {
1499 pSettings = (TcpipDnsSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1500 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pSettings->szIP);
1501 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->szIP) == LB_ERR)
1502 {
1503 if (pSettings->bAdd)
1504 SendMessageW(pSettings->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)pSettings->szIP);
1505 EndDialog(hwndDlg, TRUE);
1506 break;
1507 }
1508 if (!pSettings->bAdd)
1509 {
1510 EndDialog(hwndDlg, FALSE);
1511 break;
1512 }
1513 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONERROR);
1514 break;
1515 }
1516 break;
1517 case WM_NOTIFY:
1518 lpnmipa = (LPNMIPADDRESS) lParam;
1519 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
1520 {
1521 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
1522 {
1523 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
1524 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1525 }
1526 }
1527 break;
1528 }
1529 return FALSE;
1530 }
1531
1532
1533
1534 VOID
1535 InitializeTcpipAdvancedDNSDlg(
1536 HWND hwndDlg,
1537 TcpipConfNotifyImpl * This)
1538 {
1539 WCHAR szBuffer[200];
1540 LPWSTR pFirst, pSep, pList;
1541 IP_ADDR * pAddr;
1542 DWORD dwIpAddr;
1543
1544 /* insert DNS addresses */
1545 pAddr = This->pCurrentConfig->Ns;
1546 while(pAddr)
1547 {
1548 dwIpAddr = pAddr->IpAddress;
1549 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
1550 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
1551
1552 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_ADDSTRING, 0, (LPARAM)szBuffer);
1553 pAddr = pAddr->Next;
1554 }
1555 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, 0, 0);
1556
1557 if (!This->pCurrentConfig->pDNS)
1558 return;
1559
1560 if (This->pCurrentConfig->pDNS->RegisterAdapterName)
1561 SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1562 else
1563 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE);
1564
1565 if (This->pCurrentConfig->pDNS->RegistrationEnabled)
1566 SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1567
1568 if (This->pCurrentConfig->pDNS->szDomain[0])
1569 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)szBuffer);
1570
1571 if (This->pCurrentConfig->pDNS->UseDomainNameDevolution)
1572 SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1573
1574 if (!This->pCurrentConfig->pDNS->szSearchList || (wcslen(This->pCurrentConfig->pDNS->szSearchList) == 0))
1575 {
1576 SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1577 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE);
1578
1579 return;
1580 }
1581
1582 pList = This->pCurrentConfig->pDNS->szSearchList;
1583 if (wcslen(pList))
1584 {
1585 pFirst = pList;
1586 do
1587 {
1588 pSep = wcschr(pFirst, L',');
1589 if (pSep)
1590 {
1591 pSep[0] = L'\0';
1592 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst);
1593 pFirst = pSep + 1;
1594 pSep[0] = L',';
1595 }
1596 else
1597 {
1598 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst);
1599 break;
1600 }
1601 }while(TRUE);
1602
1603 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE);
1604 SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1605 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, 0, 0);
1606 }
1607 }
1608
1609 VOID
1610 ToggleUpDown(HWND hwndDlg, HWND hDlgCtrl, UINT UpButton, UINT DownButton, UINT ModButton, UINT DelButton)
1611 {
1612 LRESULT lResult, lCount;
1613
1614 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1615 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1616 if (lResult != LB_ERR)
1617 {
1618 if (lResult == 0)
1619 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1620 else
1621 EnableWindow(GetDlgItem(hwndDlg, UpButton), TRUE);
1622
1623 if (lResult < lCount -1)
1624 EnableWindow(GetDlgItem(hwndDlg, DownButton), TRUE);
1625 else
1626 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1627 }
1628
1629 if (lCount)
1630 {
1631 EnableWindow(GetDlgItem(hwndDlg, ModButton), TRUE);
1632 EnableWindow(GetDlgItem(hwndDlg, DelButton), TRUE);
1633 }
1634 else
1635 {
1636 EnableWindow(GetDlgItem(hwndDlg, ModButton), FALSE);
1637 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE);
1638 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1639 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1640 }
1641 }
1642
1643 VOID
1644 MoveItem(
1645 HWND hDlgCtrl,
1646 INT pos)
1647 {
1648 WCHAR szBuffer[100];
1649 LRESULT lResult;
1650
1651 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1652 if (lResult != LB_ERR)
1653 {
1654 if (SendMessageW(hDlgCtrl, LB_GETTEXTLEN, (WPARAM)lResult, 0) < sizeof(szBuffer)/sizeof(WCHAR) - 1)
1655 {
1656 if (SendMessageW(hDlgCtrl, LB_GETTEXT, (WPARAM)lResult, (LPARAM)szBuffer) != LB_ERR)
1657 {
1658 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1659 SendMessageW(hDlgCtrl, LB_INSERTSTRING, (WPARAM)lResult + pos, (LPARAM)szBuffer);
1660 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult + pos, 0);
1661 }
1662 }
1663 }
1664 }
1665 VOID
1666 RemoveItem(
1667 HWND hDlgCtrl)
1668 {
1669 LRESULT lResult, lCount;
1670
1671 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1672 if (lResult != LB_ERR)
1673 {
1674 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1675 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1676 if (lResult + 1 < lCount)
1677 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult, 0);
1678 else
1679 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lCount-1, 0);
1680 }
1681 }
1682
1683 LPWSTR
1684 GetListViewEntries(
1685 HWND hDlgCtrl)
1686 {
1687 DWORD dwSize;
1688 INT iCount, iIndex;
1689 INT_PTR lResult;
1690 LPWSTR pszSearchList, pItem;
1691
1692 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1693 if (!iCount || iCount == LB_ERR)
1694 return NULL; //BUGBUG
1695
1696 dwSize = 0;
1697
1698 for (iIndex = 0; iIndex < iCount; iIndex++)
1699 {
1700 lResult = SendMessageW(hDlgCtrl, LB_GETTEXTLEN, iIndex, 0);
1701 if (lResult == LB_ERR)
1702 return NULL;
1703
1704 dwSize += lResult + 1;
1705 }
1706
1707 pszSearchList = (LPWSTR)CoTaskMemAlloc((dwSize + 1) * sizeof(WCHAR));
1708 if (!pszSearchList)
1709 return NULL;
1710
1711 pItem = pszSearchList;
1712 for (iIndex = 0; iIndex < iCount; iIndex++)
1713 {
1714 lResult = SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)pItem);
1715 if (lResult == LB_ERR)
1716 {
1717 CoTaskMemFree(pszSearchList);
1718 return NULL;
1719 }
1720 dwSize -= lResult + 1;
1721 pItem += wcslen(pItem);
1722 if (iIndex != iCount -1)
1723 {
1724 pItem[0] = L',';
1725 pItem++;
1726 }
1727 }
1728 pItem[0] = L'\0';
1729 return pszSearchList;
1730 }
1731
1732 VOID
1733 StoreDNSSettings(
1734 HWND hDlgCtrl,
1735 TcpipConfNotifyImpl *This)
1736 {
1737 INT iCount, iIndex;
1738 WCHAR Ip[16];
1739 IP_ADDR *pCur, *pLast;
1740
1741 FreeIPAddr(This->pCurrentConfig->Ns);
1742 This->pCurrentConfig->Ns = NULL;
1743
1744 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1745 if (!iCount || iCount == LB_ERR)
1746 {
1747 return;
1748 }
1749
1750 pLast = NULL;
1751 for(iIndex = 0; iIndex < iCount; iIndex++)
1752 {
1753 if (SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)Ip) == LB_ERR)
1754 break;
1755
1756 pCur = CoTaskMemAlloc(sizeof(IP_ADDR));
1757 if (!pCur)
1758 break;
1759 ZeroMemory(pCur, sizeof(IP_ADDR));
1760 pCur->IpAddress = GetIpAddressFromStringW(Ip);
1761
1762 if (!pLast)
1763 This->pCurrentConfig->Ns = pCur;
1764 else
1765 pLast->Next = pCur;
1766
1767 pLast = pCur;
1768 pCur = pCur->Next;
1769 }
1770 This->pCurrentConfig->AutoconfigActive = FALSE;
1771 }
1772
1773 INT_PTR
1774 CALLBACK
1775 TcpipAdvancedDnsDlg(
1776 HWND hwndDlg,
1777 UINT uMsg,
1778 WPARAM wParam,
1779 LPARAM lParam
1780 )
1781 {
1782 TcpipConfNotifyImpl * This;
1783 LPPROPSHEETPAGE page;
1784 TcpipDnsSettings Dns;
1785 LRESULT lIndex, lLength;
1786 TcpipSuffixSettings Suffix;
1787 LPPSHNOTIFY lppsn;
1788 WCHAR szSuffix[100];
1789 WCHAR szFormat[200];
1790 WCHAR szBuffer[300];
1791
1792
1793 switch(uMsg)
1794 {
1795 case WM_INITDIALOG:
1796 page = (LPPROPSHEETPAGE)lParam;
1797 This = (TcpipConfNotifyImpl*)page->lParam;
1798 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This);
1799 InitializeTcpipAdvancedDNSDlg(hwndDlg, This);
1800 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1801 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1802 return TRUE;
1803 case WM_NOTIFY:
1804 lppsn = (LPPSHNOTIFY) lParam;
1805 if (lppsn->hdr.code == PSN_KILLACTIVE)
1806 {
1807 if (SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED &&
1808 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCOUNT, 0, 0) == 0)
1809 {
1810 DisplayError(IDS_NO_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1811 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1812 return TRUE;
1813 }
1814 if (SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, sizeof(szSuffix)/sizeof(WCHAR), (LPARAM)szSuffix))
1815 {
1816 szSuffix[(sizeof(szSuffix)/sizeof(WCHAR))-1] = L'\0';
1817 if (VerifyDNSSuffix(szSuffix) == FALSE)
1818 {
1819 if (LoadStringW(netcfgx_hInstance, IDS_DNS_SUFFIX, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1820 {
1821 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1822 swprintf(szBuffer, szFormat, szSuffix);
1823 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1824 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1825 else
1826 szFormat[0] = L'\0';
1827
1828 MessageBoxW(hwndDlg, szBuffer, szFormat, MB_ICONWARNING);
1829 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1830 SetFocus(GetDlgItem(hwndDlg, IDC_SUFFIX));
1831 return TRUE;
1832 }
1833 }
1834 }
1835 }
1836 else if (lppsn->hdr.code == PSN_APPLY)
1837 {
1838 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1839 if (!This->pCurrentConfig->pDNS)
1840 break;
1841
1842 StoreDNSSettings(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), This);
1843 if (SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1844 {
1845 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1846 This->pCurrentConfig->pDNS->szSearchList = NULL;
1847 if (SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1848 This->pCurrentConfig->pDNS->UseDomainNameDevolution = TRUE;
1849 else
1850 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1851 }
1852 else
1853 {
1854 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1855 This->pCurrentConfig->pDNS->szSearchList = NULL;
1856 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1857 This->pCurrentConfig->pDNS->szSearchList = GetListViewEntries(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1858 }
1859
1860 if (SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1861 {
1862 This->pCurrentConfig->pDNS->RegisterAdapterName = TRUE;
1863 if (SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1864 This->pCurrentConfig->pDNS->RegistrationEnabled = TRUE;
1865 else
1866 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1867 }
1868 else
1869 {
1870 This->pCurrentConfig->pDNS->RegisterAdapterName = FALSE;
1871 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1872 }
1873 }
1874 break;
1875 case WM_COMMAND:
1876 if (LOWORD(wParam) == IDC_DNSADDRLIST && HIWORD(wParam) == LBN_SELCHANGE)
1877 {
1878 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1879 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1880 break;
1881 }
1882 else if (LOWORD(wParam) == IDC_DNSSUFFIXLIST && HIWORD(wParam) == LBN_SELCHANGE)
1883 {
1884 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1885 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1886 break;
1887 }
1888 else if (LOWORD(wParam) == IDC_PRIMSUFFIX && HIWORD(wParam) == BN_CLICKED)
1889 {
1890 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1891 {
1892 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXUP), FALSE);
1893 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDOWN), FALSE);
1894 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE);
1895 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXMOD), FALSE);
1896 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDEL), FALSE);
1897 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), TRUE);
1898 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_RESETCONTENT, 0, 0);
1899 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1900 }
1901 }
1902 else if (LOWORD(wParam) == IDC_SELSUFFIX && HIWORD(wParam) == BN_CLICKED)
1903 {
1904 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1905 {
1906 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), TRUE);
1907 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE);
1908 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1909 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1910 }
1911 break;
1912 }
1913 else if (LOWORD(wParam) == IDC_REGSUFFIX && HIWORD(wParam) == BN_CLICKED)
1914 {
1915 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1916 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), TRUE);
1917 else
1918 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE);
1919 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1920 }
1921 else if (LOWORD(wParam) == IDC_DNSADDRUP && HIWORD(wParam) == BN_CLICKED)
1922 {
1923 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), -1);
1924 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1925 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1926 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1927 break;
1928 }
1929 else if (LOWORD(wParam) == IDC_DNSADDRDOWN && HIWORD(wParam) == BN_CLICKED)
1930 {
1931 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), 1);
1932 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1933 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1934 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1935 break;
1936 }
1937 else if (LOWORD(wParam) == IDC_DNSSUFFIXUP && HIWORD(wParam) == BN_CLICKED)
1938 {
1939 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), -1);
1940 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1941 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1942 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1943 break;
1944 }
1945 else if (LOWORD(wParam) == IDC_DNSSUFFIXDOWN && HIWORD(wParam) == BN_CLICKED)
1946 {
1947 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), 1);
1948 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1949 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1950 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1951 break;
1952 }
1953 else if (LOWORD(wParam) == IDC_DNSADDRDEL && HIWORD(wParam) == BN_CLICKED)
1954 {
1955 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1956 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1957 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1958 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1959 break;
1960 }
1961 else if (LOWORD(wParam) == IDC_DNSSUFFIXDEL && HIWORD(wParam) == BN_CLICKED)
1962 {
1963 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1964 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1965 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1966 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1967 break;
1968 }
1969 else if (LOWORD(wParam) == IDC_DNSADDRADD && HIWORD(wParam) == BN_CLICKED)
1970 {
1971 Dns.bAdd = TRUE;
1972 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
1973 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns))
1974 {
1975 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1976 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1977 }
1978 break;
1979 }
1980 else if (LOWORD(wParam) == IDC_DNSADDRMOD && HIWORD(wParam) == BN_CLICKED)
1981 {
1982 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSADDRLIST, LB_GETCURSEL, 0, 0);
1983 if (lIndex != LB_ERR)
1984 {
1985 Dns.bAdd = FALSE;
1986 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
1987 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_GETTEXT, (WPARAM)lIndex, (LPARAM)Dns.szIP);
1988 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns))
1989 {
1990 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_DELETESTRING, lIndex, 0);
1991 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_INSERTSTRING, lIndex, (LPARAM)Dns.szIP);
1992 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, lIndex, 0);
1993 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1994 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1995 }
1996 }
1997 break;
1998 }
1999 else if (LOWORD(wParam) == IDC_DNSSUFFIXADD && HIWORD(wParam) == BN_CLICKED)
2000 {
2001 Suffix.bAdd = TRUE;
2002 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2003 Suffix.Suffix = NULL;
2004 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix))
2005 {
2006 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
2007 lIndex = SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)Suffix.Suffix);
2008 if (lIndex != LB_ERR)
2009 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0);
2010 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2011 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2012 CoTaskMemFree(Suffix.Suffix);
2013 }
2014 break;
2015 }
2016 else if (LOWORD(wParam) == IDC_DNSSUFFIXMOD && HIWORD(wParam) == BN_CLICKED)
2017 {
2018 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCURSEL, 0, 0);
2019 if (lIndex != LB_ERR)
2020 {
2021 Suffix.bAdd = FALSE;
2022 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2023 lLength = SendMessageW(Suffix.hDlgCtrl, LB_GETTEXTLEN, lIndex, 0);
2024 if (lLength != LB_ERR)
2025 {
2026 Suffix.Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1) * sizeof(WCHAR));
2027 if (Suffix.Suffix)
2028 {
2029 SendMessageW(Suffix.hDlgCtrl, LB_GETTEXT, lIndex, (LPARAM)Suffix.Suffix);
2030 Suffix.Suffix[lLength] = L'\0';
2031 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix))
2032 {
2033 if (Suffix.Suffix)
2034 {
2035 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_DELETESTRING, lIndex, 0);
2036 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_INSERTSTRING, lIndex, (LPARAM)Suffix.Suffix);
2037 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0);
2038 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2039 CoTaskMemFree(Suffix.Suffix);
2040 }
2041 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
2042 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2043 }
2044 }
2045 }
2046 }
2047 break;
2048 }
2049 }
2050 return FALSE;
2051 }
2052
2053 VOID
2054 LaunchAdvancedTcpipSettings(
2055 HWND hwndDlg,
2056 TcpipConfNotifyImpl * This)
2057 {
2058 PROPSHEETHEADERW pinfo;
2059 HPROPSHEETPAGE hppages[3];
2060 WCHAR szBuffer[100];
2061
2062 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVIP_DLG), TcpipAdvancedIpDlg, (LPARAM)This, NULL);
2063 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVDNS_DLG), TcpipAdvancedDnsDlg, (LPARAM)This, NULL);
2064 hppages[2] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVOPT_DLG), TcpipAdvancedOptDlg, (LPARAM)This, NULL);
2065
2066
2067 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
2068 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
2069 else
2070 szBuffer[0] = L'\0';
2071
2072 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW));
2073 pinfo.dwSize = sizeof(PROPSHEETHEADERW);
2074 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW;
2075 pinfo.u3.phpage = hppages;
2076 pinfo.nPages = 3;
2077 pinfo.hwndParent = hwndDlg;
2078 pinfo.pszCaption = szBuffer;
2079
2080 StoreTcpipBasicSettings(hwndDlg, This, FALSE);
2081 PropertySheetW(&pinfo);
2082
2083 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2084 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2085 }
2086
2087 INT_PTR
2088 CALLBACK
2089 TcpipAltConfDlg(
2090 HWND hwndDlg,
2091 UINT uMsg,
2092 WPARAM wParam,
2093 LPARAM lParam)
2094 {
2095 switch(uMsg)
2096 {
2097 case WM_INITDIALOG:
2098 return TRUE;
2099 }
2100 return FALSE;
2101 }
2102
2103 VOID
2104 AddAlternativeDialog(
2105 HWND hDlg,
2106 TcpipConfNotifyImpl * This)
2107 {
2108 HPROPSHEETPAGE hpage;
2109
2110 hpage = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL);
2111 if (!hpage)
2112 return;
2113
2114 SendMessageW(hDlg, PSM_INSERTPAGE, 1, (LPARAM)hpage);
2115 }
2116
2117 INT_PTR
2118 StoreTcpipBasicSettings(
2119 HWND hwndDlg,
2120 TcpipConfNotifyImpl * This,
2121 BOOL bApply)
2122 {
2123 DWORD dwIpAddr;
2124
2125 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2126 {
2127 This->pCurrentConfig->DhcpEnabled = FALSE;
2128 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2129 {
2130 if (bApply)
2131 {
2132 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING);
2133 SetFocus(GetDlgItem(hwndDlg, IDC_IPADDR));
2134 return E_FAIL;
2135 }
2136 }
2137 if (!This->pCurrentConfig->Ip)
2138 {
2139 This->pCurrentConfig->Ip = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2140 if (!This->pCurrentConfig->Ip)
2141 return E_OUTOFMEMORY;
2142 ZeroMemory(This->pCurrentConfig->Ip, sizeof(IP_ADDR));
2143 }
2144 This->pCurrentConfig->Ip->IpAddress = dwIpAddr;
2145
2146 if (SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2147 {
2148 if (bApply)
2149 DisplayError(IDS_NO_SUBMASK_SET, IDS_TCPIP, MB_ICONWARNING);
2150 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2151 {
2152 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2153 dwIpAddr = MAKEIPADDRESS(255, 0, 0, 0);
2154 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2155 dwIpAddr = MAKEIPADDRESS(255, 255, 0, 0);
2156 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2157 dwIpAddr = MAKEIPADDRESS(255, 255, 255, 0);
2158
2159 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)dwIpAddr);
2160 }
2161 if (bApply)
2162 {
2163 SetFocus(GetDlgItem(hwndDlg, IDC_SUBNETMASK));
2164 return E_FAIL;
2165 }
2166 }
2167 /* store subnetmask */
2168 This->pCurrentConfig->Ip->u.Subnetmask = dwIpAddr;
2169
2170 if (SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2171 {
2172 if (!This->pCurrentConfig->Gw)
2173 {
2174 This->pCurrentConfig->Gw = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2175 if (!This->pCurrentConfig->Gw)
2176 return E_OUTOFMEMORY;
2177 ZeroMemory(This->pCurrentConfig->Gw, sizeof(IP_ADDR));
2178 }
2179 /* store default gateway */
2180 This->pCurrentConfig->Gw->IpAddress = dwIpAddr;
2181 }
2182 else
2183 {
2184 if (This->pCurrentConfig->Gw)
2185 {
2186 IP_ADDR * pNextGw = This->pCurrentConfig->Gw->Next;
2187 CoTaskMemFree(This->pCurrentConfig->Gw);
2188 This->pCurrentConfig->Gw = pNextGw;
2189 }
2190 }
2191 }
2192 else
2193 {
2194 This->pCurrentConfig->DhcpEnabled = TRUE;
2195 }
2196 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2197 {
2198 BOOL bSkip = FALSE;
2199 This->pCurrentConfig->AutoconfigActive = FALSE;
2200 if (SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2201 {
2202 if (!This->pCurrentConfig->Ns)
2203 {
2204 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2205 if (!This->pCurrentConfig->Ns)
2206 return E_OUTOFMEMORY;
2207 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2208 }
2209 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2210 }
2211 else if (This->pCurrentConfig->Ns)
2212 {
2213 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next;
2214
2215 CoTaskMemFree(This->pCurrentConfig->Ns);
2216 This->pCurrentConfig->Ns = pTemp;
2217 bSkip = TRUE;
2218 }
2219
2220
2221 if (SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2222 {
2223 if (!This->pCurrentConfig->Ns || bSkip)
2224 {
2225 if (!This->pCurrentConfig->Ns)
2226 {
2227 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2228 if (!This->pCurrentConfig->Ns)
2229 return E_OUTOFMEMORY;
2230 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2231 }
2232 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2233 }
2234 else if (!This->pCurrentConfig->Ns->Next)
2235 {
2236 This->pCurrentConfig->Ns->Next = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2237 if (!This->pCurrentConfig->Ns->Next)
2238 return E_OUTOFMEMORY;
2239 ZeroMemory(This->pCurrentConfig->Ns->Next, sizeof(IP_ADDR));
2240 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2241 }
2242 else
2243 {
2244 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2245 }
2246 }
2247 else
2248 {
2249 if (This->pCurrentConfig->Ns && This->pCurrentConfig->Ns->Next)
2250 {
2251 if (This->pCurrentConfig->Ns->Next->Next)
2252 {
2253 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next->Next;
2254 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2255 This->pCurrentConfig->Ns->Next = pTemp;
2256 }
2257 else
2258 {
2259 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2260 This->pCurrentConfig->Ns->Next = NULL;
2261 }
2262 }
2263 }
2264 }
2265 else
2266 {
2267 This->pCurrentConfig->AutoconfigActive = TRUE;
2268 }
2269 return S_OK;
2270 }
2271
2272 HRESULT
2273 InitializeTcpipBasicDlgCtrls(
2274 HWND hwndDlg,
2275 TcpipSettings * pCurSettings)
2276 {
2277 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2278 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2279 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2280 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2281
2282 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255));
2283 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2284 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2285 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2286
2287 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2288 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2289 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2290 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2291
2292 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2293 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2294 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2295 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2296
2297 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2298 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2299 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2300 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2301
2302 if (pCurSettings->DhcpEnabled)
2303 {
2304 SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_SETCHECK, BST_CHECKED, 0);
2305 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE);
2306 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE);
2307 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE);
2308 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE);
2309 }
2310 else
2311 {
2312 SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_SETCHECK, BST_CHECKED, 0);
2313
2314 if (pCurSettings->Ip)
2315 {
2316 /* set current ip address */
2317 SendDlgItemMessageA(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->IpAddress);
2318 /* set current hostmask */
2319 SendDlgItemMessageA(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->u.Subnetmask);
2320 }
2321 if (pCurSettings->Gw && pCurSettings->Gw->IpAddress)
2322 {
2323 /* set current gateway */
2324 SendDlgItemMessageA(hwndDlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Gw->IpAddress);
2325 }
2326 }
2327 if (pCurSettings->AutoconfigActive)
2328 {
2329 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_CHECKED, 0);
2330 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE);
2331 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE);
2332 }
2333 else
2334 {
2335 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0);
2336 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2337 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2338 if (pCurSettings->Ns)
2339 {
2340 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress);
2341 if (pCurSettings->Ns->Next)
2342 {
2343 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->Next->IpAddress);
2344 }
2345 else
2346 {
2347 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2348 }
2349 }
2350 else
2351 {
2352 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
2353 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2354 }
2355 }
2356
2357 return S_OK;
2358 }
2359
2360 HRESULT
2361 CopyIpAddrString(
2362 IP_ADDR_STRING * pSrc,
2363 IP_ADDR ** pTarget,
2364 COPY_TYPE Type,
2365 LPWSTR szMetric)
2366 {
2367 IP_ADDR_STRING * pCurrent;
2368 IP_ADDR *pNew, *pLast;
2369
2370 pCurrent = pSrc;
2371 pLast = NULL;
2372
2373 while(pCurrent)
2374 {
2375 pNew = CoTaskMemAlloc(sizeof(IP_ADDR));
2376 if (!pNew)
2377 {
2378 break;
2379 }
2380 ZeroMemory(pNew, sizeof(IP_ADDR));
2381 pNew->IpAddress = GetIpAddressFromStringA(pCurrent->IpAddress.String);
2382 if (!pNew->IpAddress)
2383 {
2384 CoTaskMemFree(pNew);
2385 return E_FAIL;
2386 }
2387
2388 if (Type == SUBMASK)
2389 {
2390 pNew->u.Subnetmask = GetIpAddressFromStringA(pCurrent->IpMask.String);
2391 pNew->NTEContext = pCurrent->Context;
2392 }
2393 else if (Type == METRIC)
2394 {
2395 if (szMetric && szMetric[0] != L'\0')
2396 {
2397 pNew->u.Metric = _wtoi(szMetric);
2398 szMetric += wcslen(szMetric) + 1;
2399 }
2400 }
2401
2402 if (!pLast)
2403 *pTarget = pNew;
2404 else
2405 pLast->Next = pNew;
2406
2407 pLast = pNew;
2408 pCurrent = pCurrent->Next;
2409
2410 }
2411 pLast->Next = NULL;
2412 return S_OK;
2413 }
2414
2415
2416
2417 INT_PTR
2418 CALLBACK
2419 TcpipBasicDlg(
2420 HWND hwndDlg,
2421 UINT uMsg,
2422 WPARAM wParam,
2423 LPARAM lParam
2424 )
2425 {
2426 TcpipConfNotifyImpl * This;
2427 LPPROPSHEETPAGE page;
2428 LPNMIPADDRESS lpnmipa;
2429 LPPSHNOTIFY lppsn;
2430 DWORD dwIpAddr;
2431
2432
2433 switch(uMsg)
2434 {
2435 case WM_INITDIALOG:
2436 page = (LPPROPSHEETPAGE)lParam;
2437 This = (TcpipConfNotifyImpl*)page->lParam;
2438 if (This->pCurrentConfig)
2439 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2440 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This);
2441 return TRUE;
2442 case WM_NOTIFY:
2443 lppsn = (LPPSHNOTIFY) lParam;
2444 lpnmipa = (LPNMIPADDRESS) lParam;
2445 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
2446 {
2447 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2448 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
2449 {
2450 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2451 {
2452 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2453 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0));
2454 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2455 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0));
2456 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2457 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
2458 }
2459 }
2460 }
2461 else if (lppsn->hdr.code == PSN_APPLY)
2462 {
2463 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
2464 if (SUCCEEDED(StoreTcpipBasicSettings(hwndDlg, This, TRUE)))
2465 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
2466 else
2467 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_INVALID);
2468
2469 return TRUE;
2470 }
2471 break;
2472 case WM_COMMAND:
2473 if (HIWORD(wParam) == BN_CLICKED)
2474 {
2475 switch (LOWORD(wParam))
2476 {
2477 case IDC_USEDHCP:
2478 if (SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2479 {
2480 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2481 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_CLEARADDRESS, 0, 0);
2482 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_CLEARADDRESS, 0, 0);
2483 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_CLEARADDRESS, 0, 0);
2484 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE);
2485 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE);
2486 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE);
2487 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE);
2488 AddAlternativeDialog(GetParent(hwndDlg), (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER));
2489 }
2490 break;
2491 case IDC_NODHCP:
2492 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2493 {
2494 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2495 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), TRUE);
2496 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), TRUE);
2497 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), TRUE);
2498 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2499 {
2500 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_UNCHECKED, 0);
2501 }
2502 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), FALSE);
2503 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0);
2504 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2505 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2506 SendMessageW(GetParent(hwndDlg), PSM_REMOVEPAGE, 1, 0);
2507 }
2508 break;
2509 case IDC_AUTODNS:
2510 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2511 {
2512 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2513 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
2514 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2515 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE);
2516 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE);
2517 }
2518 break;
2519 case IDC_FIXEDDNS:
2520 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2521 {
2522 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2523 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2524 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2525 }
2526 break;
2527 case IDC_ADVANCED:
2528 LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER));
2529 break;
2530 }
2531 break;
2532 }
2533 default:
2534 break;
2535
2536 }
2537 return FALSE;
2538 }
2539
2540 /***************************************************************
2541 * INetCfgComponentPropertyUi interface
2542 */
2543
2544 HRESULT
2545 WINAPI
2546 INetCfgComponentPropertyUi_fnQueryInterface(
2547 INetCfgComponentPropertyUi * iface,
2548 REFIID iid,
2549 LPVOID * ppvObj)
2550 {
2551 //LPOLESTR pStr;
2552 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2553
2554 *ppvObj = NULL;
2555
2556
2557 if (IsEqualIID (iid, &IID_IUnknown) ||
2558 IsEqualIID (iid, &IID_INetCfgComponentPropertyUi))
2559 {
2560 *ppvObj = This;
2561 INetCfgComponentPropertyUi_AddRef(iface);
2562 return S_OK;
2563 }
2564 else if (IsEqualIID(iid, &IID_INetCfgComponentControl))
2565 {
2566 *ppvObj = (LPVOID*)&This->lpVtblCompControl;
2567 INetCfgComponentPropertyUi_AddRef(iface);
2568 return S_OK;
2569 }
2570
2571 //StringFromCLSID(iid, &pStr);
2572 //MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK);
2573 //CoTaskMemFree(pStr);
2574
2575 return E_NOINTERFACE;
2576 }
2577
2578
2579 ULONG
2580 WINAPI
2581 INetCfgComponentPropertyUi_fnAddRef(
2582 INetCfgComponentPropertyUi * iface)
2583 {
2584 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2585 ULONG refCount = InterlockedIncrement(&This->ref);
2586
2587 return refCount;
2588 }
2589
2590 ULONG
2591 WINAPI
2592 INetCfgComponentPropertyUi_fnRelease(
2593 INetCfgComponentPropertyUi * iface)
2594 {
2595 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2596 ULONG refCount = InterlockedDecrement(&This->ref);
2597
2598 if (!refCount)
2599 {
2600 CoTaskMemFree(This);
2601 }
2602 return refCount;
2603 }
2604
2605 HRESULT
2606 WINAPI
2607 INetCfgComponentPropertyUi_fnQueryPropertyUi(
2608 INetCfgComponentPropertyUi * iface,
2609 IUnknown *pUnkReserved)
2610 {
2611 INetLanConnectionUiInfo * pLanInfo;
2612 HRESULT hr;
2613 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2614
2615 hr = IUnknown_QueryInterface(pUnkReserved, &IID_INetLanConnectionUiInfo, (LPVOID*)&pLanInfo);
2616 if (FAILED(hr))
2617 return hr;
2618
2619 INetLanConnectionUiInfo_GetDeviceGuid(pLanInfo, &This->NetCfgInstanceId);
2620
2621 //FIXME
2622 // check if tcpip is enabled on that binding */
2623 IUnknown_Release(pUnkReserved);
2624 return S_OK;
2625 }
2626
2627 HRESULT
2628 WINAPI
2629 INetCfgComponentPropertyUi_fnSetContext(
2630 INetCfgComponentPropertyUi * iface,
2631 IUnknown *pUnkReserved)
2632 {
2633 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2634
2635 if (!iface || !pUnkReserved)
2636 return E_POINTER;
2637
2638 This->pUnknown = pUnkReserved;
2639 return S_OK;
2640 }
2641
2642 HRESULT
2643 LoadDNSSettings(
2644 TcpipConfNotifyImpl * This)
2645 {
2646 LPOLESTR pStr;
2647 WCHAR szBuffer[200];
2648 HKEY hKey;
2649 DWORD dwSize;
2650
2651
2652 This->pCurrentConfig->pDNS = (TcpipAdvancedDNSDlgSettings*) CoTaskMemAlloc(sizeof(TcpipAdvancedDNSDlgSettings));
2653 if (!This->pCurrentConfig->pDNS)
2654 return E_FAIL;
2655
2656 ZeroMemory(This->pCurrentConfig->pDNS, sizeof(TcpipAdvancedDNSDlgSettings));
2657
2658 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
2659 return E_FAIL;
2660
2661 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
2662 CoTaskMemFree(pStr);
2663 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2664 {
2665 dwSize = sizeof(DWORD);
2666 RegQueryValueExW(hKey, L"RegisterAdapterName", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, &dwSize);
2667 RegQueryValueExW(hKey, L"RegistrationEnabled", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, &dwSize);
2668
2669 dwSize = sizeof(This->pCurrentConfig->pDNS->szDomain) / sizeof(WCHAR);
2670 RegQueryValueExW(hKey, L"Domain", NULL, NULL, (LPBYTE)szBuffer, &dwSize);
2671
2672 RegCloseKey(hKey);
2673 }
2674
2675 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2676 {
2677 dwSize = sizeof(DWORD);
2678 RegQueryValueExW(hKey, L"UseDomainNameDevolution", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->UseDomainNameDevolution, &dwSize);
2679
2680 dwSize = 0;
2681 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
2682 {
2683 This->pCurrentConfig->pDNS->szSearchList = (LPWSTR)CoTaskMemAlloc(dwSize);
2684 if (This->pCurrentConfig->pDNS->szSearchList)
2685 {
2686 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, (LPBYTE)This->pCurrentConfig->pDNS->szSearchList, &dwSize) != ERROR_SUCCESS)
2687 {
2688 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
2689 This->pCurrentConfig->pDNS->szSearchList = NULL;
2690 }
2691 }
2692 }
2693 RegCloseKey(hKey);
2694 }
2695 return S_OK;
2696 }
2697
2698 LPWSTR
2699 LoadTcpFilterSettingsFromRegistry(HKEY hKey, LPCWSTR szName, LPDWORD Size)
2700 {
2701 DWORD dwSize;
2702 LPWSTR pData;
2703
2704 if (RegQueryValueExW(hKey, szName, NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS)
2705 return NULL;
2706
2707 pData = (LPWSTR)CoTaskMemAlloc(dwSize);
2708 if (!pData)
2709 return NULL;
2710
2711 if (RegQueryValueExW(hKey, szName, NULL, NULL, (LPBYTE)pData, &dwSize) != ERROR_SUCCESS)
2712 {
2713 CoTaskMemFree(pData);
2714 return NULL;
2715 }
2716 *Size = dwSize;
2717 return pData;
2718 }
2719
2720 HRESULT
2721 LoadFilterSettings(
2722 TcpipConfNotifyImpl * This)
2723 {
2724 HKEY hKey;
2725 TcpFilterSettings *pFilter;
2726 WCHAR szBuffer[200];
2727 LPOLESTR pStr;
2728 DWORD dwVal, dwSize;
2729
2730 pFilter = (TcpFilterSettings*)CoTaskMemAlloc(sizeof(TcpFilterSettings));
2731 if (!pFilter)
2732 return E_FAIL;
2733
2734 ZeroMemory(pFilter, sizeof(TcpFilterSettings));
2735 This->pCurrentConfig->pFilter = pFilter;
2736
2737
2738 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2739 {
2740 dwSize = sizeof(DWORD);
2741 if (RegQueryValueExW(hKey, L"EnableSecurityFilters", NULL, NULL, (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
2742 pFilter->EnableSecurityFilters = dwVal;
2743 RegCloseKey(hKey);
2744 }
2745 else
2746 {
2747 pFilter->EnableSecurityFilters = FALSE;
2748 }
2749
2750 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
2751 return E_FAIL;
2752
2753 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
2754 CoTaskMemFree(pStr);
2755 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
2756 {
2757 return S_OK;
2758 }
2759 pFilter->szTCPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"TCPAllowedPorts", &pFilter->TCPSize);
2760 pFilter->szUDPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"UDPAllowedPorts", &pFilter->UDPSize);
2761 pFilter->szRawIPAllowedProtocols = LoadTcpFilterSettingsFromRegistry(hKey, L"RawIPAllowedProtocols", &pFilter->IPSize);
2762 RegCloseKey(hKey);
2763 return S_OK;
2764 }
2765
2766
2767 HRESULT
2768 Initialize(TcpipConfNotifyImpl * This)
2769 {
2770 DWORD dwSize, Status;
2771 WCHAR szBuffer[50];
2772 IP_ADAPTER_INFO * pCurrentAdapter;
2773 IP_ADAPTER_INFO * pInfo;
2774 PIP_PER_ADAPTER_INFO pPerInfo;
2775 IP_PER_ADAPTER_INFO Info;
2776 LPOLESTR pStr;
2777 HRESULT hr;
2778 BOOL bFound;
2779 TcpipSettings * pCurSettings;
2780 ULONG uLength;
2781
2782 if (This->pCurrentConfig)
2783 return S_OK;
2784
2785 hr = StringFromCLSID(&This->NetCfgInstanceId, &pStr);
2786 if (FAILED(hr))
2787 return hr;
2788
2789
2790 dwSize = 0;
2791 if (GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW)
2792 {
2793 CoTaskMemFree(pStr);
2794 return E_FAIL;
2795 }
2796
2797 pInfo = CoTaskMemAlloc(dwSize);
2798 if (!pInfo)
2799 {
2800 CoTaskMemFree(pStr);
2801 return E_FAIL;
2802 }
2803
2804 if (GetAdaptersInfo(pInfo, &dwSize) != ERROR_SUCCESS)
2805 {
2806 CoTaskMemFree(pStr);
2807 CoTaskMemFree(pInfo);
2808 return E_FAIL;
2809 }
2810
2811 pCurrentAdapter = pInfo;
2812 bFound = FALSE;
2813 while(pCurrentAdapter)
2814 {
2815 szBuffer[0] = L'\0';
2816 if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0])))
2817 {
2818 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
2819 }
2820 if (!_wcsicmp(szBuffer, pStr))
2821 {
2822 bFound = TRUE;
2823 break;
2824 }
2825 pCurrentAdapter = pCurrentAdapter->Next;
2826 }
2827 CoTaskMemFree(pStr);
2828
2829 if (!bFound)
2830 {
2831 CoTaskMemFree(pInfo);
2832 return E_FAIL;
2833 }
2834
2835 pCurSettings = CoTaskMemAlloc(sizeof(TcpipSettings));
2836 if (!pCurSettings)
2837 {
2838 CoTaskMemFree(pInfo);
2839 return E_FAIL;
2840 }
2841
2842 ZeroMemory(pCurSettings, sizeof(TcpipSettings));
2843 This->pCurrentConfig = pCurSettings;
2844 pCurSettings->DhcpEnabled = pCurrentAdapter->DhcpEnabled;
2845 pCurSettings->Index = pCurrentAdapter->Index;
2846
2847 if (!pCurrentAdapter->DhcpEnabled)
2848 {
2849 CopyIpAddrString(&pCurrentAdapter->IpAddressList, &pCurSettings->Ip, SUBMASK, NULL);
2850 CopyIpAddrString(&pCurrentAdapter->GatewayList, &pCurSettings->Gw, METRIC, NULL); //FIXME
2851 }
2852
2853 uLength = sizeof(IP_PER_ADAPTER_INFO);
2854 ZeroMemory(&Info, sizeof(IP_PER_ADAPTER_INFO));
2855
2856 if (GetPerAdapterInfo(pCurrentAdapter->Index, &Info, &uLength) == ERROR_BUFFER_OVERFLOW)
2857 {
2858 pPerInfo = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(uLength);
2859 if (pPerInfo)
2860 {
2861 Status = GetPerAdapterInfo(pCurrentAdapter->Index, pPerInfo, &uLength);
2862 if (Status == NOERROR)
2863 {
2864 if (!pPerInfo->AutoconfigActive)
2865 {
2866 CopyIpAddrString(&pPerInfo->DnsServerList, &pCurSettings->Ns, IPADDR, NULL);
2867 }
2868 pCurSettings->AutoconfigActive = pPerInfo->AutoconfigActive;
2869 }
2870 CoTaskMemFree(pPerInfo);
2871 }
2872 }
2873 else
2874 {
2875 if (!Info.AutoconfigActive)
2876 {
2877 CopyIpAddrString(&Info.DnsServerList, &pCurSettings->Ns, IPADDR, NULL);
2878 }
2879 pCurSettings->AutoconfigActive = Info.AutoconfigActive;
2880 }
2881
2882 if (FAILED(LoadFilterSettings(This)))
2883 return E_FAIL;
2884
2885 if (FAILED(LoadDNSSettings(This)))
2886 return E_FAIL;
2887
2888 CoTaskMemFree(pInfo);
2889
2890 return S_OK;
2891 }
2892
2893 HRESULT
2894 WINAPI
2895 INetCfgComponentPropertyUi_fnMergePropPages(
2896 INetCfgComponentPropertyUi * iface,
2897 DWORD *pdwDefPages,
2898 BYTE **pahpspPrivate,
2899 UINT *pcPages,
2900 HWND hwndParent,
2901 LPCWSTR *pszStartPage)
2902 {
2903 HPROPSHEETPAGE * hppages;
2904 UINT NumPages;
2905 HRESULT hr;
2906 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2907
2908 hr = Initialize(This);
2909 if (FAILED(hr))
2910 return hr;
2911
2912 if (This->pCurrentConfig->DhcpEnabled)
2913 NumPages = 2;
2914 else
2915 NumPages = 1;
2916
2917 hppages = (HPROPSHEETPAGE*) CoTaskMemAlloc(sizeof(HPROPSHEETPAGE) * NumPages);
2918 if (!hppages)
2919 return E_FAIL;
2920
2921 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_BASIC_DLG), TcpipBasicDlg, (LPARAM)This, NULL);
2922 if (!hppages[0])
2923 {
2924 CoTaskMemFree(hppages);
2925 return E_FAIL;
2926 }
2927 if (NumPages == 2)
2928 {
2929 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL);
2930 if (!hppages[1])
2931 {
2932 DestroyPropertySheetPage(hppages[0]);
2933 CoTaskMemFree(hppages);
2934 return E_FAIL;
2935 }
2936 }
2937
2938 *pahpspPrivate = (BYTE*)hppages;
2939 *pcPages = NumPages;
2940
2941 return S_OK;
2942 }
2943
2944 HRESULT
2945 WINAPI
2946 INetCfgComponentPropertyUi_fnValidateProperties(
2947 INetCfgComponentPropertyUi * iface,
2948 HWND hwndDlg)
2949 {
2950 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnValidateProperties", NULL, MB_OK);
2951 return S_OK;
2952 }
2953
2954 HRESULT
2955 WINAPI
2956 INetCfgComponentPropertyUi_fnApplyProperties(
2957 INetCfgComponentPropertyUi * iface)
2958 {
2959 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnApplyProperties", NULL, MB_OK);
2960 return S_OK;
2961 }
2962
2963
2964 HRESULT
2965 WINAPI
2966 INetCfgComponentPropertyUi_fnCancelProperties(
2967 INetCfgComponentPropertyUi * iface)
2968 {
2969 //MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnCancelProperties", NULL, MB_OK);
2970 return S_OK;
2971 }
2972
2973 static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi =
2974 {
2975 INetCfgComponentPropertyUi_fnQueryInterface,
2976 INetCfgComponentPropertyUi_fnAddRef,
2977 INetCfgComponentPropertyUi_fnRelease,
2978 INetCfgComponentPropertyUi_fnQueryPropertyUi,
2979 INetCfgComponentPropertyUi_fnSetContext,
2980 INetCfgComponentPropertyUi_fnMergePropPages,
2981 INetCfgComponentPropertyUi_fnValidateProperties,
2982 INetCfgComponentPropertyUi_fnApplyProperties,
2983 INetCfgComponentPropertyUi_fnCancelProperties
2984 };
2985
2986 /***************************************************************
2987 * INetCfgComponentControl interface
2988 */
2989
2990 HRESULT
2991 WINAPI
2992 INetCfgComponentControl_fnQueryInterface(
2993 INetCfgComponentControl * iface,
2994 REFIID iid,
2995 LPVOID * ppvObj)
2996 {
2997 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
2998 return INetCfgComponentPropertyUi_QueryInterface((INetCfgComponentPropertyUi*)This, iid, ppvObj);
2999 }
3000
3001 ULONG
3002 WINAPI
3003 INetCfgComponentControl_fnAddRef(
3004 INetCfgComponentControl * iface)
3005 {
3006 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3007 return INetCfgComponentPropertyUi_AddRef((INetCfgComponentPropertyUi*)This);
3008 }
3009
3010 ULONG
3011 WINAPI
3012 INetCfgComponentControl_fnRelease(
3013 INetCfgComponentControl * iface)
3014 {
3015 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3016 return INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3017 }
3018
3019 HRESULT
3020 WINAPI
3021 INetCfgComponentControl_fnInitialize(
3022 INetCfgComponentControl * iface,
3023 INetCfgComponent *pIComp,
3024 INetCfg *pINetCfg,
3025 BOOL fInstalling)
3026 {
3027 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3028
3029 This->pNCfg = pINetCfg;
3030 This->pNComp = pIComp;
3031
3032 return S_OK;
3033 }
3034
3035 static
3036 LPWSTR
3037 CreateMultiSzString(IP_ADDR * pAddr, COPY_TYPE Type, LPDWORD Size, BOOL bComma)
3038 {
3039 LPWSTR pStr, pRet;
3040 DWORD dwSize, dwIpAddr;
3041 WCHAR szBuffer[30];
3042 IP_ADDR *pTemp = pAddr;
3043
3044
3045 dwSize = 0;
3046 while(pTemp)
3047 {
3048 if (Type == IPADDR)
3049 {
3050 dwIpAddr = pTemp->IpAddress;
3051 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3052 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3053 }else if (Type == SUBMASK)
3054 {
3055 dwIpAddr = pTemp->u.Subnetmask;
3056 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3057 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3058 }
3059 else if (Type == METRIC)
3060 {
3061 swprintf(szBuffer, L"%u", pTemp->u.Metric);
3062 }
3063
3064 dwSize += wcslen(szBuffer) + 1;
3065 pTemp = pTemp->Next;
3066 }
3067
3068 if (!dwSize)
3069 return NULL;
3070
3071 pStr = pRet = CoTaskMemAlloc((dwSize+1) * sizeof(WCHAR));
3072 if(!pStr)
3073 return NULL;
3074
3075 pTemp = pAddr;
3076 while(pTemp)
3077 {
3078 if (Type == IPADDR)
3079 {
3080 dwIpAddr = pTemp->IpAddress;
3081 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3082 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3083 }else if (Type == SUBMASK)
3084 {
3085 dwIpAddr = pTemp->u.Subnetmask;
3086 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3087 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3088 }
3089 else if (Type == METRIC)
3090 {
3091 swprintf(pStr, L"%u", pTemp->u.Metric);
3092 }
3093
3094 if (bComma)
3095 {
3096 pStr += wcslen(pStr);
3097 if (pTemp->Next)
3098 {
3099 pStr[0] = L',';
3100 pStr++;
3101 }
3102 }
3103 else
3104 {
3105 pStr += wcslen(pStr) + 1;
3106 }
3107 pTemp = pTemp->Next;
3108 }
3109 pStr[0] = L'\0';
3110 *Size = (dwSize+1) * sizeof(WCHAR);
3111 return pRet;
3112 }
3113
3114
3115 HRESULT
3116 WINAPI
3117 INetCfgComponentControl_fnApplyRegistryChanges(
3118 INetCfgComponentControl * iface)
3119 {
3120 HKEY hKey;
3121 LPOLESTR pStr;
3122 DWORD dwSize;
3123 WCHAR szBuffer[200];
3124 TcpipSettings * pCurrentConfig, *pOldConfig;
3125 ULONG NTEInstance;
3126 DWORD DhcpApiVersion;
3127
3128 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3129
3130 pCurrentConfig = This->pCurrentConfig;
3131 This->pCurrentConfig = NULL;
3132
3133 if (FAILED(Initialize(This)))
3134 {
3135 This->pCurrentConfig = pCurrentConfig;
3136 return E_FAIL;
3137 }
3138 pOldConfig = This->pCurrentConfig;
3139 This->pCurrentConfig = pCurrentConfig;
3140
3141 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyRegistryChanges", NULL, MB_OK);
3142
3143
3144 if (RegCreateKeyExW(hKey, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
3145 {
3146 if (pCurrentConfig->pDNS)
3147 {
3148 RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD));
3149 RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)pCurrentConfig->pDNS->szSearchList,
3150 (wcslen(pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR));
3151 }
3152 if (pCurrentConfig->pFilter)
3153 {
3154 RegSetValueExW(hKey, L"EnableSecurityFilters", 0, REG_DWORD,
3155 (LPBYTE)&pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD));
3156 }
3157 RegCloseKey(hKey);
3158 }
3159
3160 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
3161 return E_FAIL;
3162
3163 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
3164 CoTaskMemFree(pStr);
3165
3166 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
3167 {
3168 if (pCurrentConfig->pDNS)
3169 {
3170 RegSetValueExW(hKey, L"RegisterAdapterName", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, sizeof(DWORD));
3171 RegSetValueExW(hKey, L"RegistrationEnabled", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, sizeof(DWORD));
3172 RegSetValueExW(hKey, L"Domain", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szDomain,
3173 (wcslen(This->pCurrentConfig->pDNS->szDomain)+1) * sizeof(WCHAR));
3174 }
3175 #if 0
3176 if (pCurrentConfig->pFilter)
3177 {
3178 if (pCurrentConfig->pFilter->szTCPAllowedPorts)
3179 {
3180 RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ,
3181 (LPBYTE)pCurrentConfig->pFilter->szTCPAllowedPorts,
3182 pCurrentConfig->pFilter->TCPSize);
3183 }
3184 if (pCurrentConfig->pFilter->szUDPAllowedPorts)
3185 {
3186 RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ,
3187 (LPBYTE)pCurrentConfig->pFilter->szUDPAllowedPorts,
3188 pCurrentConfig->pFilter->UDPSize);
3189 }
3190 if (pCurrentConfig->pFilter->szRawIPAllowedProtocols)
3191 {
3192 RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ,
3193 (LPBYTE)pCurrentConfig->pFilter->szRawIPAllowedProtocols,
3194 pCurrentConfig->pFilter->IPSize);
3195 }
3196 }
3197 #endif
3198 RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->DhcpEnabled, sizeof(DWORD));
3199 if (pCurrentConfig->DhcpEnabled)
3200 {
3201 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3202 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3203 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
3204 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
3205 if (!pOldConfig->DhcpEnabled)
3206 {
3207 /* Delete this adapter's current IP address */
3208 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3209
3210 /* Delete all default routes for this adapter */
3211 dwSize = 0;
3212 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
3213 {
3214 DWORD Index;
3215 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
3216 if (pIpForwardTable)
3217 {
3218 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3219 {
3220 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3221 {
3222 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3223 pIpForwardTable->table[Index].dwForwardDest == 0)
3224 {
3225 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3226 }
3227 }
3228 }
3229 CoTaskMemFree(pIpForwardTable);
3230 }
3231 }
3232 }
3233 }
3234 else
3235 {
3236 /* Open the DHCP API if DHCP is enabled */
3237 if (pOldConfig->DhcpEnabled && DhcpCApiInitialize(&DhcpApiVersion) == NO_ERROR)
3238 {
3239 /* We have to tell DHCP about this */
3240 DhcpStaticRefreshParams(pCurrentConfig->Index,
3241 htonl(pCurrentConfig->Ip->IpAddress),
3242 htonl(pCurrentConfig->Ip->u.Subnetmask));
3243
3244 /* Close the API */
3245 DhcpCApiCleanup();
3246 }
3247 else
3248 {
3249 /* Delete this adapter's current static IP address */
3250 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3251
3252 /* Add the static IP address via the standard IPHLPAPI function */
3253 AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress),
3254 htonl(pCurrentConfig->Ip->u.Subnetmask),
3255 pCurrentConfig->Index,
3256 &pCurrentConfig->Ip->NTEContext,
3257 &NTEInstance);
3258 }
3259
3260 pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
3261 if(pStr)
3262 {
3263 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3264 CoTaskMemFree(pStr);
3265 }
3266
3267 pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
3268 if(pStr)
3269 {
3270 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3271 CoTaskMemFree(pStr);
3272 }
3273
3274 /* Delete all default routes for this adapter */
3275 dwSize = 0;
3276 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
3277 {
3278 DWORD Index;
3279 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
3280 if (pIpForwardTable)
3281 {
3282 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3283 {
3284 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3285 {
3286 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3287 pIpForwardTable->table[Index].dwForwardDest == 0)
3288 {
3289 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3290 }
3291 }
3292 }
3293 CoTaskMemFree(pIpForwardTable);
3294 }
3295 }
3296
3297 if (pCurrentConfig->Gw)
3298 {
3299 MIB_IPFORWARDROW RouterMib;
3300 ZeroMemory(&RouterMib, sizeof(MIB_IPFORWARDROW));
3301
3302 RouterMib.dwForwardMetric1 = 1;
3303 RouterMib.dwForwardIfIndex = pOldConfig->Index;
3304 RouterMib.dwForwardNextHop = htonl(pCurrentConfig->Gw->IpAddress);
3305
3306 //TODO
3307 // add multiple gw addresses when required
3308
3309 if (CreateIpForwardEntry(&RouterMib) == NO_ERROR)
3310 {
3311 pStr = CreateMultiSzString(pCurrentConfig->Gw, IPADDR, &dwSize, FALSE);
3312 if(pStr)
3313 {
3314 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3315 CoTaskMemFree(pStr);
3316 }
3317
3318 pStr = CreateMultiSzString(pCurrentConfig->Gw, METRIC, &dwSize, FALSE);
3319 if(pStr)
3320 {
3321 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3322 CoTaskMemFree(pStr);
3323 }
3324 }
3325 }
3326 else
3327 {
3328 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
3329 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2);
3330 }
3331 }
3332
3333 if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive)
3334 {
3335 RegDeleteValueW(hKey, L"NameServer");
3336 }
3337 else
3338 {
3339 pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE);
3340 if(pStr)
3341 {
3342 RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize);
3343 //RegDeleteValueW(hKey, L"DhcpNameServer");
3344 CoTaskMemFree(pStr);
3345 }
3346 }
3347
3348 RegCloseKey(hKey);
3349 }
3350 return S_OK;
3351 }
3352
3353 HRESULT
3354 WINAPI
3355 INetCfgComponentControl_fnApplyPnpChanges(
3356 INetCfgComponentControl * iface,
3357 INetCfgPnpReconfigCallback *pICallback)
3358 {
3359 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyPnpChanges", NULL, MB_OK);
3360 return S_OK;
3361 }
3362
3363 HRESULT
3364 WINAPI
3365 INetCfgComponentControl_fnCancelChanges(
3366 INetCfgComponentControl * iface)
3367 {
3368 //MessageBoxW(NULL, L"INetCfgComponentControl_fnCancelChanges", NULL, MB_OK);
3369 return S_OK;
3370 }
3371
3372 static const INetCfgComponentControlVtbl vt_NetCfgComponentControl =
3373 {
3374 INetCfgComponentControl_fnQueryInterface,
3375 INetCfgComponentControl_fnAddRef,
3376 INetCfgComponentControl_fnRelease,
3377 INetCfgComponentControl_fnInitialize,
3378 INetCfgComponentControl_fnApplyRegistryChanges,
3379 INetCfgComponentControl_fnApplyPnpChanges,
3380 INetCfgComponentControl_fnCancelChanges
3381 };
3382
3383 HRESULT
3384 WINAPI
3385 TcpipConfigNotify_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
3386 {
3387 TcpipConfNotifyImpl *This;
3388
3389 if (!ppv)
3390 return E_POINTER;
3391
3392 This = (TcpipConfNotifyImpl *) CoTaskMemAlloc(sizeof (TcpipConfNotifyImpl));
3393 if (!This)
3394 return E_OUTOFMEMORY;
3395
3396 This->ref = 1;
3397 This->lpVtbl = (const INetCfgComponentPropertyUi*)&vt_NetCfgComponentPropertyUi;
3398 This->lpVtblCompControl = (const INetCfgComponentControl*)&vt_NetCfgComponentControl;
3399 This->pNCfg = NULL;
3400 This->pUnknown = NULL;
3401 This->pNComp = NULL;
3402 This->pCurrentConfig = NULL;
3403
3404 if (!SUCCEEDED (INetCfgComponentPropertyUi_QueryInterface ((INetCfgComponentPropertyUi*)This, riid, ppv)))
3405 {
3406 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3407 return E_NOINTERFACE;
3408 }
3409
3410 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3411 return S_OK;
3412 }