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