windows-nt/Source/XPSP1/NT/net/rras/ras/ppp/rasiphlp/helper.c
2020-09-26 16:20:57 +08:00

1146 lines
27 KiB
C

/*
Copyright (c) 1998, Microsoft Corporation, all rights reserved
Description:
HBO: host byte order. Used by DNS, DHCP (except in DhcpNotifyConfigChange).
NBO: network byte order. Used by IPCP, inet_ntoa, inet_addr, the stack
(SetProxyArpEntryToStack, IPRouteEntry, etc).
*/
#include "helper_.h"
#include "reghelp.h" // for RegHelpGuidFromString
/*
Returns:
VOID
Description:
*/
VOID
TraceHlp(
IN CHAR* Format,
...
)
{
va_list arglist;
RTASSERT(NULL != Format);
va_start(arglist, Format);
TraceVprintfEx(HelperTraceId,
0x00010000 | TRACE_USE_MASK | TRACE_USE_MSEC,
Format,
arglist);
va_end(arglist);
}
/*
Returns:
Notes:
*/
DWORD
HelperInitialize(
OUT HINSTANCE* phInstanceDhcpDll
)
{
DWORD dwErr = NO_ERROR;
while (InterlockedIncrement(&HelperLock) > 1)
{
InterlockedDecrement(&HelperLock);
if (!HelperInitialized)
{
Sleep(1000);
}
else
{
*phInstanceDhcpDll = HelperDhcpDll;
goto LDone;
}
}
ZeroMemory(&HelperRegVal, sizeof(HelperRegVal));
HelperTraceId = TraceRegister("RASIPHLP");
TraceHlp("HelperInitialize");
HelperDhcpDll = LoadLibrary("dhcpcsvc.dll");
if (NULL == HelperDhcpDll)
{
dwErr = GetLastError();
TraceHlp("LoadLibrary(dhcpcsvc.dll) failed and returned %d",
dwErr);
goto LDone;
}
HelperIpHlpDll = LoadLibrary("iphlpapi.dll");
if (NULL == HelperIpHlpDll)
{
dwErr = GetLastError();
TraceHlp("LoadLibrary(iphlpapi.dll) failed and returned %d",
dwErr);
goto LDone;
}
HelperIpBootpDll = LoadLibrary("ipbootp.dll");
if (NULL == HelperIpBootpDll)
{
TraceHlp("LoadLibrary(ipbootp.dll) failed and returned %d",
GetLastError());
}
dwErr = helperGetAddressOfProcs();
if (NO_ERROR != dwErr)
{
goto LDone;
}
/*
This is done to send an IRP_MJ_CREATE to the driver. WanArp starts
"working" (initializes itself etc) only when a component opens it. When the
router is running, this is done by the router manager, but in the ras
client case we need to force WanArp to start.
*/
HelperWanArpHandle = CreateFile(
WANARP_DOS_NAME_T,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if (INVALID_HANDLE_VALUE == HelperWanArpHandle)
{
dwErr = GetLastError();
TraceHlp("CreateFile(%s) failed and returned %d",
WANARP_DOS_NAME_A, dwErr);
goto LDone;
}
// This is done last. If something fails above, we don't have to
// DeleteCriticalSection.
InitializeCriticalSection(&RasDhcpCriticalSection);
InitializeCriticalSection(&RasStatCriticalSection);
InitializeCriticalSection(&RasSrvrCriticalSection);
InitializeCriticalSection(&RasTimrCriticalSection);
HelperChangeNotification();
*phInstanceDhcpDll = HelperDhcpDll;
HelperInitialized = TRUE;
LDone:
if (NO_ERROR != dwErr)
{
if ((DWORD)-1 != HelperTraceId)
{
TraceDeregister(HelperTraceId);
HelperTraceId = (DWORD)-1;
}
if (INVALID_HANDLE_VALUE != HelperWanArpHandle)
{
CloseHandle(HelperWanArpHandle);
HelperWanArpHandle = INVALID_HANDLE_VALUE;
}
if (NULL != HelperDhcpDll)
{
FreeLibrary(HelperDhcpDll);
HelperDhcpDll = NULL;
}
if (NULL != HelperIpHlpDll)
{
FreeLibrary(HelperIpHlpDll);
HelperIpHlpDll = NULL;
}
if (NULL != HelperIpBootpDll)
{
FreeLibrary(HelperIpBootpDll);
HelperIpBootpDll = NULL;
}
PDhcpNotifyConfigChange = NULL;
PDhcpLeaseIpAddress = NULL;
PDhcpRenewIpAddressLease = NULL;
PDhcpReleaseIpAddressLease = NULL;
PAllocateAndGetIpAddrTableFromStack = NULL;
PSetProxyArpEntryToStack = NULL;
PSetIpForwardEntryToStack = NULL;
PSetIpForwardEntry = NULL;
PDeleteIpForwardEntry = NULL;
PNhpAllocateAndGetInterfaceInfoFromStack = NULL;
PAllocateAndGetIpForwardTableFromStack = NULL;
PGetAdaptersInfo = NULL;
PGetPerAdapterInfo = NULL;
PEnableDhcpInformServer = NULL;
PDisableDhcpInformServer = NULL;
ZeroMemory(&HelperRegVal, sizeof(HelperRegVal));
InterlockedDecrement(&HelperLock);
}
return(dwErr);
}
/*
Returns:
VOID
Notes:
*/
VOID
HelperUninitialize(
VOID
)
{
TraceHlp("HelperUninitialize");
if ((DWORD)-1 != HelperTraceId)
{
TraceDeregister(HelperTraceId);
HelperTraceId = (DWORD)-1;
}
if (INVALID_HANDLE_VALUE != HelperWanArpHandle)
{
CloseHandle(HelperWanArpHandle);
HelperWanArpHandle = INVALID_HANDLE_VALUE;
}
if (NULL != HelperDhcpDll)
{
FreeLibrary(HelperDhcpDll);
HelperDhcpDll = NULL;
}
if (NULL != HelperIpHlpDll)
{
FreeLibrary(HelperIpHlpDll);
HelperIpHlpDll = NULL;
}
if (NULL != HelperIpBootpDll)
{
FreeLibrary(HelperIpBootpDll);
HelperIpBootpDll = NULL;
}
RasStatFreeAddrPool(HelperRegVal.pAddrPool);
HelperRegVal.pAddrPool = NULL;
PDhcpNotifyConfigChange = NULL;
PDhcpLeaseIpAddress = NULL;
PDhcpRenewIpAddressLease = NULL;
PDhcpReleaseIpAddressLease = NULL;
PAllocateAndGetIpAddrTableFromStack = NULL;
PSetProxyArpEntryToStack = NULL;
PSetIpForwardEntryToStack = NULL;
PSetIpForwardEntry = NULL;
PDeleteIpForwardEntry = NULL;
PNhpAllocateAndGetInterfaceInfoFromStack = NULL;
PAllocateAndGetIpForwardTableFromStack = NULL;
PGetAdaptersInfo = NULL;
PGetPerAdapterInfo = NULL;
PEnableDhcpInformServer = NULL;
PDisableDhcpInformServer = NULL;
ZeroMemory(&HelperRegVal, sizeof(HelperRegVal));
if (HelperInitialized)
{
DeleteCriticalSection(&RasDhcpCriticalSection);
DeleteCriticalSection(&RasStatCriticalSection);
DeleteCriticalSection(&RasSrvrCriticalSection);
DeleteCriticalSection(&RasTimrCriticalSection);
HelperInitialized = FALSE;
InterlockedDecrement(&HelperLock);
}
}
/*
Returns:
VOID
Description:
*/
VOID
HelperChangeNotification(
VOID
)
{
BOOL fUseDhcpAddressingOld;
BOOL fUseDhcpAddressing = TRUE;
ADDR_POOL* pAddrPool = NULL;
BOOL fNICChosen;
GUID guidChosenNIC;
HANDLE h;
DWORD dwNumBytes;
HKEY hKey = NULL;
LONG lErr;
DWORD dwErr;
TraceHlp("HelperChangeNotification");
fUseDhcpAddressingOld = HelperRegVal.fUseDhcpAddressing;
fNICChosen = HelperRegVal.fNICChosen;
CopyMemory(&guidChosenNIC, &(HelperRegVal.guidChosenNIC), sizeof(GUID));
lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY_RAS_IP_PARAM_A, 0, KEY_READ,
&hKey);
if (ERROR_SUCCESS == lErr)
{
dwNumBytes = sizeof(fUseDhcpAddressing);
lErr = RegQueryValueEx(hKey, REGVAL_USEDHCPADDRESSING_A, NULL, NULL,
(BYTE*)&fUseDhcpAddressing, &dwNumBytes);
if (ERROR_SUCCESS != lErr)
{
fUseDhcpAddressing = TRUE;
}
}
helperReadRegistry();
if (!fUseDhcpAddressing)
{
RasStatCreatePoolList(&pAddrPool);
}
EnterCriticalSection(&RasSrvrCriticalSection);
if (RasSrvrRunning)
{
RasSrvrEnableRouter(HelperRegVal.fEnableRoute);
if ( (fUseDhcpAddressingOld != fUseDhcpAddressing)
|| ( !fUseDhcpAddressing
&& RasStatAddrPoolsDiffer(HelperRegVal.pAddrPool, pAddrPool))
|| ( fUseDhcpAddressing
&& ( (fNICChosen != HelperRegVal.fNICChosen)
|| ( fNICChosen
&& (!IsEqualGUID(&guidChosenNIC,
&(HelperRegVal.guidChosenNIC)))))))
{
RasSrvrStop(TRUE /* fParametersChanged */);
HelperRegVal.fUseDhcpAddressing = fUseDhcpAddressing;
RasStatFreeAddrPool(HelperRegVal.pAddrPool);
HelperRegVal.pAddrPool = pAddrPool;
dwErr = RasSrvrStart();
if (NO_ERROR != dwErr)
{
TraceHlp("RasSrvrStart failed and returned %d");
}
}
}
else
{
HelperRegVal.fUseDhcpAddressing = fUseDhcpAddressing;
RasStatFreeAddrPool(HelperRegVal.pAddrPool);
HelperRegVal.pAddrPool = pAddrPool;
}
LeaveCriticalSection(&RasSrvrCriticalSection);
if (NULL != hKey)
{
RegCloseKey(hKey);
}
}
/*
Returns:
Description:
*/
DWORD
HelperSetDefaultInterfaceNet(
IN IPADDR nboIpAddrLocal,
IN IPADDR nboIpAddrRemote,
IN BOOL fPrioritize,
IN WCHAR *pszDevice
)
{
DWORD dwErr = NO_ERROR;
GUID DeviceGuid;
TraceHlp("HelperSetDefaultInterfaceNet(IP addr: 0x%x, fPrioritize: %d)",
nboIpAddrLocal, fPrioritize);
if(NULL == pszDevice)
{
dwErr = ERROR_INVALID_PARAMETER;
goto LDone;
}
RegHelpGuidFromString(pszDevice, &DeviceGuid);
// If fPrioritize flag is set, "fix" the metrics so that the packets go on
// the RAS links
if (fPrioritize)
{
dwErr = RasTcpAdjustRouteMetrics(nboIpAddrLocal, TRUE);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
// Add code to check for the remote network - same as the one of the local
// networks - if so, set the subnet route to be over the RAS adapter -
// making the ras link as the primary adapter
// We add a Default route to make RAS adapter as the default net if
// fPrioritize flag is set.
if (fPrioritize)
{
// RasTcpSetRoutesForNameServers(TRUE);
RasTcpSetRouteEx(
ALL_NETWORKS_ROUTE,
nboIpAddrLocal,
0,
nboIpAddrLocal,
TRUE,
1,
TRUE,
&DeviceGuid);
}
else
{
IPADDR nboMask;
nboMask = RasTcpDeriveMask(nboIpAddrLocal);
if (nboMask != 0)
{
RasTcpSetRouteEx(
nboIpAddrLocal & nboMask,
nboIpAddrLocal,
nboMask,
nboIpAddrLocal,
TRUE,
1,
TRUE,
&DeviceGuid);
}
}
if (0 != nboIpAddrRemote)
{
RasTcpSetRouteEx(
nboIpAddrRemote,
nboIpAddrLocal,
HOST_MASK,
nboIpAddrLocal,
TRUE,
1,
TRUE,
&DeviceGuid);
}
LDone:
return(dwErr);
}
/*
Returns:
Description:
*/
DWORD
HelperResetDefaultInterfaceNet(
IN IPADDR nboIpAddr,
IN BOOL fPrioritize
)
{
DWORD dwErr = NO_ERROR;;
if (fPrioritize)
{
// RasTcpSetRoutesForNameServers(FALSE);
dwErr = RasTcpAdjustRouteMetrics(nboIpAddr, FALSE);
}
return(dwErr);
}
/*
Returns:
Notes:
*/
DWORD
HelperSetDefaultInterfaceNetEx(
IPADDR nboIpAddr,
WCHAR* wszDevice,
BOOL fPrioritize,
WCHAR* wszDnsAddress,
WCHAR* wszDns2Address,
WCHAR* wszWinsAddress,
WCHAR* wszWins2Address
)
{
DWORD dwErr = NO_ERROR;
IPADDR nboIpMask = HOST_MASK;
TCPIP_INFO* pTcpipInfo = NULL;
TraceHlp("HelperSetDefaultInterfaceNetEx(IP addr: 0x%x, Device: %ws, "
"fPrioritize: %d, DNS1: %ws, DNS2: %ws, WINS1: %ws, WINS2: %ws",
nboIpAddr, wszDevice, fPrioritize, wszDnsAddress, wszDns2Address,
wszWinsAddress, wszWins2Address);
dwErr = LoadTcpipInfo(&pTcpipInfo, wszDevice, FALSE /* fAdapterOnly */);
if (NO_ERROR != dwErr)
{
goto LDone;
}
AbcdWszFromIpAddress(nboIpAddr, pTcpipInfo->wszIPAddress);
AbcdWszFromIpAddress(nboIpMask, pTcpipInfo->wszSubnetMask);
// Since we are adding the addresses to the head of the list, we need to add
// the backup DNS and WINS addresses before the primary addresses, so the
// primary ones will be at the head of the list when we're done.
if (wszDns2Address != NULL)
{
dwErr = PrependWszIpAddress(&pTcpipInfo->wszDNSNameServers,
wszDns2Address);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
if (wszDnsAddress != NULL)
{
dwErr = PrependWszIpAddress(&pTcpipInfo->wszDNSNameServers,
wszDnsAddress);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
if (wszWins2Address != NULL)
{
dwErr = PrependWszIpAddressToMwsz(&pTcpipInfo->mwszNetBIOSNameServers,
wszWins2Address);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
if (wszWinsAddress != NULL)
{
dwErr = PrependWszIpAddressToMwsz(&pTcpipInfo->mwszNetBIOSNameServers,
wszWinsAddress);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
pTcpipInfo->fChanged = TRUE;
dwErr = SaveTcpipInfo(pTcpipInfo);
if (NO_ERROR != dwErr)
{
goto LDone;
}
dwErr = PDhcpNotifyConfigChange(NULL, wszDevice, TRUE, 0, nboIpAddr,
nboIpMask, IgnoreFlag);
if (NO_ERROR != dwErr)
{
TraceHlp("DhcpNotifyConfigChange failed and returned %d", dwErr);
goto LDone;
}
// If fPrioritize flag is set "Fix" the metrics so that the packets go on
// the RAS links
if (fPrioritize)
{
dwErr = RasTcpAdjustRouteMetrics(nboIpAddr, TRUE);
if (NO_ERROR != dwErr)
{
goto LDone;
}
}
// Add code to check for the remote network - same as the one of the local
// networks - if so, set the subnet route to be over the RAS adapter -
// making the RAS link as the primary adapter
// We add a Default route to make RAS adapter as the default net if
// fPrioritize flag is set.
if (fPrioritize)
{
// RasTcpSetRoutesForNameServers(TRUE);
RasTcpSetRoute(ALL_NETWORKS_ROUTE,
nboIpAddr,
0,
nboIpAddr,
TRUE,
1,
TRUE);
}
else
{
IPADDR nboMask;
nboMask = RasTcpDeriveMask(nboIpAddr);
if (nboMask != 0)
{
RasTcpSetRoute(
nboIpAddr & nboMask,
nboIpAddr,
nboMask,
nboIpAddr,
TRUE,
1,
TRUE);
}
}
LDone:
if (pTcpipInfo != NULL)
{
FreeTcpipInfo(&pTcpipInfo);
}
return(dwErr);
}
/*
Returns:
Notes:
*/
DWORD
HelperResetDefaultInterfaceNetEx(
IPADDR nboIpAddr,
WCHAR* wszDevice,
BOOL fPrioritize,
WCHAR* wszDnsAddress,
WCHAR* wszDns2Address,
WCHAR* wszWinsAddress,
WCHAR* wszWins2Address
)
{
DWORD dwErr = NO_ERROR;
TCPIP_INFO* pTcpipInfo = NULL;
TraceHlp("HelperResetDefaultInterfaceNetEx(0x%x)", nboIpAddr);
if (fPrioritize)
{
// RasTcpSetRoutesForNameServers(FALSE);
RasTcpAdjustRouteMetrics(nboIpAddr, FALSE);
}
dwErr = LoadTcpipInfo(&pTcpipInfo, wszDevice, TRUE /* fAdapterOnly */);
if (NO_ERROR != dwErr)
{
goto LDone;
}
pTcpipInfo->fChanged = TRUE;
dwErr = SaveTcpipInfo(pTcpipInfo);
if (NO_ERROR != dwErr)
{
goto LDone;
}
dwErr = PDhcpNotifyConfigChange(NULL, wszDevice, TRUE, 0, 0, 0, IgnoreFlag);
if (NO_ERROR != dwErr)
{
TraceHlp("DhcpNotifyConfigChange failed and returned %d", dwErr);
dwErr = NO_ERROR;
}
LDone:
if (pTcpipInfo != NULL)
{
FreeTcpipInfo(&pTcpipInfo);
}
return(dwErr);
}
/*
Returns:
Description:
*/
DWORD
helperGetAddressOfProcs(
VOID
)
{
DWORD dwErr = NO_ERROR;
PDhcpNotifyConfigChange = (DHCPNOTIFYCONFIGCHANGE)
GetProcAddress(HelperDhcpDll, "DhcpNotifyConfigChange");
if (NULL == PDhcpNotifyConfigChange)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DhcpNotifyConfigChange) failed and returned "
"%d", dwErr);
goto LDone;
}
PDhcpLeaseIpAddress = (DHCPLEASEIPADDRESS)
GetProcAddress(HelperDhcpDll, "DhcpLeaseIpAddress");
if (NULL == PDhcpLeaseIpAddress)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DhcpLeaseIpAddress) failed and returned "
"%d", dwErr);
goto LDone;
}
PDhcpRenewIpAddressLease = (DHCPRENEWIPADDRESSLEASE)
GetProcAddress(HelperDhcpDll, "DhcpRenewIpAddressLease");
if (NULL == PDhcpRenewIpAddressLease)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DhcpRenewIpAddressLease) failed and returned "
"%d", dwErr);
goto LDone;
}
PDhcpReleaseIpAddressLease = (DHCPRELEASEIPADDRESSLEASE)
GetProcAddress(HelperDhcpDll, "DhcpReleaseIpAddressLease");
if (NULL == PDhcpReleaseIpAddressLease)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DhcpReleaseIpAddressLease) failed and "
"returned %d", dwErr);
goto LDone;
}
PAllocateAndGetIpAddrTableFromStack = (ALLOCATEANDGETIPADDRTABLEFROMSTACK)
GetProcAddress(HelperIpHlpDll, "AllocateAndGetIpAddrTableFromStack");
if (NULL == PAllocateAndGetIpAddrTableFromStack)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(AllocateAndGetIpAddrTableFromStack) failed "
"and returned %d", dwErr);
goto LDone;
}
PSetProxyArpEntryToStack = (SETPROXYARPENTRYTOSTACK)
GetProcAddress(HelperIpHlpDll, "SetProxyArpEntryToStack");
if (NULL == PSetProxyArpEntryToStack)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(SetProxyArpEntryToStack) failed and "
"returned %d", dwErr);
goto LDone;
}
PSetIpForwardEntryToStack = (SETIPFORWARDENTRYTOSTACK)
GetProcAddress(HelperIpHlpDll, "SetIpForwardEntryToStack");
if (NULL == PSetIpForwardEntryToStack)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(SetIpForwardEntryToStack) failed and "
"returned %d", dwErr);
goto LDone;
}
PSetIpForwardEntry = (SETIPFORWARDENTRY)
GetProcAddress(HelperIpHlpDll, "SetIpForwardEntry");
if (NULL == PSetIpForwardEntry)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(SetIpForwardEntry) failed and "
"returned %d", dwErr);
goto LDone;
}
PDeleteIpForwardEntry = (DELETEIPFORWARDENTRY)
GetProcAddress(HelperIpHlpDll, "DeleteIpForwardEntry");
if (NULL == PDeleteIpForwardEntry)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DeleteIpForwardEntry) failed and "
"returned %d", dwErr);
goto LDone;
}
PNhpAllocateAndGetInterfaceInfoFromStack =
(NHPALLOCATEANDGETINTERFACEINFOFROMSTACK)
GetProcAddress(HelperIpHlpDll,
"NhpAllocateAndGetInterfaceInfoFromStack");
if (NULL == PNhpAllocateAndGetInterfaceInfoFromStack)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(NhpAllocateAndGetInterfaceInfoFromStack) "
"failed and returned %d", dwErr);
goto LDone;
}
PAllocateAndGetIpForwardTableFromStack =
(ALLOCATEANDGETIPFORWARDTABLEFROMSTACK)
GetProcAddress(HelperIpHlpDll,
"AllocateAndGetIpForwardTableFromStack");
if (NULL == PAllocateAndGetIpForwardTableFromStack)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(AllocateAndGetIpForwardTableFromStack) "
"failed and returned %d", dwErr);
goto LDone;
}
PGetAdaptersInfo = (GETADAPTERSINFO)
GetProcAddress(HelperIpHlpDll, "GetAdaptersInfo");
if (NULL == PGetAdaptersInfo)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(GetAdaptersInfo) failed and "
"returned %d", dwErr);
goto LDone;
}
PGetPerAdapterInfo = (GETPERADAPTERINFO)
GetProcAddress(HelperIpHlpDll, "GetPerAdapterInfo");
if (NULL == PGetPerAdapterInfo)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(GetPerAdapterInfo) failed and "
"returned %d", dwErr);
goto LDone;
}
if (NULL != HelperIpBootpDll)
{
PEnableDhcpInformServer = (ENABLEDHCPINFORMSERVER)
GetProcAddress(HelperIpBootpDll, "EnableDhcpInformServer");
if (NULL == PEnableDhcpInformServer)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(EnableDhcpInformServer) failed and "
"returned %d", dwErr);
goto LDone;
}
PDisableDhcpInformServer = (DISABLEDHCPINFORMSERVER)
GetProcAddress(HelperIpBootpDll, "DisableDhcpInformServer");
if (NULL == PDisableDhcpInformServer)
{
dwErr = GetLastError();
TraceHlp("GetProcAddress(DisableDhcpInformServer) failed and "
"returned %d", dwErr);
goto LDone;
}
}
LDone:
return(dwErr);
}
/*
Returns:
VOID
Description:
*/
VOID
helperReadRegistry(
VOID
)
{
LONG lErr;
DWORD dwErr;
DWORD dw;
DWORD dwNumBytes;
CHAR* szIpAddr = NULL;
CHAR* szAlloced = NULL;
IPADDR nboIpAddr1;
IPADDR nboIpAddr2;
HKEY hKeyIpParam = NULL;
WCHAR* wszAdapterGuid = NULL;
HRESULT hr;
HelperRegVal.fSuppressWINSNameServers = FALSE;
HelperRegVal.fSuppressDNSNameServers = FALSE;
HelperRegVal.dwChunkSize = 10;
HelperRegVal.nboWINSNameServer1 = 0;
HelperRegVal.nboWINSNameServer2 = 0;
HelperRegVal.nboDNSNameServer1 = 0;
HelperRegVal.nboDNSNameServer2 = 0;
HelperRegVal.fNICChosen = FALSE;
HelperRegVal.fEnableRoute = FALSE;
lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY_RAS_IP_PARAM_A, 0,
KEY_READ, &hKeyIpParam);
if (ERROR_SUCCESS == lErr)
{
dwErr = RegQueryValueWithAllocW(hKeyIpParam, REGVAL_ADAPTERGUID_W,
REG_SZ, (BYTE**)&wszAdapterGuid);
if ( (NO_ERROR == dwErr)
&& (wszAdapterGuid[0]))
{
hr = CLSIDFromString(wszAdapterGuid, &(HelperRegVal.guidChosenNIC));
if (!FAILED(hr))
{
HelperRegVal.fNICChosen = TRUE;
}
}
dwNumBytes = sizeof(dw);
lErr = RegQueryValueEx(hKeyIpParam, REGVAL_SUPPRESSWINS_A, NULL, NULL,
(BYTE*)&dw, &dwNumBytes);
if ( (ERROR_SUCCESS == lErr)
&& (0 != dw))
{
HelperRegVal.fSuppressWINSNameServers = TRUE;
}
dwNumBytes = sizeof(dw);
lErr = RegQueryValueEx(hKeyIpParam, REGVAL_SUPPRESSDNS_A, NULL, NULL,
(BYTE*)&dw, &dwNumBytes);
if ( (ERROR_SUCCESS == lErr)
&& (0 != dw))
{
HelperRegVal.fSuppressDNSNameServers = TRUE;
}
dwNumBytes = sizeof(dw);
lErr = RegQueryValueEx(hKeyIpParam, REGVAL_CHUNK_SIZE_A, NULL, NULL,
(BYTE*)&dw, &dwNumBytes);
if (ERROR_SUCCESS == lErr)
{
HelperRegVal.dwChunkSize = dw;
}
dwNumBytes = sizeof(dw);
lErr = RegQueryValueEx(hKeyIpParam, REGVAL_ALLOW_NETWORK_ACCESS_A, NULL,
NULL, (BYTE*)&dw, &dwNumBytes);
if (ERROR_SUCCESS == lErr)
{
HelperRegVal.fEnableRoute = dw;
}
dwErr = RegQueryValueWithAllocA(hKeyIpParam, REGVAL_WINSSERVER_A,
REG_SZ, &szIpAddr);
if (NO_ERROR == dwErr)
{
nboIpAddr1 = inet_addr(szIpAddr);
if (INADDR_NONE != nboIpAddr1)
{
HelperRegVal.nboWINSNameServer1 = nboIpAddr1;
}
LocalFree(szIpAddr);
szIpAddr = NULL;
}
dwErr = RegQueryValueWithAllocA(hKeyIpParam, REGVAL_WINSSERVERBACKUP_A,
REG_SZ, &szIpAddr);
if (NO_ERROR == dwErr)
{
nboIpAddr2 = inet_addr(szIpAddr);
if ( (INADDR_NONE != nboIpAddr2)
&& (0 != HelperRegVal.nboWINSNameServer1))
{
HelperRegVal.nboWINSNameServer2 = nboIpAddr2;
}
LocalFree(szIpAddr);
szIpAddr = NULL;
}
dwErr = RegQueryValueWithAllocA(hKeyIpParam, REGVAL_DNSSERVERS_A,
REG_MULTI_SZ, &szAlloced);
if (NO_ERROR == dwErr)
{
szIpAddr = szAlloced;
nboIpAddr1 = inet_addr(szIpAddr);
// We are sure that the buffer szIpAddr has 2 zeros at the end
szIpAddr += strlen(szIpAddr) + 1;
nboIpAddr2 = inet_addr(szIpAddr);
if ( (INADDR_NONE != nboIpAddr1)
&& (0 != nboIpAddr1))
{
HelperRegVal.nboDNSNameServer1 = nboIpAddr1;
if (INADDR_NONE != nboIpAddr2)
{
HelperRegVal.nboDNSNameServer2 = nboIpAddr2;
}
}
LocalFree(szAlloced);
szAlloced = NULL;
}
}
TraceHlp("%s: %d, %s: %d, %s: %d",
REGVAL_SUPPRESSWINS_A, HelperRegVal.fSuppressWINSNameServers,
REGVAL_SUPPRESSDNS_A, HelperRegVal.fSuppressDNSNameServers,
REGVAL_CHUNK_SIZE_A, HelperRegVal.dwChunkSize);
TraceHlp("%s: 0x%x, %s: 0x%x, %s: 0x%x, 0x%x",
REGVAL_WINSSERVER_A, HelperRegVal.nboWINSNameServer1,
REGVAL_WINSSERVERBACKUP_A, HelperRegVal.nboWINSNameServer2,
REGVAL_DNSSERVERS_A, HelperRegVal.nboDNSNameServer1,
HelperRegVal.nboDNSNameServer2);
if (NULL != hKeyIpParam)
{
RegCloseKey(hKeyIpParam);
}
LocalFree(wszAdapterGuid);
}