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