windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/dbgext/mod.cxx
2020-09-26 16:20:57 +08:00

152 lines
2.8 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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 )