Click here to Skip to main content
Click here to Skip to main content

xLANInfo

, 25 Nov 2003
Rate this:
Please Sign up or sign in to vote.
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

Share

About the Author

YangTze
Web Developer
China China
Hi,I'm YangTze!

Comments and Discussions

 
Questionexecutable instead of a msgbox? PinmemberWL.LEE1-Apr-07 17:27 
GeneralReusable version PinmemberTRK13-Dec-06 2:36 
GeneralLibary files ! PinmemberBui Tan Duoc22-Nov-06 19:49 
GeneralHi PinmemberReader Man San1-Nov-06 1:31 
General&#25903;&#25345; Pinmemberpcasa5-Jul-06 20:44 
Generalinformation on traffic PinmemberFalcao_22-May-06 2:22 
GeneralLAN traffic PinmemberVasil Nikolov25-Jul-05 21:44 
Questionwhy doesn't it work? Pinmemberyanping wang1-Jul-05 18:54 
Generalgetting information from workgroup Pinsussbadzio18-Mar-05 2:39 
GeneralRe: getting information from workgroup PinmemberMember 314043817-Apr-08 1:01 
GeneralWorkgroup name PinmemberG.A.20-Jan-05 23:15 
QuestionHow to make it execute on big (usual) networks PinmemberFranz Brunner23-Oct-04 3:37 
AnswerRe: How to make it execute on big (usual) networks PinmemberWL.LEE1-Apr-07 17:24 
GeneralxLANInfo.exe - 3 error(s), 2 warning(s) Pinmembersurtei28-May-04 0:59 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) PinmemberYangTze30-May-04 15:48 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) Pinmembersurtei31-May-04 22:01 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) PinsussAnonymous15-Apr-05 21:42 
Questionwhy doesn't it work? PinmemberBarçaBoy30-Dec-03 1:38 
Questionwhy doesn't it work? PinmemberBarçaBoy30-Dec-03 1:37 
QuestionWhere is 'Iphlpapi.h' file ? Pinmemberpinhopro3-Dec-03 1:38 
AnswerRe: Where is 'Iphlpapi.h' file ? PinmemberYangTze3-Dec-03 14:24 
AnswerRe: Where is 'Iphlpapi.h' file ? PinsussAnonymous27-Jan-05 21:34 

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.

| Advertise | Privacy | Mobile
Web02 | 2.8.141022.1 | Last Updated 26 Nov 2003
Article Copyright 2003 by YangTze
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid