Click here to Skip to main content
15,886,652 members
Articles / Desktop Programming / MFC
Article

xLANInfo

Rate me:
Please Sign up or sign in to vote.
4.42/5 (12 votes)
25 Nov 2003 178K   2.1K   34   24
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


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

Comments and Discussions

 
Questionexecutable instead of a msgbox? Pin
WL.LEE1-Apr-07 17:27
WL.LEE1-Apr-07 17:27 
GeneralReusable version Pin
TRK13-Dec-06 2:36
TRK13-Dec-06 2:36 
GeneralLibary files ! Pin
Bui Tan Duoc22-Nov-06 19:49
professionalBui Tan Duoc22-Nov-06 19:49 
GeneralHi Pin
Reader Man San1-Nov-06 1:31
professionalReader Man San1-Nov-06 1:31 
General&#25903;&#25345; Pin
pcasa5-Jul-06 20:44
pcasa5-Jul-06 20:44 
Generalinformation on traffic Pin
Falcao_22-May-06 2:22
Falcao_22-May-06 2:22 
GeneralLAN traffic Pin
Member 214645725-Jul-05 21:44
Member 214645725-Jul-05 21:44 
Questionwhy doesn't it work? Pin
yanping wang1-Jul-05 18:54
yanping wang1-Jul-05 18:54 
Generalgetting information from workgroup Pin
badzio18-Mar-05 2:39
badzio18-Mar-05 2:39 
GeneralRe: getting information from workgroup Pin
Member 314043817-Apr-08 1:01
Member 314043817-Apr-08 1:01 
GeneralWorkgroup name Pin
G.A.20-Jan-05 23:15
G.A.20-Jan-05 23:15 
Hello,
Good article!I'm interested in how a workgroup name is get.Does anybody know?

Thanks in advance.
QuestionHow to make it execute on big (usual) networks Pin
Franz Brunner23-Oct-04 3:37
Franz Brunner23-Oct-04 3:37 
AnswerRe: How to make it execute on big (usual) networks Pin
WL.LEE1-Apr-07 17:24
WL.LEE1-Apr-07 17:24 
GeneralxLANInfo.exe - 3 error(s), 2 warning(s) Pin
surtei28-May-04 0:59
surtei28-May-04 0:59 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) Pin
YangTze30-May-04 15:48
YangTze30-May-04 15:48 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) Pin
surtei31-May-04 22:01
surtei31-May-04 22:01 
GeneralRe: xLANInfo.exe - 3 error(s), 2 warning(s) Pin
Anonymous15-Apr-05 21:42
Anonymous15-Apr-05 21:42 
Questionwhy doesn't it work? Pin
BarçaBoy30-Dec-03 1:38
BarçaBoy30-Dec-03 1:38 
Questionwhy doesn't it work? Pin
BarçaBoy30-Dec-03 1:37
BarçaBoy30-Dec-03 1:37 
QuestionWhere is 'Iphlpapi.h' file ? Pin
Rodrigo Pinto Pereira de Souza3-Dec-03 1:38
Rodrigo Pinto Pereira de Souza3-Dec-03 1:38 
AnswerRe: Where is 'Iphlpapi.h' file ? Pin
YangTze3-Dec-03 14:24
YangTze3-Dec-03 14:24 
AnswerRe: Where is 'Iphlpapi.h' file ? Pin
Anonymous27-Jan-05 21:34
Anonymous27-Jan-05 21:34 

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

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