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