392 lines
8.5 KiB
C
392 lines
8.5 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1998 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
conext.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains the generic routines
|
||
|
for debugging NBF connections.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Chaitanya Kodeboyina
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode
|
||
|
|
||
|
--*/
|
||
|
#include "precomp.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include "conext.h"
|
||
|
|
||
|
//
|
||
|
// Exported Functions
|
||
|
//
|
||
|
|
||
|
DECLARE_API( cons )
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Print a list of conections given
|
||
|
the head LIST_ENTRY.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
args - Address of the list entry, &
|
||
|
Detail of debug information
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
ULONG proxyPtr;
|
||
|
ULONG printDetail;
|
||
|
ULONG linkage;
|
||
|
|
||
|
// Get list-head address & debug print level
|
||
|
printDetail = SUMM_INFO;
|
||
|
if (*args)
|
||
|
{
|
||
|
sscanf(args, "%x %lu %lu", &proxyPtr, &linkage, &printDetail);
|
||
|
}
|
||
|
|
||
|
switch(linkage)
|
||
|
{
|
||
|
case LINKAGE:
|
||
|
PrintConnectionListOnLink(NULL, proxyPtr, printDetail);
|
||
|
break;
|
||
|
|
||
|
case ADDRESS:
|
||
|
PrintConnectionListOnAddress(NULL, proxyPtr, printDetail);
|
||
|
break;
|
||
|
|
||
|
case ADDFILE:
|
||
|
PrintConnectionListOnAddrFile(NULL, proxyPtr, printDetail);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DECLARE_API( con )
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Print the NBF Connection at a
|
||
|
memory location
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
args -
|
||
|
Pointer to the NBF Connection
|
||
|
Detail of debug information
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
TP_CONNECTION Connection;
|
||
|
ULONG printDetail;
|
||
|
ULONG proxyPtr;
|
||
|
|
||
|
// Get the detail of debug information needed
|
||
|
printDetail = NORM_SHAL;
|
||
|
if (*args)
|
||
|
{
|
||
|
sscanf(args, "%x %lu", &proxyPtr, &printDetail);
|
||
|
}
|
||
|
|
||
|
// Get the NBF Connection
|
||
|
if (ReadConnection(&Connection, proxyPtr) != 0)
|
||
|
return;
|
||
|
|
||
|
// Print this Connection
|
||
|
PrintConnection(&Connection, proxyPtr, printDetail);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Global Helper Functions
|
||
|
//
|
||
|
VOID
|
||
|
PrintConnectionListOnLink(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail)
|
||
|
{
|
||
|
TP_CONNECTION Connection;
|
||
|
LIST_ENTRY ConnectionList;
|
||
|
PLIST_ENTRY ConnectionListPtr;
|
||
|
PLIST_ENTRY ConnectionListProxy;
|
||
|
PLIST_ENTRY p, q;
|
||
|
ULONG proxyPtr;
|
||
|
ULONG numConnects;
|
||
|
ULONG bytesRead;
|
||
|
|
||
|
// Get list-head address & debug print level
|
||
|
proxyPtr = ListEntryProxy;
|
||
|
|
||
|
if (ListEntryPointer == NULL)
|
||
|
{
|
||
|
// Read the list entry of NBF connections
|
||
|
if (!ReadMemory(proxyPtr, &ConnectionList, sizeof(LIST_ENTRY), &bytesRead))
|
||
|
{
|
||
|
dprintf("%s @ %08x: Could not read structure\n",
|
||
|
"Connection ListEntry", proxyPtr);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ConnectionListPtr = &ConnectionList;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ConnectionListPtr = ListEntryPointer;
|
||
|
}
|
||
|
|
||
|
// Traverse the doubly linked list
|
||
|
|
||
|
dprintf("Connections On Link:\n");
|
||
|
|
||
|
ConnectionListProxy = (PLIST_ENTRY)proxyPtr;
|
||
|
|
||
|
numConnects = 0;
|
||
|
|
||
|
p = ConnectionListPtr->Flink;
|
||
|
while (p != ConnectionListProxy)
|
||
|
{
|
||
|
// Another Connection
|
||
|
numConnects++;
|
||
|
|
||
|
// Get Connection Ptr
|
||
|
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_CONNECTION, LinkList);
|
||
|
|
||
|
// Get NBF Connection
|
||
|
if (ReadConnection(&Connection, proxyPtr) != 0)
|
||
|
break;
|
||
|
|
||
|
// Print the Connection
|
||
|
PrintConnection(&Connection, proxyPtr, printDetail);
|
||
|
|
||
|
// Go to the next one
|
||
|
p = Connection.LinkList.Flink;
|
||
|
|
||
|
// Free the Connection
|
||
|
FreeConnection(&Connection);
|
||
|
}
|
||
|
|
||
|
if (p == ConnectionListProxy)
|
||
|
{
|
||
|
dprintf("Number of Connections On Link: %lu\n", numConnects);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
PrintConnectionListOnAddress(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail)
|
||
|
{
|
||
|
TP_CONNECTION Connection;
|
||
|
LIST_ENTRY ConnectionList;
|
||
|
PLIST_ENTRY ConnectionListPtr;
|
||
|
PLIST_ENTRY ConnectionListProxy;
|
||
|
PLIST_ENTRY p, q;
|
||
|
ULONG proxyPtr;
|
||
|
ULONG numConnects;
|
||
|
ULONG bytesRead;
|
||
|
|
||
|
// Get list-head address & debug print level
|
||
|
proxyPtr = ListEntryProxy;
|
||
|
|
||
|
if (ListEntryPointer == NULL)
|
||
|
{
|
||
|
// Read the list entry of NBF connections
|
||
|
if (!ReadMemory(proxyPtr, &ConnectionList, sizeof(LIST_ENTRY), &bytesRead))
|
||
|
{
|
||
|
dprintf("%s @ %08x: Could not read structure\n",
|
||
|
"Connection ListEntry", proxyPtr);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ConnectionListPtr = &ConnectionList;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ConnectionListPtr = ListEntryPointer;
|
||
|
}
|
||
|
|
||
|
// Traverse the doubly linked list
|
||
|
|
||
|
dprintf("Connections On Address:\n");
|
||
|
|
||
|
ConnectionListProxy = (PLIST_ENTRY)proxyPtr;
|
||
|
|
||
|
numConnects = 0;
|
||
|
|
||
|
p = ConnectionListPtr->Flink;
|
||
|
while (p != ConnectionListProxy)
|
||
|
{
|
||
|
// Another Connection
|
||
|
numConnects++;
|
||
|
|
||
|
// Get Connection Ptr
|
||
|
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_CONNECTION, AddressList);
|
||
|
|
||
|
// Get NBF Connection
|
||
|
if (ReadConnection(&Connection, proxyPtr) != 0)
|
||
|
break;
|
||
|
|
||
|
// Print the Connection
|
||
|
PrintConnection(&Connection, proxyPtr, printDetail);
|
||
|
|
||
|
// Go to the next one
|
||
|
p = Connection.AddressList.Flink;
|
||
|
|
||
|
// Free the Connection
|
||
|
FreeConnection(&Connection);
|
||
|
}
|
||
|
|
||
|
if (p == ConnectionListProxy)
|
||
|
{
|
||
|
dprintf("Number of Connections On Address: %lu\n", numConnects);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
PrintConnectionListOnAddrFile(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail)
|
||
|
{
|
||
|
TP_CONNECTION Connection;
|
||
|
LIST_ENTRY ConnectionList;
|
||
|
PLIST_ENTRY ConnectionListPtr;
|
||
|
PLIST_ENTRY ConnectionListProxy;
|
||
|
PLIST_ENTRY p, q;
|
||
|
ULONG proxyPtr;
|
||
|
ULONG numConnects;
|
||
|
ULONG bytesRead;
|
||
|
|
||
|
// Get list-head address & debug print level
|
||
|
proxyPtr = ListEntryProxy;
|
||
|
|
||
|
if (ListEntryPointer == NULL)
|
||
|
{
|
||
|
// Read the list entry of NBF connections
|
||
|
if (!ReadMemory(proxyPtr, &ConnectionList, sizeof(LIST_ENTRY), &bytesRead))
|
||
|
{
|
||
|
dprintf("%s @ %08x: Could not read structure\n",
|
||
|
"Connection ListEntry", proxyPtr);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
ConnectionListPtr = &ConnectionList;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ConnectionListPtr = ListEntryPointer;
|
||
|
}
|
||
|
|
||
|
// Traverse the doubly linked list
|
||
|
|
||
|
dprintf("Connections On AddrFile:\n");
|
||
|
|
||
|
ConnectionListProxy = (PLIST_ENTRY)proxyPtr;
|
||
|
|
||
|
numConnects = 0;
|
||
|
|
||
|
p = ConnectionListPtr->Flink;
|
||
|
while (p != ConnectionListProxy)
|
||
|
{
|
||
|
// Another Connection
|
||
|
numConnects++;
|
||
|
|
||
|
// Get Connection Ptr
|
||
|
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_CONNECTION, AddressFileList);
|
||
|
|
||
|
// Get NBF Connection
|
||
|
if (ReadConnection(&Connection, proxyPtr) != 0)
|
||
|
break;
|
||
|
|
||
|
// Print the Connection
|
||
|
PrintConnection(&Connection, proxyPtr, printDetail);
|
||
|
|
||
|
// Go to the next one
|
||
|
p = Connection.AddressFileList.Flink;
|
||
|
|
||
|
// Free the Connection
|
||
|
FreeConnection(&Connection);
|
||
|
}
|
||
|
|
||
|
if (p == ConnectionListProxy)
|
||
|
{
|
||
|
dprintf("Number of Connections On AddrFile: %lu\n", numConnects);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Local Helper Functions
|
||
|
//
|
||
|
|
||
|
UINT
|
||
|
ReadConnection(PTP_CONNECTION pConnection, ULONG proxyPtr)
|
||
|
{
|
||
|
ULONG bytesRead;
|
||
|
|
||
|
// Read the current NBF connection
|
||
|
if (!ReadMemory(proxyPtr, pConnection, sizeof(TP_CONNECTION), &bytesRead))
|
||
|
{
|
||
|
dprintf("%s @ %08x: Could not read structure\n",
|
||
|
"Connection", proxyPtr);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
UINT
|
||
|
PrintConnection(PTP_CONNECTION pConnection, ULONG proxyPtr, ULONG printDetail)
|
||
|
{
|
||
|
// Is this a valid NBF connection ?
|
||
|
if (pConnection->Type != NBF_CONNECTION_SIGNATURE)
|
||
|
{
|
||
|
dprintf("%s @ %08x: Could not match signature\n",
|
||
|
"Connection", proxyPtr);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
// What detail do we have to print at ?
|
||
|
if (printDetail > MAX_DETAIL)
|
||
|
printDetail = MAX_DETAIL;
|
||
|
|
||
|
// Print Information at reqd detail
|
||
|
FieldInConnection(proxyPtr, NULL, printDetail);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
FieldInConnection(ULONG structAddr, CHAR *fieldName, ULONG printDetail)
|
||
|
{
|
||
|
TP_CONNECTION Connection;
|
||
|
|
||
|
if (ReadConnection(&Connection, structAddr) == 0)
|
||
|
{
|
||
|
PrintFields(&Connection, structAddr, fieldName, printDetail, &ConnectionInfo);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
UINT
|
||
|
FreeConnection(PTP_CONNECTION pConnection)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|