|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
adfext.c
Abstract:
This file contains the generic routines for debugging NBF address files.
Author:
Chaitanya Kodeboyina
Environment:
User Mode
--*/ #include "precomp.h"
#pragma hdrstop
#include "adfext.h"
//
// Exported Functions
//
DECLARE_API( adfs )
/*++
Routine Description:
Print a list of address files 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); }
PrintAddressFileList(NULL, proxyPtr, printDetail); }
DECLARE_API( adf )
/*++
Routine Description:
Print the NBF Address File at a memory location
Arguments:
args - Pointer to the NBF Addr File Detail of debug information
Return Value:
None
--*/
{ TP_ADDRESS_FILE AddressFile; 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 File
if (ReadAddressFile(&AddressFile, proxyPtr) != 0) return;
// Print this Address File
PrintAddressFile(&AddressFile, proxyPtr, printDetail); }
//
// Global Helper Functions
//
VOID PrintAddressFileList(PVOID ListEntryPointer, ULONG ListEntryProxy, ULONG printDetail) { TP_ADDRESS_FILE AddressFile; LIST_ENTRY AddressFileList; PLIST_ENTRY AddressFileListPtr; PLIST_ENTRY AddressFileListProxy; PLIST_ENTRY p, q; ULONG proxyPtr; ULONG numAddrFiles; ULONG bytesRead;
// Get list-head address & debug print level
proxyPtr = ListEntryProxy;
if (ListEntryPointer == NULL) { // Read the list entry of NBF address files
if (!ReadMemory(proxyPtr, &AddressFileList, sizeof(LIST_ENTRY), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "AddressFile ListEntry", proxyPtr); return; }
AddressFileListPtr = &AddressFileList; } else { AddressFileListPtr = ListEntryPointer; }
// Traverse the doubly linked list
dprintf("Address Files:\n");
AddressFileListProxy = (PLIST_ENTRY)proxyPtr; numAddrFiles = 0; p = AddressFileListPtr->Flink; while (p != AddressFileListProxy) { // Another Address File
numAddrFiles++;
// Get Address File Ptr
proxyPtr = (ULONG) CONTAINING_RECORD (p, TP_ADDRESS_FILE, Linkage);
// Get NBF Address File
if (ReadAddressFile(&AddressFile, proxyPtr) != 0) break; // Print the Address File
PrintAddressFile(&AddressFile, proxyPtr, printDetail); // Go to the next one
p = AddressFile.Linkage.Flink;
// Free the Address File
FreeAddressFile(&AddressFile); }
if (p == AddressFileListProxy) { dprintf("Number of Address Files: %lu\n", numAddrFiles); } }
//
// Local Helper Functions
//
UINT ReadAddressFile(PTP_ADDRESS_FILE pAddrFile, ULONG proxyPtr) { ULONG bytesRead;
// Read the current NBF address file
if (!ReadMemory(proxyPtr, pAddrFile, sizeof(TP_ADDRESS_FILE), &bytesRead)) { dprintf("%s @ %08x: Could not read structure\n", "AddressFile", proxyPtr); return -1; } return 0; }
UINT PrintAddressFile(PTP_ADDRESS_FILE pAddrFile, ULONG proxyPtr, ULONG printDetail) { // Is this a valid NBF address file ?
if (pAddrFile->Type != NBF_ADDRESSFILE_SIGNATURE) { dprintf("%s @ %08x: Could not match signature\n", "AddressFile", proxyPtr); return -1; }
// What detail do we print at ?
if (printDetail > MAX_DETAIL) printDetail = MAX_DETAIL;
// Print Information at reqd detail
FieldInAddressFile(proxyPtr, NULL, printDetail); return 0; }
VOID FieldInAddressFile(ULONG structAddr, CHAR *fieldName, ULONG printDetail) { TP_ADDRESS_FILE AddressFile;
if (ReadAddressFile(&AddressFile, structAddr) == 0) { PrintFields(&AddressFile, structAddr, fieldName, printDetail, &AddressFileInfo); } }
UINT FreeAddressFile(PTP_ADDRESS_FILE pAddrFile) { return 0; }
|