Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

xLANInfo

0.00/5 (No votes)
25 Nov 2003 4  
A useful tool for enumerating LAN information such as IP,MAC,Shared resources.

Sample Image - xLANInfo.jpg

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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here