ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

tcpipconf_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.