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