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.
213 lines
4.2 KiB
213 lines
4.2 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
devext.c
|
|
|
|
Abstract:
|
|
|
|
This file contains the generic routines
|
|
for debugging NBF device contexts.
|
|
|
|
Author:
|
|
|
|
Chaitanya Kodeboyina
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include "devext.h"
|
|
|
|
//
|
|
// Exported Functions
|
|
//
|
|
|
|
DECLARE_API( devs )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print a list of devices on the NBF's
|
|
devices list [@ nbf!NbfDeviceList ]
|
|
|
|
Arguments:
|
|
|
|
args - Detail of debug information
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
DEVICE_CONTEXT DeviceContext;
|
|
PLIST_ENTRY NbfDeviceLPtr;
|
|
LIST_ENTRY NbfDeviceList;
|
|
PLIST_ENTRY p, q;
|
|
ULONG proxyPtr;
|
|
ULONG numDevs;
|
|
ULONG bytesRead;
|
|
ULONG printDetail;
|
|
|
|
// Get the detail of debug information needed
|
|
printDetail = SUMM_INFO;
|
|
if (*args)
|
|
{
|
|
sscanf(args, "%lu", &printDetail);
|
|
}
|
|
|
|
// Get the address corresponding to symbol
|
|
proxyPtr = GetLocation("nbf!NbfDeviceList");
|
|
|
|
// Read the list entry of NBF devices
|
|
if (!ReadMemory(proxyPtr, &NbfDeviceList, sizeof(LIST_ENTRY), &bytesRead))
|
|
{
|
|
dprintf("%s @ %08x: Could not read structure\n",
|
|
"NbfDeviceList", proxyPtr);
|
|
return;
|
|
}
|
|
|
|
// Traverse the doubly linked list
|
|
|
|
dprintf("Devices:\n");
|
|
|
|
NbfDeviceLPtr = (PLIST_ENTRY)proxyPtr;
|
|
|
|
numDevs = 0;
|
|
|
|
p = NbfDeviceList.Flink;
|
|
while (p != NbfDeviceLPtr)
|
|
{
|
|
// Another Device
|
|
numDevs++;
|
|
|
|
// Device Context Ptr
|
|
proxyPtr = (ULONG) CONTAINING_RECORD (p, DEVICE_CONTEXT, Linkage);
|
|
|
|
// Get Device Context
|
|
if (ReadDeviceContext(&DeviceContext, proxyPtr) != 0)
|
|
break;
|
|
|
|
// Print the Context
|
|
PrintDeviceContext(&DeviceContext, proxyPtr, printDetail);
|
|
|
|
// Go to the next one
|
|
p = DeviceContext.Linkage.Flink;
|
|
|
|
// Free Device Context
|
|
FreeDeviceContext(&DeviceContext);
|
|
}
|
|
|
|
if (p == NbfDeviceLPtr)
|
|
{
|
|
dprintf("Number of Devices: %lu\n", numDevs);
|
|
}
|
|
}
|
|
|
|
DECLARE_API( dev )
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Print the device context at an addr
|
|
|
|
Arguments:
|
|
|
|
args -
|
|
Address of the device context
|
|
Detail of debug information
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
DEVICE_CONTEXT DeviceContext;
|
|
ULONG printDetail;
|
|
ULONG proxyPtr;
|
|
|
|
// Get the detail of debug information needed
|
|
printDetail = NORM_SHAL;
|
|
if (*args)
|
|
{
|
|
sscanf(args, "%x %lu", &proxyPtr, &printDetail);
|
|
}
|
|
|
|
// Get Device Context
|
|
if (ReadDeviceContext(&DeviceContext, proxyPtr) != 0)
|
|
return;
|
|
|
|
// Print the Context
|
|
PrintDeviceContext(&DeviceContext, proxyPtr, printDetail);
|
|
}
|
|
|
|
//
|
|
// Helper Functions
|
|
//
|
|
|
|
UINT
|
|
ReadDeviceContext(PDEVICE_CONTEXT pDevCon, ULONG proxyPtr)
|
|
{
|
|
ULONG bytesRead;
|
|
|
|
// Read the current device context
|
|
if (!ReadMemory(proxyPtr, pDevCon, sizeof(DEVICE_CONTEXT), &bytesRead))
|
|
{
|
|
dprintf("%s @ %08x: Could not read structure\n",
|
|
"DeviceContext", proxyPtr);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
UINT
|
|
PrintDeviceContext(PDEVICE_CONTEXT pDevCon, ULONG proxyPtr, ULONG printDetail)
|
|
{
|
|
// Is this a valid NBF device context ?
|
|
if (pDevCon->Type != NBF_DEVICE_CONTEXT_SIGNATURE)
|
|
{
|
|
dprintf("%s @ %08x: Could not match signature\n",
|
|
"DeviceContext", proxyPtr);
|
|
return -1;
|
|
}
|
|
|
|
// What detail do we have to print at ?
|
|
if (printDetail > MAX_DETAIL)
|
|
printDetail = MAX_DETAIL;
|
|
|
|
// Print Information at reqd detail
|
|
FieldInDeviceContext(proxyPtr, NULL, printDetail);
|
|
|
|
return 0;
|
|
}
|
|
|
|
VOID
|
|
FieldInDeviceContext(ULONG structAddr, CHAR *fieldName, ULONG printDetail)
|
|
{
|
|
DEVICE_CONTEXT DeviceContext;
|
|
|
|
if (ReadDeviceContext(&DeviceContext, structAddr) == 0)
|
|
{
|
|
PrintFields(&DeviceContext, structAddr, fieldName, printDetail, &DeviceContextInfo);
|
|
}
|
|
}
|
|
|
|
UINT
|
|
FreeDeviceContext(PDEVICE_CONTEXT pDevCon)
|
|
{
|
|
return 0;
|
|
}
|
|
|