|
|
//++
//
// Copyright (C) Microsoft Corporation, 1987 - 1999
//
// Module Name:
//
// ipcfg.c
//
// Abstract:
//
// Queries into network drivers
//
// Author:
//
// Anilth - 4-20-1998
//
// Environment:
//
// User mode only.
// Contains NT-specific code.
//
// Revision History:
//
//--
#include "precomp.h"
#include "ipcfg.h"
#include "regutil.h"
#include "mprapi.h" // for friendly-name interface mapping
#include "strings.h"
LPTSTR MapScopeId(PVOID Param); LPTSTR MapAdapterType(UINT type); LPTSTR MapAdapterAddress(PIP_ADAPTER_INFO pAdapterInfo, LPTSTR Buffer); VOID PingDhcpServer(NETDIAG_PARAMS *pParams, IPCONFIG_TST *pIpConfig); VOID PingWinsServers(NETDIAG_PARAMS *pParams, IPCONFIG_TST *pIpConfig);
/*==========================< Iphlpapi functions >===========================*/
DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen );
DWORD GetNetworkParams( PFIXED_INFO pFixedInfo, PULONG pOutBufLen ); // -----------------------------------------------------------------
HRESULT GetAdditionalInfo(NETDIAG_PARAMS *pParams, NETDIAG_RESULT *pResults);
HRESULT IpConfigTest( NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults ) { HRESULT hr = hrOK; int i; IP_ADAPTER_INFO * pIpAdapterInfo; IPCONFIG_TST * pIpConfig; ULONG uDefGateway, uAddress, uMask; DWORD dwDefGateway, dwAddress, dwMask; hr = InitIpconfig(pParams, pResults); if (!FHrSucceeded(hr)) { // "Cannot retrieve IP configuration from registry!\n"
PrintDebug(pParams, 0, IDS_IPCFG_CANNOT_GET_IP_INFO); return hr; }
for ( i = 0; i<pResults->cNumInterfaces; i++) { pIpConfig = &pResults->pArrayInterface[i].IpConfig; pIpAdapterInfo = pIpConfig->pAdapterInfo;
if (!pResults->pArrayInterface[i].IpConfig.fActive || NETCARD_DISCONNECTED == pResults->pArrayInterface[i].dwNetCardStatus) continue;
// Ping the DHCP server
if (pIpAdapterInfo->DhcpEnabled) { if (!ZERO_IP_ADDRESS(pIpAdapterInfo->DhcpServer.IpAddress.String)) PingDhcpServer(pParams, pIpConfig); else { pIpConfig->hrPingDhcpServer = E_FAIL; pIpConfig->hr = E_FAIL; // " [WARNING] Though, the card is Dhcp Enabled, you dont have a valid DHCP server address for the card.\n"
SetMessage(&pIpConfig->msgPingDhcpServer, Nd_Quiet, IDS_IPCFG_INVALID_DHCP_ADDRESS); } }
if (pResults->pArrayInterface[i].fNbtEnabled) { // Ping the primary and secondary WINS servers
PingWinsServers(pParams, pIpConfig); }
if(pIpAdapterInfo->GatewayList.IpAddress.String[0] != 0) { // If the default gateway is defined,
// then test to see if the gateway is on the same subnet as our IP address
//
uDefGateway = inet_addrA(pIpAdapterInfo->GatewayList.IpAddress.String); uAddress = inet_addrA(pIpAdapterInfo->IpAddressList.IpAddress.String); uMask = inet_addrA(pIpAdapterInfo->IpAddressList.IpMask.String); dwDefGateway = ntohl(uDefGateway); dwAddress = ntohl(uAddress); dwMask = ntohl(uMask); if ((dwDefGateway & dwMask) != (dwAddress & dwMask)) { pIpConfig->hr = E_FAIL; pIpConfig->hrDefGwSubnetCheck = E_FAIL; } } } return hr; }
LPTSTR MapScopeId(PVOID Param) { return !strcmp((LPTSTR)Param, _T("*")) ? _T("") : (LPTSTR)Param; }
#define dim(X) (sizeof(X)/sizeof((X)[0]))
/*!--------------------------------------------------------------------------
MapGuidToServiceName - Author: KennT ---------------------------------------------------------------------------*/ LPTSTR MapGuidToServiceName(LPCTSTR pszServiceGuid) { DWORD dwRetVal = ERROR_SUCCESS; static TCHAR s_szServiceName[MAX_ALLOWED_ADAPTER_NAME_LENGTH + 1]; WCHAR swzServiceGuid[256], swzServiceName[256];
// Copy guid into return buffer
lstrcpyn(s_szServiceName, pszServiceGuid, DimensionOf(s_szServiceName));
if( NULL == pfnGuidToFriendlyName ) return s_szServiceName;
StrCpyWFromT(swzServiceGuid, pszServiceGuid);
if( !pfnGuidToFriendlyName(swzServiceGuid, swzServiceName, DimensionOf(swzServiceName)) ) { StrnCpyTFromW(s_szServiceName, swzServiceName, DimensionOf(s_szServiceName)); }
return s_szServiceName; }
/*!--------------------------------------------------------------------------
MapGuidToServiceNameW - Author: KennT ---------------------------------------------------------------------------*/ LPWSTR MapGuidToServiceNameW(LPCWSTR pswzServiceGuid) { DWORD dwRetVal = ERROR_SUCCESS; static WCHAR s_swzServiceName[1024];
// Copy guid into return buffer
StrnCpyW(s_swzServiceName, pswzServiceGuid, DimensionOf(s_swzServiceName));
if (NULL == pfnGuidToFriendlyName) return s_swzServiceName;
if (ERROR_SUCCESS != pfnGuidToFriendlyName((LPWSTR) pswzServiceGuid, s_swzServiceName, DimensionOf(s_swzServiceName)) ) { //we still want to keep the GUID as service name if cannot find the friendly name
StrnCpyW(s_swzServiceName, pswzServiceGuid, DimensionOf(s_swzServiceName)); }
return s_swzServiceName; }
/*!--------------------------------------------------------------------------
MapGuidToAdapterName - Author: KennT ---------------------------------------------------------------------------*/ LPTSTR MapGuidToAdapterName(LPCTSTR pszAdapterGuid) { HANDLE hConfig; WCHAR swzAdapterGuid[256], swzAdapterName[256]; static TCHAR s_szAdapterName[1024]; HRESULT hr = hrOK;
// Copy guid into return buffer
StrnCpy(s_szAdapterName, pszAdapterGuid, DimensionOf(s_szAdapterName));
StrnCpyWFromT(swzAdapterGuid, pszAdapterGuid, DimensionOf(swzAdapterGuid));
CheckErr( MprConfigServerConnect(NULL, &hConfig) ); CheckErr( MprConfigGetFriendlyName(hConfig, swzAdapterGuid, swzAdapterName, sizeof(swzAdapterName) ) ); MprConfigServerDisconnect(hConfig);
StrnCpyTFromW(s_szAdapterName, swzAdapterName, DimensionOf(s_szAdapterName));
Error: return s_szAdapterName; }
void PingDhcpServer( NETDIAG_PARAMS *pParams, IPCONFIG_TST *pIpConfig) {
PrintStatusMessage(pParams, 4, IDS_IPCFG_STATUS_MSG); if (IsIcmpResponseA(pIpConfig->pAdapterInfo->DhcpServer.IpAddress.String)) { pIpConfig->hrPingDhcpServer = S_OK;
PrintStatusMessage(pParams,0, IDS_GLOBAL_PASS_NL);
// " Pinging DHCP server - reachable\n"
SetMessage(&pIpConfig->msgPingDhcpServer, Nd_ReallyVerbose, IDS_IPCFG_PING_DHCP_OK); } else { pIpConfig->hrPingDhcpServer = S_FALSE; if (FHrSucceeded(pIpConfig->hr)) pIpConfig->hr = S_FALSE;
PrintStatusMessage(pParams,0, IDS_GLOBAL_FAIL_NL);
// " Pinging DHCP server - not reachable\n"
// " WARNING: DHCP server may be down.\n"
SetMessage(&pIpConfig->msgPingDhcpServer, Nd_Quiet, IDS_IPCFG_PING_DHCP_BAD); } }
VOID PingWinsServers( NETDIAG_PARAMS* pParams, IPCONFIG_TST *pIpConfig) { TCHAR szBuffer[256]; if (!ZERO_IP_ADDRESS(pIpConfig->pAdapterInfo->PrimaryWinsServer.IpAddress.String)) { PrintStatusMessage(pParams,4, IDS_IPCFG_WINS_STATUS_MSG); if (IsIcmpResponseA(pIpConfig->pAdapterInfo->PrimaryWinsServer.IpAddress.String)) { pIpConfig->hrPingPrimaryWinsServer = S_OK;
PrintStatusMessage(pParams,0, IDS_GLOBAL_PASS_NL);
// " Pinging Primary WINS Server %s - reachable\n"
SetMessage(&pIpConfig->msgPingPrimaryWinsServer, Nd_ReallyVerbose, IDS_IPCFG_PING_WINS, pIpConfig->pAdapterInfo->PrimaryWinsServer.IpAddress.String); } else { pIpConfig->hrPingPrimaryWinsServer = S_FALSE; if (FHrSucceeded(pIpConfig->hr)) pIpConfig->hr = S_FALSE;
PrintStatusMessage(pParams,0, IDS_GLOBAL_FAIL_NL);
// " Pinging Primary WINS Server %s - not reachable\n"
SetMessage(&pIpConfig->msgPingPrimaryWinsServer, Nd_Quiet, IDS_IPCFG_PING_WINS_FAIL, pIpConfig->pAdapterInfo->PrimaryWinsServer.IpAddress.String); } } if (!ZERO_IP_ADDRESS(pIpConfig->pAdapterInfo->SecondaryWinsServer.IpAddress.String)) { PrintStatusMessage(pParams,4, IDS_IPCFG_WINS2_STATUS_MSG); if (IsIcmpResponseA(pIpConfig->pAdapterInfo->SecondaryWinsServer.IpAddress.String)) { pIpConfig->hrPingSecondaryWinsServer = S_OK;
PrintStatusMessage(pParams,0, IDS_GLOBAL_PASS_NL);
// " Pinging Secondary WINS Server %s - reachable\n"
SetMessage(&pIpConfig->msgPingSecondaryWinsServer, Nd_ReallyVerbose, IDS_IPCFG_PING_WINS2, pIpConfig->pAdapterInfo->SecondaryWinsServer.IpAddress.String); } else { pIpConfig->hrPingSecondaryWinsServer = S_FALSE; if (FHrSucceeded(pIpConfig->hr)) pIpConfig->hr = S_FALSE; PrintStatusMessage(pParams,0, IDS_GLOBAL_FAIL_NL);
// " Pinging Secondary WINS Server %s - not reachable\n"
SetMessage(&pIpConfig->msgPingSecondaryWinsServer, Nd_Quiet, IDS_IPCFG_PING_WINS2_FAIL, pIpConfig->pAdapterInfo->SecondaryWinsServer.IpAddress.String); } } return; }
LPTSTR MapAdapterAddress(PIP_ADAPTER_INFO pAdapterInfo, LPTSTR Buffer) {
LPTSTR format; int separator; int len; int i; LPTSTR pbuf = Buffer; UINT mask;
len = min((int)pAdapterInfo->AddressLength, sizeof(pAdapterInfo->Address));
mask = 0xff; separator = TRUE; switch (pAdapterInfo->Type) { case IF_TYPE_ETHERNET_CSMACD: case IF_TYPE_ISO88025_TOKENRING: case IF_TYPE_FDDI: format = _T("%02X"); break;
default: format = _T("%02x"); break; } for (i = 0; i < len; ++i) { pbuf += wsprintf(pbuf, format, pAdapterInfo->Address[i] & mask); if (separator && (i != len - 1)) { pbuf += wsprintf(pbuf, _T("-")); } } return Buffer; }
void IpConfigCleanup(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults) { int i; IPCONFIG_TST * pIpConfig; // Free up the global information
// ----------------------------------------------------------------
Free(pResults->IpConfig.pFixedInfo); pResults->IpConfig.pFixedInfo = NULL;
// free up the list of adapters
// ----------------------------------------------------------------
Free(pResults->IpConfig.pAdapterInfoList); pResults->IpConfig.pAdapterInfoList = NULL;
// set all of the adapter pointers to NULL
// ----------------------------------------------------------------
for ( i=0; i < pResults->cNumInterfaces; i++) { pIpConfig = &pResults->pArrayInterface[i].IpConfig; FreeIpAddressStringList(pIpConfig->DnsServerList.Next); pIpConfig->pAdapterInfo = NULL;
ClearMessage(&pIpConfig->msgPingDhcpServer); ClearMessage(&pIpConfig->msgPingPrimaryWinsServer); ClearMessage(&pIpConfig->msgPingSecondaryWinsServer); }
pResults->IpConfig.fInitIpconfigCalled = FALSE; }
int AddIpAddressString(PIP_ADDR_STRING AddressList, LPSTR Address, LPSTR Mask) {
PIP_ADDR_STRING ipAddr;
if (AddressList->IpAddress.String[0]) { for (ipAddr = AddressList; ipAddr->Next; ipAddr = ipAddr->Next) { ; } ipAddr->Next = (PIP_ADDR_STRING) Malloc(sizeof(IP_ADDR_STRING)); if (!ipAddr->Next) { return FALSE; } ZeroMemory(ipAddr->Next, sizeof(IP_ADDR_STRING)); ipAddr = ipAddr->Next; } else { ipAddr = AddressList; } lstrcpynA(ipAddr->IpAddress.String, Address, sizeof(ipAddr->IpAddress.String)); lstrcpynA(ipAddr->IpMask.String, Mask, sizeof(ipAddr->IpMask.String)); return TRUE; }
VOID FreeIpAddressStringList(PIP_ADDR_STRING pAddressList) { PIP_ADDR_STRING pNext;
if (pAddressList == NULL) return;
do { // get the next address
pNext = pAddressList->Next;
// free the current one
Free(pAddressList);
// move onto the next
pAddressList = pNext; } while( pNext );
return; }
// Go through the ADAPTER_INFO list to count the number of interfaces
LONG CountInterfaces(PIP_ADAPTER_INFO ListAdapterInfo) { LONG cNum = 0; PIP_ADAPTER_INFO pAdapter; for(pAdapter = ListAdapterInfo; pAdapter != NULL; pAdapter = pAdapter->Next) { cNum ++; } return cNum; }
/*!--------------------------------------------------------------------------
InitIpconfig
Description: This function will get all the ipconfig information by using calls into iphlpapi.lib.
The iphlpapi.lib returns an IP_ADAPTER_INFO structure which doesnt contain many fields present int the ADAPTER_INFO structure found in ipconfig code. Since the majority of the code uses ADAPTER_INFO structure, this fucntion will copy the values found in IP_ADAPTER_INFO to ADAPTER_INFO. The values which are not supplied by iphlpapi.lib calls will be obtained by ourselves. Arguments: None. Author: 05-aug-1998 (t-rajkup) Creation History: The function aims at breaking nettest code away from ipconfig code. Author: NSun ---------------------------------------------------------------------------*/ HRESULT InitIpconfig(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults) { DWORD dwError; ULONG uSize = 0; int i; HRESULT hr = hrOK; LONG cInterfaces; IP_ADAPTER_INFO * pIpAdapter; HINSTANCE hDll; // Just initialize this once
if (pResults->IpConfig.fInitIpconfigCalled == TRUE) return hrOK; // LoadLibrary the pfnGuidToFriendlyName
// ----------------------------------------------------------------
hDll = LoadLibrary(_T("netcfgx.dll")); if (hDll) { pfnGuidToFriendlyName = (PFNGUIDTOFRIENDLYNAME) GetProcAddress(hDll, "GuidToFriendlyName"); }
// Get the size of the FIXED_INFO structure and allocate
// some memory for it.
// ----------------------------------------------------------------
GetNetworkParams(NULL, &uSize); pResults->IpConfig.pFixedInfo = Malloc(uSize); if (pResults->IpConfig.pFixedInfo == NULL) return E_OUTOFMEMORY;
ZeroMemory(pResults->IpConfig.pFixedInfo, uSize);
dwError = GetNetworkParams(pResults->IpConfig.pFixedInfo, &uSize);
if (dwError != ERROR_SUCCESS) { TCHAR szError[256]; FormatWin32Error(dwError, szError, DimensionOf(szError));
PrintMessage(pParams, IDS_GLOBAL_ERR_InitIpConfig, szError, dwError); CheckErr( dwError ); }
// Get the per-interface information from IP
// ----------------------------------------------------------------
GetAdaptersInfo(NULL, &uSize);
pResults->IpConfig.pAdapterInfoList = Malloc(uSize); if (pResults->IpConfig.pAdapterInfoList == NULL) { Free(pResults->IpConfig.pFixedInfo); CheckHr( E_OUTOFMEMORY ); }
ZeroMemory(pResults->IpConfig.pAdapterInfoList, uSize);
dwError = GetAdaptersInfo(pResults->IpConfig.pAdapterInfoList, &uSize);
if (dwError != ERROR_SUCCESS) { TCHAR szError[256]; FormatWin32Error(dwError, szError, DimensionOf(szError));
PrintMessage(pParams, IDS_GLOBAL_ERR_GetAdaptersInfo, szError, dwError); CheckErr( dwError ); }
// Now that we have the full list, count the number of interfaces
// and setup the per-interface section of the results structure.
// ----------------------------------------------------------------
cInterfaces = CountInterfaces(pResults->IpConfig.pAdapterInfoList);
// Allocate some additional interfaces (just in case for IPX)
// ----------------------------------------------------------------
pResults->pArrayInterface = Malloc((cInterfaces+8) * sizeof(INTERFACE_RESULT)); if (pResults->pArrayInterface == NULL) CheckHr( E_OUTOFMEMORY ); ZeroMemory(pResults->pArrayInterface, (cInterfaces+8)*sizeof(INTERFACE_RESULT));
// set the individual interface pointers
// ----------------------------------------------------------------
pResults->cNumInterfaces = cInterfaces; pResults->cNumInterfacesAllocated = cInterfaces + 8; pIpAdapter = pResults->IpConfig.pAdapterInfoList; for (i=0; i<cInterfaces; i++) { assert(pIpAdapter); pResults->pArrayInterface[i].IpConfig.pAdapterInfo = pIpAdapter;
pResults->pArrayInterface[i].fActive = TRUE; pResults->pArrayInterface[i].IpConfig.fActive = TRUE; if( FLAG_DONT_SHOW_PPP_ADAPTERS && (pIpAdapter->Type == IF_TYPE_PPP)) { // NDIS Wan adapter... Check to see if it has got any address..
if( ZERO_IP_ADDRESS(pIpAdapter->IpAddressList.IpAddress.String) ) { // No address ? Dont display this!
pResults->pArrayInterface[i].IpConfig.fActive = FALSE;
// If IP is not active, then don't activate the entire
// adapter. If IPX is active, then it can reactivate
// the adapter.
pResults->pArrayInterface[i].fActive = FALSE; } }
pResults->pArrayInterface[i].pszName = StrDup(pIpAdapter->AdapterName);
pResults->pArrayInterface[i].pszFriendlyName = StrDup( MapGuidToAdapterName(pIpAdapter->AdapterName) );
pIpAdapter = pIpAdapter->Next; } // Read the rest of the per adapter information not provided by
// GetAdaptersInfo
// ----------------------------------------------------------------
CheckHr( GetAdditionalInfo(pParams, pResults) );
pResults->IpConfig.fInitIpconfigCalled = TRUE; pResults->IpConfig.fEnabled = TRUE;
Error: if (!FHrSucceeded(hr)) { pResults->IpConfig.fEnabled = FALSE; IpConfigCleanup(pParams, pResults); } return hr; }
DWORD GetNetbiosOptions(LPSTR paszAdapterName, BOOL * pfNbtOptions) { HANDLE h; OBJECT_ATTRIBUTES objAttr; IO_STATUS_BLOCK iosb; STRING name; UNICODE_STRING uname; NTSTATUS status; char path[MAX_PATH]; tWINS_NODE_INFO NodeInfo;
strcpy(path, "\\Device\\NetBT_Tcpip_"); strcat(path, paszAdapterName);
RtlInitString(&name, path); RtlAnsiStringToUnicodeString(&uname, &name, TRUE);
InitializeObjectAttributes( &objAttr, &uname, OBJ_CASE_INSENSITIVE, (HANDLE)NULL, (PSECURITY_DESCRIPTOR)NULL );
status = NtCreateFile(&h, SYNCHRONIZE | GENERIC_EXECUTE, &objAttr, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, 0, NULL, 0 );
RtlFreeUnicodeString(&uname);
if (!NT_SUCCESS(status)) { DEBUG_PRINT(("GetWinsServers: NtCreateFile(path=%s) failed, err=%d\n", path, GetLastError() )); return FALSE; }
status = NtDeviceIoControlFile(h, NULL, NULL, NULL, &iosb, IOCTL_NETBT_GET_WINS_ADDR, NULL, 0, (PVOID)&NodeInfo, sizeof(NodeInfo) ); if (status == STATUS_PENDING) { status = NtWaitForSingleObject(h, TRUE, NULL); if (NT_SUCCESS(status)) { status = iosb.Status; } }
NtClose(h);
if (!NT_SUCCESS(status)) { DEBUG_PRINT(("GetWinsServers: NtDeviceIoControlFile failed, err=%d\n", GetLastError() ));
return FALSE; }
*pfNbtOptions = NodeInfo.NetbiosEnabled;
return TRUE; }
/*!--------------------------------------------------------------------------
GetAdditionalInfo ++ Description: Read the information not provided by GetAdaptersInfo and also copy the data into the PADAPTER_INFO structure. Arguments: None. Author: 05-Aug-1998 (t-rajkup) -- Author: NSun ---------------------------------------------------------------------------*/ HRESULT GetAdditionalInfo(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults) { PIP_ADAPTER_INFO pIpAdapterInfo; HKEY key; char dhcpServerAddress[4 * 4]; BOOL ok; ULONG length; DWORD DhcpClassIDLen; int i; INTERFACE_RESULT *pInterface = NULL; for (i=0; i<pResults->cNumInterfaces; i++) { pInterface = pResults->pArrayInterface + i; pIpAdapterInfo = pInterface->IpConfig.pAdapterInfo; assert(pIpAdapterInfo); if (pIpAdapterInfo->AdapterName[0] && OpenAdapterKey(pIpAdapterInfo->AdapterName, &key) ) { if( ! ReadRegistryDword(key, c_szRegIPAutoconfigurationEnabled, &(pInterface->IpConfig.fAutoconfigEnabled) )) { // AUTOCONFIG enabled if no regval exists for this...
pInterface->IpConfig.fAutoconfigEnabled = TRUE; } if ( pInterface->IpConfig.fAutoconfigEnabled ) { ReadRegistryDword(key, c_szRegAddressType, &(pInterface->IpConfig.fAutoconfigActive) ); } //
// domain: first try Domain then DhcpDomain
//
length = sizeof(pInterface->IpConfig.szDomainName); ok = ReadRegistryOemString(key, L"Domain", pInterface->IpConfig.szDomainName, &length ); if (!ok) { length = sizeof(pInterface->IpConfig.szDomainName); ok = ReadRegistryOemString(key, L"DhcpDomain", pInterface->IpConfig.szDomainName, &length ); } // DNS Server list.. first try NameServer and then try
// DhcpNameServer..
ok = ReadRegistryIpAddrString(key, c_szRegNameServer, &(pInterface->IpConfig.DnsServerList) ); if (!ok) { ok = ReadRegistryIpAddrString(key, c_szRegDhcpNameServer, &(pInterface->IpConfig.DnsServerList) ); } //
// Read the DHCP Class Id for this interface - Rajkumar
//
ZeroMemory(pInterface->IpConfig.szDhcpClassID, sizeof(pInterface->IpConfig.szDhcpClassID)); ReadRegistryString(key, c_szRegDhcpClassID, pInterface->IpConfig.szDhcpClassID, &DhcpClassIDLen ); RegCloseKey(key); //
// before getting the WINS info we must set the NodeType
//
pInterface->IpConfig.uNodeType = pResults->IpConfig.pFixedInfo->NodeType; } else { // IDS_IPCFG_10003 "Opening registry key for %s failed!\n"
PrintMessage(pParams, IDS_IPCFG_10003,pIpAdapterInfo->AdapterName); return S_FALSE; }
//be default, NetBt is enabled
pInterface->fNbtEnabled = TRUE; GetNetbiosOptions(pIpAdapterInfo->AdapterName, &pInterface->fNbtEnabled);
if (pInterface->fNbtEnabled) { pResults->Global.fHasNbtEnabledInterface = TRUE; } } return TRUE; }
/*!--------------------------------------------------------------------------
IpConfigGlobalPrint - Author: KennT ---------------------------------------------------------------------------*/ void IpConfigGlobalPrint(IN NETDIAG_PARAMS *pParams, IN OUT NETDIAG_RESULT *pResults) { PFIXED_INFO pFixedInfo = pResults->IpConfig.pFixedInfo;
if (pParams->fReallyVerbose) { PrintNewLine(pParams, 2);
// IDS_IPCFG_10005 "IP General configuration \n"
// IDS_IPCFG_10006 " LMHOSTS Enabled :"
PrintMessage(pParams, IDS_IPCFG_10005); PrintMessage(pParams, IDS_IPCFG_10006); if (pResults->Global.dwLMHostsEnabled) PrintMessage(pParams, IDS_GLOBAL_YES_NL); else PrintMessage(pParams, IDS_GLOBAL_NO_NL); // IDS_IPCFG_10009 " DNS for WINS resolution:"
PrintMessage(pParams, IDS_IPCFG_10009); if (pResults->Global.dwDnsForWINS) PrintMessage(pParams, IDS_GLOBAL_ENABLED_NL); else PrintMessage(pParams, IDS_GLOBAL_DISABLED_NL);
// NBT node type
// ------------------------------------------------------------
PrintMessage(pParams, IDSSZ_IPCFG_NODETYPE, MapWinsNodeType(pFixedInfo->NodeType)); // NBT scope id
// ------------------------------------------------------------
PrintMessage(pParams, IDSSZ_IPCFG_NBTSCOPEID, MapScopeId(pFixedInfo->ScopeId));
// ip routing
// ------------------------------------------------------------
PrintMessage(pParams, IDSSZ_IPCFG_RoutingEnabled, MAP_YES_NO(pFixedInfo->EnableRouting));
// WINS proxy
// ------------------------------------------------------------
PrintMessage(pParams, IDSSZ_IPCFG_WinsProxyEnabled, MAP_YES_NO(pFixedInfo->EnableProxy));
// DNS resolution for apps using NetBIOS
// ------------------------------------------------------------
PrintMessage(pParams, IDSSZ_IPCFG_DnsForNetBios, MAP_YES_NO(pFixedInfo->EnableDns));
// separate fixed and adapter information with an empty line
// ------------------------------------------------------------
PrintMessage(pParams, IDS_GLOBAL_EmptyLine); }
}
/*!--------------------------------------------------------------------------
IpConfigPerInterfacePrint - Author: KennT ---------------------------------------------------------------------------*/ void IpConfigPerInterfacePrint(IN NETDIAG_PARAMS *pParams, IN NETDIAG_RESULT *pResults, IN INTERFACE_RESULT *pInterfaceResults) { PIP_ADDR_STRING dnsServer; PFIXED_INFO pFixedInfo = pResults->IpConfig.pFixedInfo; IP_ADAPTER_INFO* pIpAdapterInfo; PIP_ADDR_STRING ipAddr; IPCONFIG_TST * pIpCfgResults; ULONG uDefGateway, uAddress, uMask; DWORD dwDefGateway, dwAddress, dwMask; int ids; pIpAdapterInfo = pInterfaceResults->IpConfig.pAdapterInfo; pIpCfgResults = &(pInterfaceResults->IpConfig);
if (!pIpCfgResults->fActive) return;
PrintNewLine(pParams, 1); if(pParams->fReallyVerbose) { // IDS_IPCFG_10012 " Adapter type : %s\n"
PrintMessage(pParams, IDS_IPCFG_10012, MapAdapterType(pIpAdapterInfo->Type)); } PrintMessage(pParams, IDSSZ_IPCFG_HostName, pFixedInfo->HostName, pIpCfgResults->szDomainName[0] ? _T(".") : _T(""), pIpCfgResults->szDomainName[0] ? pIpCfgResults->szDomainName : _T("")); // return;
if (pParams->fReallyVerbose) { // IDS_IPCFG_10014 " Description : %s\n"
PrintMessage(pParams, IDS_IPCFG_10014, pIpAdapterInfo->Description ); if (pIpAdapterInfo->AddressLength) { char buffer[MAX_ADAPTER_ADDRESS_LENGTH * sizeof(_T("02-"))]; // IDS_IPCFG_10015 " Physical Address : %s\n"
PrintMessage(pParams, IDS_IPCFG_10015, MapAdapterAddress(pIpAdapterInfo, buffer)); } // IDS_IPCFG_10016 " Dhcp Enabled : %s\n"
PrintMessage(pParams, IDS_IPCFG_10016, MAP_YES_NO(pIpAdapterInfo->DhcpEnabled)); // IDS_IPCFG_10017 " DHCP ClassID : %s\n"
PrintMessage(pParams, IDS_IPCFG_10017, pIpCfgResults->szDhcpClassID); // IDS_IPCFG_10018 " Autoconfiguration Enabled : %s\n"
PrintMessage(pParams, IDS_IPCFG_10018, MAP_YES_NO(pIpCfgResults->fAutoconfigEnabled)); } //
// the following 3 items are the only items displayed (per adapter) if
// /all was NOT requested on the command line
//
for (ipAddr = &pIpAdapterInfo->IpAddressList; ipAddr; ipAddr = ipAddr->Next) { if (pIpCfgResults->fAutoconfigActive) // IDS_IPCFG_10019 " Autoconfiguration IP Address : %s\n"
PrintMessage(pParams, IDS_IPCFG_10019,ipAddr->IpAddress.String); else // IDS_IPCFG_10020 " IP Address : %s\n"
PrintMessage(pParams, IDS_IPCFG_10020,ipAddr->IpAddress.String); // IDS_IPCFG_10021 " Subnet Mask : %s\n"
PrintMessage(pParams, IDS_IPCFG_10021, ipAddr->IpMask.String ); } //
// there will only be one default gateway
//
// IDS_IPCFG_10022 " Default Gateway : %s\n"
PrintMessage(pParams, IDS_IPCFG_10022, pIpAdapterInfo->GatewayList.IpAddress.String ); if (pParams->fReallyVerbose) { if (pIpAdapterInfo->DhcpEnabled && FALSE == pIpCfgResults->fAutoconfigActive) { //
// there will only be 1 DHCP server (that we get info from)
//
// IDS_IPCFG_10023 " DHCP Server : %s\n"
PrintMessage(pParams, IDS_IPCFG_10023, pIpAdapterInfo->DhcpServer.IpAddress.String ); } } //
// there is only 1 primary and 1 secondary WINS server
//
// if (pParams->fReallyVerbose)
{ if (pIpAdapterInfo->PrimaryWinsServer.IpAddress.String[0] && !ZERO_IP_ADDRESS(pIpAdapterInfo->PrimaryWinsServer.IpAddress.String)) { // IDS_IPCFG_10024 " Primary WINS Server : %s\n"
PrintMessage(pParams, IDS_IPCFG_10024, pIpAdapterInfo->PrimaryWinsServer.IpAddress.String ); } if (pIpAdapterInfo->SecondaryWinsServer.IpAddress.String[0] && !ZERO_IP_ADDRESS(pIpAdapterInfo->SecondaryWinsServer.IpAddress.String)) { // IDS_IPCFG_10025 " Secondary WINS Server : %s\n"
PrintMessage(pParams, IDS_IPCFG_10025, pIpAdapterInfo->SecondaryWinsServer.IpAddress.String); }
if (!pInterfaceResults->fNbtEnabled) { //IDS_IPCFG_NBT_DISABLED " NetBIOS over Tcpip . . . . : Disabled\n"
PrintMessage(pParams, IDS_IPCFG_NBT_DISABLED); } }
//
// only display lease times if this adapter is DHCP enabled and we
// have a non-0 IP address and not using autoconfigured address..
//
if (pParams->fReallyVerbose) { if (pIpAdapterInfo->DhcpEnabled && !ZERO_IP_ADDRESS(pIpAdapterInfo->IpAddressList.IpAddress.String) && !pIpCfgResults->fAutoconfigActive) { // IDS_IPCFG_10026 " Lease Obtained : %s\n"
PrintMessage(pParams, IDS_IPCFG_10026 , MapTime(pIpAdapterInfo->LeaseObtained) ); // IDS_IPCFG_10027 " Lease Expires : %s\n"
PrintMessage(pParams, IDS_IPCFG_10027, MapTime(pIpAdapterInfo->LeaseExpires) ); } }
//
// display the list of DNS servers. If the list came from SYSTEM.INI then
// just display that, else if the list came from DHCP.BIN, get all DNS
// servers for all NICs and display the compressed list
//
PrintMessage(pParams, IDS_IPCFG_DnsServers); if (pIpCfgResults->DnsServerList.IpAddress.String[0]) { dnsServer = &pIpCfgResults->DnsServerList;
// print out the first one
PrintMessage(pParams, IDSSZ_GLOBAL_StringLine, dnsServer->IpAddress.String);
dnsServer = dnsServer->Next; for ( ; dnsServer; dnsServer = dnsServer->Next) { // IDS_IPCFG_10013 " "
PrintMessage(pParams, IDS_IPCFG_10013); PrintMessage(pParams, IDSSZ_GLOBAL_StringLine, dnsServer->IpAddress.String); } }
PrintNewLine(pParams, 1);
// If this is a verbose output, or if an error occurred with
// any of the tests then we will need a header
// -----------------------------------------------------------------
if (pParams->fReallyVerbose || !FHrOK(pIpCfgResults->hr)) { // IDS_IPCFG_10029 " IpConfig results : "
PrintMessage(pParams, IDS_IPCFG_10029); if (FHrOK(pIpCfgResults->hr)) ids = IDS_GLOBAL_PASS_NL; else ids = IDS_GLOBAL_FAIL_NL; PrintMessage(pParams, ids); } //
// Ping the dhcp server
//
PrintNdMessage(pParams, &pInterfaceResults->IpConfig.msgPingDhcpServer); //
// Ping the WINS servers
//
PrintNdMessage(pParams, &pInterfaceResults->IpConfig.msgPingPrimaryWinsServer); PrintNdMessage(pParams, &pInterfaceResults->IpConfig.msgPingSecondaryWinsServer);
//
// Test to see if the gateway is on the same subnet as our IP address
//
if (!FHrOK(pInterfaceResults->IpConfig.hrDefGwSubnetCheck)) { PrintNewLine(pParams, 1); if (pIpAdapterInfo->DhcpEnabled) PrintMessage(pParams, IDS_IPCFG_WARNING_BOGUS_SUBNET_DHCP); else PrintMessage(pParams, IDS_IPCFG_WARNING_BOGUS_SUBNET); } //
// if there's more to come, separate lists with empty line
//
PrintNewLine(pParams, 1); }
/*!--------------------------------------------------------------------------
ZERO_IP_ADDRESS - Author: KennT ---------------------------------------------------------------------------*/ BOOL ZERO_IP_ADDRESS(LPCTSTR pszIp) { return (pszIp == NULL) || (*pszIp == 0) || (strcmp(pszIp, _T("0.0.0.0")) == 0); }
|