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