/*++ Copyright (c) 1998 Microsoft Corporation Module Name: adrext.c Abstract: This file contains the generic routines for debugging NBF address structures. Author: Chaitanya Kodeboyina Environment: User Mode --*/ #include "precomp.h" #pragma hdrstop #include "adrext.h" // // Exported Functions // DECLARE_API( adrs ) /*++ Routine Description: Print a list of addresses 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); } PrintAddressList(NULL, proxyPtr, printDetail); } DECLARE_API( adr ) /*++ Routine Description: Print the NBF Address at a location Arguments: args - Pointer to the NBF Address Detail of debug information Return Value: None --*/ { TP_ADDRESS Address; 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 Address if (ReadAddress(&Address, proxyPtr) != 0) return; // Print this Address PrintAddress(&Address, proxyPtr, printDetail); } // // Global Helper Functions // VOID PrintAddressList(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail) { TP_ADDRESS Address; LIST_ENTRY AddressList; PLIST_ENTRY AddressListPtr; PLIST_ENTRY AddressListProxy; PLIST_ENTRY p, q; ULONG proxyPtr; ULONG numAddrs; ULONG bytesRead; // Get list-head address & debug print level proxyPtr = ListEntryProxy; if (ListEntryPointer == NULL) { // Read the list entry of NBF addresses if (!ReadMemory(proxyPtr, &AddressList, sizeof(LIST_ENTRY), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Address ListEntry", proxyPtr); return; } AddressListPtr = &AddressList; } else { AddressListPtr = ListEntryPointer; } // Traverse the doubly linked list dprintf("Addresses:\n"); AddressListProxy = (PLIST_ENTRY)proxyPtr; numAddrs = 0; p = AddressListPtr->Flink; while (p != AddressListProxy) { // Another Address numAddrs++; // Get Address Ptr proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_ADDRESS, Linkage); // Get NBF Address if (ReadAddress(&Address, proxyPtr) != 0) break; // Print the Address PrintAddress(&Address, proxyPtr, printDetail); // Go to the next one p = Address.Linkage.Flink; // Free the Address FreeAddress(&Address); } if (p == AddressListProxy) { dprintf("Number of Addresses: %lu\n", numAddrs); } } // // Local Helper Functions // UINT ReadAddress(PTP_ADDRESS pAddr, ULONG proxyPtr) { ULONG bytesRead; // Read the current NBF address if (!ReadMemory(proxyPtr, pAddr, sizeof(TP_ADDRESS), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "Address", proxyPtr); return -1; } return 0; } UINT PrintAddress(PTP_ADDRESS pAddr, ULONG proxyPtr, ULONG printDetail) { // Is this a valid NBF address ? if (pAddr->Type != NBF_ADDRESS_SIGNATURE) { dprintf("%s @ %08x: Could not match signature\n", "Address", proxyPtr); return -1; } // What detail do we print at ? if (printDetail > MAX_DETAIL) printDetail = MAX_DETAIL; // Print Information at reqd detail FieldInAddress(proxyPtr, NULL, printDetail); return 0; } VOID FieldInAddress(ULONG structAddr, CHAR *fieldName, ULONG printDetail) { TP_ADDRESS Address; if (ReadAddress(&Address, structAddr) == 0) { PrintFields(&Address, structAddr, fieldName, printDetail, &AddressInfo); } } UINT FreeAddress(PTP_ADDRESS pAddr) { return 0; }