MODULE.C
/*++ 
 
Copyright 1995 - 1998 Microsoft Corporation 
 
Module Name: 
 
    module.c 
 
Abstract: 
 
    This module maintains the module (symbol) information for the pfmon application 
 
Author: 
 
    Mark Lucovsky (markl) 27-Jan-1995 
 
Revision History: 
 
--*/ 
 
#include "pfmonp.h" 
 
BOOL 
AddModule( 
    LPDEBUG_EVENT DebugEvent 
    ) 
{ 
    PMODULE_INFO Module; 
    LPVOID BaseAddress; 
    HANDLE Handle; 
 
    if ( DebugEvent->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) { 
        Handle = DebugEvent->u.CreateProcessInfo.hFile; 
        BaseAddress = DebugEvent->u.CreateProcessInfo.lpBaseOfImage; 
        } 
    else { 
        Handle = DebugEvent->u.LoadDll.hFile; 
        BaseAddress = DebugEvent->u.LoadDll.lpBaseOfDll; 
        } 
 
    Module = FindModuleContainingAddress(BaseAddress); 
    if ( Module ) { 
        DeleteModule(Module); 
        } 
 
    Module = LocalAlloc(LMEM_ZEROINIT, sizeof( *Module ) ); 
 
    if (Module == NULL) { 
        return FALSE; 
        } 
 
    Module->Handle = Handle; 
    Module->BaseAddress = BaseAddress; 
 
    if ( !Module->Handle ) { 
        LocalFree(Module); 
        return FALSE; 
        } 
 
    Module->DebugInfo = MapDebugInformation( 
                            Module->Handle, 
                            NULL, 
                            SymbolSearchPath, 
                            (DWORD)Module->BaseAddress 
                            ); 
 
    if ( !Module->DebugInfo ) { 
        LocalFree(Module); 
        return FALSE; 
        } 
    Module->VirtualSize = Module->DebugInfo->SizeOfImage; 
 
    SymLoadModule(hProcess,Handle,NULL,NULL,(DWORD)BaseAddress,0); 
 
    InsertTailList( &ModuleListHead, &Module->Entry ); 
 
    return TRUE; 
} 
 
BOOL 
DeleteModule( 
    PMODULE_INFO Module 
    ) 
{ 
    CHAR Line[256]; 
 
    if ( Module ) { 
        RemoveEntryList(&Module->Entry); 
 
        sprintf(Line,"%16s Caused %6d faults had %6d Soft %6d Hard faulted VA's\n", 
            Module->DebugInfo->ImageFileName, 
            Module->NumberCausedFaults, 
            Module->NumberFaultedSoftVas, 
            Module->NumberFaultedHardVas 
            ); 
        if ( !fLogOnly ) { 
            fprintf(stdout,"%s",Line); 
            } 
        if ( LogFile ) { 
            fprintf(LogFile,"%s",Line); 
            } 
 
        UnmapDebugInformation(Module->DebugInfo); 
        LocalFree(Module); 
        } 
 
    return TRUE; 
} 
 
 
PMODULE_INFO 
FindModuleContainingAddress( 
    LPVOID Address 
    ) 
{ 
    PLIST_ENTRY Next; 
    PMODULE_INFO Module; 
 
    Next = ModuleListHead.Flink; 
    while ( Next != &ModuleListHead ) { 
        Module = CONTAINING_RECORD(Next,MODULE_INFO,Entry); 
        if ( Address >= Module->BaseAddress && 
             Address < (LPVOID)((PUCHAR)(Module->BaseAddress)+Module->VirtualSize) ) { 
            return Module; 
            } 
        Next = Next->Flink; 
        } 
    return NULL; 
} 
 
VOID 
SetSymbolSearchPath( ) 
{ 
    LPSTR lpSymPathEnv, lpAltSymPathEnv, lpSystemRootEnv; 
    ULONG cbSymPath; 
    DWORD dw; 
 
    cbSymPath = 18; 
    if (lpSymPathEnv = getenv("_NT_SYMBOL_PATH")) { 
        cbSymPath += strlen(lpSymPathEnv) + 1; 
    } 
    if (lpAltSymPathEnv = getenv("_NT_ALT_SYMBOL_PATH")) { 
        cbSymPath += strlen(lpAltSymPathEnv) + 1; 
    } 
 
    if (lpSystemRootEnv = getenv("SystemRoot")) { 
        cbSymPath += strlen(lpSystemRootEnv) + 1; 
    } 
 
    SymbolSearchPath = LocalAlloc(LMEM_ZEROINIT,cbSymPath); 
 
    if (lpAltSymPathEnv) { 
        dw = GetFileAttributes(lpAltSymPathEnv); 
        if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) { 
            strcat(SymbolSearchPath,lpAltSymPathEnv); 
            strcat(SymbolSearchPath,";"); 
            } 
    } 
    if (lpSymPathEnv) { 
        dw = GetFileAttributes(lpSymPathEnv); 
        if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) { 
            strcat(SymbolSearchPath,lpSymPathEnv); 
            strcat(SymbolSearchPath,";"); 
            } 
    } 
 
    if (lpSystemRootEnv) { 
        dw = GetFileAttributes(lpSystemRootEnv); 
        if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) { 
            strcat(SymbolSearchPath,lpSystemRootEnv); 
            strcat(SymbolSearchPath,";"); 
            } 
    } 
 
    strcat(SymbolSearchPath,".;"); 
 
}