807 lines
21 KiB
C++
807 lines
21 KiB
C++
//+---------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1997 - 2000
|
||
//
|
||
// File: N E T I P. C P P
|
||
//
|
||
// Contents: Routines supporting RAS interoperability
|
||
//
|
||
// Notes:
|
||
//
|
||
// Author: billi 07 03 2001
|
||
//
|
||
// History:
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
|
||
|
||
#include "stdafx.h"
|
||
#include "Util.h"
|
||
#include "TheApp.h"
|
||
|
||
#include <lmjoin.h>
|
||
#include <devguid.h>
|
||
|
||
#include "NetIp.h"
|
||
#include "netutil.h"
|
||
|
||
|
||
|
||
HRESULT HrGetHostIpList( char* pszHost, IPAddr* pIpAddress, LPHOSTENT* ppHostEnt )
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrGetHostIpList
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: S_OK on success, otherwise an error code
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
ASSERT( pszHost );
|
||
ASSERT( pIpAddress );
|
||
ASSERT( ppHostEnt );
|
||
|
||
HRESULT hr = E_INVALIDARG;
|
||
|
||
if ( pIpAddress )
|
||
*pIpAddress = INADDR_NONE;
|
||
|
||
if ( ppHostEnt )
|
||
*ppHostEnt = NULL;
|
||
|
||
if ( pszHost && ( pIpAddress || ppHostEnt ) )
|
||
{
|
||
hr = E_FAIL;
|
||
|
||
*pIpAddress = inet_addr( pszHost );
|
||
|
||
if ( INADDR_NONE == *pIpAddress )
|
||
{
|
||
LPHOSTENT pHost;
|
||
|
||
pHost = gethostbyname( pszHost );
|
||
|
||
if ( pHost && pHost->h_addr_list )
|
||
{
|
||
#ifdef DBG // checked build
|
||
for ( DWORD i=0; pHost->h_addr_list[i]; i++ )
|
||
{
|
||
char* pszName = (char *)(pHost->h_addr_list[i]) + sizeof(DWORD);
|
||
DWORD* pdwAddr = (DWORD *)(pHost->h_addr_list[i]);
|
||
struct in_addr in;
|
||
|
||
in.S_un.S_addr = *pdwAddr;
|
||
char* pszAddr = inet_ntoa( in );
|
||
|
||
TraceMsg(TF_ALWAYS, " Addr[%d] = %S %p %S", i, pszName, pdwAddr, pszAddr );
|
||
}
|
||
#endif // DBG
|
||
|
||
if ( pIpAddress )
|
||
*pIpAddress = *(IPAddr*)(pHost->h_addr);
|
||
|
||
if ( ppHostEnt )
|
||
*ppHostEnt = pHost;
|
||
}
|
||
}
|
||
|
||
if ( INADDR_NONE != *pIpAddress )
|
||
{
|
||
hr = S_OK;
|
||
}
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "HrGetHostIpList = %lx pHostEnt = %lx IpAddress = %lx", hr, *ppHostEnt, *pIpAddress );
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrGetHostIpList( WCHAR* pszwHost, IPAddr* pIpAddress, LPHOSTENT* ppHostEnt )
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrGetHostIpList
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: S_OK on success, otherwise an error code
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr;
|
||
char* pszHost = NULL;
|
||
|
||
hr = HrWideCharToMultiByte( pszwHost, &pszHost );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
hr = HrGetHostIpList( pszHost, pIpAddress, ppHostEnt );
|
||
|
||
delete [] pszHost;
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrGetBestAdapter( IPAddr IpAddress, PIP_ADAPTER_INDEX_MAP pAdapter )
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrGetBestAdapter
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: S_OK on success, otherwise an error code
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
ASSERT( pAdapter );
|
||
|
||
HRESULT hr = E_FAIL;
|
||
|
||
TraceMsg(TF_ALWAYS, " %lu:", IpAddress);
|
||
|
||
DWORD dwBestIfIndex = 0;
|
||
DWORD dwErr = GetBestInterface( IpAddress, &dwBestIfIndex );
|
||
|
||
if ( ERROR_SUCCESS == dwErr )
|
||
{
|
||
ULONG ulLen = 1024;
|
||
|
||
for ( int i=0; i<2; i++ )
|
||
{
|
||
PIP_INTERFACE_INFO pIfTable = (PIP_INTERFACE_INFO)new BYTE[ ulLen ];
|
||
|
||
if ( NULL != pIfTable )
|
||
{
|
||
ZeroMemory( pIfTable, ulLen*sizeof(BYTE) );
|
||
dwErr = GetInterfaceInfo( pIfTable, &ulLen );
|
||
|
||
if ( ERROR_SUCCESS == dwErr )
|
||
{
|
||
for ( LONG j=0L; j<pIfTable->NumAdapters; j++ )
|
||
{
|
||
TraceMsg(TF_ALWAYS, " %lu %s", pIfTable->Adapter[j].Index, pIfTable->Adapter[j].Name);
|
||
|
||
if ( pIfTable->Adapter[j].Index == dwBestIfIndex )
|
||
{
|
||
memcpy( pAdapter, pIfTable->Adapter, sizeof(IP_ADAPTER_INDEX_MAP) );
|
||
hr = S_OK;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
delete [] (BYTE *)pIfTable;
|
||
}
|
||
else
|
||
{
|
||
TraceMsg(TF_ERROR, "new Failed!" );
|
||
break;
|
||
}
|
||
|
||
if ( ERROR_INSUFFICIENT_BUFFER != dwErr )
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
TraceMsg(TF_ERROR, "GetBestInterface Failed = %lx", dwErr);
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "HrGetBestAdapter = %lx", hr);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrCheckForAdapterMatch(
|
||
INetConnection* pConnection,
|
||
PIP_ADAPTER_INDEX_MAP pAdapter,
|
||
BOOL* pfAssociated )
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrCheckForAdapterMatch
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: S_OK on success, otherwise an error code
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr;
|
||
NETCON_PROPERTIES* pProps;
|
||
|
||
ASSERT( pConnection );
|
||
ASSERT( pAdapter );
|
||
ASSERT( pfAssociated );
|
||
|
||
*pfAssociated = FALSE;
|
||
|
||
hr = pConnection->GetProperties( &pProps );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
OLECHAR szwGuid[ GUID_LENGTH + 1 ];
|
||
|
||
if ( StringFromGUID2( pProps->guidId, szwGuid, GUID_LENGTH+1 ) )
|
||
{
|
||
long index = wcslen( pAdapter->Name ) - wcslen( szwGuid );
|
||
|
||
ASSERT( 0 <= index );
|
||
|
||
WCHAR* pszwGuidName = &(pAdapter->Name[index]);
|
||
|
||
TraceMsg(TF_ALWAYS, " - %s", szwGuid );
|
||
TraceMsg(TF_ALWAYS, " - %s", pszwGuidName );
|
||
|
||
if ( ( wcscmp( szwGuid, pszwGuidName ) == 0 ) )
|
||
{
|
||
TraceMsg(TF_ALWAYS, " FOUNT IT! %s", pProps->pszwName );
|
||
*pfAssociated = TRUE;
|
||
}
|
||
}
|
||
|
||
NcFreeNetconProperties( pProps );
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "HrCheckForAdapterMatch = %lx", hr);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrCheckListForMatch(
|
||
INetConnection* pConnection,
|
||
IPAddr IpAddress,
|
||
LPHOSTENT pHostEnt,
|
||
BOOL* pfAssociated )
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrCheckListForMatch
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: S_OK on success, otherwise an error code
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
// If IpAdress or pHostEnt->h_addr INADDR_NONE then the HRESULT is still successful
|
||
HRESULT hr = S_OK;
|
||
|
||
ASSERT( pConnection );
|
||
ASSERT( pfAssociated );
|
||
|
||
IP_ADAPTER_INDEX_MAP Adapter;
|
||
|
||
*pfAssociated = FALSE;
|
||
|
||
if ( NULL != pHostEnt )
|
||
{
|
||
int i;
|
||
|
||
for ( i=0; pHostEnt->h_addr_list[i]; i++ )
|
||
{
|
||
IpAddress = *(IPAddr *)(pHostEnt->h_addr_list[i]);
|
||
|
||
if ( INADDR_NONE != IpAddress )
|
||
{
|
||
hr = HrGetBestAdapter( IpAddress, &Adapter );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
hr = HrCheckForAdapterMatch( pConnection, &Adapter, pfAssociated );
|
||
|
||
if ( *pfAssociated )
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( INADDR_NONE != IpAddress )
|
||
{
|
||
// The name was an ip address
|
||
|
||
hr = HrGetBestAdapter( IpAddress, &Adapter );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
hr = HrCheckForAdapterMatch( pConnection, &Adapter, pfAssociated );
|
||
}
|
||
}
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "HrCheckListForMatch = %lx", hr);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrInternalGetAdapterInfo(
|
||
PIP_ADAPTER_INFO* ppAdapter
|
||
)
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrInternalGetAdapterInfo
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments: PIP_ADAPTER_INFO* ppAdapter
|
||
//
|
||
// Returns: HRESULT
|
||
//
|
||
// Author: billi 12/02/01
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr;
|
||
PIP_ADAPTER_INFO paAdapterInfo = NULL;
|
||
|
||
ASSERT( ppAdapter );
|
||
|
||
if ( NULL == ppAdapter )
|
||
{
|
||
ppAdapter = &paAdapterInfo;
|
||
hr = E_POINTER;
|
||
}
|
||
else
|
||
{
|
||
ULONG uLen = 1024;
|
||
|
||
*ppAdapter = NULL;
|
||
hr = E_FAIL;
|
||
|
||
for ( int i=0; i<2; i++ )
|
||
{
|
||
PIP_ADAPTER_INFO pInfo = (PIP_ADAPTER_INFO)new BYTE[ uLen ];
|
||
|
||
ZeroMemory( pInfo, uLen );
|
||
|
||
if ( NULL != pInfo )
|
||
{
|
||
DWORD dwErr = GetAdaptersInfo( pInfo, &uLen );
|
||
|
||
if ( ERROR_SUCCESS == dwErr )
|
||
{
|
||
hr = S_OK;
|
||
*ppAdapter = pInfo;
|
||
break;
|
||
}
|
||
|
||
delete [] (BYTE *)pInfo;
|
||
}
|
||
else
|
||
{
|
||
hr = E_OUTOFMEMORY;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "HrInternalGetAdapterInfo = %lx Info = %lx", hr, *ppAdapter);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrGetAdapterInfo(
|
||
INetConnection* pConnection,
|
||
PIP_ADAPTER_INFO* ppAdapter
|
||
)
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrGetAdapterInfo
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments: INetConnection* pConnection
|
||
// PIP_ADAPTER_INFO* ppAdapter
|
||
//
|
||
// Returns: HRESULT
|
||
//
|
||
// Author: billi 12/02/01
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr;
|
||
NETCON_PROPERTIES* pProps;
|
||
|
||
ASSERT( pConnection );
|
||
ASSERT( ppAdapter );
|
||
|
||
*ppAdapter = NULL;
|
||
|
||
hr = pConnection->GetProperties( &pProps );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
OLECHAR szwGuid[ GUID_LENGTH + 1 ];
|
||
|
||
hr = E_FAIL; // assume failure
|
||
|
||
if ( StringFromGUID2( pProps->guidId, szwGuid, GUID_LENGTH+1 ) )
|
||
{
|
||
char* szGuid = NULL;
|
||
|
||
hr = HrWideCharToMultiByte( szwGuid, &szGuid );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
PIP_ADAPTER_INFO pInfo;
|
||
|
||
TraceMsg(TF_ALWAYS, "%S:", szGuid);
|
||
|
||
hr = HrInternalGetAdapterInfo( &pInfo );
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
PIP_ADAPTER_INFO pAdapter = pInfo;
|
||
|
||
hr = E_FAIL; // Assume the loop fails...
|
||
|
||
while ( pAdapter )
|
||
{
|
||
TraceMsg(TF_ALWAYS, " %S", pAdapter->AdapterName);
|
||
|
||
if ( ( strcmp( szGuid, pAdapter->AdapterName ) == 0 ) )
|
||
{
|
||
TraceMsg(TF_ALWAYS, " Found It!");
|
||
|
||
PIP_ADAPTER_INFO pBuf = new IP_ADAPTER_INFO;
|
||
|
||
if ( NULL != pBuf )
|
||
{
|
||
memcpy( pBuf, pAdapter, sizeof(IP_ADAPTER_INFO) );
|
||
*ppAdapter = pBuf;
|
||
hr = S_OK;
|
||
break;
|
||
}
|
||
|
||
} // if ( ( strcmp( szGuid, pAdapter->AdapterName ) == 0 ) )
|
||
|
||
pAdapter = pAdapter->Next;
|
||
|
||
} // while ( pAdapter )
|
||
|
||
if ( NULL == *ppAdapter )
|
||
{
|
||
hr = HrFromWin32Error( ERROR_FILE_NOT_FOUND );
|
||
}
|
||
|
||
delete pInfo;
|
||
|
||
} // if ( SUCCEEDED(hr) )
|
||
|
||
delete [] szGuid;
|
||
|
||
} // if ( SUCCEEDED(hr) )
|
||
|
||
} // if ( StringFromGUID2( pProps->guidId, szwGuid, GUID_LENGTH+1 ) )
|
||
|
||
NcFreeNetconProperties( pProps );
|
||
|
||
} // if ( SUCCEEDED(hr) )
|
||
|
||
TraceMsg(TF_ALWAYS, "HrGetAdapterInfo = %lx Info = %lx", hr, *ppAdapter);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrGetHostByAddr(
|
||
IPAddr IpAddress,
|
||
WCHAR** ppszHost,
|
||
PDWORD pdwSize
|
||
)
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrGetHostByAddr
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: HRESULT
|
||
//
|
||
// Author: billi 05/08/01
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr = E_INVALIDARG;
|
||
|
||
if ( ppszHost )
|
||
*ppszHost = 0;
|
||
|
||
if ( pdwSize )
|
||
*pdwSize = 0;
|
||
|
||
if ( INADDR_NONE != IpAddress )
|
||
{
|
||
LPHOSTENT pHostEnt = gethostbyaddr( (char*)&IpAddress, sizeof(IPAddr), AF_INET );
|
||
int iErr = WSAGetLastError();
|
||
|
||
switch ( iErr )
|
||
{
|
||
case WSANOTINITIALISED:
|
||
case WSAENETDOWN:
|
||
case WSANO_RECOVERY:
|
||
case WSAEFAULT:
|
||
hr = E_FAIL;
|
||
break;
|
||
|
||
case NO_ERROR:
|
||
hr = S_OK;
|
||
ASSERT( pHostEnt );
|
||
break;
|
||
|
||
case WSAHOST_NOT_FOUND:
|
||
default:
|
||
hr = S_FALSE;
|
||
break;
|
||
}
|
||
|
||
if ( SUCCEEDED(hr) && pHostEnt && pHostEnt->h_name && ppszHost && pdwSize )
|
||
{
|
||
char* pName = pHostEnt->h_name;
|
||
int iLen = strlen( pName ) + 1;
|
||
DWORD dwSize = 0;
|
||
|
||
dwSize = MultiByteToWideChar( CP_ACP, 0, pName, iLen, NULL, 0 );
|
||
if ( dwSize > 0 )
|
||
{
|
||
WCHAR* pszName = new WCHAR[ ++dwSize ];
|
||
|
||
if ( pszName )
|
||
{
|
||
if ( MultiByteToWideChar( CP_ACP, 0, pName, iLen, pszName, dwSize ) == 0 )
|
||
{
|
||
hr = HrFromLastWin32Error();
|
||
*ppszHost = 0;
|
||
|
||
delete [] pszName;
|
||
}
|
||
else
|
||
{
|
||
*pdwSize = dwSize;
|
||
*ppszHost = pszName;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
hr = E_OUTOFMEMORY;
|
||
}
|
||
|
||
} // if ( dwSize > 0 )
|
||
else
|
||
{
|
||
TraceMsg(TF_ERROR, " MultiByteToWideChar returned %lx wchars", dwSize );
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, " %lx: %S", IpAddress, pHostEnt->h_name, pHostEnt->h_name );
|
||
|
||
} // if ( SUCCEEDED(hr) && ...
|
||
|
||
} // if ( INADDR_NONE != IpAddress )
|
||
|
||
TraceMsg(TF_ALWAYS, "HrGetHostByAddr = %lx", hr);
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrSendArp(
|
||
INetConnection* pConnection,
|
||
IPAddr DestIp,
|
||
PULONG pMacAddr,
|
||
PULONG pAddrLen
|
||
)
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrSendArp
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: HRESULT
|
||
//
|
||
// Author: billi 05/08/01
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr = E_POINTER;
|
||
|
||
ASSERT( pMacAddr );
|
||
ASSERT( pAddrLen );
|
||
|
||
if ( pMacAddr ) *pMacAddr = 0L;
|
||
|
||
if ( pMacAddr && pAddrLen )
|
||
{
|
||
hr = E_INVALIDARG;
|
||
|
||
if ( pConnection && ( INADDR_NONE != DestIp ) )
|
||
{
|
||
PIP_ADAPTER_INFO pAdapter;
|
||
|
||
hr = HrGetAdapterInfo( pConnection, &pAdapter );
|
||
|
||
if ( NULL == pAdapter )
|
||
{
|
||
hr = E_FAIL;
|
||
}
|
||
|
||
if ( SUCCEEDED(hr) )
|
||
{
|
||
hr = E_FAIL;
|
||
|
||
// Make sure the target IP address isn't already cached,
|
||
// by removing it from the ARP cache if present using the interface index
|
||
// determined above.
|
||
|
||
MIB_IPNETROW IpNetRow;
|
||
CHAR HardwareAddress[MAXLEN_PHYSADDR];
|
||
ULONG HardwareAddressLength;
|
||
ULONG SrcIp;
|
||
DWORD dwRet;
|
||
|
||
SrcIp = inet_addr( pAdapter->IpAddressList.IpAddress.String );
|
||
|
||
ZeroMemory( &IpNetRow, sizeof(IpNetRow) );
|
||
IpNetRow.dwIndex = pAdapter->Index;
|
||
IpNetRow.dwPhysAddrLen = MAXLEN_PHYSADDR;
|
||
IpNetRow.dwAddr = DestIp;
|
||
IpNetRow.dwType = MIB_IPNET_TYPE_INVALID;
|
||
|
||
dwRet = DeleteIpNetEntry( &IpNetRow );
|
||
|
||
TraceMsg( TF_ALWAYS, "SendArp: DestIp = %lu SrcIp = %lu Ret = %lx", DestIp, SrcIp, dwRet );
|
||
|
||
if ( ( INADDR_NONE != SrcIp ) && ( NO_ERROR == dwRet ) )
|
||
{
|
||
HardwareAddressLength = MAXLEN_PHYSADDR;
|
||
|
||
if ( SendARP( DestIp, SrcIp, (PULONG)HardwareAddress, &HardwareAddressLength ) == NO_ERROR )
|
||
{
|
||
hr = S_OK;
|
||
|
||
if ( HardwareAddressLength < *pAddrLen )
|
||
{
|
||
*pAddrLen = HardwareAddressLength;
|
||
}
|
||
|
||
memcpy( pMacAddr, HardwareAddress, *pAddrLen );
|
||
}
|
||
|
||
TraceMsg(TF_ALWAYS, "\t%02x %02x %02x %02x %02x %02x Len=%lu",
|
||
HardwareAddress[0] & 0x0ff,
|
||
HardwareAddress[1] & 0x0ff,
|
||
HardwareAddress[2] & 0x0ff,
|
||
HardwareAddress[3] & 0x0ff,
|
||
HardwareAddress[4] & 0x0ff,
|
||
HardwareAddress[5] & 0x0ff,
|
||
*pAddrLen);
|
||
}
|
||
|
||
delete pAdapter;
|
||
|
||
} // if ( SUCCEEDED(hr) )
|
||
|
||
} // if ( pConnection && ( INADDR_NONE != DestIp ) )
|
||
|
||
} // if ( pMacAddr && pAddrLen )
|
||
|
||
TraceMsg( TF_ALWAYS, "HrSendArp = %lx", hr );
|
||
return hr;
|
||
}
|
||
|
||
|
||
|
||
HRESULT HrLookupForIpAddress(
|
||
INetConnection* pConnection,
|
||
IPAddr IpAddress,
|
||
BOOL* pfExists,
|
||
WCHAR** ppszHost,
|
||
PDWORD pdwSize
|
||
)
|
||
//+---------------------------------------------------------------------------
|
||
//
|
||
// Function: HrLookupForIpAddress
|
||
//
|
||
// Purpose:
|
||
//
|
||
// Arguments:
|
||
//
|
||
// Returns: HRESULT
|
||
//
|
||
// Author: billi 12/02/01
|
||
//
|
||
// Notes:
|
||
//
|
||
{
|
||
HRESULT hr = E_POINTER;
|
||
|
||
ASSERT( pfExists );
|
||
ASSERT( pConnection );
|
||
ASSERT( INADDR_NONE != IpAddress );
|
||
|
||
if ( ppszHost && *ppszHost ) *ppszHost = NULL;
|
||
if ( pdwSize ) *pdwSize = NULL;
|
||
|
||
if ( pfExists )
|
||
{
|
||
hr = E_INVALIDARG;
|
||
*pfExists = FALSE;
|
||
|
||
if ( pConnection && ( INADDR_NONE != IpAddress ) )
|
||
{
|
||
WSADATA WsaData;
|
||
int iErr;
|
||
|
||
iErr = WSAStartup( MAKEWORD(2, 0), &WsaData );
|
||
|
||
if ( ERROR_SUCCESS == iErr )
|
||
{
|
||
// This is taking to long and No One is using the host name in the wizard.
|
||
// hr = HrGetHostByAddr( IpAddress, ppszHost, pdwSize );
|
||
hr = S_OK;
|
||
|
||
if ( S_OK == hr )
|
||
{
|
||
CHAR MacAddr[6];
|
||
ULONG ulAddrLen = 6L;
|
||
|
||
hr = HrSendArp( pConnection, IpAddress, (PULONG)MacAddr, &ulAddrLen );
|
||
|
||
if ( SUCCEEDED(hr) && ulAddrLen )
|
||
{
|
||
*pfExists = TRUE;
|
||
}
|
||
}
|
||
else if ( S_FALSE == hr )
|
||
{
|
||
hr = S_OK;
|
||
*pfExists = FALSE;
|
||
}
|
||
|
||
WSACleanup();
|
||
|
||
} // if ( ERROR_SUCCESS == iErr )
|
||
else
|
||
{
|
||
TraceMsg(TF_ERROR, "WSAStartup Failed = %lu", iErr );
|
||
hr = E_FAIL;
|
||
}
|
||
|
||
} // if ( pConnection && ( INADDR_NONE != IpAddress ) )
|
||
|
||
} // if ( pfExists )
|
||
|
||
TraceMsg(TF_ALWAYS, "HrLookupForIpAddress = %lx, Exists = %lx", hr, *pfExists);
|
||
return hr;
|
||
}
|