/* 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); }