Visual Studio 6Windows 2003Windows 2000Visual C++ 6.0Windows XPMFCIntermediateDevVisual StudioWindowsC++
xLANInfo






4.42/5 (10 votes)
Nov 26, 2003

179860

2149
A useful tool for enumerating LAN information such as IP,MAC,Shared resources.
Introduction
xLANInfo is a useful tool for getting some information about LAN, such as remote-machine's IP/MAC/Host name/Shared resources.Key code fragment
//======================================================================= // Get LAN Information. // ====================================================================== #include <Winsock2.h> #include < Iphlpapi.h > #pragma comment( lib,"Ws2_32.lib" ) #pragma comment( lib,"Mpr.lib" ) #pragma comment( lib,"iphlpapi.lib" ) void CXLANInfoDlg::OnGetLanInfo() { // Enable/Disable [Copy] button. BOOL bCopyList = FALSE; // Clear contents of List Box. m_list.ResetContent(); // Waiting... CWaitCursor wait; CString strTemp = _T(""); CString strTemp1 = _T(""); CString strSubResource = _T(""); struct hostent *host; struct in_addr *ptr; DWORD dwScope = RESOURCE_CONTEXT; NETRESOURCE *NetResource = NULL; HANDLE hEnum; WSADATA wsaData; // Initialize Windows Socket Library. WSAStartup( MAKEWORD( 1,1 ),&wsaData ); WNetOpenEnum( dwScope,NULL,NULL,NULL,&hEnum ); // If we get a valid handle... if( hEnum ) { DWORD Count = 0xFFFFFFFF; DWORD BufferSize = 2048; LPVOID Buffer = new char[ 2048 ]; WNetEnumResource( hEnum,&Count,Buffer,&BufferSize ); NetResource = ( NETRESOURCE * )Buffer; for( unsigned int i = 0; i < Count; i++, NetResource++ ) { m_list.UpdateWindow(); if( NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY ) { if( NetResource->lpRemoteName ) { // Ha: What the Host shared? { strSubResource.Empty(); BOOL ret = GetSubResource( NetResource, strSubResource ); } CString strFullName = NetResource->lpRemoteName; if( 0 == strFullName.Left( 2 ).Compare( "\\\\" ) ) strFullName = strFullName.Right( strFullName.GetLength() - 2 ); // Get Host host = gethostbyname( strFullName ); if( host == NULL ) continue; ptr = ( struct in_addr * )host->h_addr_list[ 0 ]; // Get IP int a = ptr->S_un.S_un_b.s_b1; int b = ptr->S_un.S_un_b.s_b2; int c = ptr->S_un.S_un_b.s_b3; int d = ptr->S_un.S_un_b.s_b4; strTemp.Format( _T("%d.%d.%d.%d"),a,b,c,d ); GetRemoteMAC( strTemp,strTemp1 ); if( strTemp1 != _T("Hello,YangTze!") ) { strTemp.Format( _T("[IP] %3d.%3d.%3d.%3d [MAC] %s [Host] %s"), a,b,c,d,strTemp1,strFullName ); } else { strTemp.Format( _T("[IP] %3d.%3d.%3d.%3d [Host] %s"), a,b,c,d,strFullName ); } // Add to List Box. int index = m_list.AddStringEx( strTemp ); m_list.SetCurSel( index ); if( !strSubResource.IsEmpty() ) { int at = 0; while( 1 ) { m_list.UpdateWindow(); at = strSubResource.Find( '?',0 ); if( at == -1 ) break; strTemp = " |__"; strTemp += strSubResource.Left( at ); int index = m_list.AddStringEx( strTemp ); m_list.SetCurSel( index ); strSubResource = strSubResource.Right( strSubResource.GetLength()-at-1 ); } } bCopyList = TRUE; } } } delete Buffer; WNetCloseEnum( hEnum ); } WSACleanup(); CButton *pCopyListBtn = ( CButton * )GetDlgItem( IDC_COPY_LANINFO ); pCopyListBtn->EnableWindow( bCopyList ); } void CXLANInfoDlg::GetRemoteMAC(CString &IP, CString &strMAC) { HRESULT hr; IPAddr ipAddr; ULONG pulMac[ 2 ]; ULONG ulLen; CString tmp0,tmp1; strMAC = _T("Hello,YangTze!"); ipAddr = inet_addr( ( char * )( LPCTSTR )IP ); memset( pulMac,0xff,sizeof( pulMac ) ); ulLen = 6; hr = SendARP( ipAddr,0,pulMac,&ulLen ); if( NO_ERROR != hr || ulLen == 0 ) return; ULONG i; char * szMac = new char[ ulLen * 3 ]; PBYTE pbHexMac = ( PBYTE )pulMac; // Convert the binary MAC address into human-readable for( i = 0; i < ulLen - 1; ++ i ) { tmp0.Format( "%02X:",pbHexMac[ i ] ); tmp1 += tmp0; } tmp0.Format( "%02X",pbHexMac[ i ] ); tmp1 += tmp0; delete [] szMac; strMAC = tmp1; } BOOL CXLANInfoDlg::GetSubResource(NETRESOURCE *pContainer, CString &strRet) { NETRESOURCE NetResource; NETRESOURCE *pSubNetResource = NULL; HANDLE hEnum = NULL; DWORD ret; CopyMemory( ( PVOID )&NetResource,( PVOID )pContainer, sizeof( NETRESOURCE ) ); NetResource.dwScope = RESOURCE_GLOBALNET; NetResource.dwType = RESOURCETYPE_ANY; NetResource.dwUsage = RESOURCEUSAGE_CONTAINER; ret = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,&NetResource,&hEnum ); if( NO_ERROR != ret ) return FALSE; if( hEnum ) { DWORD Count = 0xFFFFFFFF; DWORD BufferSize = 2048; LPVOID Buffer = new char[ 2048 ]; ret = WNetEnumResource( hEnum,&Count,Buffer,&BufferSize ); pSubNetResource = ( NETRESOURCE * )Buffer; if( NO_ERROR == ret ) { CString tmp; for( unsigned int i = 0; i < Count; i++, pSubNetResource++ ) { m_list.UpdateWindow(); if( pSubNetResource->lpRemoteName ) { tmp.Format( "%s?",pSubNetResource->lpRemoteName ); strRet += tmp; } } } delete Buffer; WNetCloseEnum( hEnum ); } return TRUE; }
Thanks
Thanks for your review!
History
- First written - By YangTze, 11/26/2K3