Click here to Skip to main content
Licence 
First Posted 25 Nov 2003
Views 66,231
Bookmarked 32 times

xLANInfo

By | 25 Nov 2003 | Article
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

About the Author

YangTze

Web Developer

China China

Member

Hi,I'm YangTze!


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
Questionexecutable instead of a msgbox? PinmemberWL.LEE17:27 1 Apr '07  
GeneralReusable version PinmemberTRK2:36 13 Dec '06  
GeneralLibary files ! PinmemberBui Tan Duoc19:49 22 Nov '06  
GeneralHi PinmemberReader Man San1:31 1 Nov '06  
General支持 Pinmemberpcasa20:44 5 Jul '06  
Generalinformation on traffic PinmemberFalcao_2:22 22 May '06  
GeneralLAN traffic PinmemberVasil Nikolov21:44 25 Jul '05  
Questionwhy doesn't it work? Pinmemberyanping wang18:54 1 Jul '05  
Generalgetting information from workgroup Pinsussbadzio2:39 18 Mar '05  
GeneralRe: getting information from workgroup PinmemberMember 31404381:01 17 Apr '08  
GeneralWorkgroup name PinmemberG.A.23:15 20 Jan '05  
QuestionHow to make it execute on big (usual) networks PinmemberFranz Brunner3:37 23 Oct '04  
AnswerRe: How to make it execute on big (usual) networks PinmemberWL.LEE17:24 1 Apr '07  
GeneralxLANInfo.exe - 3 error(s), 2 warning(s) Pinmembersurtei0:59 28 May '04  
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) PinmemberYangTze15:48 30 May '04  
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) Pinmembersurtei22:01 31 May '04  
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) PinsussAnonymous21:42 15 Apr '05  
Questionwhy doesn't it work? PinmemberBarçaBoy1:38 30 Dec '03  
Questionwhy doesn't it work? PinmemberBarçaBoy1:37 30 Dec '03  
QuestionWhere is 'Iphlpapi.h' file ? Pinmemberpinhopro1:38 3 Dec '03  
AnswerRe: Where is 'Iphlpapi.h' file ? PinmemberYangTze14:24 3 Dec '03  
AnswerRe: Where is 'Iphlpapi.h' file ? PinsussAnonymous21:34 27 Jan '05  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120517.1 | Last Updated 26 Nov 2003
Article Copyright 2003 by YangTze
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid