summaryrefslogblamecommitdiffstats
path: root/private/ntos/afd/afdkd/addr.c
blob: 61f9f3aea58831b2654c570751136663cf562c5d (plain) (tree)










































































































































                                                                        
/*++

Copyright (c) 1992  Microsoft Corporation

Module Name:

    addr.c

Abstract:

    Implements the addr command.

Author:

    Keith Moore (keithmo) 19-Apr-1995

Environment:

    User Mode.

Revision History:

--*/


#include "afdkdp.h"
#pragma hdrstop


//
// Public functions.
//

DECLARE_API( addr )

/*++

Routine Description:

    Dumps the TRANSPORT_ADDRESS structure at the specified address.

Arguments:

    None.

Return Value:

    None.

--*/

{

    DWORD address = 0;
    ULONG result;
    UCHAR transportAddress[MAX_TRANSPORT_ADDR];
    PTA_IP_ADDRESS ipAddress = (PTA_IP_ADDRESS)transportAddress;

    //
    // Snag the address from the command line.
    //

    sscanf( args, "%lx", &address );

    if( address == 0 ) {

        dprintf( "use: addr address\n" );
        return;

    }

    //
    // Assume the address is 22 bytes long (the same size as
    // a TA_IP_ADDRESS structure).  After we perform this initial
    // read, we can examine the structure to determine its actual
    // size.  If it's really larger than 22 bytes, we'll reread
    // the entire address structure.
    //

    if( !ReadMemory(
            address,
            transportAddress,
            sizeof(TA_IP_ADDRESS),
            &result
            ) ) {

        dprintf(
            "addr: cannot read TRANSPORT_ADDRESS @ %08lx\n",
            address
            );

        return;

    }

    if( ipAddress->TAAddressCount != 1 ) {

        dprintf(
            "addr: invalid TRANSPORT_ADDRESS @ %08lx\n",
            address
            );

        return;

    }

    if( ipAddress->Address[0].AddressLength > sizeof(TDI_ADDRESS_IP) ) {

        //
        // It's a big one.
        //

        if( !ReadMemory(
                address,
                transportAddress,
                ipAddress->Address[0].AddressLength +
                    ( sizeof(TA_IP_ADDRESS) - sizeof(TDI_ADDRESS_IP) ),
                &result
                ) ) {

            dprintf(
                "addr: cannot read TRANSPORT_ADDRESS @ %08lx\n",
                address
                );

            return;

        }

    }

    DumpTransportAddress(
        "",
        (PTRANSPORT_ADDRESS)transportAddress,
        address
        );

}   // addr