#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winsock2.h>
#include <wsipx.h>
#include <svcguid.h>
#include <nspapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <rpc.h>
#include <rpcdce.h>


_cdecl
main(int argc, char **argv)
{
    WSADATA          wsaData;
    struct hostent * lpHostEnt;
    BYTE             AddrBuffer[1000];
    BYTE             AliasBuffer[1000];
    DWORD            AddrBufLen = 1000;
    DWORD            AliasBufLen = 1000;
    LPCSADDR_INFO    lpCSAddrInfo = (LPCSADDR_INFO) AddrBuffer;
    LPSTR            lpAliases = (LPSTR) AliasBuffer;
    GUID             dnsGuid = SVCID_DOMAIN_TCP;
    char **          ppHostAliases;
    LPSTR            lpTemp = NULL, lpAddress = NULL;
    BYTE             Part1, Part2, Part3, Part4;
    DWORD            Address;

    if ( argc != 2 )
    {
        printf( "\nUseage: ghbn <Address>\n" );
        return( -1 );
    }

    lpAddress = argv[1];

    lpTemp = strtok( lpAddress, "." );
    Part1 = atoi( lpTemp );
    lpTemp = strtok( NULL, "." );
    Part2 = atoi( lpTemp );
    lpTemp = strtok( NULL, "." );
    Part3 = atoi( lpTemp );
    lpTemp = strtok( NULL, "." );
    Part4 = atoi( lpTemp );

    ((LPBYTE) &Address)[0] = Part1;
    ((LPBYTE) &Address)[1] = Part2;
    ((LPBYTE) &Address)[2] = Part3;
    ((LPBYTE) &Address)[3] = Part4;

    WSAStartup( MAKEWORD(1, 1), &wsaData );

    lpHostEnt = gethostbyaddr( &Address, 4, 0 );

    if ( lpHostEnt )
    {
        DWORD iter = 0;

        printf( "\nHost address found for IP address %d.%d.%d.%d.\n",
                Part1, Part2, Part3, Part4 );
        printf( "Official name of host: %s\n", lpHostEnt->h_name );
        ppHostAliases = lpHostEnt->h_aliases;

        while ( *ppHostAliases )
            printf( "Alias name: %s\n", *ppHostAliases++ );

        printf( "Host address type: %d\n", lpHostEnt->h_addrtype );
        printf( "Length of addresses: %d\n", lpHostEnt->h_length );
        while ( lpHostEnt->h_addr_list[iter] )
        {
            printf( "Address %d\t: [%d.%d.%d.%d]\n",
                    iter + 1,
                    0x00FF & (WORD) lpHostEnt->h_addr_list[iter][0],
                    0x00FF & (WORD) lpHostEnt->h_addr_list[iter][1],
                    0x00FF & (WORD) lpHostEnt->h_addr_list[iter][2],
                    0x00FF & (WORD) lpHostEnt->h_addr_list[iter][3] );
            iter++;
        }
    }
    else
    {
        printf( "\nNo host found for IP address %d.%d.%d.%d.\nError: %d",
        Part1, Part2, Part3, Part4, WSAGetLastError() );
    }

    WSACleanup();

    return( 0 );
}