|
|
/*++
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; }
|