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