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 )
|
|||
|
|