152 lines
2.8 KiB
C++
152 lines
2.8 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995-1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
mod.cxx
|
||
|
||
Abstract:
|
||
|
||
This module contains an NTSD debugger extension for dumping module
|
||
information.
|
||
|
||
Author:
|
||
|
||
Keith Moore (keithmo) 16-Sep-1997
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "inetdbgp.h"
|
||
|
||
typedef struct _ENUM_CONTEXT {
|
||
BOOLEAN FirstTime;
|
||
} ENUM_CONTEXT, *PENUM_CONTEXT;
|
||
|
||
|
||
/************************************************************
|
||
* Dump Module Info
|
||
************************************************************/
|
||
|
||
|
||
BOOLEAN
|
||
CALLBACK
|
||
ModpEnumProc(
|
||
IN PVOID Param,
|
||
IN PMODULE_INFO ModuleInfo
|
||
)
|
||
{
|
||
|
||
PENUM_CONTEXT context;
|
||
|
||
context = (PENUM_CONTEXT)Param;
|
||
|
||
if( context->FirstTime ) {
|
||
context->FirstTime = FALSE;
|
||
dprintf( "Start End Entry Path\n" );
|
||
}
|
||
|
||
dprintf(
|
||
"%08lp %08lp %08lp %s\n",
|
||
ModuleInfo->DllBase,
|
||
ModuleInfo->DllBase + ModuleInfo->SizeOfImage,
|
||
ModuleInfo->EntryPoint,
|
||
ModuleInfo->FullName
|
||
);
|
||
|
||
return TRUE;
|
||
|
||
} // ModpEnumProc
|
||
|
||
|
||
DECLARE_API( mod )
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function is called as an NTSD extension to format and dump
|
||
module information.
|
||
|
||
Arguments:
|
||
|
||
hCurrentProcess - Supplies a handle to the current process (at the
|
||
time the extension was called).
|
||
|
||
hCurrentThread - Supplies a handle to the current thread (at the
|
||
time the extension was called).
|
||
|
||
CurrentPc - Supplies the current pc at the time the extension is
|
||
called.
|
||
|
||
lpExtensionApis - Supplies the address of the functions callable
|
||
by this extension.
|
||
|
||
lpArgumentString - Supplies the asciiz string that describes the
|
||
ansi string to be dumped.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
ENUM_CONTEXT context;
|
||
MODULE_INFO modInfo;
|
||
ULONG address;
|
||
PSTR endPointer;
|
||
|
||
INIT_API();
|
||
|
||
context.FirstTime = TRUE;
|
||
|
||
//
|
||
// Skip leading blanks.
|
||
//
|
||
|
||
while( *lpArgumentString == ' ' ||
|
||
*lpArgumentString == '\t' ) {
|
||
lpArgumentString++;
|
||
}
|
||
|
||
if( *lpArgumentString == '\0' ) {
|
||
|
||
//
|
||
// No argument passed, dump all modules.
|
||
//
|
||
|
||
if( !EnumModules(
|
||
ModpEnumProc,
|
||
(PVOID)&context
|
||
) ) {
|
||
dprintf( "error retrieving module list\n" );
|
||
}
|
||
|
||
} else {
|
||
|
||
//
|
||
// Try to find the module containing the specified address.
|
||
//
|
||
|
||
address = strtoul( lpArgumentString, &endPointer, 16 );
|
||
|
||
if( *endPointer != ' ' && *endPointer != '\t' && *endPointer != '\0' ) {
|
||
PrintUsage( "mod" );
|
||
return;
|
||
}
|
||
|
||
if( FindModuleByAddress( address, &modInfo ) ) {
|
||
ModpEnumProc( (PVOID)&context, &modInfo );
|
||
} else {
|
||
dprintf( "Cannot find %08lp\n", address );
|
||
}
|
||
|
||
}
|
||
|
||
} // DECLARE_API( mod )
|
||
|