Create the AHCI branch for Aman's work
[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 if (pGwSettings->szIP)
784 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)GetIpAddressFromStringW(pGwSettings->szIP));
785
786 if (pGwSettings->Metric)
787 {
788 SetDlgItemInt(hwndDlg, IDC_METRIC, pGwSettings->Metric, FALSE);
789 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
790 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE);
791 }
792 else
793 {
794 SendDlgItemMessageW(hwndDlg, IDC_USEMETRIC, BM_SETCHECK, BST_CHECKED, 0);
795 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
796 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE);
797 }
798 }
799 return TRUE;
800 case WM_COMMAND:
801 if (LOWORD(wParam) == IDC_USEMETRIC)
802 {
803 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED)
804 {
805 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
806 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE);
807 SendDlgItemMessageW(hwndDlg, IDC_METRIC, WM_SETTEXT, 0, (LPARAM)L"");
808 }
809 else
810 {
811 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
812 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE);
813 }
814 break;
815 }
816 else if (LOWORD(wParam) == IDCANCEL)
817 {
818 EndDialog(hwndDlg, FALSE);
819 break;
820 }
821 else if (LOWORD(wParam) == IDC_OK)
822 {
823 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
824 {
825 pGwSettings = (TcpipGwSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
826 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pGwSettings->szIP);
827
828 ZeroMemory(&find, sizeof(LVFINDINFOW));
829 find.flags = LVFI_STRING;
830 find.psz = pGwSettings->szIP;
831
832 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_UNCHECKED)
833 pGwSettings->Metric = GetDlgItemInt(hwndDlg, IDC_METRIC, NULL, FALSE);
834 else
835 pGwSettings->Metric = 0;
836
837
838 if (SendMessageW(pGwSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1)
839 {
840 EndDialog(hwndDlg, TRUE);
841 break;
842 }
843 if (!pGwSettings->bAdd)
844 {
845 EndDialog(hwndDlg, FALSE);
846 break;
847 }
848 DisplayError(IDS_DUP_GW, IDS_TCPIP, MB_ICONINFORMATION);
849 }
850 break;
851 }
852 break;
853 case WM_NOTIFY:
854 lpnmipa = (LPNMIPADDRESS) lParam;
855 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
856 {
857 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
858 {
859 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
860 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
861 }
862 }
863 break;
864 }
865 return FALSE;
866 }
867
868 BOOL
869 GetGWListEntry(HWND hDlgCtrl, INT Index, TcpipGwSettings * pGwSettings)
870 {
871 LVITEMW li;
872 WCHAR szBuffer[30];
873 BOOL bRet;
874
875 ZeroMemory(&li, sizeof(LVITEMW));
876 li.mask = LVIF_TEXT;
877 li.cchTextMax = 16;
878 li.pszText = pGwSettings->szIP;
879 li.iItem = Index;
880
881 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
882 return FALSE;
883 li.pszText = szBuffer;
884 li.cchTextMax = 30;
885 li.iSubItem = 1;
886
887 bRet = SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
888 if (bRet)
889 {
890 pGwSettings->Metric = _wtoi(szBuffer);
891 }
892
893 return bRet;
894 }
895
896 INT_PTR
897 CALLBACK
898 TcpipAddIpDlg(
899 HWND hwndDlg,
900 UINT uMsg,
901 WPARAM wParam,
902 LPARAM lParam
903 )
904 {
905 LPNMIPADDRESS lpnmipa;
906 DWORD dwIpAddr;
907 TcpipIpSettings *pIpSettings;
908 WCHAR szBuffer[50];
909 LVFINDINFOW find;
910 LRESULT lResult;
911
912 switch(uMsg)
913 {
914 case WM_INITDIALOG:
915 pIpSettings = (TcpipIpSettings*)lParam;
916 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
917
918 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
919 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
920 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
921 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
922 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255));
923 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
924 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
925 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
926
927 if (pIpSettings->bAdd)
928 {
929 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
930 {
931 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
932 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
933 }
934 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
935 }
936 else
937 {
938 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
939 {
940 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
941 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
942 }
943
944 if (pIpSettings->szIP)
945 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)GetIpAddressFromStringW(pIpSettings->szIP));
946
947 if (pIpSettings->szMask)
948 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)GetIpAddressFromStringW(pIpSettings->szMask));
949 }
950 return TRUE;
951 case WM_NOTIFY:
952 lpnmipa = (LPNMIPADDRESS) lParam;
953 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
954 {
955 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
956 {
957 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
958 {
959 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
960 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0));
961 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
962 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0));
963 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
964 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
965 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
966 }
967 }
968 }
969 break;
970 case WM_COMMAND:
971 if (LOWORD(wParam) == IDC_OK)
972 {
973 pIpSettings = (TcpipIpSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
974 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pIpSettings->szIP);
975 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_GETTEXT, 16, (LPARAM)pIpSettings->szMask);
976
977 ZeroMemory(&find, sizeof(LVFINDINFOW));
978 find.flags = LVFI_STRING;
979 find.psz = pIpSettings->szIP;
980 lResult = SendMessageW(pIpSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find);
981
982 if (lResult == -1)
983 {
984 EndDialog(hwndDlg, TRUE);
985 break;
986 }
987 else if (!pIpSettings->bAdd)
988 {
989 EndDialog(hwndDlg, FALSE);
990 break;
991 }
992 DisplayError(IDS_DUP_IPADDR, IDS_TCPIP, MB_ICONINFORMATION);
993 break;
994 }
995 else if (LOWORD(wParam) == IDCANCEL)
996 {
997 EndDialog(hwndDlg, FALSE);
998 }
999 break;
1000 }
1001 return FALSE;
1002 }
1003
1004 BOOL
1005 VerifyDNSSuffix(
1006 LPWSTR szName)
1007 {
1008 UINT Index;
1009 UINT Length = wcslen(szName);
1010
1011 for(Index = 0; Index < Length; Index++)
1012 if (iswalnum(szName[Index]) == 0 && szName[Index] != '.' && szName[Index] != '-')
1013 return FALSE;
1014
1015 return TRUE;
1016 }
1017
1018 INT_PTR
1019 CALLBACK
1020 TcpipAddSuffixDlg(
1021 HWND hwndDlg,
1022 UINT uMsg,
1023 WPARAM wParam,
1024 LPARAM lParam
1025 )
1026 {
1027 WCHAR szBuffer[100];
1028 TcpipSuffixSettings * pSettings;
1029 LRESULT lLength;
1030
1031 switch(uMsg)
1032 {
1033 case WM_INITDIALOG:
1034 pSettings = (TcpipSuffixSettings*)lParam;
1035 if (!pSettings->bAdd)
1036 {
1037 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)pSettings->Suffix);
1038 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1039 {
1040 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1041 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1042 }
1043 CoTaskMemFree(pSettings->Suffix);
1044 pSettings->Suffix = NULL;
1045 }
1046 else
1047 {
1048 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1049 {
1050 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1051 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1052 }
1053 }
1054 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pSettings);
1055 return TRUE;
1056 case WM_COMMAND:
1057 if (LOWORD(wParam) == IDCANCEL)
1058 {
1059 EndDialog(hwndDlg, FALSE);
1060 break;
1061 }
1062 else if (LOWORD(wParam) == IDC_OK)
1063 {
1064 lLength = SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXTLENGTH, 0, 0);
1065 if (lLength)
1066 {
1067 pSettings = (TcpipSuffixSettings*) GetWindowLongPtr(hwndDlg, DWLP_USER);
1068 pSettings->Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1)* sizeof(WCHAR));
1069 if (pSettings->Suffix)
1070 {
1071 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, lLength + 1, (LPARAM)pSettings->Suffix);
1072 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->Suffix) != LB_ERR)
1073 {
1074 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1075 CoTaskMemFree(pSettings->Suffix);
1076 break;
1077 }
1078
1079 if (!VerifyDNSSuffix(pSettings->Suffix))
1080 {
1081 DisplayError(IDS_DOMAIN_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1082 CoTaskMemFree(pSettings->Suffix);
1083 break;
1084 }
1085 EndDialog(hwndDlg, TRUE);
1086 }
1087 }
1088 break;
1089 }
1090 }
1091 return FALSE;
1092 }
1093
1094
1095
1096 INT
1097 GetSelectedItem(HWND hDlgCtrl)
1098 {
1099 LVITEMW li;
1100 UINT iItemCount, iIndex;
1101
1102 iItemCount = ListView_GetItemCount(hDlgCtrl);
1103 if (!iItemCount)
1104 return -1;
1105
1106 for (iIndex = 0; iIndex < iItemCount; iIndex++)
1107 {
1108 ZeroMemory(&li, sizeof(LVITEMW));
1109 li.mask = LVIF_STATE;
1110 li.stateMask = (UINT)-1;
1111 li.iItem = iIndex;
1112 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1113 {
1114 if (li.state & LVIS_SELECTED)
1115 return iIndex;
1116 }
1117 }
1118 return -1;
1119 }
1120
1121
1122 BOOL
1123 GetIPListEntry(HWND hDlgCtrl, INT Index, TcpipIpSettings * pIpSettings)
1124 {
1125 LVITEMW li;
1126
1127 ZeroMemory(&li, sizeof(LVITEMW));
1128 li.mask = LVIF_TEXT;
1129 li.cchTextMax = 16;
1130 li.pszText = pIpSettings->szIP;
1131 li.iItem = Index;
1132
1133 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li))
1134 return FALSE;
1135
1136 ZeroMemory(&li, sizeof(LVITEMW));
1137 li.mask = LVIF_TEXT;
1138 li.cchTextMax = 16;
1139 li.pszText = pIpSettings->szMask;
1140 li.iSubItem = 1;
1141 li.iItem = Index;
1142
1143 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1144 }
1145
1146 VOID
1147 DeleteItemFromList(HWND hDlgCtrl)
1148 {
1149 LVITEMW li;
1150
1151 memset(&li, 0x0, sizeof(LVITEMW));
1152 li.iItem = GetSelectedItem(hDlgCtrl);
1153 if (li.iItem < 0)
1154 {
1155 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1156 SetFocus(hDlgCtrl);
1157 }
1158 else
1159 {
1160 (void)ListView_DeleteItem(hDlgCtrl, li.iItem);
1161 }
1162 }
1163
1164 UINT
1165 GetIpAddressFromStringW(
1166 WCHAR * szBuffer)
1167 {
1168 DWORD dwIpAddr = 0;
1169 INT Val;
1170 UINT Index = 3;
1171 LPWSTR pLast = szBuffer;
1172 LPWSTR pNext = szBuffer;
1173
1174
1175 while((pNext = wcschr(pNext, L'.')))
1176 {
1177 pNext[0] = L'\0';
1178 Val = _wtoi(pLast);
1179 dwIpAddr |= (Val << Index * 8);
1180 Index--;
1181 pNext++;
1182 pLast = pNext;
1183 }
1184 dwIpAddr |= _wtoi(pLast);
1185
1186 return dwIpAddr;
1187 }
1188
1189 UINT
1190 GetIpAddressFromStringA(
1191 char * sBuffer)
1192 {
1193 WCHAR szIp[16];
1194
1195 if (MultiByteToWideChar(CP_ACP, 0, sBuffer, -1, szIp, 16))
1196 {
1197 szIp[15] = L'\0';
1198 return GetIpAddressFromStringW(szIp);
1199 }
1200 return (UINT)-1;
1201 }
1202
1203
1204 VOID
1205 FreeIPAddr(IP_ADDR *pAddr)
1206 {
1207 IP_ADDR *pNext;
1208
1209 if (!pAddr)
1210 return;
1211
1212 while(pAddr)
1213 {
1214 pNext = pAddr->Next;
1215 CoTaskMemFree(pAddr);
1216 pAddr = pNext;
1217 }
1218 }
1219
1220 BOOL
1221 GetListViewItem(HWND hDlgCtrl, UINT Index, UINT SubIndex, WCHAR * szBuffer, UINT BufferSize)
1222 {
1223 LVITEMW li;
1224
1225 ZeroMemory(&li, sizeof(LVITEMW));
1226 li.mask = LVIF_TEXT;
1227 li.pszText = szBuffer;
1228 li.iItem = Index;
1229 li.iSubItem = SubIndex;
1230 li.cchTextMax = BufferSize;
1231 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li);
1232 }
1233
1234 VOID
1235 StoreIPSettings(
1236 HWND hDlgCtrl,
1237 TcpipConfNotifyImpl * This,
1238 BOOL bSubmask)
1239 {
1240 WCHAR szBuffer[30];
1241
1242 INT iIndex, iCount;
1243 IP_ADDR *pCur, *pLast;
1244
1245 iCount = ListView_GetItemCount(hDlgCtrl);
1246 if (!iCount)
1247 {
1248 return;
1249 }
1250
1251 pLast = NULL;
1252 for(iIndex = 0; iIndex < iCount; iIndex++)
1253 {
1254 if (GetListViewItem(hDlgCtrl, iIndex, 0, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1255 {
1256 pCur = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
1257 if (!pCur)
1258 break;
1259 ZeroMemory(pCur, sizeof(IP_ADDR));
1260
1261 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1262 pCur->IpAddress = GetIpAddressFromStringW(szBuffer);
1263
1264 if (GetListViewItem(hDlgCtrl, iIndex, 1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR) ))
1265 {
1266 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1267 if (bSubmask)
1268 pCur->u.Subnetmask = GetIpAddressFromStringW(szBuffer);
1269 else
1270 pCur->u.Metric = _wtoi(szBuffer);
1271 }
1272
1273 if (!pLast)
1274 {
1275 if (bSubmask)
1276 This->pCurrentConfig->Ip = pCur;
1277 else
1278 This->pCurrentConfig->Gw = pCur;
1279 }
1280 else
1281 {
1282 pLast->Next = pCur;
1283 }
1284
1285 pLast = pCur;
1286 }
1287 }
1288 }
1289
1290
1291 INT_PTR
1292 CALLBACK
1293 TcpipAdvancedIpDlg(
1294 HWND hwndDlg,
1295 UINT uMsg,
1296 WPARAM wParam,
1297 LPARAM lParam
1298 )
1299 {
1300 TcpipConfNotifyImpl * This;
1301 LPPROPSHEETPAGE page;
1302 INT_PTR res;
1303 WCHAR szBuffer[200];
1304 LPPSHNOTIFY lppsn;
1305 TcpipGwSettings Gw;
1306 TcpipIpSettings Ip;
1307
1308 LVITEMW li;
1309
1310 switch(uMsg)
1311 {
1312 case WM_INITDIALOG:
1313 page = (LPPROPSHEETPAGE)lParam;
1314 This = (TcpipConfNotifyImpl*)page->lParam;
1315 InitializeTcpipAdvancedIpDlg(hwndDlg, This);
1316 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This);
1317 return TRUE;
1318 case WM_NOTIFY:
1319 lppsn = (LPPSHNOTIFY) lParam;
1320 if (lppsn->hdr.code == PSN_KILLACTIVE)
1321 {
1322 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1323 if (!This->pCurrentConfig->DhcpEnabled && ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST)) == 0)
1324 {
1325 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING);
1326 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1327 return TRUE;
1328 }
1329 }
1330 else if (lppsn->hdr.code == PSN_APPLY)
1331 {
1332 This = (TcpipConfNotifyImpl*) GetWindowLongPtr(hwndDlg, DWLP_USER);
1333 FreeIPAddr(This->pCurrentConfig->Gw);
1334 This->pCurrentConfig->Gw = NULL;
1335 FreeIPAddr(This->pCurrentConfig->Ip);
1336 This->pCurrentConfig->Ip = NULL;
1337 StoreIPSettings(GetDlgItem(hwndDlg, IDC_IPLIST), This, TRUE);
1338 StoreIPSettings(GetDlgItem(hwndDlg, IDC_GWLIST), This, FALSE);
1339 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
1340 return TRUE;
1341 }
1342 break;
1343 case WM_COMMAND:
1344 if (LOWORD(wParam) == IDC_AUTOMETRIC)
1345 {
1346 if (SendDlgItemMessageW(hwndDlg, IDC_AUTOMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED)
1347 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE);
1348 else
1349 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE);
1350 }
1351 else if (LOWORD(wParam) == IDC_IPADD)
1352 {
1353 Ip.bAdd = TRUE;
1354 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1355 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip);
1356 if (res)
1357 {
1358 memset(&li, 0x0, sizeof(LVITEMW));
1359 li.mask = LVIF_TEXT | LVIF_PARAM;
1360 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST));
1361 li.pszText = Ip.szIP;
1362 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1363 if (li.iItem != -1)
1364 {
1365 li.mask = LVIF_TEXT;
1366 li.iSubItem = 1;
1367 li.pszText = Ip.szMask;
1368 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1369 }
1370
1371 EnableIpButtons(hwndDlg);
1372 }
1373 }
1374 else if (LOWORD(wParam) == IDC_IPMOD)
1375 {
1376 memset(&li, 0x0, sizeof(LVITEMW));
1377 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_IPLIST));
1378 if (li.iItem < 0)
1379 {
1380 /* no item selected */
1381 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1382 SetFocus(GetDlgItem(hwndDlg, IDC_IPLIST));
1383 break;
1384 }
1385 Ip.bAdd = FALSE;
1386 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST);
1387 if (GetIPListEntry(GetDlgItem(hwndDlg, IDC_IPLIST), li.iItem, &Ip))
1388 {
1389 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip);
1390 if (res)
1391 {
1392 li.mask = LVIF_TEXT;
1393 li.pszText = Ip.szIP;
1394 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1395 li.pszText = Ip.szMask;
1396 li.iSubItem = 1;
1397 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1398 }
1399 }
1400 }
1401 else if (LOWORD(wParam) == IDC_IPDEL)
1402 {
1403 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_IPLIST));
1404 EnableIpButtons(hwndDlg);
1405 break;
1406 }
1407 else if (LOWORD(wParam) == IDC_GWADD)
1408 {
1409 Gw.bAdd = TRUE;
1410 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1411 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw);
1412 if (res)
1413 {
1414 memset(&li, 0x0, sizeof(LVITEMW));
1415 li.mask = LVIF_TEXT;
1416 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_GWLIST));
1417 li.pszText = Gw.szIP;
1418 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_INSERTITEMW, 0, (LPARAM)&li);
1419 if (li.iItem >= 0)
1420 {
1421 if (Gw.Metric)
1422 {
1423 swprintf(szBuffer, L"%u", Gw.Metric);
1424 li.iSubItem = 1;
1425 li.pszText = szBuffer;
1426 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1427 }
1428 else
1429 {
1430 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1431 {
1432 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1433 li.iSubItem = 1;
1434 li.pszText = szBuffer;
1435 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1436 }
1437 }
1438 }
1439
1440 EnableGwButtons(hwndDlg);
1441 }
1442 break;
1443 }
1444 else if (LOWORD(wParam) == IDC_GWMOD)
1445 {
1446 memset(&li, 0x0, sizeof(LVITEMW));
1447 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_GWLIST));
1448 if (li.iItem < 0)
1449 {
1450 /* no item selected */
1451 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION);
1452 SetFocus(GetDlgItem(hwndDlg, IDC_GWLIST));
1453 break;
1454 }
1455 if (GetGWListEntry(GetDlgItem(hwndDlg, IDC_GWLIST), li.iItem, &Gw))
1456 {
1457 Gw.bAdd = FALSE;
1458 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST);
1459 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw);
1460 if (res)
1461 {
1462 li.mask = LVIF_TEXT;
1463 li.pszText = Gw.szIP;
1464 (void)SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1465 if (Gw.Metric)
1466 {
1467 swprintf(szBuffer, L"%u", Gw.Metric);
1468 li.iSubItem = 1;
1469 li.pszText = szBuffer;
1470 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1471 }
1472 else
1473 {
1474 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1475 {
1476 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1477 li.iSubItem = 1;
1478 li.pszText = szBuffer;
1479 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li);
1480 }
1481 }
1482 }
1483 }
1484 break;
1485 }
1486 else if (LOWORD(wParam) == IDC_GWDEL)
1487 {
1488 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_GWLIST));
1489 EnableGwButtons(hwndDlg);
1490 break;
1491 }
1492 }
1493 return FALSE;
1494 }
1495
1496 INT_PTR
1497 CALLBACK
1498 TcpipAddDNSDlg(
1499 HWND hwndDlg,
1500 UINT uMsg,
1501 WPARAM wParam,
1502 LPARAM lParam
1503 )
1504 {
1505 TcpipDnsSettings * pSettings;
1506 WCHAR szBuffer[100];
1507 DWORD dwIpAddr;
1508 LPNMIPADDRESS lpnmipa;
1509
1510 switch(uMsg)
1511 {
1512 case WM_INITDIALOG:
1513 pSettings = (TcpipDnsSettings*)lParam;
1514 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
1515 if (!pSettings->bAdd)
1516 {
1517 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1518 {
1519 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1520 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1521 }
1522 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pSettings->szIP);
1523 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1524 }
1525 else
1526 {
1527 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
1528 {
1529 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
1530 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer);
1531 }
1532 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE);
1533 }
1534 return TRUE;
1535 case WM_COMMAND:
1536 if (LOWORD(wParam) == IDCANCEL)
1537 {
1538 EndDialog(hwndDlg, FALSE);
1539 break;
1540 }
1541 else if (LOWORD(wParam) == IDC_OK)
1542 {
1543 pSettings = (TcpipDnsSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1544 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pSettings->szIP);
1545 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->szIP) == LB_ERR)
1546 {
1547 if (pSettings->bAdd)
1548 SendMessageW(pSettings->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)pSettings->szIP);
1549 EndDialog(hwndDlg, TRUE);
1550 break;
1551 }
1552 if (!pSettings->bAdd)
1553 {
1554 EndDialog(hwndDlg, FALSE);
1555 break;
1556 }
1557 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONERROR);
1558 break;
1559 }
1560 break;
1561 case WM_NOTIFY:
1562 lpnmipa = (LPNMIPADDRESS) lParam;
1563 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
1564 {
1565 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
1566 {
1567 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
1568 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE);
1569 }
1570 }
1571 break;
1572 }
1573 return FALSE;
1574 }
1575
1576
1577
1578 VOID
1579 InitializeTcpipAdvancedDNSDlg(
1580 HWND hwndDlg,
1581 TcpipConfNotifyImpl * This)
1582 {
1583 WCHAR szBuffer[200];
1584 LPWSTR pFirst, pSep, pList;
1585 IP_ADDR * pAddr;
1586 DWORD dwIpAddr;
1587
1588 /* insert DNS addresses */
1589 pAddr = This->pCurrentConfig->Ns;
1590 while(pAddr)
1591 {
1592 dwIpAddr = pAddr->IpAddress;
1593 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
1594 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
1595
1596 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_ADDSTRING, 0, (LPARAM)szBuffer);
1597 pAddr = pAddr->Next;
1598 }
1599 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, 0, 0);
1600
1601 if (!This->pCurrentConfig->pDNS)
1602 return;
1603
1604 if (This->pCurrentConfig->pDNS->RegisterAdapterName)
1605 SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1606 else
1607 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE);
1608
1609 if (This->pCurrentConfig->pDNS->RegistrationEnabled)
1610 SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1611
1612 if (This->pCurrentConfig->pDNS->szDomain[0])
1613 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)szBuffer);
1614
1615 if (This->pCurrentConfig->pDNS->UseDomainNameDevolution)
1616 SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1617
1618 if (!This->pCurrentConfig->pDNS->szSearchList || (wcslen(This->pCurrentConfig->pDNS->szSearchList) == 0))
1619 {
1620 SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1621 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE);
1622
1623 return;
1624 }
1625
1626 pList = This->pCurrentConfig->pDNS->szSearchList;
1627 if (wcslen(pList))
1628 {
1629 pFirst = pList;
1630 do
1631 {
1632 pSep = wcschr(pFirst, L',');
1633 if (pSep)
1634 {
1635 pSep[0] = L'\0';
1636 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst);
1637 pFirst = pSep + 1;
1638 pSep[0] = L',';
1639 }
1640 else
1641 {
1642 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst);
1643 break;
1644 }
1645 }while(TRUE);
1646
1647 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE);
1648 SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_SETCHECK, BST_CHECKED, 0);
1649 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, 0, 0);
1650 }
1651 }
1652
1653 VOID
1654 ToggleUpDown(HWND hwndDlg, HWND hDlgCtrl, UINT UpButton, UINT DownButton, UINT ModButton, UINT DelButton)
1655 {
1656 LRESULT lResult, lCount;
1657
1658 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1659 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1660 if (lResult != LB_ERR)
1661 {
1662 if (lResult == 0)
1663 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1664 else
1665 EnableWindow(GetDlgItem(hwndDlg, UpButton), TRUE);
1666
1667 if (lResult < lCount -1)
1668 EnableWindow(GetDlgItem(hwndDlg, DownButton), TRUE);
1669 else
1670 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1671 }
1672
1673 if (lCount)
1674 {
1675 EnableWindow(GetDlgItem(hwndDlg, ModButton), TRUE);
1676 EnableWindow(GetDlgItem(hwndDlg, DelButton), TRUE);
1677 }
1678 else
1679 {
1680 EnableWindow(GetDlgItem(hwndDlg, ModButton), FALSE);
1681 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE);
1682 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE);
1683 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE);
1684 }
1685 }
1686
1687 VOID
1688 MoveItem(
1689 HWND hDlgCtrl,
1690 INT pos)
1691 {
1692 WCHAR szBuffer[100];
1693 LRESULT lResult;
1694
1695 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1696 if (lResult != LB_ERR)
1697 {
1698 if (SendMessageW(hDlgCtrl, LB_GETTEXTLEN, (WPARAM)lResult, 0) < sizeof(szBuffer)/sizeof(WCHAR) - 1)
1699 {
1700 if (SendMessageW(hDlgCtrl, LB_GETTEXT, (WPARAM)lResult, (LPARAM)szBuffer) != LB_ERR)
1701 {
1702 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1703 SendMessageW(hDlgCtrl, LB_INSERTSTRING, (WPARAM)lResult + pos, (LPARAM)szBuffer);
1704 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult + pos, 0);
1705 }
1706 }
1707 }
1708 }
1709 VOID
1710 RemoveItem(
1711 HWND hDlgCtrl)
1712 {
1713 LRESULT lResult, lCount;
1714
1715 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0);
1716 if (lResult != LB_ERR)
1717 {
1718 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0);
1719 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1720 if (lResult + 1 < lCount)
1721 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult, 0);
1722 else
1723 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lCount-1, 0);
1724 }
1725 }
1726
1727 LPWSTR
1728 GetListViewEntries(
1729 HWND hDlgCtrl)
1730 {
1731 DWORD dwSize;
1732 INT iCount, iIndex;
1733 INT_PTR lResult;
1734 LPWSTR pszSearchList, pItem;
1735
1736 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1737 if (!iCount || iCount == LB_ERR)
1738 return NULL; //BUGBUG
1739
1740 dwSize = 0;
1741
1742 for (iIndex = 0; iIndex < iCount; iIndex++)
1743 {
1744 lResult = SendMessageW(hDlgCtrl, LB_GETTEXTLEN, iIndex, 0);
1745 if (lResult == LB_ERR)
1746 return NULL;
1747
1748 dwSize += lResult + 1;
1749 }
1750
1751 pszSearchList = (LPWSTR)CoTaskMemAlloc((dwSize + 1) * sizeof(WCHAR));
1752 if (!pszSearchList)
1753 return NULL;
1754
1755 pItem = pszSearchList;
1756 for (iIndex = 0; iIndex < iCount; iIndex++)
1757 {
1758 lResult = SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)pItem);
1759 if (lResult == LB_ERR)
1760 {
1761 CoTaskMemFree(pszSearchList);
1762 return NULL;
1763 }
1764 dwSize -= lResult + 1;
1765 pItem += wcslen(pItem);
1766 if (iIndex != iCount -1)
1767 {
1768 pItem[0] = L',';
1769 pItem++;
1770 }
1771 }
1772 pItem[0] = L'\0';
1773 return pszSearchList;
1774 }
1775
1776 VOID
1777 StoreDNSSettings(
1778 HWND hDlgCtrl,
1779 TcpipConfNotifyImpl *This)
1780 {
1781 INT iCount, iIndex;
1782 WCHAR Ip[16];
1783 IP_ADDR *pCur, *pLast;
1784
1785 FreeIPAddr(This->pCurrentConfig->Ns);
1786 This->pCurrentConfig->Ns = NULL;
1787
1788 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0);
1789 if (!iCount || iCount == LB_ERR)
1790 {
1791 return;
1792 }
1793
1794 pLast = NULL;
1795 for(iIndex = 0; iIndex < iCount; iIndex++)
1796 {
1797 if (SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)Ip) == LB_ERR)
1798 break;
1799
1800 pCur = CoTaskMemAlloc(sizeof(IP_ADDR));
1801 if (!pCur)
1802 break;
1803 ZeroMemory(pCur, sizeof(IP_ADDR));
1804 pCur->IpAddress = GetIpAddressFromStringW(Ip);
1805
1806 if (!pLast)
1807 This->pCurrentConfig->Ns = pCur;
1808 else
1809 pLast->Next = pCur;
1810
1811 pLast = pCur;
1812 pCur = pCur->Next;
1813 }
1814 This->pCurrentConfig->AutoconfigActive = FALSE;
1815 }
1816
1817 INT_PTR
1818 CALLBACK
1819 TcpipAdvancedDnsDlg(
1820 HWND hwndDlg,
1821 UINT uMsg,
1822 WPARAM wParam,
1823 LPARAM lParam
1824 )
1825 {
1826 TcpipConfNotifyImpl * This;
1827 LPPROPSHEETPAGE page;
1828 TcpipDnsSettings Dns;
1829 LRESULT lIndex, lLength;
1830 TcpipSuffixSettings Suffix;
1831 LPPSHNOTIFY lppsn;
1832 WCHAR szSuffix[100];
1833 WCHAR szFormat[200];
1834 WCHAR szBuffer[300];
1835
1836
1837 switch(uMsg)
1838 {
1839 case WM_INITDIALOG:
1840 page = (LPPROPSHEETPAGE)lParam;
1841 This = (TcpipConfNotifyImpl*)page->lParam;
1842 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This);
1843 InitializeTcpipAdvancedDNSDlg(hwndDlg, This);
1844 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1845 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1846 return TRUE;
1847 case WM_NOTIFY:
1848 lppsn = (LPPSHNOTIFY) lParam;
1849 if (lppsn->hdr.code == PSN_KILLACTIVE)
1850 {
1851 if (SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED &&
1852 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCOUNT, 0, 0) == 0)
1853 {
1854 DisplayError(IDS_NO_SUFFIX, IDS_TCPIP, MB_ICONWARNING);
1855 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1856 return TRUE;
1857 }
1858 if (SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, sizeof(szSuffix)/sizeof(WCHAR), (LPARAM)szSuffix))
1859 {
1860 szSuffix[(sizeof(szSuffix)/sizeof(WCHAR))-1] = L'\0';
1861 if (VerifyDNSSuffix(szSuffix) == FALSE)
1862 {
1863 if (LoadStringW(netcfgx_hInstance, IDS_DNS_SUFFIX, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1864 {
1865 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1866 swprintf(szBuffer, szFormat, szSuffix);
1867 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szFormat, sizeof(szFormat)/sizeof(WCHAR)))
1868 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0';
1869 else
1870 szFormat[0] = L'\0';
1871
1872 MessageBoxW(hwndDlg, szBuffer, szFormat, MB_ICONWARNING);
1873 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE);
1874 SetFocus(GetDlgItem(hwndDlg, IDC_SUFFIX));
1875 return TRUE;
1876 }
1877 }
1878 }
1879 }
1880 else if (lppsn->hdr.code == PSN_APPLY)
1881 {
1882 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
1883 if (!This->pCurrentConfig->pDNS)
1884 break;
1885
1886 StoreDNSSettings(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), This);
1887 if (SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1888 {
1889 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1890 This->pCurrentConfig->pDNS->szSearchList = NULL;
1891 if (SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1892 This->pCurrentConfig->pDNS->UseDomainNameDevolution = TRUE;
1893 else
1894 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1895 }
1896 else
1897 {
1898 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
1899 This->pCurrentConfig->pDNS->szSearchList = NULL;
1900 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE;
1901 This->pCurrentConfig->pDNS->szSearchList = GetListViewEntries(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1902 }
1903
1904 if (SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1905 {
1906 This->pCurrentConfig->pDNS->RegisterAdapterName = TRUE;
1907 if (SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED)
1908 This->pCurrentConfig->pDNS->RegistrationEnabled = TRUE;
1909 else
1910 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1911 }
1912 else
1913 {
1914 This->pCurrentConfig->pDNS->RegisterAdapterName = FALSE;
1915 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE;
1916 }
1917 }
1918 break;
1919 case WM_COMMAND:
1920 if (LOWORD(wParam) == IDC_DNSADDRLIST && HIWORD(wParam) == LBN_SELCHANGE)
1921 {
1922 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1923 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1924 break;
1925 }
1926 else if (LOWORD(wParam) == IDC_DNSSUFFIXLIST && HIWORD(wParam) == LBN_SELCHANGE)
1927 {
1928 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1929 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1930 break;
1931 }
1932 else if (LOWORD(wParam) == IDC_PRIMSUFFIX && HIWORD(wParam) == BN_CLICKED)
1933 {
1934 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1935 {
1936 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXUP), FALSE);
1937 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDOWN), FALSE);
1938 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE);
1939 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXMOD), FALSE);
1940 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDEL), FALSE);
1941 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), TRUE);
1942 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_RESETCONTENT, 0, 0);
1943 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1944 }
1945 }
1946 else if (LOWORD(wParam) == IDC_SELSUFFIX && HIWORD(wParam) == BN_CLICKED)
1947 {
1948 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1949 {
1950 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), TRUE);
1951 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE);
1952 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1953 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1954 }
1955 break;
1956 }
1957 else if (LOWORD(wParam) == IDC_REGSUFFIX && HIWORD(wParam) == BN_CLICKED)
1958 {
1959 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED)
1960 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), TRUE);
1961 else
1962 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE);
1963 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1964 }
1965 else if (LOWORD(wParam) == IDC_DNSADDRUP && HIWORD(wParam) == BN_CLICKED)
1966 {
1967 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), -1);
1968 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1969 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1970 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1971 break;
1972 }
1973 else if (LOWORD(wParam) == IDC_DNSADDRDOWN && HIWORD(wParam) == BN_CLICKED)
1974 {
1975 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), 1);
1976 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
1977 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
1978 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1979 break;
1980 }
1981 else if (LOWORD(wParam) == IDC_DNSSUFFIXUP && HIWORD(wParam) == BN_CLICKED)
1982 {
1983 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), -1);
1984 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1985 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1986 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1987 break;
1988 }
1989 else if (LOWORD(wParam) == IDC_DNSSUFFIXDOWN && HIWORD(wParam) == BN_CLICKED)
1990 {
1991 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), 1);
1992 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
1993 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
1994 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1995 break;
1996 }
1997 else if (LOWORD(wParam) == IDC_DNSADDRDEL && HIWORD(wParam) == BN_CLICKED)
1998 {
1999 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
2000 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
2001 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
2002 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2003 break;
2004 }
2005 else if (LOWORD(wParam) == IDC_DNSSUFFIXDEL && HIWORD(wParam) == BN_CLICKED)
2006 {
2007 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2008 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
2009 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2010 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2011 break;
2012 }
2013 else if (LOWORD(wParam) == IDC_DNSADDRADD && HIWORD(wParam) == BN_CLICKED)
2014 {
2015 Dns.bAdd = TRUE;
2016 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
2017 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns))
2018 {
2019 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL);
2020 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2021 }
2022 break;
2023 }
2024 else if (LOWORD(wParam) == IDC_DNSADDRMOD && HIWORD(wParam) == BN_CLICKED)
2025 {
2026 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSADDRLIST, LB_GETCURSEL, 0, 0);
2027 if (lIndex != LB_ERR)
2028 {
2029 Dns.bAdd = FALSE;
2030 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST);
2031 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_GETTEXT, (WPARAM)lIndex, (LPARAM)Dns.szIP);
2032 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns))
2033 {
2034 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_DELETESTRING, lIndex, 0);
2035 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_INSERTSTRING, lIndex, (LPARAM)Dns.szIP);
2036 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, lIndex, 0);
2037 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST));
2038 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2039 }
2040 }
2041 break;
2042 }
2043 else if (LOWORD(wParam) == IDC_DNSSUFFIXADD && HIWORD(wParam) == BN_CLICKED)
2044 {
2045 Suffix.bAdd = TRUE;
2046 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2047 Suffix.Suffix = NULL;
2048 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix))
2049 {
2050 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
2051 lIndex = SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)Suffix.Suffix);
2052 if (lIndex != LB_ERR)
2053 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0);
2054 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2055 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2056 CoTaskMemFree(Suffix.Suffix);
2057 }
2058 break;
2059 }
2060 else if (LOWORD(wParam) == IDC_DNSSUFFIXMOD && HIWORD(wParam) == BN_CLICKED)
2061 {
2062 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCURSEL, 0, 0);
2063 if (lIndex != LB_ERR)
2064 {
2065 Suffix.bAdd = FALSE;
2066 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST);
2067 lLength = SendMessageW(Suffix.hDlgCtrl, LB_GETTEXTLEN, lIndex, 0);
2068 if (lLength != LB_ERR)
2069 {
2070 Suffix.Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1) * sizeof(WCHAR));
2071 if (Suffix.Suffix)
2072 {
2073 SendMessageW(Suffix.hDlgCtrl, LB_GETTEXT, lIndex, (LPARAM)Suffix.Suffix);
2074 Suffix.Suffix[lLength] = L'\0';
2075 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix))
2076 {
2077 if (Suffix.Suffix)
2078 {
2079 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_DELETESTRING, lIndex, 0);
2080 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_INSERTSTRING, lIndex, (LPARAM)Suffix.Suffix);
2081 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0);
2082 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST));
2083 CoTaskMemFree(Suffix.Suffix);
2084 }
2085 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL);
2086 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2087 }
2088 }
2089 }
2090 }
2091 break;
2092 }
2093 }
2094 return FALSE;
2095 }
2096
2097 VOID
2098 LaunchAdvancedTcpipSettings(
2099 HWND hwndDlg,
2100 TcpipConfNotifyImpl * This)
2101 {
2102 PROPSHEETHEADERW pinfo;
2103 HPROPSHEETPAGE hppages[3];
2104 WCHAR szBuffer[100];
2105
2106 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVIP_DLG), TcpipAdvancedIpDlg, (LPARAM)This, NULL);
2107 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVDNS_DLG), TcpipAdvancedDnsDlg, (LPARAM)This, NULL);
2108 hppages[2] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVOPT_DLG), TcpipAdvancedOptDlg, (LPARAM)This, NULL);
2109
2110
2111 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
2112 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
2113 else
2114 szBuffer[0] = L'\0';
2115
2116 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW));
2117 pinfo.dwSize = sizeof(PROPSHEETHEADERW);
2118 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW;
2119 pinfo.u3.phpage = hppages;
2120 pinfo.nPages = 3;
2121 pinfo.hwndParent = hwndDlg;
2122 pinfo.pszCaption = szBuffer;
2123
2124 StoreTcpipBasicSettings(hwndDlg, This, FALSE);
2125 PropertySheetW(&pinfo);
2126
2127 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2128 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2129 }
2130
2131 INT_PTR
2132 CALLBACK
2133 TcpipAltConfDlg(
2134 HWND hwndDlg,
2135 UINT uMsg,
2136 WPARAM wParam,
2137 LPARAM lParam)
2138 {
2139 switch(uMsg)
2140 {
2141 case WM_INITDIALOG:
2142 return TRUE;
2143 }
2144 return FALSE;
2145 }
2146
2147 VOID
2148 AddAlternativeDialog(
2149 HWND hDlg,
2150 TcpipConfNotifyImpl * This)
2151 {
2152 HPROPSHEETPAGE hpage;
2153
2154 hpage = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL);
2155 if (!hpage)
2156 return;
2157
2158 SendMessageW(hDlg, PSM_INSERTPAGE, 1, (LPARAM)hpage);
2159 }
2160
2161 INT_PTR
2162 StoreTcpipBasicSettings(
2163 HWND hwndDlg,
2164 TcpipConfNotifyImpl * This,
2165 BOOL bApply)
2166 {
2167 DWORD dwIpAddr;
2168
2169 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2170 {
2171 This->pCurrentConfig->DhcpEnabled = FALSE;
2172 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2173 {
2174 if (bApply)
2175 {
2176 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING);
2177 SetFocus(GetDlgItem(hwndDlg, IDC_IPADDR));
2178 return E_FAIL;
2179 }
2180 }
2181 if (!This->pCurrentConfig->Ip)
2182 {
2183 This->pCurrentConfig->Ip = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2184 if (!This->pCurrentConfig->Ip)
2185 return E_OUTOFMEMORY;
2186 ZeroMemory(This->pCurrentConfig->Ip, sizeof(IP_ADDR));
2187 }
2188 This->pCurrentConfig->Ip->IpAddress = dwIpAddr;
2189
2190 if (SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4)
2191 {
2192 if (bApply)
2193 DisplayError(IDS_NO_SUBMASK_SET, IDS_TCPIP, MB_ICONWARNING);
2194 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2195 {
2196 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2197 dwIpAddr = MAKEIPADDRESS(255, 0, 0, 0);
2198 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2199 dwIpAddr = MAKEIPADDRESS(255, 255, 0, 0);
2200 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2201 dwIpAddr = MAKEIPADDRESS(255, 255, 255, 0);
2202
2203 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)dwIpAddr);
2204 }
2205 if (bApply)
2206 {
2207 SetFocus(GetDlgItem(hwndDlg, IDC_SUBNETMASK));
2208 return E_FAIL;
2209 }
2210 }
2211 /* store subnetmask */
2212 This->pCurrentConfig->Ip->u.Subnetmask = dwIpAddr;
2213
2214 if (SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2215 {
2216 if (!This->pCurrentConfig->Gw)
2217 {
2218 This->pCurrentConfig->Gw = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2219 if (!This->pCurrentConfig->Gw)
2220 return E_OUTOFMEMORY;
2221 ZeroMemory(This->pCurrentConfig->Gw, sizeof(IP_ADDR));
2222 }
2223 /* store default gateway */
2224 This->pCurrentConfig->Gw->IpAddress = dwIpAddr;
2225 }
2226 else
2227 {
2228 if (This->pCurrentConfig->Gw)
2229 {
2230 IP_ADDR * pNextGw = This->pCurrentConfig->Gw->Next;
2231 CoTaskMemFree(This->pCurrentConfig->Gw);
2232 This->pCurrentConfig->Gw = pNextGw;
2233 }
2234 }
2235 }
2236 else
2237 {
2238 This->pCurrentConfig->DhcpEnabled = TRUE;
2239 }
2240 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2241 {
2242 BOOL bSkip = FALSE;
2243 This->pCurrentConfig->AutoconfigActive = FALSE;
2244 if (SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2245 {
2246 if (!This->pCurrentConfig->Ns)
2247 {
2248 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2249 if (!This->pCurrentConfig->Ns)
2250 return E_OUTOFMEMORY;
2251 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2252 }
2253 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2254 }
2255 else if (This->pCurrentConfig->Ns)
2256 {
2257 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next;
2258
2259 CoTaskMemFree(This->pCurrentConfig->Ns);
2260 This->pCurrentConfig->Ns = pTemp;
2261 bSkip = TRUE;
2262 }
2263
2264
2265 if (SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2266 {
2267 if (!This->pCurrentConfig->Ns || bSkip)
2268 {
2269 if (!This->pCurrentConfig->Ns)
2270 {
2271 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2272 if (!This->pCurrentConfig->Ns)
2273 return E_OUTOFMEMORY;
2274 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR));
2275 }
2276 This->pCurrentConfig->Ns->IpAddress = dwIpAddr;
2277 }
2278 else if (!This->pCurrentConfig->Ns->Next)
2279 {
2280 This->pCurrentConfig->Ns->Next = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR));
2281 if (!This->pCurrentConfig->Ns->Next)
2282 return E_OUTOFMEMORY;
2283 ZeroMemory(This->pCurrentConfig->Ns->Next, sizeof(IP_ADDR));
2284 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2285 }
2286 else
2287 {
2288 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr;
2289 }
2290 }
2291 else
2292 {
2293 if (This->pCurrentConfig->Ns && This->pCurrentConfig->Ns->Next)
2294 {
2295 if (This->pCurrentConfig->Ns->Next->Next)
2296 {
2297 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next->Next;
2298 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2299 This->pCurrentConfig->Ns->Next = pTemp;
2300 }
2301 else
2302 {
2303 CoTaskMemFree(This->pCurrentConfig->Ns->Next);
2304 This->pCurrentConfig->Ns->Next = NULL;
2305 }
2306 }
2307 }
2308 }
2309 else
2310 {
2311 This->pCurrentConfig->AutoconfigActive = TRUE;
2312 }
2313 return S_OK;
2314 }
2315
2316 HRESULT
2317 InitializeTcpipBasicDlgCtrls(
2318 HWND hwndDlg,
2319 TcpipSettings * pCurSettings)
2320 {
2321 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2322 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2323 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2324 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2325
2326 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255));
2327 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2328 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2329 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2330
2331 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2332 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2333 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2334 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2335
2336 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2337 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2338 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2339 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2340
2341 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223));
2342 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255));
2343 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255));
2344 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255));
2345
2346 if (pCurSettings->DhcpEnabled)
2347 {
2348 SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_SETCHECK, BST_CHECKED, 0);
2349 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE);
2350 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE);
2351 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE);
2352 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE);
2353 }
2354 else
2355 {
2356 SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_SETCHECK, BST_CHECKED, 0);
2357
2358 if (pCurSettings->Ip)
2359 {
2360 /* set current ip address */
2361 SendDlgItemMessageA(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->IpAddress);
2362 /* set current hostmask */
2363 SendDlgItemMessageA(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->u.Subnetmask);
2364 }
2365 if (pCurSettings->Gw && pCurSettings->Gw->IpAddress)
2366 {
2367 /* set current gateway */
2368 SendDlgItemMessageA(hwndDlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Gw->IpAddress);
2369 }
2370 }
2371 if (pCurSettings->AutoconfigActive)
2372 {
2373 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_CHECKED, 0);
2374 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE);
2375 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE);
2376 }
2377 else
2378 {
2379 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0);
2380 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2381 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2382 if (pCurSettings->Ns)
2383 {
2384 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress);
2385 if (pCurSettings->Ns->Next)
2386 {
2387 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->Next->IpAddress);
2388 }
2389 else
2390 {
2391 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2392 }
2393 }
2394 else
2395 {
2396 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
2397 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2398 }
2399 }
2400
2401 return S_OK;
2402 }
2403
2404 HRESULT
2405 CopyIpAddrString(
2406 IP_ADDR_STRING * pSrc,
2407 IP_ADDR ** pTarget,
2408 COPY_TYPE Type,
2409 LPWSTR szMetric)
2410 {
2411 IP_ADDR_STRING * pCurrent;
2412 IP_ADDR *pNew, *pLast;
2413
2414 pCurrent = pSrc;
2415 pLast = NULL;
2416
2417 while(pCurrent)
2418 {
2419 pNew = CoTaskMemAlloc(sizeof(IP_ADDR));
2420 if (!pNew)
2421 {
2422 break;
2423 }
2424 ZeroMemory(pNew, sizeof(IP_ADDR));
2425 pNew->IpAddress = GetIpAddressFromStringA(pCurrent->IpAddress.String);
2426 if (!pNew->IpAddress)
2427 {
2428 CoTaskMemFree(pNew);
2429 return E_FAIL;
2430 }
2431
2432 if (Type == SUBMASK)
2433 {
2434 pNew->u.Subnetmask = GetIpAddressFromStringA(pCurrent->IpMask.String);
2435 pNew->NTEContext = pCurrent->Context;
2436 }
2437 else if (Type == METRIC)
2438 {
2439 if (szMetric && szMetric[0] != L'\0')
2440 {
2441 pNew->u.Metric = _wtoi(szMetric);
2442 szMetric += wcslen(szMetric) + 1;
2443 }
2444 }
2445
2446 if (!pLast)
2447 *pTarget = pNew;
2448 else
2449 pLast->Next = pNew;
2450
2451 pLast = pNew;
2452 pCurrent = pCurrent->Next;
2453
2454 }
2455 pLast->Next = NULL;
2456 return S_OK;
2457 }
2458
2459
2460
2461 INT_PTR
2462 CALLBACK
2463 TcpipBasicDlg(
2464 HWND hwndDlg,
2465 UINT uMsg,
2466 WPARAM wParam,
2467 LPARAM lParam
2468 )
2469 {
2470 TcpipConfNotifyImpl * This;
2471 LPPROPSHEETPAGE page;
2472 LPNMIPADDRESS lpnmipa;
2473 LPPSHNOTIFY lppsn;
2474 DWORD dwIpAddr;
2475
2476
2477 switch(uMsg)
2478 {
2479 case WM_INITDIALOG:
2480 page = (LPPROPSHEETPAGE)lParam;
2481 This = (TcpipConfNotifyImpl*)page->lParam;
2482 if (This->pCurrentConfig)
2483 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig);
2484 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This);
2485 return TRUE;
2486 case WM_NOTIFY:
2487 lppsn = (LPPSHNOTIFY) lParam;
2488 lpnmipa = (LPNMIPADDRESS) lParam;
2489 if (lpnmipa->hdr.code == IPN_FIELDCHANGED)
2490 {
2491 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2492 if (lpnmipa->hdr.idFrom == IDC_IPADDR)
2493 {
2494 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4)
2495 {
2496 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255))
2497 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0));
2498 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255))
2499 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0));
2500 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255))
2501 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0));
2502 }
2503 }
2504 }
2505 else if (lppsn->hdr.code == PSN_APPLY)
2506 {
2507 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER);
2508 if (SUCCEEDED(StoreTcpipBasicSettings(hwndDlg, This, TRUE)))
2509 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
2510 else
2511 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_INVALID);
2512
2513 return TRUE;
2514 }
2515 break;
2516 case WM_COMMAND:
2517 if (HIWORD(wParam) == BN_CLICKED)
2518 {
2519 switch (LOWORD(wParam))
2520 {
2521 case IDC_USEDHCP:
2522 if (SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2523 {
2524 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2525 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_CLEARADDRESS, 0, 0);
2526 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_CLEARADDRESS, 0, 0);
2527 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_CLEARADDRESS, 0, 0);
2528 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE);
2529 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE);
2530 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE);
2531 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE);
2532 AddAlternativeDialog(GetParent(hwndDlg), (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER));
2533 }
2534 break;
2535 case IDC_NODHCP:
2536 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED)
2537 {
2538 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2539 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), TRUE);
2540 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), TRUE);
2541 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), TRUE);
2542 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2543 {
2544 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_UNCHECKED, 0);
2545 }
2546 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), FALSE);
2547 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0);
2548 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2549 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2550 SendMessageW(GetParent(hwndDlg), PSM_REMOVEPAGE, 1, 0);
2551 }
2552 break;
2553 case IDC_AUTODNS:
2554 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2555 {
2556 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2557 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
2558 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
2559 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE);
2560 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE);
2561 }
2562 break;
2563 case IDC_FIXEDDNS:
2564 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED)
2565 {
2566 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
2567 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE);
2568 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE);
2569 }
2570 break;
2571 case IDC_ADVANCED:
2572 LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER));
2573 break;
2574 }
2575 break;
2576 }
2577 default:
2578 break;
2579
2580 }
2581 return FALSE;
2582 }
2583
2584 /***************************************************************
2585 * INetCfgComponentPropertyUi interface
2586 */
2587
2588 HRESULT
2589 WINAPI
2590 INetCfgComponentPropertyUi_fnQueryInterface(
2591 INetCfgComponentPropertyUi * iface,
2592 REFIID iid,
2593 LPVOID * ppvObj)
2594 {
2595 //LPOLESTR pStr;
2596 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2597
2598 *ppvObj = NULL;
2599
2600
2601 if (IsEqualIID (iid, &IID_IUnknown) ||
2602 IsEqualIID (iid, &IID_INetCfgComponentPropertyUi))
2603 {
2604 *ppvObj = This;
2605 INetCfgComponentPropertyUi_AddRef(iface);
2606 return S_OK;
2607 }
2608 else if (IsEqualIID(iid, &IID_INetCfgComponentControl))
2609 {
2610 *ppvObj = (LPVOID*)&This->lpVtblCompControl;
2611 INetCfgComponentPropertyUi_AddRef(iface);
2612 return S_OK;
2613 }
2614
2615 //StringFromCLSID(iid, &pStr);
2616 //MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK);
2617 //CoTaskMemFree(pStr);
2618
2619 return E_NOINTERFACE;
2620 }
2621
2622
2623 ULONG
2624 WINAPI
2625 INetCfgComponentPropertyUi_fnAddRef(
2626 INetCfgComponentPropertyUi * iface)
2627 {
2628 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2629 ULONG refCount = InterlockedIncrement(&This->ref);
2630
2631 return refCount;
2632 }
2633
2634 ULONG
2635 WINAPI
2636 INetCfgComponentPropertyUi_fnRelease(
2637 INetCfgComponentPropertyUi * iface)
2638 {
2639 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2640 ULONG refCount = InterlockedDecrement(&This->ref);
2641
2642 if (!refCount)
2643 {
2644 CoTaskMemFree(This);
2645 }
2646 return refCount;
2647 }
2648
2649 HRESULT
2650 WINAPI
2651 INetCfgComponentPropertyUi_fnQueryPropertyUi(
2652 INetCfgComponentPropertyUi * iface,
2653 IUnknown *pUnkReserved)
2654 {
2655 INetLanConnectionUiInfo * pLanInfo;
2656 HRESULT hr;
2657 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2658
2659 hr = IUnknown_QueryInterface(pUnkReserved, &IID_INetLanConnectionUiInfo, (LPVOID*)&pLanInfo);
2660 if (FAILED(hr))
2661 return hr;
2662
2663 INetLanConnectionUiInfo_GetDeviceGuid(pLanInfo, &This->NetCfgInstanceId);
2664
2665 //FIXME
2666 // check if tcpip is enabled on that binding */
2667 IUnknown_Release(pUnkReserved);
2668 return S_OK;
2669 }
2670
2671 HRESULT
2672 WINAPI
2673 INetCfgComponentPropertyUi_fnSetContext(
2674 INetCfgComponentPropertyUi * iface,
2675 IUnknown *pUnkReserved)
2676 {
2677 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2678
2679 if (!iface || !pUnkReserved)
2680 return E_POINTER;
2681
2682 This->pUnknown = pUnkReserved;
2683 return S_OK;
2684 }
2685
2686 HRESULT
2687 LoadDNSSettings(
2688 TcpipConfNotifyImpl * This)
2689 {
2690 LPOLESTR pStr;
2691 WCHAR szBuffer[200];
2692 HKEY hKey;
2693 DWORD dwSize;
2694
2695
2696 This->pCurrentConfig->pDNS = (TcpipAdvancedDNSDlgSettings*) CoTaskMemAlloc(sizeof(TcpipAdvancedDNSDlgSettings));
2697 if (!This->pCurrentConfig->pDNS)
2698 return E_FAIL;
2699
2700 ZeroMemory(This->pCurrentConfig->pDNS, sizeof(TcpipAdvancedDNSDlgSettings));
2701
2702 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
2703 return E_FAIL;
2704
2705 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
2706 CoTaskMemFree(pStr);
2707 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2708 {
2709 dwSize = sizeof(DWORD);
2710 RegQueryValueExW(hKey, L"RegisterAdapterName", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, &dwSize);
2711 RegQueryValueExW(hKey, L"RegistrationEnabled", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, &dwSize);
2712
2713 dwSize = sizeof(This->pCurrentConfig->pDNS->szDomain) / sizeof(WCHAR);
2714 RegQueryValueExW(hKey, L"Domain", NULL, NULL, (LPBYTE)szBuffer, &dwSize);
2715
2716 RegCloseKey(hKey);
2717 }
2718
2719 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2720 {
2721 dwSize = sizeof(DWORD);
2722 RegQueryValueExW(hKey, L"UseDomainNameDevolution", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->UseDomainNameDevolution, &dwSize);
2723
2724 dwSize = 0;
2725 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS)
2726 {
2727 This->pCurrentConfig->pDNS->szSearchList = (LPWSTR)CoTaskMemAlloc(dwSize);
2728 if (This->pCurrentConfig->pDNS->szSearchList)
2729 {
2730 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, (LPBYTE)This->pCurrentConfig->pDNS->szSearchList, &dwSize) != ERROR_SUCCESS)
2731 {
2732 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList);
2733 This->pCurrentConfig->pDNS->szSearchList = NULL;
2734 }
2735 }
2736 }
2737 RegCloseKey(hKey);
2738 }
2739 return S_OK;
2740 }
2741
2742 LPWSTR
2743 LoadTcpFilterSettingsFromRegistry(HKEY hKey, LPCWSTR szName, LPDWORD Size)
2744 {
2745 DWORD dwSize;
2746 LPWSTR pData;
2747
2748 if (RegQueryValueExW(hKey, szName, NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS)
2749 return NULL;
2750
2751 pData = (LPWSTR)CoTaskMemAlloc(dwSize);
2752 if (!pData)
2753 return NULL;
2754
2755 if (RegQueryValueExW(hKey, szName, NULL, NULL, (LPBYTE)pData, &dwSize) != ERROR_SUCCESS)
2756 {
2757 CoTaskMemFree(pData);
2758 return NULL;
2759 }
2760 *Size = dwSize;
2761 return pData;
2762 }
2763
2764 HRESULT
2765 LoadFilterSettings(
2766 TcpipConfNotifyImpl * This)
2767 {
2768 HKEY hKey;
2769 TcpFilterSettings *pFilter;
2770 WCHAR szBuffer[200];
2771 LPOLESTR pStr;
2772 DWORD dwVal, dwSize;
2773
2774 pFilter = (TcpFilterSettings*)CoTaskMemAlloc(sizeof(TcpFilterSettings));
2775 if (!pFilter)
2776 return E_FAIL;
2777
2778 ZeroMemory(pFilter, sizeof(TcpFilterSettings));
2779 This->pCurrentConfig->pFilter = pFilter;
2780
2781
2782 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
2783 {
2784 dwSize = sizeof(DWORD);
2785 if (RegQueryValueExW(hKey, L"EnableSecurityFilters", NULL, NULL, (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS)
2786 pFilter->EnableSecurityFilters = dwVal;
2787 RegCloseKey(hKey);
2788 }
2789 else
2790 {
2791 pFilter->EnableSecurityFilters = FALSE;
2792 }
2793
2794 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
2795 return E_FAIL;
2796
2797 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
2798 CoTaskMemFree(pStr);
2799 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
2800 {
2801 return S_OK;
2802 }
2803 pFilter->szTCPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"TCPAllowedPorts", &pFilter->TCPSize);
2804 pFilter->szUDPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"UDPAllowedPorts", &pFilter->UDPSize);
2805 pFilter->szRawIPAllowedProtocols = LoadTcpFilterSettingsFromRegistry(hKey, L"RawIPAllowedProtocols", &pFilter->IPSize);
2806 RegCloseKey(hKey);
2807 return S_OK;
2808 }
2809
2810
2811 HRESULT
2812 Initialize(TcpipConfNotifyImpl * This)
2813 {
2814 DWORD dwSize, Status;
2815 WCHAR szBuffer[50];
2816 IP_ADAPTER_INFO * pCurrentAdapter;
2817 IP_ADAPTER_INFO * pInfo;
2818 PIP_PER_ADAPTER_INFO pPerInfo;
2819 IP_PER_ADAPTER_INFO Info;
2820 LPOLESTR pStr;
2821 HRESULT hr;
2822 BOOL bFound;
2823 TcpipSettings * pCurSettings;
2824 ULONG uLength;
2825
2826 if (This->pCurrentConfig)
2827 return S_OK;
2828
2829 hr = StringFromCLSID(&This->NetCfgInstanceId, &pStr);
2830 if (FAILED(hr))
2831 return hr;
2832
2833
2834 dwSize = 0;
2835 if (GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW)
2836 {
2837 CoTaskMemFree(pStr);
2838 return E_FAIL;
2839 }
2840
2841 pInfo = CoTaskMemAlloc(dwSize);
2842 if (!pInfo)
2843 {
2844 CoTaskMemFree(pStr);
2845 return E_FAIL;
2846 }
2847
2848 if (GetAdaptersInfo(pInfo, &dwSize) != ERROR_SUCCESS)
2849 {
2850 CoTaskMemFree(pStr);
2851 CoTaskMemFree(pInfo);
2852 return E_FAIL;
2853 }
2854
2855 pCurrentAdapter = pInfo;
2856 bFound = FALSE;
2857 while(pCurrentAdapter)
2858 {
2859 szBuffer[0] = L'\0';
2860 if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0])))
2861 {
2862 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
2863 }
2864 if (!_wcsicmp(szBuffer, pStr))
2865 {
2866 bFound = TRUE;
2867 break;
2868 }
2869 pCurrentAdapter = pCurrentAdapter->Next;
2870 }
2871 CoTaskMemFree(pStr);
2872
2873 if (!bFound)
2874 {
2875 CoTaskMemFree(pInfo);
2876 return E_FAIL;
2877 }
2878
2879 pCurSettings = CoTaskMemAlloc(sizeof(TcpipSettings));
2880 if (!pCurSettings)
2881 {
2882 CoTaskMemFree(pInfo);
2883 return E_FAIL;
2884 }
2885
2886 ZeroMemory(pCurSettings, sizeof(TcpipSettings));
2887 This->pCurrentConfig = pCurSettings;
2888 pCurSettings->DhcpEnabled = pCurrentAdapter->DhcpEnabled;
2889 pCurSettings->Index = pCurrentAdapter->Index;
2890
2891 if (!pCurrentAdapter->DhcpEnabled)
2892 {
2893 CopyIpAddrString(&pCurrentAdapter->IpAddressList, &pCurSettings->Ip, SUBMASK, NULL);
2894 CopyIpAddrString(&pCurrentAdapter->GatewayList, &pCurSettings->Gw, METRIC, NULL); //FIXME
2895 }
2896
2897 uLength = sizeof(IP_PER_ADAPTER_INFO);
2898 ZeroMemory(&Info, sizeof(IP_PER_ADAPTER_INFO));
2899
2900 if (GetPerAdapterInfo(pCurrentAdapter->Index, &Info, &uLength) == ERROR_BUFFER_OVERFLOW)
2901 {
2902 pPerInfo = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(uLength);
2903 if (pPerInfo)
2904 {
2905 Status = GetPerAdapterInfo(pCurrentAdapter->Index, pPerInfo, &uLength);
2906 if (Status == NOERROR)
2907 {
2908 if (!pPerInfo->AutoconfigActive)
2909 {
2910 CopyIpAddrString(&pPerInfo->DnsServerList, &pCurSettings->Ns, IPADDR, NULL);
2911 }
2912 pCurSettings->AutoconfigActive = pPerInfo->AutoconfigActive;
2913 }
2914 CoTaskMemFree(pPerInfo);
2915 }
2916 }
2917 else
2918 {
2919 if (!Info.AutoconfigActive)
2920 {
2921 CopyIpAddrString(&Info.DnsServerList, &pCurSettings->Ns, IPADDR, NULL);
2922 }
2923 pCurSettings->AutoconfigActive = Info.AutoconfigActive;
2924 }
2925
2926 if (FAILED(LoadFilterSettings(This)))
2927 return E_FAIL;
2928
2929 if (FAILED(LoadDNSSettings(This)))
2930 return E_FAIL;
2931
2932 CoTaskMemFree(pInfo);
2933
2934 return S_OK;
2935 }
2936
2937 HRESULT
2938 WINAPI
2939 INetCfgComponentPropertyUi_fnMergePropPages(
2940 INetCfgComponentPropertyUi * iface,
2941 DWORD *pdwDefPages,
2942 BYTE **pahpspPrivate,
2943 UINT *pcPages,
2944 HWND hwndParent,
2945 LPCWSTR *pszStartPage)
2946 {
2947 HPROPSHEETPAGE * hppages;
2948 UINT NumPages;
2949 HRESULT hr;
2950 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface;
2951
2952 hr = Initialize(This);
2953 if (FAILED(hr))
2954 return hr;
2955
2956 if (This->pCurrentConfig->DhcpEnabled)
2957 NumPages = 2;
2958 else
2959 NumPages = 1;
2960
2961 hppages = (HPROPSHEETPAGE*) CoTaskMemAlloc(sizeof(HPROPSHEETPAGE) * NumPages);
2962 if (!hppages)
2963 return E_FAIL;
2964
2965 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_BASIC_DLG), TcpipBasicDlg, (LPARAM)This, NULL);
2966 if (!hppages[0])
2967 {
2968 CoTaskMemFree(hppages);
2969 return E_FAIL;
2970 }
2971 if (NumPages == 2)
2972 {
2973 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL);
2974 if (!hppages[1])
2975 {
2976 DestroyPropertySheetPage(hppages[0]);
2977 CoTaskMemFree(hppages);
2978 return E_FAIL;
2979 }
2980 }
2981
2982 *pahpspPrivate = (BYTE*)hppages;
2983 *pcPages = NumPages;
2984
2985 return S_OK;
2986 }
2987
2988 HRESULT
2989 WINAPI
2990 INetCfgComponentPropertyUi_fnValidateProperties(
2991 INetCfgComponentPropertyUi * iface,
2992 HWND hwndDlg)
2993 {
2994 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnValidateProperties", NULL, MB_OK);
2995 return S_OK;
2996 }
2997
2998 HRESULT
2999 WINAPI
3000 INetCfgComponentPropertyUi_fnApplyProperties(
3001 INetCfgComponentPropertyUi * iface)
3002 {
3003 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnApplyProperties", NULL, MB_OK);
3004 return S_OK;
3005 }
3006
3007
3008 HRESULT
3009 WINAPI
3010 INetCfgComponentPropertyUi_fnCancelProperties(
3011 INetCfgComponentPropertyUi * iface)
3012 {
3013 //MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnCancelProperties", NULL, MB_OK);
3014 return S_OK;
3015 }
3016
3017 static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi =
3018 {
3019 INetCfgComponentPropertyUi_fnQueryInterface,
3020 INetCfgComponentPropertyUi_fnAddRef,
3021 INetCfgComponentPropertyUi_fnRelease,
3022 INetCfgComponentPropertyUi_fnQueryPropertyUi,
3023 INetCfgComponentPropertyUi_fnSetContext,
3024 INetCfgComponentPropertyUi_fnMergePropPages,
3025 INetCfgComponentPropertyUi_fnValidateProperties,
3026 INetCfgComponentPropertyUi_fnApplyProperties,
3027 INetCfgComponentPropertyUi_fnCancelProperties
3028 };
3029
3030 /***************************************************************
3031 * INetCfgComponentControl interface
3032 */
3033
3034 HRESULT
3035 WINAPI
3036 INetCfgComponentControl_fnQueryInterface(
3037 INetCfgComponentControl * iface,
3038 REFIID iid,
3039 LPVOID * ppvObj)
3040 {
3041 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3042 return INetCfgComponentPropertyUi_QueryInterface((INetCfgComponentPropertyUi*)This, iid, ppvObj);
3043 }
3044
3045 ULONG
3046 WINAPI
3047 INetCfgComponentControl_fnAddRef(
3048 INetCfgComponentControl * iface)
3049 {
3050 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3051 return INetCfgComponentPropertyUi_AddRef((INetCfgComponentPropertyUi*)This);
3052 }
3053
3054 ULONG
3055 WINAPI
3056 INetCfgComponentControl_fnRelease(
3057 INetCfgComponentControl * iface)
3058 {
3059 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3060 return INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3061 }
3062
3063 HRESULT
3064 WINAPI
3065 INetCfgComponentControl_fnInitialize(
3066 INetCfgComponentControl * iface,
3067 INetCfgComponent *pIComp,
3068 INetCfg *pINetCfg,
3069 BOOL fInstalling)
3070 {
3071 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3072
3073 This->pNCfg = pINetCfg;
3074 This->pNComp = pIComp;
3075
3076 return S_OK;
3077 }
3078
3079 static
3080 LPWSTR
3081 CreateMultiSzString(IP_ADDR * pAddr, COPY_TYPE Type, LPDWORD Size, BOOL bComma)
3082 {
3083 LPWSTR pStr, pRet;
3084 DWORD dwSize, dwIpAddr;
3085 WCHAR szBuffer[30];
3086 IP_ADDR *pTemp = pAddr;
3087
3088
3089 dwSize = 0;
3090 while(pTemp)
3091 {
3092 if (Type == IPADDR)
3093 {
3094 dwIpAddr = pTemp->IpAddress;
3095 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3096 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3097 }else if (Type == SUBMASK)
3098 {
3099 dwIpAddr = pTemp->u.Subnetmask;
3100 swprintf(szBuffer, L"%lu.%lu.%lu.%lu",
3101 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3102 }
3103 else if (Type == METRIC)
3104 {
3105 swprintf(szBuffer, L"%u", pTemp->u.Metric);
3106 }
3107
3108 dwSize += wcslen(szBuffer) + 1;
3109 pTemp = pTemp->Next;
3110 }
3111
3112 if (!dwSize)
3113 return NULL;
3114
3115 pStr = pRet = CoTaskMemAlloc((dwSize+1) * sizeof(WCHAR));
3116 if(!pStr)
3117 return NULL;
3118
3119 pTemp = pAddr;
3120 while(pTemp)
3121 {
3122 if (Type == IPADDR)
3123 {
3124 dwIpAddr = pTemp->IpAddress;
3125 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3126 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3127 }else if (Type == SUBMASK)
3128 {
3129 dwIpAddr = pTemp->u.Subnetmask;
3130 swprintf(pStr, L"%lu.%lu.%lu.%lu",
3131 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr));
3132 }
3133 else if (Type == METRIC)
3134 {
3135 swprintf(pStr, L"%u", pTemp->u.Metric);
3136 }
3137
3138 if (bComma)
3139 {
3140 pStr += wcslen(pStr);
3141 if (pTemp->Next)
3142 {
3143 pStr[0] = L',';
3144 pStr++;
3145 }
3146 }
3147 else
3148 {
3149 pStr += wcslen(pStr) + 1;
3150 }
3151 pTemp = pTemp->Next;
3152 }
3153 pStr[0] = L'\0';
3154 *Size = (dwSize+1) * sizeof(WCHAR);
3155 return pRet;
3156 }
3157
3158
3159 HRESULT
3160 WINAPI
3161 INetCfgComponentControl_fnApplyRegistryChanges(
3162 INetCfgComponentControl * iface)
3163 {
3164 HKEY hKey;
3165 LPOLESTR pStr;
3166 DWORD dwSize;
3167 WCHAR szBuffer[200];
3168 TcpipSettings * pCurrentConfig, *pOldConfig;
3169 ULONG NTEInstance;
3170 DWORD DhcpApiVersion;
3171
3172 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
3173
3174 pCurrentConfig = This->pCurrentConfig;
3175 This->pCurrentConfig = NULL;
3176
3177 if (FAILED(Initialize(This)))
3178 {
3179 This->pCurrentConfig = pCurrentConfig;
3180 return E_FAIL;
3181 }
3182 pOldConfig = This->pCurrentConfig;
3183 This->pCurrentConfig = pCurrentConfig;
3184
3185 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyRegistryChanges", NULL, MB_OK);
3186
3187
3188 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
3189 {
3190 if (pCurrentConfig->pDNS)
3191 {
3192 RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD));
3193 RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)pCurrentConfig->pDNS->szSearchList,
3194 (wcslen(pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR));
3195 }
3196 if (pCurrentConfig->pFilter)
3197 {
3198 RegSetValueExW(hKey, L"EnableSecurityFilters", 0, REG_DWORD,
3199 (LPBYTE)&pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD));
3200 }
3201 RegCloseKey(hKey);
3202 }
3203
3204 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr)))
3205 return E_FAIL;
3206
3207 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr);
3208 CoTaskMemFree(pStr);
3209
3210 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS)
3211 {
3212 if (pCurrentConfig->pDNS)
3213 {
3214 RegSetValueExW(hKey, L"RegisterAdapterName", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, sizeof(DWORD));
3215 RegSetValueExW(hKey, L"RegistrationEnabled", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, sizeof(DWORD));
3216 RegSetValueExW(hKey, L"Domain", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szDomain,
3217 (wcslen(This->pCurrentConfig->pDNS->szDomain)+1) * sizeof(WCHAR));
3218 }
3219 #if 0
3220 if (pCurrentConfig->pFilter)
3221 {
3222 if (pCurrentConfig->pFilter->szTCPAllowedPorts)
3223 {
3224 RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ,
3225 (LPBYTE)pCurrentConfig->pFilter->szTCPAllowedPorts,
3226 pCurrentConfig->pFilter->TCPSize);
3227 }
3228 if (pCurrentConfig->pFilter->szUDPAllowedPorts)
3229 {
3230 RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ,
3231 (LPBYTE)pCurrentConfig->pFilter->szUDPAllowedPorts,
3232 pCurrentConfig->pFilter->UDPSize);
3233 }
3234 if (pCurrentConfig->pFilter->szRawIPAllowedProtocols)
3235 {
3236 RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ,
3237 (LPBYTE)pCurrentConfig->pFilter->szRawIPAllowedProtocols,
3238 pCurrentConfig->pFilter->IPSize);
3239 }
3240 }
3241 #endif
3242 RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->DhcpEnabled, sizeof(DWORD));
3243 if (pCurrentConfig->DhcpEnabled)
3244 {
3245 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3246 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR));
3247 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
3248 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
3249 if (!pOldConfig->DhcpEnabled)
3250 {
3251 /* Delete this adapter's current IP address */
3252 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3253
3254 /* Delete all default routes for this adapter */
3255 dwSize = 0;
3256 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
3257 {
3258 DWORD Index;
3259 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
3260 if (pIpForwardTable)
3261 {
3262 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3263 {
3264 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3265 {
3266 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3267 pIpForwardTable->table[Index].dwForwardDest == 0)
3268 {
3269 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3270 }
3271 }
3272 }
3273 CoTaskMemFree(pIpForwardTable);
3274 }
3275 }
3276 }
3277 }
3278 else
3279 {
3280 /* Open the DHCP API if DHCP is enabled */
3281 if (pOldConfig->DhcpEnabled && DhcpCApiInitialize(&DhcpApiVersion) == NO_ERROR)
3282 {
3283 /* We have to tell DHCP about this */
3284 DhcpStaticRefreshParams(pCurrentConfig->Index,
3285 htonl(pCurrentConfig->Ip->IpAddress),
3286 htonl(pCurrentConfig->Ip->u.Subnetmask));
3287
3288 /* Close the API */
3289 DhcpCApiCleanup();
3290 }
3291 else
3292 {
3293 /* Delete this adapter's current static IP address */
3294 DeleteIPAddress(pOldConfig->Ip->NTEContext);
3295
3296 /* Add the static IP address via the standard IPHLPAPI function */
3297 AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress),
3298 htonl(pCurrentConfig->Ip->u.Subnetmask),
3299 pCurrentConfig->Index,
3300 &pCurrentConfig->Ip->NTEContext,
3301 &NTEInstance);
3302 }
3303
3304 pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
3305 if(pStr)
3306 {
3307 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3308 CoTaskMemFree(pStr);
3309 }
3310
3311 pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
3312 if(pStr)
3313 {
3314 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3315 CoTaskMemFree(pStr);
3316 }
3317
3318 /* Delete all default routes for this adapter */
3319 dwSize = 0;
3320 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
3321 {
3322 DWORD Index;
3323 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
3324 if (pIpForwardTable)
3325 {
3326 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
3327 {
3328 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
3329 {
3330 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
3331 pIpForwardTable->table[Index].dwForwardDest == 0)
3332 {
3333 DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
3334 }
3335 }
3336 }
3337 CoTaskMemFree(pIpForwardTable);
3338 }
3339 }
3340
3341 if (pCurrentConfig->Gw)
3342 {
3343 MIB_IPFORWARDROW RouterMib;
3344 ZeroMemory(&RouterMib, sizeof(MIB_IPFORWARDROW));
3345
3346 RouterMib.dwForwardMetric1 = 1;
3347 RouterMib.dwForwardIfIndex = pOldConfig->Index;
3348 RouterMib.dwForwardNextHop = htonl(pCurrentConfig->Gw->IpAddress);
3349
3350 //TODO
3351 // add multiple gw addresses when required
3352
3353 if (CreateIpForwardEntry(&RouterMib) == NO_ERROR)
3354 {
3355 pStr = CreateMultiSzString(pCurrentConfig->Gw, IPADDR, &dwSize, FALSE);
3356 if(pStr)
3357 {
3358 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3359 CoTaskMemFree(pStr);
3360 }
3361
3362 pStr = CreateMultiSzString(pCurrentConfig->Gw, METRIC, &dwSize, FALSE);
3363 if(pStr)
3364 {
3365 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
3366 CoTaskMemFree(pStr);
3367 }
3368 }
3369 }
3370 else
3371 {
3372 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR));
3373 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2);
3374 }
3375 }
3376
3377 if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive)
3378 {
3379 RegDeleteValueW(hKey, L"NameServer");
3380 }
3381 else
3382 {
3383 pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE);
3384 if(pStr)
3385 {
3386 RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize);
3387 //RegDeleteValueW(hKey, L"DhcpNameServer");
3388 CoTaskMemFree(pStr);
3389 }
3390 }
3391
3392 RegCloseKey(hKey);
3393 }
3394 return S_OK;
3395 }
3396
3397 HRESULT
3398 WINAPI
3399 INetCfgComponentControl_fnApplyPnpChanges(
3400 INetCfgComponentControl * iface,
3401 INetCfgPnpReconfigCallback *pICallback)
3402 {
3403 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyPnpChanges", NULL, MB_OK);
3404 return S_OK;
3405 }
3406
3407 HRESULT
3408 WINAPI
3409 INetCfgComponentControl_fnCancelChanges(
3410 INetCfgComponentControl * iface)
3411 {
3412 //MessageBoxW(NULL, L"INetCfgComponentControl_fnCancelChanges", NULL, MB_OK);
3413 return S_OK;
3414 }
3415
3416 static const INetCfgComponentControlVtbl vt_NetCfgComponentControl =
3417 {
3418 INetCfgComponentControl_fnQueryInterface,
3419 INetCfgComponentControl_fnAddRef,
3420 INetCfgComponentControl_fnRelease,
3421 INetCfgComponentControl_fnInitialize,
3422 INetCfgComponentControl_fnApplyRegistryChanges,
3423 INetCfgComponentControl_fnApplyPnpChanges,
3424 INetCfgComponentControl_fnCancelChanges
3425 };
3426
3427 HRESULT
3428 WINAPI
3429 TcpipConfigNotify_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv)
3430 {
3431 TcpipConfNotifyImpl *This;
3432
3433 if (!ppv)
3434 return E_POINTER;
3435
3436 This = (TcpipConfNotifyImpl *) CoTaskMemAlloc(sizeof (TcpipConfNotifyImpl));
3437 if (!This)
3438 return E_OUTOFMEMORY;
3439
3440 This->ref = 1;
3441 This->lpVtbl = (const INetCfgComponentPropertyUi*)&vt_NetCfgComponentPropertyUi;
3442 This->lpVtblCompControl = (const INetCfgComponentControl*)&vt_NetCfgComponentControl;
3443 This->pNCfg = NULL;
3444 This->pUnknown = NULL;
3445 This->pNComp = NULL;
3446 This->pCurrentConfig = NULL;
3447
3448 if (!SUCCEEDED (INetCfgComponentPropertyUi_QueryInterface ((INetCfgComponentPropertyUi*)This, riid, ppv)))
3449 {
3450 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3451 return E_NOINTERFACE;
3452 }
3453
3454 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This);
3455 return S_OK;
3456 }