Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygentcpipconf_notify.c
Go to the documentation of this file.
00001 #include "precomp.h" 00002 00003 typedef struct 00004 { 00005 DWORD EnableSecurityFilters; 00006 LPWSTR szTCPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\TCPAllowedPorts 00007 LPWSTR szUDPAllowedPorts; // KEY: Tcpip\Parameter\{InstanceGuid}\UDPAllowedPorts 00008 LPWSTR szRawIPAllowedProtocols; // KEY: Tcpip\Parameter\{InstanceGuid}\RawIPAllowedProtocols 00009 DWORD IPSize; 00010 DWORD TCPSize; 00011 DWORD UDPSize; 00012 }TcpFilterSettings; 00013 00014 // KEY: Tcpip\Parameter\{InstanceGuid}\IpAddress | DhcpIpAddress 00015 // KEY: Tcpip\Parameter\{InstanceGuid}\SubnetMask | DhcpSubnetMask 00016 // KEY: Tcpip\Parameter\{InstanceGuid}\DefaultGateway | DhcpDefaultGateway 00017 // KEY: Tcpip\Parameter\{InstanceGuid}\NameServer | DhcpNameServer 00018 // KEY: Services\NetBT\Parameters\Interfaces\Tcpip_{INSTANCE_GUID} 00019 00020 typedef struct 00021 { 00022 DWORD RegisterAdapterName; 00023 DWORD RegistrationEnabled; 00024 DWORD UseDomainNameDevolution; 00025 WCHAR szDomain[100]; 00026 LPWSTR szSearchList; 00027 }TcpipAdvancedDNSDlgSettings; 00028 00029 typedef struct tagIP_ADDR 00030 { 00031 DWORD IpAddress; 00032 union 00033 { 00034 DWORD Subnetmask; 00035 USHORT Metric; 00036 }u; 00037 ULONG NTEContext; 00038 struct tagIP_ADDR * Next; 00039 }IP_ADDR; 00040 00041 typedef enum 00042 { 00043 METRIC = 1, 00044 SUBMASK = 2, 00045 IPADDR = 3 00046 }COPY_TYPE; 00047 00048 typedef struct 00049 { 00050 IP_ADDR * Ip; 00051 IP_ADDR * Ns; 00052 IP_ADDR * Gw; 00053 00054 UINT DhcpEnabled; 00055 UINT AutoconfigActive; 00056 DWORD Index; 00057 TcpFilterSettings * pFilter; 00058 TcpipAdvancedDNSDlgSettings * pDNS; 00059 }TcpipSettings; 00060 00061 typedef struct 00062 { 00063 const INetCfgComponentPropertyUi * lpVtbl; 00064 const INetCfgComponentControl * lpVtblCompControl; 00065 LONG ref; 00066 IUnknown * pUnknown; 00067 INetCfg * pNCfg; 00068 INetCfgComponent * pNComp; 00069 TcpipSettings *pCurrentConfig; 00070 CLSID NetCfgInstanceId; 00071 }TcpipConfNotifyImpl, *LPTcpipConfNotifyImpl; 00072 00073 typedef struct 00074 { 00075 BOOL bAdd; 00076 HWND hDlgCtrl; 00077 WCHAR szIP[16]; 00078 UINT Metric; 00079 }TcpipGwSettings; 00080 00081 typedef struct 00082 { 00083 BOOL bAdd; 00084 HWND hDlgCtrl; 00085 WCHAR szIP[16]; 00086 WCHAR szMask[16]; 00087 }TcpipIpSettings; 00088 00089 typedef struct 00090 { 00091 BOOL bAdd; 00092 HWND hDlgCtrl; 00093 WCHAR szIP[16]; 00094 }TcpipDnsSettings; 00095 00096 typedef struct 00097 { 00098 BOOL bAdd; 00099 HWND hDlgCtrl; 00100 LPWSTR Suffix; 00101 }TcpipSuffixSettings; 00102 00103 typedef struct 00104 { 00105 HWND hDlgCtrl; 00106 UINT ResId; 00107 UINT MaxNum; 00108 }TcpipPortSettings; 00109 00110 static __inline LPTcpipConfNotifyImpl impl_from_INetCfgComponentControl(INetCfgComponentControl *iface) 00111 { 00112 return (TcpipConfNotifyImpl*)((char *)iface - FIELD_OFFSET(TcpipConfNotifyImpl, lpVtblCompControl)); 00113 } 00114 00115 INT GetSelectedItem(HWND hDlgCtrl); 00116 HRESULT InitializeTcpipBasicDlgCtrls(HWND hwndDlg, TcpipSettings * pCurSettings); 00117 VOID InsertColumnToListView(HWND hDlgCtrl, UINT ResId, UINT SubItem, UINT Size); 00118 INT_PTR StoreTcpipBasicSettings(HWND hwndDlg, TcpipConfNotifyImpl * This, BOOL bApply); 00119 HRESULT Initialize(TcpipConfNotifyImpl * This); 00120 00121 VOID 00122 DisplayError(UINT ResTxt, UINT ResTitle, UINT Type) 00123 { 00124 WCHAR szBuffer[300]; 00125 WCHAR szTitle[100]; 00126 00127 if (LoadStringW(netcfgx_hInstance, ResTxt, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00128 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00129 else 00130 szBuffer[0] = L'\0'; 00131 00132 if (LoadStringW(netcfgx_hInstance, ResTitle, szTitle, sizeof(szTitle)/sizeof(WCHAR))) 00133 szTitle[(sizeof(szTitle)/sizeof(WCHAR))-1] = L'\0'; 00134 else 00135 szTitle[0] = L'\0'; 00136 00137 MessageBoxW(NULL, szBuffer, szTitle, Type); 00138 } 00139 00140 00141 /*************************************************************** 00142 * TCP/IP Filter Dialog 00143 * 00144 */ 00145 00146 INT_PTR 00147 CALLBACK 00148 TcpipFilterPortDlg( 00149 HWND hwndDlg, 00150 UINT uMsg, 00151 WPARAM wParam, 00152 LPARAM lParam 00153 ) 00154 { 00155 TcpipPortSettings * pPort; 00156 UINT Num; 00157 LVFINDINFOW find; 00158 LVITEMW li; 00159 WCHAR szBuffer[100]; 00160 00161 switch(uMsg) 00162 { 00163 case WM_INITDIALOG: 00164 pPort = (TcpipPortSettings*)lParam; 00165 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pPort); 00166 if (LoadStringW(netcfgx_hInstance, pPort->ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00167 { 00168 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00169 SendDlgItemMessageW(hwndDlg, IDC_PORT_DESC, WM_SETTEXT, 0, (LPARAM)szBuffer); 00170 } 00171 00172 if (pPort->MaxNum == 65536) 00173 SendDlgItemMessageW(hwndDlg, IDC_PORT_VAL, EM_LIMITTEXT, 5, 0); 00174 else 00175 SendDlgItemMessageW(hwndDlg, IDC_PORT_VAL, EM_LIMITTEXT, 3, 0); 00176 00177 return TRUE; 00178 case WM_COMMAND: 00179 if (LOWORD(wParam) == IDCANCEL) 00180 { 00181 EndDialog(hwndDlg, FALSE); 00182 break; 00183 } 00184 else if (LOWORD(wParam) == IDC_OK) 00185 { 00186 pPort = (TcpipPortSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00187 Num = GetDlgItemInt(hwndDlg, IDC_PORT_VAL, NULL, TRUE); 00188 if (Num > pPort->MaxNum || Num == 0) 00189 { 00190 if (pPort->MaxNum == 65536) 00191 DisplayError(IDS_PORT_RANGE, IDS_TCPIP, MB_ICONWARNING); 00192 else 00193 DisplayError(IDS_PROT_RANGE, IDS_TCPIP, MB_ICONWARNING); 00194 00195 SetFocus(GetDlgItem(hwndDlg, IDC_PORT_VAL)); 00196 break; 00197 } 00198 if (GetWindowTextW(GetDlgItem(hwndDlg, IDC_PORT_VAL), szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00199 { 00200 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00201 ZeroMemory(&find, sizeof(LVFINDINFOW)); 00202 find.flags = LVFI_STRING; 00203 find.psz = szBuffer; 00204 if (SendMessageW(pPort->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1) 00205 { 00206 ZeroMemory(&li, sizeof(LVITEMW)); 00207 li.mask = LVIF_TEXT; 00208 li.iItem = ListView_GetItemCount(pPort->hDlgCtrl); 00209 li.pszText = szBuffer; 00210 SendMessageW(pPort->hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); 00211 EndDialog(hwndDlg, TRUE); 00212 break; 00213 } 00214 DisplayError(IDS_DUP_NUMBER, IDS_PROT_RANGE, MB_ICONWARNING); 00215 SetFocus(GetDlgItem(hwndDlg, IDC_PORT_VAL)); 00216 break; 00217 } 00218 } 00219 } 00220 return FALSE; 00221 } 00222 00223 VOID 00224 InitFilterListBox(LPWSTR pData, HWND hwndDlg, HWND hDlgCtrl, UINT AllowButton, UINT RestrictButton, UINT AddButton, UINT DelButton) 00225 { 00226 LVITEMW li; 00227 LPWSTR pCur; 00228 INT iItem; 00229 00230 if (!pData || !_wtoi(pData)) 00231 { 00232 SendDlgItemMessageW(hwndDlg, AllowButton, BM_SETCHECK, BST_CHECKED, 0); 00233 EnableWindow(GetDlgItem(hwndDlg, AddButton), FALSE); 00234 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE); 00235 return; 00236 } 00237 00238 pCur = pData; 00239 memset(&li, 0x0, sizeof(LVITEMW)); 00240 li.mask = LVIF_TEXT; 00241 iItem = 0; 00242 00243 while(pCur[0]) 00244 { 00245 li.pszText = pCur; 00246 li.iItem = iItem; 00247 SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); 00248 iItem++; 00249 pCur += wcslen(pCur) + 1; 00250 } 00251 00252 if (!iItem) 00253 SendDlgItemMessageW(hwndDlg, AllowButton, BM_SETCHECK, BST_CHECKED, 0); 00254 else 00255 SendDlgItemMessageW(hwndDlg, RestrictButton, BM_SETCHECK, BST_CHECKED, 0); 00256 } 00257 00258 LPWSTR 00259 CreateFilterList( 00260 HWND hDlgCtrl, 00261 LPDWORD Size) 00262 { 00263 INT iCount, iIndex; 00264 LVITEMW li; 00265 LPWSTR pData, pCur; 00266 DWORD dwSize; 00267 WCHAR szBuffer[10]; 00268 00269 iCount = ListView_GetItemCount(hDlgCtrl); 00270 if (!iCount) 00271 { 00272 pData = (LPWSTR)CoTaskMemAlloc(3 * sizeof(WCHAR)); 00273 if (!pData) 00274 return NULL; 00275 pData[0] = L'0'; 00276 pData[1] = L'\0'; 00277 pData[2] = L'\0'; 00278 *Size = 3 * sizeof(WCHAR); 00279 return pData; 00280 } 00281 00282 pData = CoTaskMemAlloc((6 * iCount + 1) * sizeof(WCHAR)); 00283 if (!pData) 00284 return NULL; 00285 00286 pCur = pData; 00287 dwSize = 0; 00288 for(iIndex = 0; iIndex < iCount; iIndex++) 00289 { 00290 ZeroMemory(&li, sizeof(LVITEMW)); 00291 li.mask = LVIF_TEXT; 00292 li.iItem = iIndex; 00293 li.pszText = szBuffer; 00294 li.cchTextMax = sizeof(szBuffer) /sizeof(WCHAR); 00295 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li)) 00296 { 00297 wcscpy(pCur, szBuffer); 00298 dwSize += wcslen(szBuffer) + 1; 00299 pCur += wcslen(szBuffer) + 1; 00300 } 00301 } 00302 pCur[0] = L'\0'; 00303 *Size = (dwSize+1) * sizeof(WCHAR); 00304 return pData; 00305 } 00306 00307 TcpFilterSettings * 00308 StoreTcpipFilterSettings( 00309 HWND hwndDlg) 00310 { 00311 TcpFilterSettings * pFilter; 00312 00313 pFilter = CoTaskMemAlloc(sizeof(TcpFilterSettings)); 00314 if (!pFilter) 00315 return NULL; 00316 00317 if (SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_GETCHECK, 0, 0) == BST_CHECKED) 00318 pFilter->EnableSecurityFilters = TRUE; 00319 else 00320 pFilter->EnableSecurityFilters = FALSE; 00321 00322 pFilter->szTCPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_TCP_LIST), &pFilter->TCPSize); 00323 pFilter->szUDPAllowedPorts = CreateFilterList(GetDlgItem(hwndDlg, IDC_UDP_LIST), &pFilter->UDPSize); 00324 pFilter->szRawIPAllowedProtocols = CreateFilterList(GetDlgItem(hwndDlg, IDC_IP_LIST), &pFilter->IPSize); 00325 00326 return pFilter; 00327 } 00328 00329 static 00330 VOID 00331 AddItem( 00332 HWND hwndDlg, 00333 HWND hDlgCtrl, 00334 UINT MaxItem, 00335 UINT ResId) 00336 { 00337 TcpipPortSettings Port; 00338 00339 Port.MaxNum = MaxItem; 00340 Port.hDlgCtrl = hDlgCtrl; 00341 Port.ResId = ResId; 00342 00343 DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIP_PORT_DLG), hwndDlg, TcpipFilterPortDlg, (LPARAM)&Port); 00344 } 00345 00346 static 00347 VOID 00348 DelItem( 00349 HWND hDlgCtrl) 00350 { 00351 INT iIndex = GetSelectedItem(hDlgCtrl); 00352 00353 if (iIndex != -1) 00354 { 00355 (void)ListView_DeleteItem(hDlgCtrl, iIndex); 00356 return; 00357 } 00358 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONWARNING); 00359 } 00360 00361 INT_PTR 00362 CALLBACK 00363 TcpipFilterSettingsDlg( 00364 HWND hwndDlg, 00365 UINT uMsg, 00366 WPARAM wParam, 00367 LPARAM lParam 00368 ) 00369 { 00370 TcpipConfNotifyImpl *pContext; 00371 TcpFilterSettings *pFilter; 00372 00373 switch(uMsg) 00374 { 00375 case WM_INITDIALOG: 00376 pContext = (TcpipConfNotifyImpl*)lParam; 00377 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_TCP_LIST), IDS_TCP_PORTS, 0, 100); 00378 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_UDP_LIST), IDS_UDP_PORTS, 0, 100); 00379 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IP_LIST), IDS_IP_PROTO, 0, 100); 00380 if (pContext->pCurrentConfig->pFilter) 00381 { 00382 InitFilterListBox(pContext->pCurrentConfig->pFilter->szTCPAllowedPorts, hwndDlg, GetDlgItem(hwndDlg, IDC_TCP_LIST), IDC_TCP_ALLOW_ALL, IDC_TCP_RESTRICT, IDC_TCP_ADD, IDC_TCP_DEL); 00383 InitFilterListBox(pContext->pCurrentConfig->pFilter->szUDPAllowedPorts, hwndDlg, GetDlgItem(hwndDlg, IDC_UDP_LIST), IDC_UDP_ALLOW_ALL, IDC_UDP_RESTRICT, IDC_UDP_ADD, IDC_UDP_DEL); 00384 InitFilterListBox(pContext->pCurrentConfig->pFilter->szRawIPAllowedProtocols, hwndDlg, GetDlgItem(hwndDlg, IDC_IP_LIST), IDC_IP_ALLOW_ALL, IDC_IP_RESTRICT, IDC_IP_ADD, IDC_IP_DEL); 00385 if (pContext->pCurrentConfig->pFilter->EnableSecurityFilters) 00386 SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_SETCHECK, BST_CHECKED, 0); 00387 } 00388 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext); 00389 return TRUE; 00390 case WM_COMMAND: 00391 if (HIWORD(wParam) == BN_CLICKED) 00392 { 00393 switch (LOWORD(wParam)) 00394 { 00395 case IDC_TCP_ALLOW_ALL: 00396 if (SendDlgItemMessageW(hwndDlg, IDC_TCP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED) 00397 { 00398 SendDlgItemMessageW(hwndDlg, IDC_TCP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0); 00399 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_LIST), FALSE); 00400 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_ADD), FALSE); 00401 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_DEL), FALSE); 00402 } 00403 break; 00404 case IDC_TCP_RESTRICT: 00405 if (SendDlgItemMessageW(hwndDlg, IDC_TCP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED) 00406 { 00407 SendDlgItemMessageW(hwndDlg, IDC_TCP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0); 00408 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_LIST), TRUE); 00409 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_ADD), TRUE); 00410 EnableWindow(GetDlgItem(hwndDlg, IDC_TCP_DEL), TRUE); 00411 } 00412 break; 00413 case IDC_UDP_ALLOW_ALL: 00414 if (SendDlgItemMessageW(hwndDlg, IDC_UDP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED) 00415 { 00416 SendDlgItemMessageW(hwndDlg, IDC_UDP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0); 00417 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_LIST), FALSE); 00418 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_ADD), FALSE); 00419 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_DEL), FALSE); 00420 } 00421 break; 00422 case IDC_UDP_RESTRICT: 00423 if (SendDlgItemMessageW(hwndDlg, IDC_UDP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED) 00424 { 00425 SendDlgItemMessageW(hwndDlg, IDC_UDP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0); 00426 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_LIST), TRUE); 00427 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_ADD), TRUE); 00428 EnableWindow(GetDlgItem(hwndDlg, IDC_UDP_DEL), TRUE); 00429 } 00430 break; 00431 case IDC_IP_ALLOW_ALL: 00432 if (SendDlgItemMessageW(hwndDlg, IDC_IP_ALLOW_ALL, BM_GETCHECK, 0, 0) == BST_CHECKED) 00433 { 00434 SendDlgItemMessageW(hwndDlg, IDC_IP_RESTRICT, BM_SETCHECK, BST_UNCHECKED, 0); 00435 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_LIST), FALSE); 00436 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_ADD), FALSE); 00437 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_DEL), FALSE); 00438 } 00439 break; 00440 case IDC_IP_RESTRICT: 00441 if (SendDlgItemMessageW(hwndDlg, IDC_IP_RESTRICT, BM_GETCHECK, 0, 0) == BST_CHECKED) 00442 { 00443 SendDlgItemMessageW(hwndDlg, IDC_IP_ALLOW_ALL, BM_SETCHECK, BST_UNCHECKED, 0); 00444 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_LIST), TRUE); 00445 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_ADD), TRUE); 00446 EnableWindow(GetDlgItem(hwndDlg, IDC_IP_DEL), TRUE); 00447 } 00448 break; 00449 case IDC_USE_FILTER: 00450 if (SendDlgItemMessageW(hwndDlg, IDC_USE_FILTER, BM_GETCHECK, 0, 0) == BST_UNCHECKED) 00451 DisplayError(IDS_DISABLE_FILTER, IDS_TCPIP, MB_OK); 00452 00453 break; 00454 } 00455 } 00456 switch(LOWORD(wParam)) 00457 { 00458 case IDC_OK: 00459 pContext = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00460 pFilter = StoreTcpipFilterSettings(hwndDlg); 00461 if (pFilter) 00462 { 00463 if (pContext->pCurrentConfig->pFilter) 00464 { 00465 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szTCPAllowedPorts); 00466 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szUDPAllowedPorts); 00467 CoTaskMemFree(pContext->pCurrentConfig->pFilter->szRawIPAllowedProtocols); 00468 CoTaskMemFree(pContext->pCurrentConfig->pFilter); 00469 } 00470 pContext->pCurrentConfig->pFilter = pFilter; 00471 } 00472 EndDialog(hwndDlg, (INT_PTR)TRUE); 00473 break; 00474 case IDCANCEL: 00475 EndDialog(hwndDlg, FALSE); 00476 break; 00477 case IDC_TCP_ADD: 00478 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_TCP_LIST), 65536, IDS_TCP_PORTS); 00479 break; 00480 case IDC_TCP_DEL: 00481 DelItem(GetDlgItem(hwndDlg, IDC_TCP_LIST)); 00482 break; 00483 case IDC_UDP_ADD: 00484 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_UDP_LIST), 65536, IDS_UDP_PORTS); 00485 break; 00486 case IDC_UDP_DEL: 00487 DelItem(GetDlgItem(hwndDlg, IDC_UDP_LIST)); 00488 break; 00489 case IDC_IP_ADD: 00490 AddItem(hwndDlg, GetDlgItem(hwndDlg, IDC_IP_LIST), 256, IDS_IP_PROTO); 00491 break; 00492 case IDC_IP_DEL: 00493 DelItem(GetDlgItem(hwndDlg, IDC_IP_LIST)); 00494 break; 00495 default: 00496 break; 00497 } 00498 default: 00499 break; 00500 } 00501 00502 return FALSE; 00503 } 00504 00505 00506 HPROPSHEETPAGE 00507 InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) 00508 { 00509 PROPSHEETPAGEW ppage; 00510 00511 memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); 00512 ppage.dwSize = sizeof(PROPSHEETPAGEW); 00513 ppage.dwFlags = PSP_DEFAULT; 00514 ppage.u.pszTemplate = resname; 00515 ppage.pfnDlgProc = dlgproc; 00516 ppage.lParam = lParam; 00517 ppage.hInstance = netcfgx_hInstance; 00518 if (szTitle) 00519 { 00520 ppage.dwFlags |= PSP_USETITLE; 00521 ppage.pszTitle = szTitle; 00522 } 00523 return CreatePropertySheetPageW(&ppage); 00524 } 00525 00526 /*************************************************************** 00527 * TCP/IP Advanced Option Dialog 00528 * 00529 */ 00530 00531 VOID 00532 InitializeTcpipAdvancedOptDlg( 00533 HWND hwndDlg, 00534 TcpipConfNotifyImpl * This) 00535 { 00536 WCHAR szText[500]; 00537 /* store context */ 00538 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This); 00539 00540 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTER, szText, sizeof(szText)/sizeof(WCHAR))) 00541 { 00542 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; 00543 if (SendDlgItemMessageW(hwndDlg, IDC_OPTLIST, LB_ADDSTRING, 0, (LPARAM)szText) != LB_ERR) 00544 SendDlgItemMessageW(hwndDlg, IDC_OPTLIST, LB_SETCURSEL, 0, 0); 00545 } 00546 00547 if (LoadStringW(netcfgx_hInstance, IDS_TCPFILTERDESC, szText, sizeof(szText)/sizeof(WCHAR))) 00548 { 00549 szText[(sizeof(szText)/sizeof(WCHAR))-1] = L'\0'; 00550 SendDlgItemMessageW(hwndDlg, IDC_OPTDESC, WM_SETTEXT, 0, (LPARAM)szText); 00551 } 00552 } 00553 00554 00555 00556 INT_PTR 00557 CALLBACK 00558 TcpipAdvancedOptDlg( 00559 HWND hwndDlg, 00560 UINT uMsg, 00561 WPARAM wParam, 00562 LPARAM lParam 00563 ) 00564 { 00565 TcpipConfNotifyImpl * This; 00566 LPPROPSHEETPAGE page; 00567 00568 switch(uMsg) 00569 { 00570 case WM_INITDIALOG: 00571 page = (LPPROPSHEETPAGE)lParam; 00572 This = (TcpipConfNotifyImpl*)page->lParam; 00573 InitializeTcpipAdvancedOptDlg(hwndDlg, This); 00574 return TRUE; 00575 case WM_COMMAND: 00576 if (LOWORD(wParam) == IDC_OPTPROP) 00577 { 00578 DialogBoxParamW(netcfgx_hInstance, 00579 MAKEINTRESOURCEW(IDD_TCPIP_FILTER_DLG), 00580 GetParent(hwndDlg), 00581 TcpipFilterSettingsDlg, 00582 (LPARAM)GetWindowLongPtr(hwndDlg, DWLP_USER)); 00583 break; 00584 } 00585 } 00586 return FALSE; 00587 } 00588 00589 VOID 00590 InsertColumnToListView( 00591 HWND hDlgCtrl, 00592 UINT ResId, 00593 UINT SubItem, 00594 UINT Size) 00595 { 00596 WCHAR szBuffer[200]; 00597 LVCOLUMNW lc; 00598 00599 if (!LoadStringW(netcfgx_hInstance, ResId, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00600 return; 00601 00602 memset(&lc, 0, sizeof(LV_COLUMN) ); 00603 lc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; 00604 lc.iSubItem = SubItem; 00605 lc.fmt = LVCFMT_FIXED_WIDTH; 00606 lc.cx = Size; 00607 lc.cchTextMax = wcslen(szBuffer); 00608 lc.pszText = szBuffer; 00609 00610 (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc); 00611 } 00612 00613 VOID 00614 InsertIpAddressToListView( 00615 HWND hDlgCtrl, 00616 IP_ADDR * pAddr, 00617 BOOL bSubMask) 00618 { 00619 WCHAR szBuffer[70]; 00620 DWORD dwIpAddr; 00621 UINT itemCount = 0; 00622 LVITEMW li; 00623 00624 while(pAddr) 00625 { 00626 ZeroMemory(&li, sizeof(li)); 00627 li.mask = LVIF_TEXT; 00628 li.iItem = itemCount; 00629 li.iSubItem = 0; 00630 dwIpAddr = pAddr->IpAddress; 00631 swprintf(szBuffer, L"%lu.%lu.%lu.%lu", 00632 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 00633 00634 li.pszText = szBuffer; 00635 li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); 00636 if (li.iItem != -1) 00637 { 00638 if (bSubMask) 00639 { 00640 dwIpAddr = pAddr->u.Subnetmask; 00641 swprintf(szBuffer, L"%lu.%lu.%lu.%lu", 00642 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 00643 } 00644 else 00645 { 00646 if (pAddr->u.Metric) 00647 swprintf(szBuffer, L"%u", pAddr->u.Metric); 00648 else 00649 LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)); 00650 } 00651 00652 li.mask = LVIF_TEXT; 00653 li.iSubItem = 1; 00654 li.pszText = szBuffer; 00655 SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); 00656 } 00657 itemCount++; 00658 pAddr = pAddr->Next; 00659 } 00660 } 00661 00662 00663 VOID 00664 InitializeTcpipAdvancedIpDlg( 00665 HWND hwndDlg, 00666 TcpipConfNotifyImpl * This) 00667 { 00668 00669 RECT rect; 00670 LVITEMW li; 00671 WCHAR szBuffer[100]; 00672 00673 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IPLIST), IDS_IPADDR, 0, 100); 00674 GetClientRect(GetDlgItem(hwndDlg, IDC_IPLIST), &rect); 00675 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_IPLIST), IDS_SUBMASK, 1, (rect.right - rect.left - 100)); 00676 00677 if (This->pCurrentConfig->DhcpEnabled) 00678 { 00679 if (LoadStringW(netcfgx_hInstance, IDS_DHCPACTIVE, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00680 { 00681 ZeroMemory(&li, sizeof(LVITEMW)); 00682 li.mask = LVIF_TEXT; 00683 li.pszText = szBuffer; 00684 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li); 00685 } 00686 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADD), FALSE); 00687 EnableWindow(GetDlgItem(hwndDlg, IDC_IPMOD), FALSE); 00688 EnableWindow(GetDlgItem(hwndDlg, IDC_IPDEL), FALSE); 00689 } 00690 else 00691 { 00692 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_IPLIST), This->pCurrentConfig->Ip, TRUE); 00693 } 00694 00695 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_GWLIST), IDS_GATEWAY, 0, 100); 00696 GetClientRect(GetDlgItem(hwndDlg, IDC_IPLIST), &rect); 00697 InsertColumnToListView(GetDlgItem(hwndDlg, IDC_GWLIST), IDS_METRIC, 1, (rect.right - rect.left - 100)); 00698 00699 InsertIpAddressToListView(GetDlgItem(hwndDlg, IDC_GWLIST), This->pCurrentConfig->Gw, FALSE); 00700 SendDlgItemMessageW(hwndDlg, IDC_METRIC, EM_LIMITTEXT, 4, 0); 00701 00702 } 00703 00704 INT_PTR 00705 CALLBACK 00706 TcpipAdvGwDlg( 00707 HWND hwndDlg, 00708 UINT uMsg, 00709 WPARAM wParam, 00710 LPARAM lParam 00711 ) 00712 { 00713 WCHAR szBuffer[70]; 00714 TcpipGwSettings *pGwSettings; 00715 DWORD dwIpAddr; 00716 LPNMIPADDRESS lpnmipa; 00717 LVFINDINFOW find; 00718 00719 switch(uMsg) 00720 { 00721 case WM_INITDIALOG: 00722 pGwSettings = (TcpipGwSettings *)lParam; 00723 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); 00724 if (pGwSettings->bAdd) 00725 { 00726 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00727 { 00728 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00729 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 00730 } 00731 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE); 00732 SendDlgItemMessageW(hwndDlg, IDC_USEMETRIC, BM_SETCHECK, BST_CHECKED, 0); 00733 } 00734 else 00735 { 00736 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00737 { 00738 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00739 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 00740 } 00741 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pGwSettings->szIP); 00742 if (pGwSettings->Metric) 00743 { 00744 SetDlgItemInt(hwndDlg, IDC_METRIC, pGwSettings->Metric, FALSE); 00745 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE); 00746 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE); 00747 } 00748 else 00749 { 00750 SendDlgItemMessageW(hwndDlg, IDC_USEMETRIC, BM_SETCHECK, BST_CHECKED, 0); 00751 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE); 00752 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE); 00753 } 00754 } 00755 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 00756 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 00757 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 00758 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 00759 return TRUE; 00760 case WM_COMMAND: 00761 if (LOWORD(wParam) == IDC_USEMETRIC) 00762 { 00763 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED) 00764 { 00765 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE); 00766 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), FALSE); 00767 SendDlgItemMessageW(hwndDlg, IDC_METRIC, WM_SETTEXT, 0, (LPARAM)L""); 00768 } 00769 else 00770 { 00771 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE); 00772 EnableWindow(GetDlgItem(hwndDlg, IDC_METRICTXT), TRUE); 00773 } 00774 break; 00775 } 00776 else if (LOWORD(wParam) == IDCANCEL) 00777 { 00778 EndDialog(hwndDlg, FALSE); 00779 break; 00780 } 00781 else if (LOWORD(wParam) == IDC_OK) 00782 { 00783 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 00784 { 00785 pGwSettings = (TcpipGwSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00786 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pGwSettings->szIP); 00787 00788 ZeroMemory(&find, sizeof(LVFINDINFOW)); 00789 find.flags = LVFI_STRING; 00790 find.psz = pGwSettings->szIP; 00791 00792 if (SendDlgItemMessage(hwndDlg, IDC_USEMETRIC, BM_GETCHECK, 0, 0) == BST_UNCHECKED) 00793 pGwSettings->Metric = GetDlgItemInt(hwndDlg, IDC_METRIC, NULL, FALSE); 00794 else 00795 pGwSettings->Metric = 0; 00796 00797 00798 if (SendMessageW(pGwSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find) == -1) 00799 { 00800 EndDialog(hwndDlg, TRUE); 00801 break; 00802 } 00803 if (!pGwSettings->bAdd) 00804 { 00805 EndDialog(hwndDlg, FALSE); 00806 break; 00807 } 00808 DisplayError(IDS_DUP_GW, IDS_TCPIP, MB_ICONINFORMATION); 00809 } 00810 break; 00811 } 00812 break; 00813 case WM_NOTIFY: 00814 lpnmipa = (LPNMIPADDRESS) lParam; 00815 if (lpnmipa->hdr.code == IPN_FIELDCHANGED) 00816 { 00817 if (lpnmipa->hdr.idFrom == IDC_IPADDR) 00818 { 00819 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 00820 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE); 00821 } 00822 } 00823 break; 00824 } 00825 return FALSE; 00826 } 00827 00828 BOOL 00829 GetGWListEntry(HWND hDlgCtrl, INT Index, TcpipGwSettings * pGwSettings) 00830 { 00831 LVITEMW li; 00832 WCHAR szBuffer[30]; 00833 BOOL bRet; 00834 00835 ZeroMemory(&li, sizeof(LVITEMW)); 00836 li.mask = LVIF_TEXT; 00837 li.cchTextMax = 16; 00838 li.pszText = pGwSettings->szIP; 00839 li.iItem = Index; 00840 00841 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li)) 00842 return FALSE; 00843 li.pszText = szBuffer; 00844 li.cchTextMax = 30; 00845 li.iSubItem = 1; 00846 00847 bRet = SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li); 00848 if (bRet) 00849 { 00850 pGwSettings->Metric = _wtoi(szBuffer); 00851 } 00852 00853 return bRet; 00854 } 00855 00856 INT_PTR 00857 CALLBACK 00858 TcpipAddIpDlg( 00859 HWND hwndDlg, 00860 UINT uMsg, 00861 WPARAM wParam, 00862 LPARAM lParam 00863 ) 00864 { 00865 LPNMIPADDRESS lpnmipa; 00866 DWORD dwIpAddr; 00867 TcpipIpSettings *pIpSettings; 00868 WCHAR szBuffer[50]; 00869 LVFINDINFOW find; 00870 LRESULT lResult; 00871 00872 switch(uMsg) 00873 { 00874 case WM_INITDIALOG: 00875 pIpSettings = (TcpipIpSettings*)lParam; 00876 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); 00877 00878 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 00879 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 00880 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 00881 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 00882 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255)); 00883 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 00884 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 00885 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 00886 00887 if (pIpSettings->bAdd) 00888 { 00889 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00890 { 00891 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00892 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 00893 } 00894 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE); 00895 } 00896 else 00897 { 00898 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00899 { 00900 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00901 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 00902 } 00903 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pIpSettings->szIP); 00904 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_SETTEXT, 0, (LPARAM)pIpSettings->szMask); 00905 } 00906 return TRUE; 00907 case WM_NOTIFY: 00908 lpnmipa = (LPNMIPADDRESS) lParam; 00909 if (lpnmipa->hdr.code == IPN_FIELDCHANGED) 00910 { 00911 if (lpnmipa->hdr.idFrom == IDC_IPADDR) 00912 { 00913 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 00914 { 00915 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255)) 00916 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0)); 00917 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255)) 00918 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0)); 00919 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255)) 00920 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0)); 00921 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE); 00922 } 00923 } 00924 } 00925 break; 00926 case WM_COMMAND: 00927 if (LOWORD(wParam) == IDC_OK) 00928 { 00929 pIpSettings = (TcpipIpSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER); 00930 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pIpSettings->szIP); 00931 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, WM_GETTEXT, 16, (LPARAM)pIpSettings->szMask); 00932 00933 ZeroMemory(&find, sizeof(LVFINDINFOW)); 00934 find.flags = LVFI_STRING; 00935 find.psz = pIpSettings->szIP; 00936 lResult = SendMessageW(pIpSettings->hDlgCtrl, LVM_FINDITEMW, (WPARAM)-1, (LPARAM)&find); 00937 00938 if (lResult == -1) 00939 { 00940 EndDialog(hwndDlg, TRUE); 00941 break; 00942 } 00943 else if (!pIpSettings->bAdd) 00944 { 00945 EndDialog(hwndDlg, FALSE); 00946 break; 00947 } 00948 DisplayError(IDS_DUP_IPADDR, IDS_TCPIP, MB_ICONINFORMATION); 00949 break; 00950 } 00951 else if (LOWORD(wParam) == IDCANCEL) 00952 { 00953 EndDialog(hwndDlg, FALSE); 00954 } 00955 break; 00956 } 00957 return FALSE; 00958 } 00959 00960 BOOL 00961 VerifyDNSSuffix( 00962 LPWSTR szName) 00963 { 00964 UINT Index; 00965 UINT Length = wcslen(szName); 00966 00967 for(Index = 0; Index < Length; Index++) 00968 if (iswalnum(szName[Index]) == 0 && szName[Index] != '.' && szName[Index] != '-') 00969 return FALSE; 00970 00971 return TRUE; 00972 } 00973 00974 INT_PTR 00975 CALLBACK 00976 TcpipAddSuffixDlg( 00977 HWND hwndDlg, 00978 UINT uMsg, 00979 WPARAM wParam, 00980 LPARAM lParam 00981 ) 00982 { 00983 WCHAR szBuffer[100]; 00984 TcpipSuffixSettings * pSettings; 00985 LRESULT lLength; 00986 00987 switch(uMsg) 00988 { 00989 case WM_INITDIALOG: 00990 pSettings = (TcpipSuffixSettings*)lParam; 00991 if (!pSettings->bAdd) 00992 { 00993 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)pSettings->Suffix); 00994 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 00995 { 00996 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 00997 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 00998 } 00999 CoTaskMemFree(pSettings->Suffix); 01000 pSettings->Suffix = NULL; 01001 } 01002 else 01003 { 01004 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01005 { 01006 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01007 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 01008 } 01009 } 01010 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pSettings); 01011 return TRUE; 01012 case WM_COMMAND: 01013 if (LOWORD(wParam) == IDCANCEL) 01014 { 01015 EndDialog(hwndDlg, FALSE); 01016 break; 01017 } 01018 else if (LOWORD(wParam) == IDC_OK) 01019 { 01020 lLength = SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXTLENGTH, 0, 0); 01021 if (lLength) 01022 { 01023 pSettings = (TcpipSuffixSettings*) GetWindowLongPtr(hwndDlg, DWLP_USER); 01024 pSettings->Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1)* sizeof(WCHAR)); 01025 if (pSettings->Suffix) 01026 { 01027 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, lLength + 1, (LPARAM)pSettings->Suffix); 01028 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->Suffix) != LB_ERR) 01029 { 01030 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONWARNING); 01031 CoTaskMemFree(pSettings->Suffix); 01032 break; 01033 } 01034 01035 if (!VerifyDNSSuffix(pSettings->Suffix)) 01036 { 01037 DisplayError(IDS_DOMAIN_SUFFIX, IDS_TCPIP, MB_ICONWARNING); 01038 CoTaskMemFree(pSettings->Suffix); 01039 break; 01040 } 01041 EndDialog(hwndDlg, TRUE); 01042 } 01043 } 01044 break; 01045 } 01046 } 01047 return FALSE; 01048 } 01049 01050 01051 01052 INT 01053 GetSelectedItem(HWND hDlgCtrl) 01054 { 01055 LVITEMW li; 01056 UINT iItemCount, iIndex; 01057 01058 iItemCount = ListView_GetItemCount(hDlgCtrl); 01059 if (!iItemCount) 01060 return -1; 01061 01062 for (iIndex = 0; iIndex < iItemCount; iIndex++) 01063 { 01064 ZeroMemory(&li, sizeof(LVITEMW)); 01065 li.mask = LVIF_STATE; 01066 li.stateMask = (UINT)-1; 01067 li.iItem = iIndex; 01068 if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li)) 01069 { 01070 if (li.state & LVIS_SELECTED) 01071 return iIndex; 01072 } 01073 } 01074 return -1; 01075 } 01076 01077 01078 BOOL 01079 GetIPListEntry(HWND hDlgCtrl, INT Index, TcpipIpSettings * pIpSettings) 01080 { 01081 LVITEMW li; 01082 01083 ZeroMemory(&li, sizeof(LVITEMW)); 01084 li.mask = LVIF_TEXT; 01085 li.cchTextMax = 16; 01086 li.pszText = pIpSettings->szIP; 01087 li.iItem = Index; 01088 01089 if (!SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li)) 01090 return FALSE; 01091 01092 ZeroMemory(&li, sizeof(LVITEMW)); 01093 li.mask = LVIF_TEXT; 01094 li.cchTextMax = 16; 01095 li.pszText = pIpSettings->szMask; 01096 li.iSubItem = 1; 01097 li.iItem = Index; 01098 01099 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li); 01100 } 01101 01102 VOID 01103 DeleteItemFromList(HWND hDlgCtrl) 01104 { 01105 LVITEMW li; 01106 01107 memset(&li, 0x0, sizeof(LVITEMW)); 01108 li.iItem = GetSelectedItem(hDlgCtrl); 01109 if (li.iItem < 0) 01110 { 01111 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION); 01112 SetFocus(hDlgCtrl); 01113 } 01114 else 01115 { 01116 (void)ListView_DeleteItem(hDlgCtrl, li.iItem); 01117 } 01118 } 01119 01120 UINT 01121 GetIpAddressFromStringW( 01122 WCHAR * szBuffer) 01123 { 01124 DWORD dwIpAddr = 0; 01125 INT Val; 01126 UINT Index = 3; 01127 LPWSTR pLast = szBuffer; 01128 LPWSTR pNext = szBuffer; 01129 01130 01131 while((pNext = wcschr(pNext, L'.'))) 01132 { 01133 pNext[0] = L'\0'; 01134 Val = _wtoi(pLast); 01135 dwIpAddr |= (Val << Index * 8); 01136 Index--; 01137 pNext++; 01138 pLast = pNext; 01139 } 01140 dwIpAddr |= _wtoi(pLast); 01141 01142 return dwIpAddr; 01143 } 01144 01145 UINT 01146 GetIpAddressFromStringA( 01147 char * sBuffer) 01148 { 01149 WCHAR szIp[16]; 01150 01151 if (MultiByteToWideChar(CP_ACP, 0, sBuffer, -1, szIp, 16)) 01152 { 01153 szIp[15] = L'\0'; 01154 return GetIpAddressFromStringW(szIp); 01155 } 01156 return (UINT)-1; 01157 } 01158 01159 01160 VOID 01161 FreeIPAddr(IP_ADDR *pAddr) 01162 { 01163 IP_ADDR *pNext; 01164 01165 if (!pAddr) 01166 return; 01167 01168 while(pAddr) 01169 { 01170 pNext = pAddr->Next; 01171 CoTaskMemFree(pAddr); 01172 pAddr = pNext; 01173 } 01174 } 01175 01176 BOOL 01177 GetListViewItem(HWND hDlgCtrl, UINT Index, UINT SubIndex, WCHAR * szBuffer, UINT BufferSize) 01178 { 01179 LVITEMW li; 01180 01181 ZeroMemory(&li, sizeof(LVITEMW)); 01182 li.mask = LVIF_TEXT; 01183 li.pszText = szBuffer; 01184 li.iItem = Index; 01185 li.iSubItem = SubIndex; 01186 li.cchTextMax = BufferSize; 01187 return SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&li); 01188 } 01189 01190 VOID 01191 StoreIPSettings( 01192 HWND hDlgCtrl, 01193 TcpipConfNotifyImpl * This, 01194 BOOL bSubmask) 01195 { 01196 WCHAR szBuffer[30]; 01197 01198 INT iIndex, iCount; 01199 IP_ADDR *pCur, *pLast; 01200 01201 iCount = ListView_GetItemCount(hDlgCtrl); 01202 if (!iCount) 01203 { 01204 return; 01205 } 01206 01207 pLast = NULL; 01208 for(iIndex = 0; iIndex < iCount; iIndex++) 01209 { 01210 if (GetListViewItem(hDlgCtrl, iIndex, 0, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01211 { 01212 pCur = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 01213 if (!pCur) 01214 break; 01215 ZeroMemory(pCur, sizeof(IP_ADDR)); 01216 01217 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01218 pCur->IpAddress = GetIpAddressFromStringW(szBuffer); 01219 01220 if (GetListViewItem(hDlgCtrl, iIndex, 1, szBuffer, sizeof(szBuffer)/sizeof(WCHAR) )) 01221 { 01222 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01223 if (bSubmask) 01224 pCur->u.Subnetmask = GetIpAddressFromStringW(szBuffer); 01225 else 01226 pCur->u.Metric = _wtoi(szBuffer); 01227 } 01228 01229 if (!pLast) 01230 { 01231 if (bSubmask) 01232 This->pCurrentConfig->Ip = pCur; 01233 else 01234 This->pCurrentConfig->Gw = pCur; 01235 } 01236 else 01237 { 01238 pLast->Next = pCur; 01239 } 01240 01241 pLast = pCur; 01242 } 01243 } 01244 } 01245 01246 01247 INT_PTR 01248 CALLBACK 01249 TcpipAdvancedIpDlg( 01250 HWND hwndDlg, 01251 UINT uMsg, 01252 WPARAM wParam, 01253 LPARAM lParam 01254 ) 01255 { 01256 TcpipConfNotifyImpl * This; 01257 LPPROPSHEETPAGE page; 01258 INT_PTR res; 01259 WCHAR szBuffer[200]; 01260 LPPSHNOTIFY lppsn; 01261 TcpipGwSettings Gw; 01262 TcpipIpSettings Ip; 01263 01264 LVITEMW li; 01265 01266 switch(uMsg) 01267 { 01268 case WM_INITDIALOG: 01269 page = (LPPROPSHEETPAGE)lParam; 01270 This = (TcpipConfNotifyImpl*)page->lParam; 01271 InitializeTcpipAdvancedIpDlg(hwndDlg, This); 01272 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This); 01273 return TRUE; 01274 case WM_NOTIFY: 01275 lppsn = (LPPSHNOTIFY) lParam; 01276 if (lppsn->hdr.code == PSN_KILLACTIVE) 01277 { 01278 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); 01279 if (!This->pCurrentConfig->DhcpEnabled && ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST)) == 0) 01280 { 01281 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING); 01282 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE); 01283 return TRUE; 01284 } 01285 } 01286 else if (lppsn->hdr.code == PSN_APPLY) 01287 { 01288 This = (TcpipConfNotifyImpl*) GetWindowLongPtr(hwndDlg, DWLP_USER); 01289 FreeIPAddr(This->pCurrentConfig->Gw); 01290 This->pCurrentConfig->Gw = NULL; 01291 FreeIPAddr(This->pCurrentConfig->Ip); 01292 This->pCurrentConfig->Ip = NULL; 01293 StoreIPSettings(GetDlgItem(hwndDlg, IDC_IPLIST), This, TRUE); 01294 StoreIPSettings(GetDlgItem(hwndDlg, IDC_GWLIST), This, FALSE); 01295 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); 01296 return TRUE; 01297 } 01298 break; 01299 case WM_COMMAND: 01300 if (LOWORD(wParam) == IDC_AUTOMETRIC) 01301 { 01302 if (SendDlgItemMessageW(hwndDlg, IDC_AUTOMETRIC, BM_GETCHECK, 0, 0) == BST_CHECKED) 01303 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), FALSE); 01304 else 01305 EnableWindow(GetDlgItem(hwndDlg, IDC_METRIC), TRUE); 01306 } 01307 else if (LOWORD(wParam) == IDC_IPADD) 01308 { 01309 Ip.bAdd = TRUE; 01310 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST); 01311 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip); 01312 if (res) 01313 { 01314 memset(&li, 0x0, sizeof(LVITEMW)); 01315 li.mask = LVIF_TEXT | LVIF_PARAM; 01316 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_IPLIST)); 01317 li.pszText = Ip.szIP; 01318 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_INSERTITEMW, 0, (LPARAM)&li); 01319 if (li.iItem != -1) 01320 { 01321 li.mask = LVIF_TEXT; 01322 li.iSubItem = 1; 01323 li.pszText = Ip.szMask; 01324 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01325 } 01326 } 01327 } 01328 else if (LOWORD(wParam) == IDC_IPMOD) 01329 { 01330 memset(&li, 0x0, sizeof(LVITEMW)); 01331 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_IPLIST)); 01332 if (li.iItem < 0) 01333 { 01334 /* no item selected */ 01335 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION); 01336 SetFocus(GetDlgItem(hwndDlg, IDC_IPLIST)); 01337 break; 01338 } 01339 Ip.bAdd = FALSE; 01340 Ip.hDlgCtrl = GetDlgItem(hwndDlg, IDC_IPLIST); 01341 if (GetIPListEntry(GetDlgItem(hwndDlg, IDC_IPLIST), li.iItem, &Ip)) 01342 { 01343 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPADDIP_DLG), hwndDlg, TcpipAddIpDlg, (LPARAM)&Ip); 01344 if (res) 01345 { 01346 li.mask = LVIF_TEXT; 01347 li.pszText = Ip.szIP; 01348 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01349 li.pszText = Ip.szMask; 01350 li.iSubItem = 1; 01351 SendDlgItemMessageW(hwndDlg, IDC_IPLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01352 } 01353 } 01354 } 01355 else if (LOWORD(wParam) == IDC_IPDEL) 01356 { 01357 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_IPLIST)); 01358 break; 01359 } 01360 else if (LOWORD(wParam) == IDC_GWADD) 01361 { 01362 Gw.bAdd = TRUE; 01363 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST); 01364 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw); 01365 if (res) 01366 { 01367 memset(&li, 0x0, sizeof(LVITEMW)); 01368 li.mask = LVIF_TEXT; 01369 li.iItem = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_GWLIST)); 01370 li.pszText = Gw.szIP; 01371 li.iItem = SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_INSERTITEMW, 0, (LPARAM)&li); 01372 if (li.iItem >= 0) 01373 { 01374 if (Gw.Metric) 01375 { 01376 swprintf(szBuffer, L"%u", Gw.Metric); 01377 li.iSubItem = 1; 01378 li.pszText = szBuffer; 01379 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01380 } 01381 else 01382 { 01383 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01384 { 01385 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01386 li.iSubItem = 1; 01387 li.pszText = szBuffer; 01388 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01389 } 01390 } 01391 } 01392 } 01393 break; 01394 } 01395 else if (LOWORD(wParam) == IDC_GWMOD) 01396 { 01397 memset(&li, 0x0, sizeof(LVITEMW)); 01398 li.iItem = GetSelectedItem(GetDlgItem(hwndDlg, IDC_GWLIST)); 01399 if (li.iItem < 0) 01400 { 01401 /* no item selected */ 01402 DisplayError(IDS_NOITEMSEL, IDS_TCPIP, MB_ICONINFORMATION); 01403 SetFocus(GetDlgItem(hwndDlg, IDC_GWLIST)); 01404 break; 01405 } 01406 if (GetGWListEntry(GetDlgItem(hwndDlg, IDC_GWLIST), li.iItem, &Gw)) 01407 { 01408 Gw.bAdd = FALSE; 01409 Gw.hDlgCtrl = GetDlgItem(hwndDlg, IDC_GWLIST); 01410 res = DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPGW_DLG), hwndDlg, TcpipAdvGwDlg, (LPARAM)&Gw); 01411 if (res) 01412 { 01413 li.mask = LVIF_TEXT; 01414 li.pszText = Gw.szIP; 01415 (void)SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01416 if (Gw.Metric) 01417 { 01418 swprintf(szBuffer, L"%u", Gw.Metric); 01419 li.iSubItem = 1; 01420 li.pszText = szBuffer; 01421 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01422 } 01423 else 01424 { 01425 if (LoadStringW(netcfgx_hInstance, IDS_AUTOMATIC, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01426 { 01427 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01428 li.iSubItem = 1; 01429 li.pszText = szBuffer; 01430 SendDlgItemMessageW(hwndDlg, IDC_GWLIST, LVM_SETITEMW, 0, (LPARAM)&li); 01431 } 01432 } 01433 } 01434 } 01435 break; 01436 } 01437 else if (LOWORD(wParam) == IDC_GWDEL) 01438 { 01439 DeleteItemFromList(GetDlgItem(hwndDlg, IDC_GWLIST)); 01440 break; 01441 } 01442 } 01443 return FALSE; 01444 } 01445 01446 INT_PTR 01447 CALLBACK 01448 TcpipAddDNSDlg( 01449 HWND hwndDlg, 01450 UINT uMsg, 01451 WPARAM wParam, 01452 LPARAM lParam 01453 ) 01454 { 01455 TcpipDnsSettings * pSettings; 01456 WCHAR szBuffer[100]; 01457 DWORD dwIpAddr; 01458 LPNMIPADDRESS lpnmipa; 01459 01460 switch(uMsg) 01461 { 01462 case WM_INITDIALOG: 01463 pSettings = (TcpipDnsSettings*)lParam; 01464 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)lParam); 01465 if (!pSettings->bAdd) 01466 { 01467 if (LoadStringW(netcfgx_hInstance, IDS_MOD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01468 { 01469 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01470 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 01471 } 01472 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_SETTEXT, 0, (LPARAM)pSettings->szIP); 01473 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE); 01474 } 01475 else 01476 { 01477 if (LoadStringW(netcfgx_hInstance, IDS_ADD, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 01478 { 01479 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 01480 SendDlgItemMessageW(hwndDlg, IDC_OK, WM_SETTEXT, 0, (LPARAM)szBuffer); 01481 } 01482 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), FALSE); 01483 } 01484 return TRUE; 01485 case WM_COMMAND: 01486 if (LOWORD(wParam) == IDCANCEL) 01487 { 01488 EndDialog(hwndDlg, FALSE); 01489 break; 01490 } 01491 else if (LOWORD(wParam) == IDC_OK) 01492 { 01493 pSettings = (TcpipDnsSettings*)GetWindowLongPtr(hwndDlg, DWLP_USER); 01494 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, WM_GETTEXT, 16, (LPARAM)pSettings->szIP); 01495 if (SendMessageW(pSettings->hDlgCtrl, LB_FINDSTRING, 0, (LPARAM)pSettings->szIP) == LB_ERR) 01496 { 01497 if (pSettings->bAdd) 01498 SendMessageW(pSettings->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)pSettings->szIP); 01499 EndDialog(hwndDlg, TRUE); 01500 break; 01501 } 01502 if (!pSettings->bAdd) 01503 { 01504 EndDialog(hwndDlg, FALSE); 01505 break; 01506 } 01507 DisplayError(IDS_DUP_SUFFIX, IDS_TCPIP, MB_ICONERROR); 01508 break; 01509 } 01510 break; 01511 case WM_NOTIFY: 01512 lpnmipa = (LPNMIPADDRESS) lParam; 01513 if (lpnmipa->hdr.code == IPN_FIELDCHANGED) 01514 { 01515 if (lpnmipa->hdr.idFrom == IDC_IPADDR) 01516 { 01517 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 01518 EnableWindow(GetDlgItem(hwndDlg, IDC_OK), TRUE); 01519 } 01520 } 01521 break; 01522 } 01523 return FALSE; 01524 } 01525 01526 01527 01528 VOID 01529 InitializeTcpipAdvancedDNSDlg( 01530 HWND hwndDlg, 01531 TcpipConfNotifyImpl * This) 01532 { 01533 WCHAR szBuffer[200]; 01534 LPWSTR pFirst, pSep, pList; 01535 IP_ADDR * pAddr; 01536 DWORD dwIpAddr; 01537 01538 /* insert DNS addresses */ 01539 pAddr = This->pCurrentConfig->Ns; 01540 while(pAddr) 01541 { 01542 dwIpAddr = pAddr->IpAddress; 01543 swprintf(szBuffer, L"%lu.%lu.%lu.%lu", 01544 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 01545 01546 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_ADDSTRING, 0, (LPARAM)szBuffer); 01547 pAddr = pAddr->Next; 01548 } 01549 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, 0, 0); 01550 01551 if (!This->pCurrentConfig->pDNS) 01552 return; 01553 01554 if (This->pCurrentConfig->pDNS->RegisterAdapterName) 01555 SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_SETCHECK, BST_CHECKED, 0); 01556 else 01557 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE); 01558 01559 if (This->pCurrentConfig->pDNS->RegistrationEnabled) 01560 SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_SETCHECK, BST_CHECKED, 0); 01561 01562 if (This->pCurrentConfig->pDNS->szDomain[0]) 01563 SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_SETTEXT, 0, (LPARAM)szBuffer); 01564 01565 if (This->pCurrentConfig->pDNS->UseDomainNameDevolution) 01566 SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0); 01567 01568 if (!This->pCurrentConfig->pDNS->szSearchList || (wcslen(This->pCurrentConfig->pDNS->szSearchList) == 0)) 01569 { 01570 SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_SETCHECK, BST_CHECKED, 0); 01571 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE); 01572 01573 return; 01574 } 01575 01576 pList = This->pCurrentConfig->pDNS->szSearchList; 01577 if (wcslen(pList)) 01578 { 01579 pFirst = pList; 01580 do 01581 { 01582 pSep = wcschr(pFirst, L','); 01583 if (pSep) 01584 { 01585 pSep[0] = L'\0'; 01586 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst); 01587 pFirst = pSep + 1; 01588 pSep[0] = L','; 01589 } 01590 else 01591 { 01592 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)pFirst); 01593 break; 01594 } 01595 }while(TRUE); 01596 01597 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE); 01598 SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_SETCHECK, BST_CHECKED, 0); 01599 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, 0, 0); 01600 } 01601 } 01602 01603 VOID 01604 ToggleUpDown(HWND hwndDlg, HWND hDlgCtrl, UINT UpButton, UINT DownButton, UINT ModButton, UINT DelButton) 01605 { 01606 LRESULT lResult, lCount; 01607 01608 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0); 01609 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0); 01610 if (lResult != LB_ERR) 01611 { 01612 if (lResult == 0) 01613 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE); 01614 else 01615 EnableWindow(GetDlgItem(hwndDlg, UpButton), TRUE); 01616 01617 if (lResult < lCount -1) 01618 EnableWindow(GetDlgItem(hwndDlg, DownButton), TRUE); 01619 else 01620 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE); 01621 } 01622 01623 if (lCount) 01624 { 01625 EnableWindow(GetDlgItem(hwndDlg, ModButton), TRUE); 01626 EnableWindow(GetDlgItem(hwndDlg, DelButton), TRUE); 01627 } 01628 else 01629 { 01630 EnableWindow(GetDlgItem(hwndDlg, ModButton), FALSE); 01631 EnableWindow(GetDlgItem(hwndDlg, DelButton), FALSE); 01632 EnableWindow(GetDlgItem(hwndDlg, UpButton), FALSE); 01633 EnableWindow(GetDlgItem(hwndDlg, DownButton), FALSE); 01634 } 01635 } 01636 01637 VOID 01638 MoveItem( 01639 HWND hDlgCtrl, 01640 INT pos) 01641 { 01642 WCHAR szBuffer[100]; 01643 LRESULT lResult; 01644 01645 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0); 01646 if (lResult != LB_ERR) 01647 { 01648 if (SendMessageW(hDlgCtrl, LB_GETTEXTLEN, (WPARAM)lResult, 0) < sizeof(szBuffer)/sizeof(WCHAR) - 1) 01649 { 01650 if (SendMessageW(hDlgCtrl, LB_GETTEXT, (WPARAM)lResult, (LPARAM)szBuffer) != LB_ERR) 01651 { 01652 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0); 01653 SendMessageW(hDlgCtrl, LB_INSERTSTRING, (WPARAM)lResult + pos, (LPARAM)szBuffer); 01654 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult + pos, 0); 01655 } 01656 } 01657 } 01658 } 01659 VOID 01660 RemoveItem( 01661 HWND hDlgCtrl) 01662 { 01663 LRESULT lResult, lCount; 01664 01665 lResult = SendMessageW(hDlgCtrl, LB_GETCURSEL, 0, 0); 01666 if (lResult != LB_ERR) 01667 { 01668 SendMessageW(hDlgCtrl, LB_DELETESTRING, (WPARAM)lResult, 0); 01669 lCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0); 01670 if (lResult + 1 < lCount) 01671 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lResult, 0); 01672 else 01673 SendMessageW(hDlgCtrl, LB_SETCURSEL, (WPARAM)lCount-1, 0); 01674 } 01675 } 01676 01677 LPWSTR 01678 GetListViewEntries( 01679 HWND hDlgCtrl) 01680 { 01681 DWORD dwSize; 01682 INT iCount, iIndex; 01683 INT_PTR lResult; 01684 LPWSTR pszSearchList, pItem; 01685 01686 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0); 01687 if (!iCount || iCount == LB_ERR) 01688 return NULL; //BUGBUG 01689 01690 dwSize = 0; 01691 01692 for (iIndex = 0; iIndex < iCount; iIndex++) 01693 { 01694 lResult = SendMessageW(hDlgCtrl, LB_GETTEXTLEN, iIndex, 0); 01695 if (lResult == LB_ERR) 01696 return NULL; 01697 01698 dwSize += lResult + 1; 01699 } 01700 01701 pszSearchList = (LPWSTR)CoTaskMemAlloc((dwSize + 1) * sizeof(WCHAR)); 01702 if (!pszSearchList) 01703 return NULL; 01704 01705 pItem = pszSearchList; 01706 for (iIndex = 0; iIndex < iCount; iIndex++) 01707 { 01708 lResult = SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)pItem); 01709 if (lResult == LB_ERR) 01710 { 01711 CoTaskMemFree(pszSearchList); 01712 return NULL; 01713 } 01714 dwSize -= lResult + 1; 01715 pItem += wcslen(pItem); 01716 if (iIndex != iCount -1) 01717 { 01718 pItem[0] = L','; 01719 pItem++; 01720 } 01721 } 01722 pItem[0] = L'\0'; 01723 return pszSearchList; 01724 } 01725 01726 VOID 01727 StoreDNSSettings( 01728 HWND hDlgCtrl, 01729 TcpipConfNotifyImpl *This) 01730 { 01731 INT iCount, iIndex; 01732 WCHAR Ip[16]; 01733 IP_ADDR *pCur, *pLast; 01734 01735 FreeIPAddr(This->pCurrentConfig->Ns); 01736 This->pCurrentConfig->Ns = NULL; 01737 01738 iCount = SendMessageW(hDlgCtrl, LB_GETCOUNT, 0, 0); 01739 if (!iCount || iCount == LB_ERR) 01740 { 01741 return; 01742 } 01743 01744 pLast = NULL; 01745 for(iIndex = 0; iIndex < iCount; iIndex++) 01746 { 01747 if (SendMessageW(hDlgCtrl, LB_GETTEXT, iIndex, (LPARAM)Ip) == LB_ERR) 01748 break; 01749 01750 pCur = CoTaskMemAlloc(sizeof(IP_ADDR)); 01751 if (!pCur) 01752 break; 01753 ZeroMemory(pCur, sizeof(IP_ADDR)); 01754 pCur->IpAddress = GetIpAddressFromStringW(Ip); 01755 01756 if (!pLast) 01757 This->pCurrentConfig->Ns = pCur; 01758 else 01759 pLast->Next = pCur; 01760 01761 pLast = pCur; 01762 pCur = pCur->Next; 01763 } 01764 This->pCurrentConfig->AutoconfigActive = FALSE; 01765 } 01766 01767 INT_PTR 01768 CALLBACK 01769 TcpipAdvancedDnsDlg( 01770 HWND hwndDlg, 01771 UINT uMsg, 01772 WPARAM wParam, 01773 LPARAM lParam 01774 ) 01775 { 01776 TcpipConfNotifyImpl * This; 01777 LPPROPSHEETPAGE page; 01778 TcpipDnsSettings Dns; 01779 LRESULT lIndex, lLength; 01780 TcpipSuffixSettings Suffix; 01781 LPPSHNOTIFY lppsn; 01782 WCHAR szSuffix[100]; 01783 WCHAR szFormat[200]; 01784 WCHAR szBuffer[300]; 01785 01786 01787 switch(uMsg) 01788 { 01789 case WM_INITDIALOG: 01790 page = (LPPROPSHEETPAGE)lParam; 01791 This = (TcpipConfNotifyImpl*)page->lParam; 01792 SetWindowLongPtr(hwndDlg, DWLP_USER, (INT_PTR)This); 01793 InitializeTcpipAdvancedDNSDlg(hwndDlg, This); 01794 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01795 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01796 return TRUE; 01797 case WM_NOTIFY: 01798 lppsn = (LPPSHNOTIFY) lParam; 01799 if (lppsn->hdr.code == PSN_KILLACTIVE) 01800 { 01801 if (SendDlgItemMessageW(hwndDlg, IDC_SELSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED && 01802 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCOUNT, 0, 0) == 0) 01803 { 01804 DisplayError(IDS_NO_SUFFIX, IDS_TCPIP, MB_ICONWARNING); 01805 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE); 01806 return TRUE; 01807 } 01808 if (SendDlgItemMessageW(hwndDlg, IDC_SUFFIX, WM_GETTEXT, sizeof(szSuffix)/sizeof(WCHAR), (LPARAM)szSuffix)) 01809 { 01810 szSuffix[(sizeof(szSuffix)/sizeof(WCHAR))-1] = L'\0'; 01811 if (VerifyDNSSuffix(szSuffix) == FALSE) 01812 { 01813 if (LoadStringW(netcfgx_hInstance, IDS_DNS_SUFFIX, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 01814 { 01815 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0'; 01816 swprintf(szBuffer, szFormat, szSuffix); 01817 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szFormat, sizeof(szFormat)/sizeof(WCHAR))) 01818 szFormat[(sizeof(szFormat)/sizeof(WCHAR))-1] = L'\0'; 01819 else 01820 szFormat[0] = L'\0'; 01821 01822 MessageBoxW(hwndDlg, szBuffer, szFormat, MB_ICONWARNING); 01823 SetWindowLongPtr(hwndDlg, DWL_MSGRESULT, TRUE); 01824 SetFocus(GetDlgItem(hwndDlg, IDC_SUFFIX)); 01825 return TRUE; 01826 } 01827 } 01828 } 01829 } 01830 else if (lppsn->hdr.code == PSN_APPLY) 01831 { 01832 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); 01833 if (!This->pCurrentConfig->pDNS) 01834 break; 01835 01836 StoreDNSSettings(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), This); 01837 if (SendDlgItemMessageW(hwndDlg, IDC_PRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED) 01838 { 01839 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList); 01840 This->pCurrentConfig->pDNS->szSearchList = NULL; 01841 if (SendDlgItemMessageW(hwndDlg, IDC_TOPPRIMSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED) 01842 This->pCurrentConfig->pDNS->UseDomainNameDevolution = TRUE; 01843 else 01844 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE; 01845 } 01846 else 01847 { 01848 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList); 01849 This->pCurrentConfig->pDNS->szSearchList = NULL; 01850 This->pCurrentConfig->pDNS->UseDomainNameDevolution = FALSE; 01851 This->pCurrentConfig->pDNS->szSearchList = GetListViewEntries(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 01852 } 01853 01854 if (SendDlgItemMessageW(hwndDlg, IDC_REGSUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED) 01855 { 01856 This->pCurrentConfig->pDNS->RegisterAdapterName = TRUE; 01857 if (SendDlgItemMessageW(hwndDlg, IDC_USESUFFIX, BM_GETCHECK, 0, 0) == BST_CHECKED) 01858 This->pCurrentConfig->pDNS->RegistrationEnabled = TRUE; 01859 else 01860 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE; 01861 } 01862 else 01863 { 01864 This->pCurrentConfig->pDNS->RegisterAdapterName = FALSE; 01865 This->pCurrentConfig->pDNS->RegistrationEnabled = FALSE; 01866 } 01867 } 01868 break; 01869 case WM_COMMAND: 01870 if (LOWORD(wParam) == IDC_DNSADDRLIST && HIWORD(wParam) == LBN_SELCHANGE) 01871 { 01872 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01873 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01874 break; 01875 } 01876 else if (LOWORD(wParam) == IDC_DNSSUFFIXLIST && HIWORD(wParam) == LBN_SELCHANGE) 01877 { 01878 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01879 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01880 break; 01881 } 01882 else if (LOWORD(wParam) == IDC_PRIMSUFFIX && HIWORD(wParam) == BN_CLICKED) 01883 { 01884 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) 01885 { 01886 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXUP), FALSE); 01887 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDOWN), FALSE); 01888 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), FALSE); 01889 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXMOD), FALSE); 01890 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXDEL), FALSE); 01891 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), TRUE); 01892 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_RESETCONTENT, 0, 0); 01893 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01894 } 01895 } 01896 else if (LOWORD(wParam) == IDC_SELSUFFIX && HIWORD(wParam) == BN_CLICKED) 01897 { 01898 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) 01899 { 01900 EnableWindow(GetDlgItem(hwndDlg, IDC_DNSSUFFIXADD), TRUE); 01901 EnableWindow(GetDlgItem(hwndDlg, IDC_TOPPRIMSUFFIX), FALSE); 01902 ToggleUpDown(hwndDlg, (HWND)lParam, IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01903 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01904 } 01905 break; 01906 } 01907 else if (LOWORD(wParam) == IDC_REGSUFFIX && HIWORD(wParam) == BN_CLICKED) 01908 { 01909 if (SendMessageW((HWND)lParam, BM_GETCHECK, 0, 0) == BST_CHECKED) 01910 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), TRUE); 01911 else 01912 EnableWindow(GetDlgItem(hwndDlg, IDC_USESUFFIX), FALSE); 01913 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01914 } 01915 else if (LOWORD(wParam) == IDC_DNSADDRUP && HIWORD(wParam) == BN_CLICKED) 01916 { 01917 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), -1); 01918 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01919 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST)); 01920 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01921 break; 01922 } 01923 else if (LOWORD(wParam) == IDC_DNSADDRDOWN && HIWORD(wParam) == BN_CLICKED) 01924 { 01925 MoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST), 1); 01926 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01927 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST)); 01928 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01929 break; 01930 } 01931 else if (LOWORD(wParam) == IDC_DNSSUFFIXUP && HIWORD(wParam) == BN_CLICKED) 01932 { 01933 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), -1); 01934 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01935 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 01936 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01937 break; 01938 } 01939 else if (LOWORD(wParam) == IDC_DNSSUFFIXDOWN && HIWORD(wParam) == BN_CLICKED) 01940 { 01941 MoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), 1); 01942 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01943 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 01944 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01945 break; 01946 } 01947 else if (LOWORD(wParam) == IDC_DNSADDRDEL && HIWORD(wParam) == BN_CLICKED) 01948 { 01949 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSADDRLIST)); 01950 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01951 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST)); 01952 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01953 break; 01954 } 01955 else if (LOWORD(wParam) == IDC_DNSSUFFIXDEL && HIWORD(wParam) == BN_CLICKED) 01956 { 01957 RemoveItem(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 01958 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 01959 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 01960 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01961 break; 01962 } 01963 else if (LOWORD(wParam) == IDC_DNSADDRADD && HIWORD(wParam) == BN_CLICKED) 01964 { 01965 Dns.bAdd = TRUE; 01966 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST); 01967 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns)) 01968 { 01969 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSADDRLIST), IDC_DNSADDRUP, IDC_DNSADDRDOWN, IDC_DNSADDRMOD, IDC_DNSADDRDEL); 01970 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01971 } 01972 break; 01973 } 01974 else if (LOWORD(wParam) == IDC_DNSADDRMOD && HIWORD(wParam) == BN_CLICKED) 01975 { 01976 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSADDRLIST, LB_GETCURSEL, 0, 0); 01977 if (lIndex != LB_ERR) 01978 { 01979 Dns.bAdd = FALSE; 01980 Dns.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSADDRLIST); 01981 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_GETTEXT, (WPARAM)lIndex, (LPARAM)Dns.szIP); 01982 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPDNS_DLG), NULL, TcpipAddDNSDlg, (LPARAM)&Dns)) 01983 { 01984 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_DELETESTRING, lIndex, 0); 01985 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_INSERTSTRING, lIndex, (LPARAM)Dns.szIP); 01986 SendDlgItemMessageW(hwndDlg, IDC_DNSADDRLIST, LB_SETCURSEL, lIndex, 0); 01987 SetFocus(GetDlgItem(hwndDlg, IDC_DNSADDRLIST)); 01988 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 01989 } 01990 } 01991 break; 01992 } 01993 else if (LOWORD(wParam) == IDC_DNSSUFFIXADD && HIWORD(wParam) == BN_CLICKED) 01994 { 01995 Suffix.bAdd = TRUE; 01996 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST); 01997 Suffix.Suffix = NULL; 01998 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix)) 01999 { 02000 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 02001 lIndex = SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_ADDSTRING, 0, (LPARAM)Suffix.Suffix); 02002 if (lIndex != LB_ERR) 02003 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0); 02004 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 02005 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02006 CoTaskMemFree(Suffix.Suffix); 02007 } 02008 break; 02009 } 02010 else if (LOWORD(wParam) == IDC_DNSSUFFIXMOD && HIWORD(wParam) == BN_CLICKED) 02011 { 02012 lIndex = SendDlgItemMessage(hwndDlg, IDC_DNSSUFFIXLIST, LB_GETCURSEL, 0, 0); 02013 if (lIndex != LB_ERR) 02014 { 02015 Suffix.bAdd = FALSE; 02016 Suffix.hDlgCtrl = GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST); 02017 lLength = SendMessageW(Suffix.hDlgCtrl, LB_GETTEXTLEN, lIndex, 0); 02018 if (lLength != LB_ERR) 02019 { 02020 Suffix.Suffix = (LPWSTR)CoTaskMemAlloc((lLength + 1) * sizeof(WCHAR)); 02021 if (Suffix.Suffix) 02022 { 02023 SendMessageW(Suffix.hDlgCtrl, LB_GETTEXT, lIndex, (LPARAM)Suffix.Suffix); 02024 Suffix.Suffix[lLength] = L'\0'; 02025 if (DialogBoxParamW(netcfgx_hInstance, MAKEINTRESOURCEW(IDD_TCPIPSUFFIX_DLG), NULL, TcpipAddSuffixDlg, (LPARAM)&Suffix)) 02026 { 02027 if (Suffix.Suffix) 02028 { 02029 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_DELETESTRING, lIndex, 0); 02030 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_INSERTSTRING, lIndex, (LPARAM)Suffix.Suffix); 02031 SendDlgItemMessageW(hwndDlg, IDC_DNSSUFFIXLIST, LB_SETCURSEL, lIndex, 0); 02032 SetFocus(GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST)); 02033 CoTaskMemFree(Suffix.Suffix); 02034 } 02035 ToggleUpDown(hwndDlg, GetDlgItem(hwndDlg, IDC_DNSSUFFIXLIST), IDC_DNSSUFFIXUP, IDC_DNSSUFFIXDOWN, IDC_DNSSUFFIXMOD, IDC_DNSSUFFIXDEL); 02036 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02037 } 02038 } 02039 } 02040 } 02041 break; 02042 } 02043 } 02044 return FALSE; 02045 } 02046 02047 VOID 02048 LaunchAdvancedTcpipSettings( 02049 HWND hwndDlg, 02050 TcpipConfNotifyImpl * This) 02051 { 02052 PROPSHEETHEADERW pinfo; 02053 HPROPSHEETPAGE hppages[3]; 02054 WCHAR szBuffer[100]; 02055 02056 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVIP_DLG), TcpipAdvancedIpDlg, (LPARAM)This, NULL); 02057 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVDNS_DLG), TcpipAdvancedDnsDlg, (LPARAM)This, NULL); 02058 hppages[2] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ADVOPT_DLG), TcpipAdvancedOptDlg, (LPARAM)This, NULL); 02059 02060 02061 if (LoadStringW(netcfgx_hInstance, IDS_TCPIP, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) 02062 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 02063 else 02064 szBuffer[0] = L'\0'; 02065 02066 ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); 02067 pinfo.dwSize = sizeof(PROPSHEETHEADERW); 02068 pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; 02069 pinfo.u3.phpage = hppages; 02070 pinfo.nPages = 3; 02071 pinfo.hwndParent = hwndDlg; 02072 pinfo.pszCaption = szBuffer; 02073 02074 StoreTcpipBasicSettings(hwndDlg, This, FALSE); 02075 PropertySheetW(&pinfo); 02076 02077 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig); 02078 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02079 } 02080 02081 INT_PTR 02082 CALLBACK 02083 TcpipAltConfDlg( 02084 HWND hwndDlg, 02085 UINT uMsg, 02086 WPARAM wParam, 02087 LPARAM lParam) 02088 { 02089 switch(uMsg) 02090 { 02091 case WM_INITDIALOG: 02092 return TRUE; 02093 } 02094 return FALSE; 02095 } 02096 02097 VOID 02098 AddAlternativeDialog( 02099 HWND hDlg, 02100 TcpipConfNotifyImpl * This) 02101 { 02102 HPROPSHEETPAGE hpage; 02103 02104 hpage = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL); 02105 if (!hpage) 02106 return; 02107 02108 SendMessageW(hDlg, PSM_INSERTPAGE, 1, (LPARAM)hpage); 02109 } 02110 02111 INT_PTR 02112 StoreTcpipBasicSettings( 02113 HWND hwndDlg, 02114 TcpipConfNotifyImpl * This, 02115 BOOL bApply) 02116 { 02117 DWORD dwIpAddr; 02118 02119 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED) 02120 { 02121 This->pCurrentConfig->DhcpEnabled = FALSE; 02122 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4) 02123 { 02124 if (bApply) 02125 { 02126 DisplayError(IDS_NO_IPADDR_SET, IDS_TCPIP, MB_ICONWARNING); 02127 SetFocus(GetDlgItem(hwndDlg, IDC_IPADDR)); 02128 return E_FAIL; 02129 } 02130 } 02131 if (!This->pCurrentConfig->Ip) 02132 { 02133 This->pCurrentConfig->Ip = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 02134 if (!This->pCurrentConfig->Ip) 02135 return E_OUTOFMEMORY; 02136 ZeroMemory(This->pCurrentConfig->Ip, sizeof(IP_ADDR)); 02137 } 02138 This->pCurrentConfig->Ip->IpAddress = dwIpAddr; 02139 02140 if (SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) != 4) 02141 { 02142 if (bApply) 02143 DisplayError(IDS_NO_SUBMASK_SET, IDS_TCPIP, MB_ICONWARNING); 02144 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 02145 { 02146 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255)) 02147 dwIpAddr = MAKEIPADDRESS(255, 0, 0, 0); 02148 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255)) 02149 dwIpAddr = MAKEIPADDRESS(255, 255, 0, 0); 02150 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255)) 02151 dwIpAddr = MAKEIPADDRESS(255, 255, 255, 0); 02152 02153 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)dwIpAddr); 02154 } 02155 if (bApply) 02156 { 02157 SetFocus(GetDlgItem(hwndDlg, IDC_SUBNETMASK)); 02158 return E_FAIL; 02159 } 02160 } 02161 /* store subnetmask */ 02162 This->pCurrentConfig->Ip->u.Subnetmask = dwIpAddr; 02163 02164 if (SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 02165 { 02166 if (!This->pCurrentConfig->Gw) 02167 { 02168 This->pCurrentConfig->Gw = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 02169 if (!This->pCurrentConfig->Gw) 02170 return E_OUTOFMEMORY; 02171 ZeroMemory(This->pCurrentConfig->Gw, sizeof(IP_ADDR)); 02172 } 02173 /* store default gateway */ 02174 This->pCurrentConfig->Gw->IpAddress = dwIpAddr; 02175 } 02176 else 02177 { 02178 if (This->pCurrentConfig->Gw) 02179 { 02180 IP_ADDR * pNextGw = This->pCurrentConfig->Gw->Next; 02181 CoTaskMemFree(This->pCurrentConfig->Gw); 02182 This->pCurrentConfig->Gw = pNextGw; 02183 } 02184 } 02185 } 02186 else 02187 { 02188 This->pCurrentConfig->DhcpEnabled = TRUE; 02189 } 02190 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED) 02191 { 02192 BOOL bSkip = FALSE; 02193 This->pCurrentConfig->AutoconfigActive = FALSE; 02194 if (SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 02195 { 02196 if (!This->pCurrentConfig->Ns) 02197 { 02198 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 02199 if (!This->pCurrentConfig->Ns) 02200 return E_OUTOFMEMORY; 02201 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR)); 02202 } 02203 This->pCurrentConfig->Ns->IpAddress = dwIpAddr; 02204 } 02205 else if (This->pCurrentConfig->Ns) 02206 { 02207 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next; 02208 02209 CoTaskMemFree(This->pCurrentConfig->Ns); 02210 This->pCurrentConfig->Ns = pTemp; 02211 bSkip = TRUE; 02212 } 02213 02214 02215 if (SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 02216 { 02217 if (!This->pCurrentConfig->Ns || bSkip) 02218 { 02219 if (!This->pCurrentConfig->Ns) 02220 { 02221 This->pCurrentConfig->Ns = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 02222 if (!This->pCurrentConfig->Ns) 02223 return E_OUTOFMEMORY; 02224 ZeroMemory(This->pCurrentConfig->Ns, sizeof(IP_ADDR)); 02225 } 02226 This->pCurrentConfig->Ns->IpAddress = dwIpAddr; 02227 } 02228 else if (!This->pCurrentConfig->Ns->Next) 02229 { 02230 This->pCurrentConfig->Ns->Next = (IP_ADDR*)CoTaskMemAlloc(sizeof(IP_ADDR)); 02231 if (!This->pCurrentConfig->Ns->Next) 02232 return E_OUTOFMEMORY; 02233 ZeroMemory(This->pCurrentConfig->Ns->Next, sizeof(IP_ADDR)); 02234 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr; 02235 } 02236 else 02237 { 02238 This->pCurrentConfig->Ns->Next->IpAddress = dwIpAddr; 02239 } 02240 } 02241 else 02242 { 02243 if (This->pCurrentConfig->Ns && This->pCurrentConfig->Ns->Next) 02244 { 02245 if (This->pCurrentConfig->Ns->Next->Next) 02246 { 02247 IP_ADDR *pTemp = This->pCurrentConfig->Ns->Next->Next; 02248 CoTaskMemFree(This->pCurrentConfig->Ns->Next); 02249 This->pCurrentConfig->Ns->Next = pTemp; 02250 } 02251 else 02252 { 02253 CoTaskMemFree(This->pCurrentConfig->Ns->Next); 02254 This->pCurrentConfig->Ns->Next = NULL; 02255 } 02256 } 02257 } 02258 } 02259 else 02260 { 02261 This->pCurrentConfig->AutoconfigActive = TRUE; 02262 } 02263 return S_OK; 02264 } 02265 02266 HRESULT 02267 InitializeTcpipBasicDlgCtrls( 02268 HWND hwndDlg, 02269 TcpipSettings * pCurSettings) 02270 { 02271 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 02272 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 02273 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 02274 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 02275 02276 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 0, MAKEIPRANGE(0, 255)); 02277 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 02278 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 02279 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 02280 02281 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 02282 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 02283 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 02284 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 02285 02286 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 02287 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 02288 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 02289 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 02290 02291 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 0, MAKEIPRANGE(1, 223)); 02292 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 1, MAKEIPRANGE(0, 255)); 02293 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 2, MAKEIPRANGE(0, 255)); 02294 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETRANGE, 3, MAKEIPRANGE(0, 255)); 02295 02296 if (pCurSettings->DhcpEnabled) 02297 { 02298 SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_SETCHECK, BST_CHECKED, 0); 02299 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE); 02300 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE); 02301 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE); 02302 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE); 02303 } 02304 else 02305 { 02306 SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_SETCHECK, BST_CHECKED, 0); 02307 02308 if (pCurSettings->Ip) 02309 { 02310 /* set current ip address */ 02311 SendDlgItemMessageA(hwndDlg, IDC_IPADDR, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->IpAddress); 02312 /* set current hostmask */ 02313 SendDlgItemMessageA(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ip->u.Subnetmask); 02314 } 02315 if (pCurSettings->Gw && pCurSettings->Gw->IpAddress) 02316 { 02317 /* set current gateway */ 02318 SendDlgItemMessageA(hwndDlg, IDC_DEFGATEWAY, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Gw->IpAddress); 02319 } 02320 } 02321 if (pCurSettings->AutoconfigActive) 02322 { 02323 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_CHECKED, 0); 02324 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE); 02325 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE); 02326 } 02327 else 02328 { 02329 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0); 02330 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); 02331 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); 02332 if (pCurSettings->Ns) 02333 { 02334 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress); 02335 if (pCurSettings->Ns->Next) 02336 { 02337 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->Next->IpAddress); 02338 } 02339 else 02340 { 02341 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0); 02342 } 02343 } 02344 else 02345 { 02346 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0); 02347 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0); 02348 } 02349 } 02350 02351 return S_OK; 02352 } 02353 02354 HRESULT 02355 CopyIpAddrString( 02356 IP_ADDR_STRING * pSrc, 02357 IP_ADDR ** pTarget, 02358 COPY_TYPE Type, 02359 LPWSTR szMetric) 02360 { 02361 IP_ADDR_STRING * pCurrent; 02362 IP_ADDR *pNew, *pLast; 02363 02364 pCurrent = pSrc; 02365 pLast = NULL; 02366 02367 while(pCurrent) 02368 { 02369 pNew = CoTaskMemAlloc(sizeof(IP_ADDR)); 02370 if (!pNew) 02371 { 02372 break; 02373 } 02374 ZeroMemory(pNew, sizeof(IP_ADDR)); 02375 pNew->IpAddress = GetIpAddressFromStringA(pCurrent->IpAddress.String); 02376 if (!pNew->IpAddress) 02377 { 02378 CoTaskMemFree(pNew); 02379 return E_FAIL; 02380 } 02381 02382 if (Type == SUBMASK) 02383 { 02384 pNew->u.Subnetmask = GetIpAddressFromStringA(pCurrent->IpMask.String); 02385 pNew->NTEContext = pCurrent->Context; 02386 } 02387 else if (Type == METRIC) 02388 { 02389 if (szMetric && szMetric[0] != L'\0') 02390 { 02391 pNew->u.Metric = _wtoi(szMetric); 02392 szMetric += wcslen(szMetric) + 1; 02393 } 02394 } 02395 02396 if (!pLast) 02397 *pTarget = pNew; 02398 else 02399 pLast->Next = pNew; 02400 02401 pLast = pNew; 02402 pCurrent = pCurrent->Next; 02403 02404 } 02405 pLast->Next = NULL; 02406 return S_OK; 02407 } 02408 02409 02410 02411 INT_PTR 02412 CALLBACK 02413 TcpipBasicDlg( 02414 HWND hwndDlg, 02415 UINT uMsg, 02416 WPARAM wParam, 02417 LPARAM lParam 02418 ) 02419 { 02420 TcpipConfNotifyImpl * This; 02421 LPPROPSHEETPAGE page; 02422 LPNMIPADDRESS lpnmipa; 02423 LPPSHNOTIFY lppsn; 02424 DWORD dwIpAddr; 02425 02426 02427 switch(uMsg) 02428 { 02429 case WM_INITDIALOG: 02430 page = (LPPROPSHEETPAGE)lParam; 02431 This = (TcpipConfNotifyImpl*)page->lParam; 02432 if (This->pCurrentConfig) 02433 InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig); 02434 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This); 02435 return TRUE; 02436 case WM_NOTIFY: 02437 lppsn = (LPPSHNOTIFY) lParam; 02438 lpnmipa = (LPNMIPADDRESS) lParam; 02439 if (lpnmipa->hdr.code == IPN_FIELDCHANGED) 02440 { 02441 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02442 if (lpnmipa->hdr.idFrom == IDC_IPADDR) 02443 { 02444 if (SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_GETADDRESS, 0, (LPARAM)&dwIpAddr) == 4) 02445 { 02446 if (dwIpAddr <= MAKEIPADDRESS(127, 255, 255, 255)) 02447 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 0, 0, 0)); 02448 else if (dwIpAddr <= MAKEIPADDRESS(191, 255, 255, 255)) 02449 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 0, 0)); 02450 else if (dwIpAddr <= MAKEIPADDRESS(223, 255, 255, 255)) 02451 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_SETADDRESS, 0, (LPARAM)MAKEIPADDRESS(255, 255, 255, 0)); 02452 } 02453 } 02454 } 02455 else if (lppsn->hdr.code == PSN_APPLY) 02456 { 02457 This = (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); 02458 if (SUCCEEDED(StoreTcpipBasicSettings(hwndDlg, This, TRUE))) 02459 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR); 02460 else 02461 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_INVALID); 02462 02463 return TRUE; 02464 } 02465 break; 02466 case WM_COMMAND: 02467 if (HIWORD(wParam) == BN_CLICKED) 02468 { 02469 switch (LOWORD(wParam)) 02470 { 02471 case IDC_USEDHCP: 02472 if (SendDlgItemMessageW(hwndDlg, IDC_USEDHCP, BM_GETCHECK, 0, 0) == BST_CHECKED) 02473 { 02474 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02475 SendDlgItemMessageW(hwndDlg, IDC_IPADDR, IPM_CLEARADDRESS, 0, 0); 02476 SendDlgItemMessageW(hwndDlg, IDC_SUBNETMASK, IPM_CLEARADDRESS, 0, 0); 02477 SendDlgItemMessageW(hwndDlg, IDC_DEFGATEWAY, IPM_CLEARADDRESS, 0, 0); 02478 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), FALSE); 02479 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), FALSE); 02480 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), FALSE); 02481 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), TRUE); 02482 AddAlternativeDialog(GetParent(hwndDlg), (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); 02483 } 02484 break; 02485 case IDC_NODHCP: 02486 if (SendDlgItemMessageW(hwndDlg, IDC_NODHCP, BM_GETCHECK, 0, 0) == BST_CHECKED) 02487 { 02488 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02489 EnableWindow(GetDlgItem(hwndDlg, IDC_IPADDR), TRUE); 02490 EnableWindow(GetDlgItem(hwndDlg, IDC_SUBNETMASK), TRUE); 02491 EnableWindow(GetDlgItem(hwndDlg, IDC_DEFGATEWAY), TRUE); 02492 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED) 02493 { 02494 SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_SETCHECK, BST_UNCHECKED, 0); 02495 } 02496 EnableWindow(GetDlgItem(hwndDlg, IDC_AUTODNS), FALSE); 02497 SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0); 02498 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); 02499 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); 02500 SendMessageW(GetParent(hwndDlg), PSM_REMOVEPAGE, 1, 0); 02501 } 02502 break; 02503 case IDC_AUTODNS: 02504 if (SendDlgItemMessageW(hwndDlg, IDC_AUTODNS, BM_GETCHECK, 0, 0) == BST_CHECKED) 02505 { 02506 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02507 SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0); 02508 SendDlgItemMessageW(hwndDlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0); 02509 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), FALSE); 02510 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), FALSE); 02511 } 02512 break; 02513 case IDC_FIXEDDNS: 02514 if (SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_GETCHECK, 0, 0) == BST_CHECKED) 02515 { 02516 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 02517 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); 02518 EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); 02519 } 02520 break; 02521 case IDC_ADVANCED: 02522 LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); 02523 break; 02524 } 02525 break; 02526 } 02527 default: 02528 break; 02529 02530 } 02531 return FALSE; 02532 } 02533 02534 /*************************************************************** 02535 * INetCfgComponentPropertyUi interface 02536 */ 02537 02538 HRESULT 02539 WINAPI 02540 INetCfgComponentPropertyUi_fnQueryInterface( 02541 INetCfgComponentPropertyUi * iface, 02542 REFIID iid, 02543 LPVOID * ppvObj) 02544 { 02545 //LPOLESTR pStr; 02546 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02547 02548 *ppvObj = NULL; 02549 02550 02551 if (IsEqualIID (iid, &IID_IUnknown) || 02552 IsEqualIID (iid, &IID_INetCfgComponentPropertyUi)) 02553 { 02554 *ppvObj = This; 02555 INetCfgComponentPropertyUi_AddRef(iface); 02556 return S_OK; 02557 } 02558 else if (IsEqualIID(iid, &IID_INetCfgComponentControl)) 02559 { 02560 *ppvObj = (LPVOID*)&This->lpVtblCompControl; 02561 INetCfgComponentPropertyUi_AddRef(iface); 02562 return S_OK; 02563 } 02564 02565 //StringFromCLSID(iid, &pStr); 02566 //MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); 02567 //CoTaskMemFree(pStr); 02568 02569 return E_NOINTERFACE; 02570 } 02571 02572 02573 ULONG 02574 WINAPI 02575 INetCfgComponentPropertyUi_fnAddRef( 02576 INetCfgComponentPropertyUi * iface) 02577 { 02578 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02579 ULONG refCount = InterlockedIncrement(&This->ref); 02580 02581 return refCount; 02582 } 02583 02584 ULONG 02585 WINAPI 02586 INetCfgComponentPropertyUi_fnRelease( 02587 INetCfgComponentPropertyUi * iface) 02588 { 02589 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02590 ULONG refCount = InterlockedDecrement(&This->ref); 02591 02592 if (!refCount) 02593 { 02594 CoTaskMemFree(This); 02595 } 02596 return refCount; 02597 } 02598 02599 HRESULT 02600 WINAPI 02601 INetCfgComponentPropertyUi_fnQueryPropertyUi( 02602 INetCfgComponentPropertyUi * iface, 02603 IUnknown *pUnkReserved) 02604 { 02605 INetLanConnectionUiInfo * pLanInfo; 02606 HRESULT hr; 02607 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02608 02609 hr = IUnknown_QueryInterface(pUnkReserved, &IID_INetLanConnectionUiInfo, (LPVOID*)&pLanInfo); 02610 if (FAILED(hr)) 02611 return hr; 02612 02613 INetLanConnectionUiInfo_GetDeviceGuid(pLanInfo, &This->NetCfgInstanceId); 02614 02615 //FIXME 02616 // check if tcpip is enabled on that binding */ 02617 IUnknown_Release(pUnkReserved); 02618 return S_OK; 02619 } 02620 02621 HRESULT 02622 WINAPI 02623 INetCfgComponentPropertyUi_fnSetContext( 02624 INetCfgComponentPropertyUi * iface, 02625 IUnknown *pUnkReserved) 02626 { 02627 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02628 02629 if (!iface || !pUnkReserved) 02630 return E_POINTER; 02631 02632 This->pUnknown = pUnkReserved; 02633 return S_OK; 02634 } 02635 02636 HRESULT 02637 LoadDNSSettings( 02638 TcpipConfNotifyImpl * This) 02639 { 02640 LPOLESTR pStr; 02641 WCHAR szBuffer[200]; 02642 HKEY hKey; 02643 DWORD dwSize; 02644 02645 02646 This->pCurrentConfig->pDNS = (TcpipAdvancedDNSDlgSettings*) CoTaskMemAlloc(sizeof(TcpipAdvancedDNSDlgSettings)); 02647 if (!This->pCurrentConfig->pDNS) 02648 return E_FAIL; 02649 02650 ZeroMemory(This->pCurrentConfig->pDNS, sizeof(TcpipAdvancedDNSDlgSettings)); 02651 02652 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr))) 02653 return E_FAIL; 02654 02655 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr); 02656 CoTaskMemFree(pStr); 02657 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) == ERROR_SUCCESS) 02658 { 02659 dwSize = sizeof(DWORD); 02660 RegQueryValueExW(hKey, L"RegisterAdapterName", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, &dwSize); 02661 RegQueryValueExW(hKey, L"RegistrationEnabled", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, &dwSize); 02662 02663 dwSize = sizeof(This->pCurrentConfig->pDNS->szDomain) / sizeof(WCHAR); 02664 RegQueryValueExW(hKey, L"Domain", NULL, NULL, (LPBYTE)szBuffer, &dwSize); 02665 02666 RegCloseKey(hKey); 02667 } 02668 02669 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS) 02670 { 02671 dwSize = sizeof(DWORD); 02672 RegQueryValueExW(hKey, L"UseDomainNameDevolution", NULL, NULL, (LPBYTE)&This->pCurrentConfig->pDNS->UseDomainNameDevolution, &dwSize); 02673 02674 dwSize = 0; 02675 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, NULL, &dwSize) == ERROR_SUCCESS) 02676 { 02677 This->pCurrentConfig->pDNS->szSearchList = (LPWSTR)CoTaskMemAlloc(dwSize); 02678 if (This->pCurrentConfig->pDNS->szSearchList) 02679 { 02680 if (RegQueryValueExW(hKey, L"SearchList", NULL, NULL, (LPBYTE)This->pCurrentConfig->pDNS->szSearchList, &dwSize) != ERROR_SUCCESS) 02681 { 02682 CoTaskMemFree(This->pCurrentConfig->pDNS->szSearchList); 02683 This->pCurrentConfig->pDNS->szSearchList = NULL; 02684 } 02685 } 02686 } 02687 RegCloseKey(hKey); 02688 } 02689 return S_OK; 02690 } 02691 02692 LPWSTR 02693 LoadTcpFilterSettingsFromRegistry(HKEY hKey, LPCWSTR szName, LPDWORD Size) 02694 { 02695 DWORD dwSize; 02696 LPWSTR pData; 02697 02698 if (RegQueryValueExW(hKey, szName, NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS) 02699 return NULL; 02700 02701 pData = (LPWSTR)CoTaskMemAlloc(dwSize); 02702 if (!pData) 02703 return NULL; 02704 02705 if (RegQueryValueExW(hKey, szName, NULL, NULL, (LPBYTE)pData, &dwSize) != ERROR_SUCCESS) 02706 { 02707 CoTaskMemFree(pData); 02708 return NULL; 02709 } 02710 *Size = dwSize; 02711 return pData; 02712 } 02713 02714 HRESULT 02715 LoadFilterSettings( 02716 TcpipConfNotifyImpl * This) 02717 { 02718 HKEY hKey; 02719 TcpFilterSettings *pFilter; 02720 WCHAR szBuffer[200]; 02721 LPOLESTR pStr; 02722 DWORD dwVal, dwSize; 02723 02724 pFilter = (TcpFilterSettings*)CoTaskMemAlloc(sizeof(TcpFilterSettings)); 02725 if (!pFilter) 02726 return E_FAIL; 02727 02728 ZeroMemory(pFilter, sizeof(TcpFilterSettings)); 02729 This->pCurrentConfig->pFilter = pFilter; 02730 02731 02732 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, KEY_READ, &hKey) == ERROR_SUCCESS) 02733 { 02734 dwSize = sizeof(DWORD); 02735 if (RegQueryValueExW(hKey, L"EnableSecurityFilters", NULL, NULL, (LPBYTE)&dwVal, &dwSize) == ERROR_SUCCESS) 02736 pFilter->EnableSecurityFilters = dwVal; 02737 RegCloseKey(hKey); 02738 } 02739 else 02740 { 02741 pFilter->EnableSecurityFilters = FALSE; 02742 } 02743 02744 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr))) 02745 return E_FAIL; 02746 02747 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr); 02748 CoTaskMemFree(pStr); 02749 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, KEY_READ, &hKey) != ERROR_SUCCESS) 02750 { 02751 return S_OK; 02752 } 02753 pFilter->szTCPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"TCPAllowedPorts", &pFilter->TCPSize); 02754 pFilter->szUDPAllowedPorts = LoadTcpFilterSettingsFromRegistry(hKey, L"UDPAllowedPorts", &pFilter->UDPSize); 02755 pFilter->szRawIPAllowedProtocols = LoadTcpFilterSettingsFromRegistry(hKey, L"RawIPAllowedProtocols", &pFilter->IPSize); 02756 RegCloseKey(hKey); 02757 return S_OK; 02758 } 02759 02760 02761 HRESULT 02762 Initialize(TcpipConfNotifyImpl * This) 02763 { 02764 DWORD dwSize, Status; 02765 WCHAR szBuffer[50]; 02766 IP_ADAPTER_INFO * pCurrentAdapter; 02767 IP_ADAPTER_INFO * pInfo; 02768 PIP_PER_ADAPTER_INFO pPerInfo; 02769 IP_PER_ADAPTER_INFO Info; 02770 LPOLESTR pStr; 02771 HRESULT hr; 02772 BOOL bFound; 02773 TcpipSettings * pCurSettings; 02774 ULONG uLength; 02775 02776 if (This->pCurrentConfig) 02777 return S_OK; 02778 02779 hr = StringFromCLSID(&This->NetCfgInstanceId, &pStr); 02780 if (FAILED(hr)) 02781 return hr; 02782 02783 02784 dwSize = 0; 02785 if (GetAdaptersInfo(NULL, &dwSize) != ERROR_BUFFER_OVERFLOW) 02786 { 02787 CoTaskMemFree(pStr); 02788 return E_FAIL; 02789 } 02790 02791 pInfo = CoTaskMemAlloc(dwSize); 02792 if (!pInfo) 02793 { 02794 CoTaskMemFree(pStr); 02795 return E_FAIL; 02796 } 02797 02798 if (GetAdaptersInfo(pInfo, &dwSize) != ERROR_SUCCESS) 02799 { 02800 CoTaskMemFree(pStr); 02801 CoTaskMemFree(pInfo); 02802 return E_FAIL; 02803 } 02804 02805 pCurrentAdapter = pInfo; 02806 bFound = FALSE; 02807 while(pCurrentAdapter) 02808 { 02809 szBuffer[0] = L'\0'; 02810 if (MultiByteToWideChar(CP_ACP, 0, pCurrentAdapter->AdapterName, -1, szBuffer, sizeof(szBuffer)/sizeof(szBuffer[0]))) 02811 { 02812 szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; 02813 } 02814 if (!_wcsicmp(szBuffer, pStr)) 02815 { 02816 bFound = TRUE; 02817 break; 02818 } 02819 pCurrentAdapter = pCurrentAdapter->Next; 02820 } 02821 CoTaskMemFree(pStr); 02822 02823 if (!bFound) 02824 { 02825 CoTaskMemFree(pInfo); 02826 return E_FAIL; 02827 } 02828 02829 pCurSettings = CoTaskMemAlloc(sizeof(TcpipSettings)); 02830 if (!pCurSettings) 02831 { 02832 CoTaskMemFree(pInfo); 02833 return E_FAIL; 02834 } 02835 02836 ZeroMemory(pCurSettings, sizeof(TcpipSettings)); 02837 This->pCurrentConfig = pCurSettings; 02838 pCurSettings->DhcpEnabled = pCurrentAdapter->DhcpEnabled; 02839 pCurSettings->Index = pCurrentAdapter->Index; 02840 02841 if (!pCurrentAdapter->DhcpEnabled) 02842 { 02843 CopyIpAddrString(&pCurrentAdapter->IpAddressList, &pCurSettings->Ip, SUBMASK, NULL); 02844 CopyIpAddrString(&pCurrentAdapter->GatewayList, &pCurSettings->Gw, METRIC, NULL); //FIXME 02845 } 02846 02847 uLength = sizeof(IP_PER_ADAPTER_INFO); 02848 ZeroMemory(&Info, sizeof(IP_PER_ADAPTER_INFO)); 02849 02850 if (GetPerAdapterInfo(pCurrentAdapter->Index, &Info, &uLength) == ERROR_BUFFER_OVERFLOW) 02851 { 02852 pPerInfo = (PIP_PER_ADAPTER_INFO)CoTaskMemAlloc(uLength); 02853 if (pPerInfo) 02854 { 02855 Status = GetPerAdapterInfo(pCurrentAdapter->Index, pPerInfo, &uLength); 02856 if (Status == NOERROR) 02857 { 02858 if (!pPerInfo->AutoconfigActive) 02859 { 02860 CopyIpAddrString(&pPerInfo->DnsServerList, &pCurSettings->Ns, IPADDR, NULL); 02861 } 02862 pCurSettings->AutoconfigActive = pPerInfo->AutoconfigActive; 02863 } 02864 CoTaskMemFree(pPerInfo); 02865 } 02866 } 02867 else 02868 { 02869 if (!Info.AutoconfigActive) 02870 { 02871 CopyIpAddrString(&Info.DnsServerList, &pCurSettings->Ns, IPADDR, NULL); 02872 } 02873 pCurSettings->AutoconfigActive = Info.AutoconfigActive; 02874 } 02875 02876 if (FAILED(LoadFilterSettings(This))) 02877 return E_FAIL; 02878 02879 if (FAILED(LoadDNSSettings(This))) 02880 return E_FAIL; 02881 02882 CoTaskMemFree(pInfo); 02883 02884 return S_OK; 02885 } 02886 02887 HRESULT 02888 WINAPI 02889 INetCfgComponentPropertyUi_fnMergePropPages( 02890 INetCfgComponentPropertyUi * iface, 02891 DWORD *pdwDefPages, 02892 BYTE **pahpspPrivate, 02893 UINT *pcPages, 02894 HWND hwndParent, 02895 LPCWSTR *pszStartPage) 02896 { 02897 HPROPSHEETPAGE * hppages; 02898 UINT NumPages; 02899 HRESULT hr; 02900 TcpipConfNotifyImpl * This = (TcpipConfNotifyImpl*)iface; 02901 02902 hr = Initialize(This); 02903 if (FAILED(hr)) 02904 return hr; 02905 02906 if (This->pCurrentConfig->DhcpEnabled) 02907 NumPages = 2; 02908 else 02909 NumPages = 1; 02910 02911 hppages = (HPROPSHEETPAGE*) CoTaskMemAlloc(sizeof(HPROPSHEETPAGE) * NumPages); 02912 if (!hppages) 02913 return E_FAIL; 02914 02915 hppages[0] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_BASIC_DLG), TcpipBasicDlg, (LPARAM)This, NULL); 02916 if (!hppages[0]) 02917 { 02918 CoTaskMemFree(hppages); 02919 return E_FAIL; 02920 } 02921 if (NumPages == 2) 02922 { 02923 hppages[1] = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_TCPIP_ALTCF_DLG), TcpipAltConfDlg, (LPARAM)This, NULL); 02924 if (!hppages[1]) 02925 { 02926 DestroyPropertySheetPage(hppages[0]); 02927 CoTaskMemFree(hppages); 02928 return E_FAIL; 02929 } 02930 } 02931 02932 *pahpspPrivate = (BYTE*)hppages; 02933 *pcPages = NumPages; 02934 02935 return S_OK; 02936 } 02937 02938 HRESULT 02939 WINAPI 02940 INetCfgComponentPropertyUi_fnValidateProperties( 02941 INetCfgComponentPropertyUi * iface, 02942 HWND hwndDlg) 02943 { 02944 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnValidateProperties", NULL, MB_OK); 02945 return S_OK; 02946 } 02947 02948 HRESULT 02949 WINAPI 02950 INetCfgComponentPropertyUi_fnApplyProperties( 02951 INetCfgComponentPropertyUi * iface) 02952 { 02953 MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnApplyProperties", NULL, MB_OK); 02954 return S_OK; 02955 } 02956 02957 02958 HRESULT 02959 WINAPI 02960 INetCfgComponentPropertyUi_fnCancelProperties( 02961 INetCfgComponentPropertyUi * iface) 02962 { 02963 //MessageBoxW(NULL, L"INetCfgComponentPropertyUi_fnCancelProperties", NULL, MB_OK); 02964 return S_OK; 02965 } 02966 02967 static const INetCfgComponentPropertyUiVtbl vt_NetCfgComponentPropertyUi = 02968 { 02969 INetCfgComponentPropertyUi_fnQueryInterface, 02970 INetCfgComponentPropertyUi_fnAddRef, 02971 INetCfgComponentPropertyUi_fnRelease, 02972 INetCfgComponentPropertyUi_fnQueryPropertyUi, 02973 INetCfgComponentPropertyUi_fnSetContext, 02974 INetCfgComponentPropertyUi_fnMergePropPages, 02975 INetCfgComponentPropertyUi_fnValidateProperties, 02976 INetCfgComponentPropertyUi_fnApplyProperties, 02977 INetCfgComponentPropertyUi_fnCancelProperties 02978 }; 02979 02980 /*************************************************************** 02981 * INetCfgComponentControl interface 02982 */ 02983 02984 HRESULT 02985 WINAPI 02986 INetCfgComponentControl_fnQueryInterface( 02987 INetCfgComponentControl * iface, 02988 REFIID iid, 02989 LPVOID * ppvObj) 02990 { 02991 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); 02992 return INetCfgComponentPropertyUi_QueryInterface((INetCfgComponentPropertyUi*)This, iid, ppvObj); 02993 } 02994 02995 ULONG 02996 WINAPI 02997 INetCfgComponentControl_fnAddRef( 02998 INetCfgComponentControl * iface) 02999 { 03000 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); 03001 return INetCfgComponentPropertyUi_AddRef((INetCfgComponentPropertyUi*)This); 03002 } 03003 03004 ULONG 03005 WINAPI 03006 INetCfgComponentControl_fnRelease( 03007 INetCfgComponentControl * iface) 03008 { 03009 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); 03010 return INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); 03011 } 03012 03013 HRESULT 03014 WINAPI 03015 INetCfgComponentControl_fnInitialize( 03016 INetCfgComponentControl * iface, 03017 INetCfgComponent *pIComp, 03018 INetCfg *pINetCfg, 03019 BOOL fInstalling) 03020 { 03021 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); 03022 03023 This->pNCfg = pINetCfg; 03024 This->pNComp = pIComp; 03025 03026 return S_OK; 03027 } 03028 03029 static 03030 LPWSTR 03031 CreateMultiSzString(IP_ADDR * pAddr, COPY_TYPE Type, LPDWORD Size, BOOL bComma) 03032 { 03033 LPWSTR pStr, pRet; 03034 DWORD dwSize, dwIpAddr; 03035 WCHAR szBuffer[30]; 03036 IP_ADDR *pTemp = pAddr; 03037 03038 03039 dwSize = 0; 03040 while(pTemp) 03041 { 03042 if (Type == IPADDR) 03043 { 03044 dwIpAddr = pTemp->IpAddress; 03045 swprintf(szBuffer, L"%lu.%lu.%lu.%lu", 03046 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 03047 }else if (Type == SUBMASK) 03048 { 03049 dwIpAddr = pTemp->u.Subnetmask; 03050 swprintf(szBuffer, L"%lu.%lu.%lu.%lu", 03051 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 03052 } 03053 else if (Type == METRIC) 03054 { 03055 swprintf(szBuffer, L"%u", pTemp->u.Metric); 03056 } 03057 03058 dwSize += wcslen(szBuffer) + 1; 03059 pTemp = pTemp->Next; 03060 } 03061 03062 if (!dwSize) 03063 return NULL; 03064 03065 pStr = pRet = CoTaskMemAlloc((dwSize+1) * sizeof(WCHAR)); 03066 if(!pStr) 03067 return NULL; 03068 03069 pTemp = pAddr; 03070 while(pTemp) 03071 { 03072 if (Type == IPADDR) 03073 { 03074 dwIpAddr = pTemp->IpAddress; 03075 swprintf(pStr, L"%lu.%lu.%lu.%lu", 03076 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 03077 }else if (Type == SUBMASK) 03078 { 03079 dwIpAddr = pTemp->u.Subnetmask; 03080 swprintf(pStr, L"%lu.%lu.%lu.%lu", 03081 FIRST_IPADDRESS(dwIpAddr), SECOND_IPADDRESS(dwIpAddr), THIRD_IPADDRESS(dwIpAddr), FOURTH_IPADDRESS(dwIpAddr)); 03082 } 03083 else if (Type == METRIC) 03084 { 03085 swprintf(pStr, L"%u", pTemp->u.Metric); 03086 } 03087 03088 if (bComma) 03089 { 03090 pStr += wcslen(pStr); 03091 if (pTemp->Next) 03092 { 03093 pStr[0] = L','; 03094 pStr++; 03095 } 03096 } 03097 else 03098 { 03099 pStr += wcslen(pStr) + 1; 03100 } 03101 pTemp = pTemp->Next; 03102 } 03103 pStr[0] = L'\0'; 03104 *Size = (dwSize+1) * sizeof(WCHAR); 03105 return pRet; 03106 } 03107 03108 03109 HRESULT 03110 WINAPI 03111 INetCfgComponentControl_fnApplyRegistryChanges( 03112 INetCfgComponentControl * iface) 03113 { 03114 HKEY hKey; 03115 LPOLESTR pStr; 03116 DWORD dwSize; 03117 WCHAR szBuffer[200]; 03118 TcpipSettings * pCurrentConfig, *pOldConfig; 03119 ULONG NTEInstance; 03120 DWORD DhcpApiVersion; 03121 03122 TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface); 03123 03124 pCurrentConfig = This->pCurrentConfig; 03125 This->pCurrentConfig = NULL; 03126 03127 if (FAILED(Initialize(This))) 03128 { 03129 This->pCurrentConfig = pCurrentConfig; 03130 return E_FAIL; 03131 } 03132 pOldConfig = This->pCurrentConfig; 03133 This->pCurrentConfig = pCurrentConfig; 03134 03135 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyRegistryChanges", NULL, MB_OK); 03136 03137 03138 if (RegCreateKeyExW(hKey, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters", 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) 03139 { 03140 if (pCurrentConfig->pDNS) 03141 { 03142 RegSetValueExW(hKey, L"UseDomainNameDevolution", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->pDNS->UseDomainNameDevolution, sizeof(DWORD)); 03143 RegSetValueExW(hKey, L"SearchList", 0, REG_SZ, (LPBYTE)pCurrentConfig->pDNS->szSearchList, 03144 (wcslen(pCurrentConfig->pDNS->szSearchList)+1) * sizeof(WCHAR)); 03145 } 03146 if (pCurrentConfig->pFilter) 03147 { 03148 RegSetValueExW(hKey, L"EnableSecurityFilters", 0, REG_DWORD, 03149 (LPBYTE)&pCurrentConfig->pFilter->EnableSecurityFilters, sizeof(DWORD)); 03150 } 03151 RegCloseKey(hKey); 03152 } 03153 03154 if (FAILED(StringFromCLSID(&This->NetCfgInstanceId, &pStr))) 03155 return E_FAIL; 03156 03157 swprintf(szBuffer, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s", pStr); 03158 CoTaskMemFree(pStr); 03159 03160 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, szBuffer, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) == ERROR_SUCCESS) 03161 { 03162 if (pCurrentConfig->pDNS) 03163 { 03164 RegSetValueExW(hKey, L"RegisterAdapterName", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegisterAdapterName, sizeof(DWORD)); 03165 RegSetValueExW(hKey, L"RegistrationEnabled", 0, REG_DWORD, (LPBYTE)&This->pCurrentConfig->pDNS->RegistrationEnabled, sizeof(DWORD)); 03166 RegSetValueExW(hKey, L"Domain", 0, REG_SZ, (LPBYTE)This->pCurrentConfig->pDNS->szDomain, 03167 (wcslen(This->pCurrentConfig->pDNS->szDomain)+1) * sizeof(WCHAR)); 03168 } 03169 #if 0 03170 if (pCurrentConfig->pFilter) 03171 { 03172 if (pCurrentConfig->pFilter->szTCPAllowedPorts) 03173 { 03174 RegSetValueExW(hKey, L"TCPAllowedPorts", 0, REG_MULTI_SZ, 03175 (LPBYTE)pCurrentConfig->pFilter->szTCPAllowedPorts, 03176 pCurrentConfig->pFilter->TCPSize); 03177 } 03178 if (pCurrentConfig->pFilter->szUDPAllowedPorts) 03179 { 03180 RegSetValueExW(hKey, L"UDPAllowedPorts", 0, REG_MULTI_SZ, 03181 (LPBYTE)pCurrentConfig->pFilter->szUDPAllowedPorts, 03182 pCurrentConfig->pFilter->UDPSize); 03183 } 03184 if (pCurrentConfig->pFilter->szRawIPAllowedProtocols) 03185 { 03186 RegSetValueExW(hKey, L"RawIPAllowedProtocols", 0, REG_MULTI_SZ, 03187 (LPBYTE)pCurrentConfig->pFilter->szRawIPAllowedProtocols, 03188 pCurrentConfig->pFilter->IPSize); 03189 } 03190 } 03191 #endif 03192 RegSetValueExW(hKey, L"EnableDHCP", 0, REG_DWORD, (LPBYTE)&pCurrentConfig->DhcpEnabled, sizeof(DWORD)); 03193 if (pCurrentConfig->DhcpEnabled) 03194 { 03195 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR)); 03196 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)L"0.0.0.0\0", 9 * sizeof(WCHAR)); 03197 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR)); 03198 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR)); 03199 if (!pOldConfig->DhcpEnabled) 03200 { 03201 /* Delete this adapter's current IP address */ 03202 DeleteIPAddress(pOldConfig->Ip->NTEContext); 03203 03204 /* Delete all default routes for this adapter */ 03205 dwSize = 0; 03206 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) 03207 { 03208 DWORD Index; 03209 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize); 03210 if (pIpForwardTable) 03211 { 03212 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR) 03213 { 03214 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++) 03215 { 03216 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index && 03217 pIpForwardTable->table[Index].dwForwardDest == 0) 03218 { 03219 DeleteIpForwardEntry(&pIpForwardTable->table[Index]); 03220 } 03221 } 03222 } 03223 CoTaskMemFree(pIpForwardTable); 03224 } 03225 } 03226 } 03227 } 03228 else 03229 { 03230 /* Open the DHCP API if DHCP is enabled */ 03231 if (pOldConfig->DhcpEnabled && DhcpCApiInitialize(&DhcpApiVersion) == NO_ERROR) 03232 { 03233 /* We have to tell DHCP about this */ 03234 DhcpStaticRefreshParams(pCurrentConfig->Index, 03235 htonl(pCurrentConfig->Ip->IpAddress), 03236 htonl(pCurrentConfig->Ip->u.Subnetmask)); 03237 03238 /* Close the API */ 03239 DhcpCApiCleanup(); 03240 } 03241 else 03242 { 03243 /* Delete this adapter's current static IP address */ 03244 DeleteIPAddress(pOldConfig->Ip->NTEContext); 03245 03246 /* Add the static IP address via the standard IPHLPAPI function */ 03247 AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress), 03248 htonl(pCurrentConfig->Ip->u.Subnetmask), 03249 pCurrentConfig->Index, 03250 &pCurrentConfig->Ip->NTEContext, 03251 &NTEInstance); 03252 } 03253 03254 pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE); 03255 if(pStr) 03256 { 03257 RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize); 03258 CoTaskMemFree(pStr); 03259 } 03260 03261 pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE); 03262 if(pStr) 03263 { 03264 RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize); 03265 CoTaskMemFree(pStr); 03266 } 03267 03268 /* Delete all default routes for this adapter */ 03269 dwSize = 0; 03270 if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) 03271 { 03272 DWORD Index; 03273 PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize); 03274 if (pIpForwardTable) 03275 { 03276 if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR) 03277 { 03278 for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++) 03279 { 03280 if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index && 03281 pIpForwardTable->table[Index].dwForwardDest == 0) 03282 { 03283 DeleteIpForwardEntry(&pIpForwardTable->table[Index]); 03284 } 03285 } 03286 } 03287 CoTaskMemFree(pIpForwardTable); 03288 } 03289 } 03290 03291 if (pCurrentConfig->Gw) 03292 { 03293 MIB_IPFORWARDROW RouterMib; 03294 ZeroMemory(&RouterMib, sizeof(MIB_IPFORWARDROW)); 03295 03296 RouterMib.dwForwardMetric1 = 1; 03297 RouterMib.dwForwardIfIndex = pOldConfig->Index; 03298 RouterMib.dwForwardNextHop = htonl(pCurrentConfig->Gw->IpAddress); 03299 03300 //TODO 03301 // add multiple gw addresses when required 03302 03303 if (CreateIpForwardEntry(&RouterMib) == NO_ERROR) 03304 { 03305 pStr = CreateMultiSzString(pCurrentConfig->Gw, IPADDR, &dwSize, FALSE); 03306 if(pStr) 03307 { 03308 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize); 03309 CoTaskMemFree(pStr); 03310 } 03311 03312 pStr = CreateMultiSzString(pCurrentConfig->Gw, METRIC, &dwSize, FALSE); 03313 if(pStr) 03314 { 03315 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize); 03316 CoTaskMemFree(pStr); 03317 } 03318 } 03319 } 03320 else 03321 { 03322 RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); 03323 RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2); 03324 } 03325 } 03326 03327 if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) 03328 { 03329 RegDeleteValueW(hKey, L"NameServer"); 03330 } 03331 else 03332 { 03333 pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); 03334 if(pStr) 03335 { 03336 RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); 03337 //RegDeleteValueW(hKey, L"DhcpNameServer"); 03338 CoTaskMemFree(pStr); 03339 } 03340 } 03341 03342 RegCloseKey(hKey); 03343 } 03344 return S_OK; 03345 } 03346 03347 HRESULT 03348 WINAPI 03349 INetCfgComponentControl_fnApplyPnpChanges( 03350 INetCfgComponentControl * iface, 03351 INetCfgPnpReconfigCallback *pICallback) 03352 { 03353 //MessageBoxW(NULL, L"INetCfgComponentControl_fnApplyPnpChanges", NULL, MB_OK); 03354 return S_OK; 03355 } 03356 03357 HRESULT 03358 WINAPI 03359 INetCfgComponentControl_fnCancelChanges( 03360 INetCfgComponentControl * iface) 03361 { 03362 //MessageBoxW(NULL, L"INetCfgComponentControl_fnCancelChanges", NULL, MB_OK); 03363 return S_OK; 03364 } 03365 03366 static const INetCfgComponentControlVtbl vt_NetCfgComponentControl = 03367 { 03368 INetCfgComponentControl_fnQueryInterface, 03369 INetCfgComponentControl_fnAddRef, 03370 INetCfgComponentControl_fnRelease, 03371 INetCfgComponentControl_fnInitialize, 03372 INetCfgComponentControl_fnApplyRegistryChanges, 03373 INetCfgComponentControl_fnApplyPnpChanges, 03374 INetCfgComponentControl_fnCancelChanges 03375 }; 03376 03377 HRESULT 03378 WINAPI 03379 TcpipConfigNotify_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) 03380 { 03381 TcpipConfNotifyImpl *This; 03382 03383 if (!ppv) 03384 return E_POINTER; 03385 03386 This = (TcpipConfNotifyImpl *) CoTaskMemAlloc(sizeof (TcpipConfNotifyImpl)); 03387 if (!This) 03388 return E_OUTOFMEMORY; 03389 03390 This->ref = 1; 03391 This->lpVtbl = (const INetCfgComponentPropertyUi*)&vt_NetCfgComponentPropertyUi; 03392 This->lpVtblCompControl = (const INetCfgComponentControl*)&vt_NetCfgComponentControl; 03393 This->pNCfg = NULL; 03394 This->pUnknown = NULL; 03395 This->pNComp = NULL; 03396 This->pCurrentConfig = NULL; 03397 03398 if (!SUCCEEDED (INetCfgComponentPropertyUi_QueryInterface ((INetCfgComponentPropertyUi*)This, riid, ppv))) 03399 { 03400 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); 03401 return E_NOINTERFACE; 03402 } 03403 03404 INetCfgComponentPropertyUi_Release((INetCfgComponentPropertyUi*)This); 03405 return S_OK; 03406 } Generated on Sat May 26 2012 04:24:00 for ReactOS by
1.7.6.1
|