[NETCFGX]

- Notify the DHCP service when a static IP address is assigned to an adapter

svn path=/branches/wlan-bringup/; revision=54980
This commit is contained in:
Cameron Gutman 2012-01-15 19:46:14 +00:00
parent 36be6f512a
commit a2acf8b4b2
4 changed files with 62 additions and 24 deletions

View 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)

View 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>

View 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"

View 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)
{
/* We have to tell DHCP about this */
DhcpStaticRefreshParams(pCurrentConfig->Index,
htonl(pCurrentConfig->Ip->IpAddress),
htonl(pCurrentConfig->Ip->u.Subnetmask));
/* Close the API */
DhcpCApiCleanup();
}
else
{
/* Delete this adapter's current static IP address */
DeleteIPAddress(pOldConfig->Ip->NTEContext);
//TODO
//delete multiple ip addresses when required
}
//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)
/* 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)
{
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);
}
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)
{