|
|
/*++
Copyright (c) 1997-2000 Microsoft Corporation
Module Name:
main.cxx
Abstract:
Misc utilities
Author:
Murali R. Krishnan ( MuraliK ) 24-Aug-1997
Revision History:
--*/
#include "precomp.hxx"
NTSD_EXTENSION_APIS ExtensionApis; HANDLE ExtensionCurrentProcess;
# define minSize(a, b) (((a) < (b)) ? (a) : (b))
/************************************************************
* Utility Functions ************************************************************/
VOID dstring( CHAR * pszName, PVOID pvString, DWORD cbLen) /*++
Description: This function reads the data from the debuggee process at address [pvString] for specified length [cbLen] and echoes the string back on the debugger window.
Arguments: pszName - pointer to string containing the name of the string read pvString - pointer to VOID specifying the location of the string in the debugee process cbLen - count of bytes to be read at [pvString]
Returns: None --*/ { CHAR rgchString[10240]; DWORD cLength = minSize( cbLen, sizeof(rgchString) -1);
//
// Read the data block from the debuggee process into local buffer
//
moveBlock( rgchString, pvString, cLength);
rgchString[cLength] = '\0'; // terminate the string buffer
dprintf( "%s = %s\n", pszName, rgchString);
return; } // dstring()
VOID Print2Dwords( CHAR * pszN1, DWORD d1, CHAR * pszN2, DWORD d2 ) { dprintf(" %25s =%8d %25s =%8d\n", pszN1, d1, pszN2, d2 ); return; } // Print2Dwords()
BOOL EnumLinkedList( IN LIST_ENTRY * pListHead, IN PFN_LIST_ENUMERATOR pfnListEnumerator, IN CHAR chVerbosity, IN DWORD cbSizeOfStructure, IN DWORD cbListEntryOffset ) /*++
Description: This function iterates over the NT's standard LIST_ENTRY structure (doubly linked circular list with header) and makes callbacks for objects found on the list.
Arguments: pListHead - pointer to List head in the debugee process pfnListEnumerator - pointer to callback function for the object on the list chVerbosity - character indicating the verbosity level desired cbSizeOfStructure - count of bytes of object's size cbListEntryOffset - count of bytes of offset of the List entry structure inside the containing object
Returns: TRUE on successful enumeration FALSE on failure --*/ { # define MAX_STRUCTURE_SIZE (10240)
CHAR rgch[MAX_STRUCTURE_SIZE]; PVOID pvDebuggee = NULL; PVOID pvDebugger = (PVOID ) rgch;
LIST_ENTRY leListHead; LIST_ENTRY * pListEntry;
DWORD cItems = 0;
if ( NULL == pListHead) { dprintf( "Invalid List given \n"); return (FALSE); }
if ( MAX_STRUCTURE_SIZE < cbSizeOfStructure) { dprintf( "Given size for structure %d exceeds default max %d bytes\n", cbSizeOfStructure, MAX_STRUCTURE_SIZE); return (FALSE); }
// make a local copy of the list head for navigation purposes
MoveWithRet( leListHead, pListHead, FALSE);
for ( pListEntry = leListHead.Flink; pListEntry != pListHead; ) { if ( CheckControlC() ) { return (FALSE); }
pvDebuggee = (PVOID ) ((PCHAR ) pListEntry - cbListEntryOffset);
// make a local copy of the debuggee structure
MoveBlockWithRet( rgch, pvDebuggee, cbSizeOfStructure, FALSE);
cItems++;
if( pfnListEnumerator ) { (*pfnListEnumerator)( pvDebuggee, pvDebugger, chVerbosity, cItems); dprintf( "\n"); }
MoveWithRet( pListEntry, &pListEntry->Flink, FALSE ); } // for all linked list entries
dprintf( "%d entries traversed\n", cItems );
return (TRUE); } // EnumLinkedList()
|