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