You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
429 lines
11 KiB
429 lines
11 KiB
/*++
|
|
|
|
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.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
UCHAR transportAddress[MAX_TRANSPORT_ADDR];
|
|
ULONG64 address = 0;
|
|
ULONG result;
|
|
INT i;
|
|
USHORT length;
|
|
CHAR expr[MAX_ADDRESS_EXPRESSION];
|
|
PCHAR argp;
|
|
|
|
gClient = pClient;
|
|
if (!CheckKmGlobals ()) {
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
argp = ProcessOptions ((PCHAR)args);
|
|
if (argp==NULL)
|
|
return E_INVALIDARG;
|
|
|
|
//
|
|
// Snag the address from the command line.
|
|
//
|
|
while (sscanf( argp, "%s%n", expr, &i )==1) {
|
|
if( CheckControlC() ) {
|
|
break;
|
|
}
|
|
|
|
argp+=i;
|
|
address = GetExpression (expr);
|
|
|
|
result = GetFieldValue (address,
|
|
"AFD!TRANSPORT_ADDRESS",
|
|
"Address[0].AddressLength",
|
|
length);
|
|
if (result!=0) {
|
|
dprintf("\naddr: Could not read length of TRANSPORT_ADDRESS @ %p, err: %ld\n",
|
|
address, result);
|
|
continue;
|
|
}
|
|
|
|
length = (USHORT)FIELD_OFFSET (TRANSPORT_ADDRESS, Address[0].Address[length]);
|
|
|
|
if (!ReadMemory (address,
|
|
transportAddress,
|
|
length < sizeof (transportAddress)
|
|
? length
|
|
: sizeof (transportAddress),
|
|
&result)) {
|
|
dprintf("\naddr: Could not read TRANSPORT_ADDRESS @ %p (%ld bytes)\n",
|
|
address, length);
|
|
continue;
|
|
}
|
|
|
|
if (Options & AFDKD_BRIEF_DISPLAY) {
|
|
dprintf ("\n%s", TransportAddressToString (
|
|
(PTRANSPORT_ADDRESS)transportAddress,
|
|
address));
|
|
}
|
|
else {
|
|
DumpTransportAddress(
|
|
"",
|
|
(PTRANSPORT_ADDRESS)transportAddress,
|
|
address
|
|
);
|
|
}
|
|
if (Options & AFDKD_FIELD_DISPLAY) {
|
|
ProcessFieldOutput (address, "AFD!TRANSPORT_ADDRESS");
|
|
}
|
|
}
|
|
|
|
dprintf ("\n");
|
|
|
|
return S_OK;
|
|
|
|
} // addr
|
|
|
|
DECLARE_API( addrlist )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps the list of addresses registered by the TDI transports,
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
ULONG64 address, listHead;
|
|
ULONG result;
|
|
LIST_ENTRY64 listEntry;
|
|
ULONG64 nextEntry;
|
|
ULONG64 nameAddress;
|
|
WCHAR deviceName[MAX_PATH];
|
|
UCHAR transportAddress[MAX_TRANSPORT_ADDR];
|
|
USHORT length;
|
|
PCHAR argp;
|
|
|
|
gClient = pClient;
|
|
|
|
if (!CheckKmGlobals ()) {
|
|
return E_INVALIDARG;
|
|
}
|
|
argp = ProcessOptions ((PCHAR)args);
|
|
if (argp==NULL)
|
|
return E_INVALIDARG;
|
|
|
|
if (Options&AFDKD_BRIEF_DISPLAY) {
|
|
dprintf (AFDKD_BRIEF_ADDRLIST_DISPLAY_HEADER);
|
|
}
|
|
|
|
address = listHead = GetExpression( "afd!AfdAddressEntryList" );
|
|
if( address == 0 ) {
|
|
|
|
dprintf( "\naddrlist: Could not find afd!AfdEndpointlistHead\n" );
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
if( !ReadListEntry(
|
|
listHead,
|
|
&listEntry) ) {
|
|
dprintf(
|
|
"\naddrlist: Could not read afd!AfdAddressEntryList @ %p\n",
|
|
listHead
|
|
);
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
nextEntry = listEntry.Flink;
|
|
|
|
while( nextEntry != listHead ) {
|
|
|
|
if (nextEntry==0) {
|
|
dprintf ("\naddrlist: Flink is NULL, last entry: %p\n", address);
|
|
break;
|
|
}
|
|
|
|
if( CheckControlC() ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
address = nextEntry-AddressEntryLinkOffset;
|
|
|
|
result = (ULONG)InitTypeRead (address, AFD!AFD_ADDRESS_ENTRY);
|
|
if (result!=0) {
|
|
dprintf(
|
|
"\naddrlist: Could not read AFD_ADDRESS_ENTRY @ %p\n",
|
|
address
|
|
);
|
|
break;
|
|
}
|
|
nextEntry = ReadField (AddressListLink.Flink);
|
|
nameAddress = ReadField (DeviceName.Buffer);
|
|
length = (USHORT)ReadField (DeviceName.Length);
|
|
|
|
if (!ReadMemory (nameAddress,
|
|
deviceName,
|
|
length < sizeof (deviceName)-1
|
|
? length
|
|
: sizeof (deviceName)-1,
|
|
&result)) {
|
|
dprintf(
|
|
"\naddrlist: Could not read DeviceName for address entry @ %p\n",
|
|
address
|
|
);
|
|
continue;
|
|
}
|
|
deviceName[result/2+1] = 0;
|
|
length = (USHORT)ReadField (Address.AddressLength);
|
|
length = (USHORT)FIELD_OFFSET (TA_ADDRESS, Address[length]);
|
|
|
|
if (!ReadMemory (address+AddressEntryAddressOffset,
|
|
transportAddress+FIELD_OFFSET(TRANSPORT_ADDRESS, Address),
|
|
length < sizeof (transportAddress)-FIELD_OFFSET(TRANSPORT_ADDRESS, Address)
|
|
? length
|
|
: sizeof (transportAddress)-FIELD_OFFSET(TRANSPORT_ADDRESS, Address),
|
|
&result)) {
|
|
dprintf("\naddrlist: Could not read TRANSPORT_ADDRESS for address entry @ %p (%d bytes)\n",
|
|
address, length);
|
|
continue;
|
|
}
|
|
|
|
if (!(Options & AFDKD_CONDITIONAL) ||
|
|
CheckConditional (address, "AFD!AFD_ADDRESS_ENTRY") ) {
|
|
if (Options & AFDKD_BRIEF_DISPLAY) {
|
|
dprintf (
|
|
IsPtr64 ()
|
|
? "\n%011.011p %-37.37ls %-32.32s"
|
|
: "\n%008.008p %-37.37ls %-32.32s",
|
|
DISP_PTR(address),
|
|
&deviceName[sizeof("\\Device\\")-1],
|
|
TransportAddressToString (
|
|
(PTRANSPORT_ADDRESS)transportAddress,
|
|
address +
|
|
AddressEntryAddressOffset -
|
|
FIELD_OFFSET(TRANSPORT_ADDRESS, Address))
|
|
);
|
|
|
|
|
|
}
|
|
else {
|
|
dprintf ("\nAddress List Entry @ %p\n", address);
|
|
dprintf (" DeviceName = %ls\n", deviceName);
|
|
|
|
DumpTransportAddress(
|
|
" ",
|
|
(PTRANSPORT_ADDRESS)transportAddress,
|
|
address+AddressEntryAddressOffset-FIELD_OFFSET(TRANSPORT_ADDRESS, Address)
|
|
);
|
|
}
|
|
if (Options & AFDKD_FIELD_DISPLAY) {
|
|
ProcessFieldOutput (address, "AFD!AFD_ADDRESS_ENTRY");
|
|
}
|
|
}
|
|
else
|
|
dprintf (".");
|
|
}
|
|
if (Options&AFDKD_BRIEF_DISPLAY) {
|
|
dprintf (AFDKD_BRIEF_ADDRLIST_DISPLAY_TRAILER);
|
|
}
|
|
else {
|
|
dprintf ("\n");
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DECLARE_API( tranlist )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dumps the list of transports which have open sockets associated with them.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
ULONG64 address;
|
|
ULONG result;
|
|
LIST_ENTRY64 listEntry;
|
|
ULONG64 nextEntry;
|
|
ULONG64 listHead;
|
|
PAFDKD_TRANSPORT_INFO transportInfo;
|
|
PCHAR argp;
|
|
|
|
gClient = pClient;
|
|
|
|
if (!CheckKmGlobals ()) {
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
argp = ProcessOptions ((PCHAR)args);
|
|
if (argp==NULL)
|
|
return E_INVALIDARG;
|
|
|
|
if (Options&AFDKD_BRIEF_DISPLAY) {
|
|
dprintf (AFDKD_BRIEF_TRANSPORT_DISPLAY_HEADER);
|
|
}
|
|
|
|
listHead = address = GetExpression( "afd!AfdTransportInfoListHead" );
|
|
if( listHead == 0 ) {
|
|
|
|
dprintf( "\ntranlist: Could not find afd!AfdTransportInfoListHead\n" );
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
if( !ReadListEntry(
|
|
listHead,
|
|
&listEntry) ) {
|
|
dprintf(
|
|
"\ntranlist: Could not read afd!AfdTransportInfoListHead @ %p\n",
|
|
listHead
|
|
);
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
//
|
|
// Free the old list
|
|
//
|
|
while (!IsListEmpty (&TransportInfoList)) {
|
|
PLIST_ENTRY plistEntry;
|
|
plistEntry = RemoveHeadList (&TransportInfoList);
|
|
transportInfo = CONTAINING_RECORD (plistEntry,
|
|
AFDKD_TRANSPORT_INFO,
|
|
Link);
|
|
RtlFreeHeap (RtlProcessHeap (), 0, transportInfo);
|
|
}
|
|
|
|
nextEntry = listEntry.Flink;
|
|
|
|
while( nextEntry != listHead ) {
|
|
|
|
|
|
if (nextEntry==0) {
|
|
dprintf ("\ntranlist: Flink is NULL, last entry: %p\n", address);
|
|
break;
|
|
}
|
|
|
|
if( CheckControlC() ) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
address = nextEntry-TransportInfoLinkOffset;
|
|
|
|
result = (ULONG)InitTypeRead (address, AFD!AFD_TRANSPORT_INFO);
|
|
|
|
if (result!=0) {
|
|
dprintf(
|
|
"\ntranlist: Could not read AFD_TRANSPORT_INFO @ %p\n",
|
|
address
|
|
);
|
|
break;
|
|
}
|
|
nextEntry = ReadField (TransportInfoListEntry.Flink);
|
|
|
|
transportInfo = ReadTransportInfo (address);
|
|
if (transportInfo!=NULL) {
|
|
InsertHeadList (&TransportInfoList, &transportInfo->Link);
|
|
if (!(Options & AFDKD_CONDITIONAL) ||
|
|
CheckConditional (address, "AFD!AFD_TRANSPORT_INFO") ) {
|
|
if (Options & AFDKD_BRIEF_DISPLAY) {
|
|
DumpTransportInfoBrief (transportInfo);
|
|
}
|
|
else {
|
|
DumpTransportInfo (transportInfo);
|
|
}
|
|
if (Options & AFDKD_FIELD_DISPLAY) {
|
|
ProcessFieldOutput (address, "AFD!AFD_TRANSPORT_INFO");
|
|
}
|
|
}
|
|
else
|
|
dprintf (".");
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
if (Options&AFDKD_BRIEF_DISPLAY) {
|
|
dprintf (AFDKD_BRIEF_TRANSPORT_DISPLAY_TRAILER);
|
|
}
|
|
else {
|
|
dprintf ("\n");
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|