First fully functional version of ncpa.
authorHervé Poussineau <hpoussin@reactos.org>
Tue, 9 May 2006 20:25:29 +0000 (20:25 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Tue, 9 May 2006 20:25:29 +0000 (20:25 +0000)
Requires a reboot after parameters changes.

svn path=/trunk/; revision=21868

reactos/dll/cpl/ncpa/tcpip_properties.c

index 75a106a..4cc1163 100644 (file)
@@ -67,7 +67,7 @@ ManualDNS(HWND Dlg, BOOL Enabled) {
     CheckDlgButton(Dlg, IDC_AUTODNS,
                    Enabled ? BST_UNCHECKED : BST_CHECKED);
     EnableWindow(GetDlgItem(Dlg, IDC_DNS1), Enabled);
-    EnableWindow(GetDlgItem(Dlg, IDC_DNS2), Enabled);
+    EnableWindow(GetDlgItem(Dlg, IDC_DNS2), FALSE/*Enabled*/);
     if (! Enabled) {
         SendDlgItemMessage(Dlg, IDC_DNS1, IPM_CLEARADDRESS, 0, 0);
         SendDlgItemMessage(Dlg, IDC_DNS2, IPM_CLEARADDRESS, 0, 0);
@@ -107,6 +107,27 @@ ShowError(HWND Parent, UINT MsgId)
     MessageBoxW(Parent, Msg, Error, MB_OK | MB_ICONSTOP);
 }
 
+static
+BOOL GetAddressFromField( HWND hwndDlg, UINT CtlId, 
+                          DWORD *dwIPAddr,
+                          const char **AddressString ) {
+    LRESULT lResult;
+    struct in_addr inIPAddr;
+
+    *AddressString = NULL;
+
+    lResult = SendMessage(GetDlgItem(hwndDlg, CtlId), IPM_GETADDRESS, 0, 
+                          (ULONG_PTR)dwIPAddr);
+    if( lResult != 4 ) return FALSE;
+    
+    *dwIPAddr = htonl(*dwIPAddr);
+    inIPAddr.s_addr = *dwIPAddr;
+    *AddressString = inet_ntoa(inIPAddr);
+    if( !*AddressString ) return FALSE;
+
+    return TRUE;
+}
+
 static BOOL
 ValidateAndStore(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData)
 {
@@ -165,17 +186,79 @@ ValidateAndStore(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData)
 
 static BOOL
 InternTCPIPSettings(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData) {
-    BOOL Changed;
+    /*BOOL Changed;
     BOOL IpChanged;
     int DhcpAction;
-    LPWSTR AdapterName;
-    
+    LPWSTR AdapterName;*/
+    BOOL SetIpAddressByDhcp;
+    BOOL SetDnsByDhcp;
+    TCHAR pszRegKey[MAX_PATH];
+    const char *AddressString;
+    DWORD Address = 0;
+    LONG rc;
+    HKEY hKey = NULL;
+    BOOL ret = FALSE;
+
     if (! ValidateAndStore(Dlg, DlgData)) {
         /* Should never happen, we should have validated at PSN_KILLACTIVE */
         ASSERT(FALSE);
         return FALSE;
     }
 
+    SetIpAddressByDhcp = IsDlgButtonChecked(Dlg, IDC_USEDHCP);
+    SetDnsByDhcp = IsDlgButtonChecked(Dlg, IDC_AUTODNS);
+
+    /* Save parameters in HKLM\SYSTEM\CurrentControlSet\Services\{GUID}\Parameters\Tcpip */
+    _stprintf(pszRegKey,_T("SYSTEM\\CurrentControlSet\\Services\\%S\\Parameters\\Tcpip"), DlgData->AdapterName);
+    rc = RegOpenKey(HKEY_LOCAL_MACHINE, pszRegKey, &hKey);
+    if (rc != ERROR_SUCCESS)
+        goto cleanup;
+    if (SetIpAddressByDhcp)
+        AddressString = "0.0.0.0";
+    else if (!GetAddressFromField(Dlg, IDC_IPADDR, &Address, &AddressString))
+        goto cleanup;
+    rc = RegSetValueExA(hKey, "IPAddress", 0, REG_SZ, AddressString, strlen(AddressString) + 1);
+    if (rc != ERROR_SUCCESS)
+        goto cleanup;
+    if (!SetIpAddressByDhcp && !GetAddressFromField(Dlg, IDC_SUBNETMASK, &Address, &AddressString))
+        goto cleanup;
+    rc = RegSetValueExA(hKey, "SubnetMask", 0, REG_SZ, AddressString, strlen(AddressString) + 1);
+    if (rc != ERROR_SUCCESS)
+        goto cleanup;
+    if (!SetIpAddressByDhcp && !GetAddressFromField(Dlg, IDC_DEFGATEWAY, &Address, &AddressString))
+        goto cleanup;
+    rc = RegSetValueExA(hKey, "DefaultGateway", 0, REG_SZ, AddressString, strlen(AddressString) + 1);
+    if (rc != ERROR_SUCCESS)
+        goto cleanup;
+    RegCloseKey(hKey);
+
+    /* Save parameters in HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters */
+    rc = RegOpenKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"), &hKey);
+    if (rc != ERROR_SUCCESS)
+        goto cleanup;
+    if (DlgData->Dns1 == INADDR_NONE)
+    {
+        rc = RegDeleteValue(hKey, _T("NameServer"));
+        if (rc != ERROR_SUCCESS && rc != ERROR_FILE_NOT_FOUND)
+            goto cleanup;
+    }
+    else
+    {
+        if (!GetAddressFromField(Dlg, IDC_DNS1, &Address, &AddressString))
+            goto cleanup;
+        rc = RegSetValueExA(hKey, "NameServer", 0, REG_SZ, AddressString, strlen(AddressString) + 1);
+        if (rc != ERROR_SUCCESS)
+            goto cleanup;
+    }
+
+    MessageBox(NULL, TEXT("You need to reboot before the new parameters take effect."), TEXT("Reboot required"), MB_OK | MB_ICONWARNING);
+    ret = TRUE;
+
+cleanup:
+    if (hKey != NULL)
+        RegCloseKey(hKey);
+    return ret;
+#if 0
     Changed = FALSE;
     if (DlgData->DhcpEnabled) {
         Changed = ! DlgData->OldDhcpEnabled;
@@ -213,6 +296,7 @@ InternTCPIPSettings(HWND Dlg, PTCPIP_PROPERTIES_DATA DlgData) {
 
     /* FIXME Save default gateway and DNS entries */
     return TRUE;
+#endif
 }
 
 static INT_PTR CALLBACK