- Merge r54980 from wlan-bringup
authorCameron Gutman <aicommander@gmail.com>
Sun, 15 Jan 2012 19:53:52 +0000 (19:53 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 15 Jan 2012 19:53:52 +0000 (19:53 +0000)
svn path=/trunk/; revision=54981

reactos/dll/win32/netcfgx/CMakeLists.txt
reactos/dll/win32/netcfgx/netcfgx.rbuild
reactos/dll/win32/netcfgx/precomp.h
reactos/dll/win32/netcfgx/tcpipconf_notify.c

index 835c3c3..2811d36 100644 (file)
@@ -22,6 +22,6 @@ target_link_libraries(netcfgx
     uuid
     wine)
 
-add_importlibs(netcfgx rpcrt4 setupapi advapi32 iphlpapi ole32 user32 comctl32 ws2_32 msvcrt kernel32 ntdll)
+add_importlibs(netcfgx rpcrt4 setupapi advapi32 iphlpapi dhcpcsvc ole32 user32 comctl32 ws2_32 msvcrt kernel32 ntdll)
 add_pch(netcfgx precomp.h)
 add_cd_file(TARGET netcfgx DESTINATION reactos/system32 FOR all)
index 2d220ae..3198641 100644 (file)
@@ -8,7 +8,7 @@
        <library>advapi32</library>
        <library>uuid</library>
        <library>iphlpapi</library>
-       <library>iphlpapi</library>
+       <library>dhcpcsvc</library>
        <library>wine</library>
        <library>ole32</library>
        <library>user32</library>
index a6a6021..f64647b 100644 (file)
@@ -14,6 +14,8 @@
 #include <setupapi.h>
 #include <stdio.h>
 #include <iphlpapi.h>
+#include <dhcpcsdk.h>
+#include <dhcpcapi.h>
 #include <olectl.h>
 #include <netcfgn.h>
 #include "resource.h"
index cb521e8..cf4966d 100644 (file)
@@ -3117,6 +3117,7 @@ INetCfgComponentControl_fnApplyRegistryChanges(
     WCHAR szBuffer[200];
     TcpipSettings * pCurrentConfig, *pOldConfig;
     ULONG NTEInstance;
+    DWORD DhcpApiVersion;
 
     TcpipConfNotifyImpl * This = impl_from_INetCfgComponentControl(iface);
 
@@ -3197,39 +3198,74 @@ INetCfgComponentControl_fnApplyRegistryChanges(
             RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", 2 * sizeof(WCHAR));
             if (!pOldConfig->DhcpEnabled)
             {
+                /* Delete this adapter's current IP address */
                 DeleteIPAddress(pOldConfig->Ip->NTEContext);
-                //FIXME
-                // start dhcp client service for the adapter
+
+                /* Delete all default routes for this adapter */
+                dwSize = 0;
+                if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
+                {
+                    DWORD Index;
+                    PMIB_IPFORWARDTABLE pIpForwardTable = (PMIB_IPFORWARDTABLE)CoTaskMemAlloc(dwSize);
+                    if (pIpForwardTable)
+                    {
+                        if (GetIpForwardTable(pIpForwardTable, &dwSize, FALSE) == NO_ERROR)
+                        {
+                            for (Index = 0; Index < pIpForwardTable->dwNumEntries; Index++)
+                            {
+                                if (pIpForwardTable->table[Index].dwForwardIfIndex == pOldConfig->Index &&
+                                    pIpForwardTable->table[Index].dwForwardDest == 0)
+                                {
+                                    DeleteIpForwardEntry(&pIpForwardTable->table[Index]);
+                                }
+                            }
+                        }
+                        CoTaskMemFree(pIpForwardTable);
+                    }
+                }
             }
         }
         else
         {
-            if (!pOldConfig->DhcpEnabled)
+            /* Open the DHCP API if DHCP is enabled */
+            if (pOldConfig->DhcpEnabled && DhcpCApiInitialize(&DhcpApiVersion) == NO_ERROR)
             {
-                DeleteIPAddress(pOldConfig->Ip->NTEContext);
-                //TODO
-                //delete multiple ip addresses when required
-            }
+                /* We have to tell DHCP about this */
+                DhcpStaticRefreshParams(pCurrentConfig->Index,
+                                        htonl(pCurrentConfig->Ip->IpAddress),
+                                        htonl(pCurrentConfig->Ip->u.Subnetmask));
 
-            //TODO
-            // add multiple ip addresses when required
-            if (AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress), htonl(pCurrentConfig->Ip->u.Subnetmask), pCurrentConfig->Index, &pCurrentConfig->Ip->NTEContext, &NTEInstance) == NO_ERROR)
+                /* Close the API */
+                DhcpCApiCleanup();
+            }
+            else
             {
-                pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
-                if(pStr)
-                {
-                    RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
-                    CoTaskMemFree(pStr);
-                }
+                /* Delete this adapter's current static IP address */
+                DeleteIPAddress(pOldConfig->Ip->NTEContext);
 
-                pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
-                if(pStr)
-                {
-                    RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
-                    CoTaskMemFree(pStr);
-                }
+                /* Add the static IP address via the standard IPHLPAPI function */
+                AddIPAddress(htonl(pCurrentConfig->Ip->IpAddress),
+                             htonl(pCurrentConfig->Ip->u.Subnetmask),
+                             pCurrentConfig->Index,
+                             &pCurrentConfig->Ip->NTEContext,
+                             &NTEInstance);
+            }
+            
+            pStr = CreateMultiSzString(pCurrentConfig->Ip, IPADDR, &dwSize, FALSE);
+            if(pStr)
+            {
+                RegSetValueExW(hKey, L"IPAddress", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
+                CoTaskMemFree(pStr);
+            }
+            
+            pStr = CreateMultiSzString(pCurrentConfig->Ip, SUBMASK, &dwSize, FALSE);
+            if(pStr)
+            {
+                RegSetValueExW(hKey, L"SubnetMask", 0, REG_MULTI_SZ, (LPBYTE)pStr, dwSize);
+                CoTaskMemFree(pStr);
             }
 
+            /* Delete all default routes for this adapter */
             dwSize = 0;
             if (GetIpForwardTable(NULL, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER)
             {