Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

235 lines
4.3 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
reqext.c
Abstract:
This file contains the generic routines
for debugging NBF request structures.
Author:
Chaitanya Kodeboyina
Environment:
User Mode
--*/
#include "precomp.h"
#pragma hdrstop
#include "reqext.h"
//
// Exported Functions
//
DECLARE_API( reqs )
/*++
Routine Description:
Print a list of requests 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);
}
PrintRequestList(NULL, proxyPtr, printDetail);
}
DECLARE_API( req )
/*++
Routine Description:
Print the NBF Request at a location
Arguments:
args -
Pointer to the NBF Request
Detail of debug information
Return Value:
None
--*/
{
TP_REQUEST Request;
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 Request
if (ReadRequest(&Request, proxyPtr) != 0)
return;
// Print this Request
PrintRequest(&Request, proxyPtr, printDetail);
}
//
// Global Helper Functions
//
VOID
PrintRequestList(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail)
{
TP_REQUEST Request;
LIST_ENTRY RequestList;
PLIST_ENTRY RequestListPtr;
PLIST_ENTRY RequestListProxy;
PLIST_ENTRY p, q;
ULONG proxyPtr;
ULONG numReqs;
ULONG bytesRead;
// Get list-head address & debug print level
proxyPtr = ListEntryProxy;
if (ListEntryPointer == NULL)
{
// Read the list entry of NBF requests
if (!ReadMemory(proxyPtr, &RequestList, sizeof(LIST_ENTRY), &bytesRead))
{
dprintf("%s @ %08x: Could not read structure\n",
"Request ListEntry", proxyPtr);
return;
}
RequestListPtr = &RequestList;
}
else
{
RequestListPtr = ListEntryPointer;
}
// Traverse the doubly linked list
dprintf("Requests:\n");
RequestListProxy = (PLIST_ENTRY)proxyPtr;
numReqs = 0;
p = RequestListPtr->Flink;
while (p != RequestListProxy)
{
// Another Request
numReqs++;
// Get Request Ptr
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_REQUEST, Linkage);
// Get NBF Request
if (ReadRequest(&Request, proxyPtr) != 0)
break;
// Print the Request
PrintRequest(&Request, proxyPtr, printDetail);
// Go to the next one
p = Request.Linkage.Flink;
// Free the Request
FreeRequest(&Request);
}
if (p == RequestListProxy)
{
dprintf("Number of Requests: %lu\n", numReqs);
}
}
//
// Local Helper Functions
//
UINT
ReadRequest(PTP_REQUEST pReq, ULONG proxyPtr)
{
ULONG bytesRead;
// Read the current NBF request
if (!ReadMemory(proxyPtr, pReq, sizeof(TP_REQUEST), &bytesRead))
{
dprintf("%s @ %08x: Could not read structure\n",
"Request", proxyPtr);
return -1;
}
return 0;
}
UINT
PrintRequest(PTP_REQUEST pReq, ULONG proxyPtr, ULONG printDetail)
{
// Is this a valid NBF request ?
if (pReq->Type != NBF_REQUEST_SIGNATURE)
{
dprintf("%s @ %08x: Could not match signature\n",
"Request", proxyPtr);
return -1;
}
// What detail do we print at ?
if (printDetail > MAX_DETAIL)
printDetail = MAX_DETAIL;
// Print Information at reqd detail
FieldInRequest(proxyPtr, NULL, printDetail);
return 0;
}
VOID
FieldInRequest(ULONG structAddr, CHAR *fieldName, ULONG printDetail)
{
TP_REQUEST Request;
if (ReadRequest(&Request, structAddr) == 0)
{
PrintFields(&Request, structAddr, fieldName, printDetail, &RequestInfo);
}
}
UINT
FreeRequest(PTP_REQUEST pReq)
{
return 0;
}