|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
pktext.c
Abstract:
This file contains the generic routines for debugging NBF packet structures.
Author:
Chaitanya Kodeboyina
Environment:
User Mode
--*/ #include "precomp.h"
#pragma hdrstop
#include "pktext.h"
//
// Exported Functions
//
DECLARE_API( pkts )
/*++
Routine Description:
Print a list of packets given the head LIST_ENTRY.
Arguments:
args - Address of the list entry, & Detail of debug information Return Value:
None
--*/
{ ULONG proxyPtr; ULONG printDetail;
// Get list-head address & debug print level
printDetail = SUMM_INFO; if (*args) { sscanf(args, "%x %lu", &proxyPtr, &printDetail); }
PrintPacketList(NULL, proxyPtr, printDetail); }
DECLARE_API( pkt )
/*++
Routine Description:
Print the NBF Packet at a location
Arguments:
args - Pointer to the NBF Packet Detail of debug information
Return Value:
None
--*/
{ TP_PACKET Packet; 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 Packet
if (ReadPacket(&Packet, proxyPtr) != 0) return;
// Print this Packet
PrintPacket(&Packet, proxyPtr, printDetail); }
//
// Global Helper Functions
//
VOID PrintPacketList(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail) { TP_PACKET Packet; LIST_ENTRY PacketList; PLIST_ENTRY PacketListPtr; PLIST_ENTRY PacketListProxy; PLIST_ENTRY p, q; ULONG proxyPtr; ULONG numPkts; ULONG bytesRead;
// Get list-head address & debug print level
proxyPtr = ListEntryProxy;
if (ListEntryPointer == NULL) { // Read the list entry of NBF packets
if (!ReadMemory(proxyPtr, &PacketList, sizeof(LIST_ENTRY), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Packet ListEntry", proxyPtr); return; }
PacketListPtr = &PacketList; } else { PacketListPtr = ListEntryPointer; }
// Traverse the doubly linked list
dprintf("Packets:\n");
PacketListProxy = (PLIST_ENTRY)proxyPtr; numPkts = 0; p = PacketListPtr->Flink; while (p != PacketListProxy) { // Another Packet
numPkts++;
// Get Packet Ptr
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_PACKET, Linkage);
// Get NBF Packet
if (ReadPacket(&Packet, proxyPtr) != 0) break; // Print the Packet
PrintPacket(&Packet, proxyPtr, printDetail); // Go to the next one
p = Packet.Linkage.Flink;
// Free the Packet
FreePacket(&Packet); }
if (p == PacketListProxy) { dprintf("Number of Packets: %lu\n", numPkts); } }
//
// Local Helper Functions
//
UINT ReadPacket(PTP_PACKET pPkt, ULONG proxyPtr) { ULONG bytesRead;
// Read the current NBF packet
if (!ReadMemory(proxyPtr, pPkt, sizeof(TP_PACKET), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Packet", proxyPtr); return -1; } return 0; }
UINT PrintPacket(PTP_PACKET pPkt, ULONG proxyPtr, ULONG printDetail) { // Is this a valid NBF packet ?
if (pPkt->Type != NBF_PACKET_SIGNATURE) { dprintf("%s @ %08x: Could not match signature\n", "Packet", proxyPtr); return -1; }
// What detail do we print at ?
if (printDetail > MAX_DETAIL) printDetail = MAX_DETAIL;
// Print Information at reqd detail
FieldInPacket(proxyPtr, NULL, printDetail); return 0; }
VOID FieldInPacket(ULONG structAddr, CHAR *fieldName, ULONG printDetail) { TP_PACKET Packet;
if (ReadPacket(&Packet, structAddr) == 0) { PrintFields(&Packet, structAddr, fieldName, printDetail, &PacketInfo); } }
UINT FreePacket(PTP_PACKET pPkt) { return 0; }
|