windows-nt/Source/XPSP1/NT/net/netbeui/kdext/conext.c
2020-09-26 16:20:57 +08:00

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;
}