MODULE.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1995-1997  Microsoft Corporation
  3. Module Name:
  4.     module.c
  5. Abstract:
  6.     This module maintains the module (symbol) information for the pfmon application
  7. Author:
  8.     Mark Lucovsky (markl) 27-Jan-1995
  9. Revision History:
  10. --*/
  11. #include "pfmonp.h"
  12. BOOL
  13. AddModule(
  14.     LPDEBUG_EVENT DebugEvent
  15.     )
  16. {
  17.     PMODULE_INFO Module;
  18.     LPVOID BaseAddress;
  19.     HANDLE Handle;
  20.     if ( DebugEvent->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
  21.         Handle = DebugEvent->u.CreateProcessInfo.hFile;
  22.         BaseAddress = DebugEvent->u.CreateProcessInfo.lpBaseOfImage;
  23.         }
  24.     else {
  25.         Handle = DebugEvent->u.LoadDll.hFile;
  26.         BaseAddress = DebugEvent->u.LoadDll.lpBaseOfDll;
  27.         }
  28.     Module = FindModuleContainingAddress(BaseAddress);
  29.     if ( Module ) {
  30.         DeleteModule(Module);
  31.         }
  32.     Module = LocalAlloc(LMEM_ZEROINIT, sizeof( *Module ) );
  33.     if (Module == NULL) {
  34.         return FALSE;
  35.         }
  36.     Module->Handle = Handle;
  37.     Module->BaseAddress = BaseAddress;
  38.     if ( !Module->Handle ) {
  39.         LocalFree(Module);
  40.         return FALSE;
  41.         }
  42.     Module->DebugInfo = MapDebugInformation(
  43.                             Module->Handle,
  44.                             NULL,
  45.                             SymbolSearchPath,
  46.                             (DWORD)Module->BaseAddress
  47.                             );
  48.     if ( !Module->DebugInfo ) {
  49.         LocalFree(Module);
  50.         return FALSE;
  51.         }
  52.     Module->VirtualSize = Module->DebugInfo->SizeOfImage;
  53.     SymLoadModule(hProcess,Handle,NULL,NULL,(DWORD)BaseAddress,0);
  54.     InsertTailList( &ModuleListHead, &Module->Entry );
  55.     return TRUE;
  56. }
  57. BOOL
  58. DeleteModule(
  59.     PMODULE_INFO Module
  60.     )
  61. {
  62.     CHAR Line[256];
  63.     if ( Module ) {
  64.         RemoveEntryList(&Module->Entry);
  65.         sprintf(Line,"%16s Caused %6d faults had %6d Soft %6d Hard faulted VA'sn",
  66.             Module->DebugInfo->ImageFileName,
  67.             Module->NumberCausedFaults,
  68.             Module->NumberFaultedSoftVas,
  69.             Module->NumberFaultedHardVas
  70.             );
  71.         if ( !fLogOnly ) {
  72.             fprintf(stdout,"%s",Line);
  73.             }
  74.         if ( LogFile ) {
  75.             fprintf(LogFile,"%s",Line);
  76.             }
  77.         UnmapDebugInformation(Module->DebugInfo);
  78.         LocalFree(Module);
  79.         }
  80.     return TRUE;
  81. }
  82. PMODULE_INFO
  83. FindModuleContainingAddress(
  84.     LPVOID Address
  85.     )
  86. {
  87.     PLIST_ENTRY Next;
  88.     PMODULE_INFO Module;
  89.     Next = ModuleListHead.Flink;
  90.     while ( Next != &ModuleListHead ) {
  91.         Module = CONTAINING_RECORD(Next,MODULE_INFO,Entry);
  92.         if ( Address >= Module->BaseAddress &&
  93.              Address < (LPVOID)((PUCHAR)(Module->BaseAddress)+Module->VirtualSize) ) {
  94.             return Module;
  95.             }
  96.         Next = Next->Flink;
  97.         }
  98.     return NULL;
  99. }
  100. VOID
  101. SetSymbolSearchPath( )
  102. {
  103.     LPSTR lpSymPathEnv, lpAltSymPathEnv, lpSystemRootEnv;
  104.     ULONG cbSymPath;
  105.     DWORD dw;
  106.     cbSymPath = 18;
  107.     if (lpSymPathEnv = getenv("_NT_SYMBOL_PATH")) {
  108.         cbSymPath += strlen(lpSymPathEnv) + 1;
  109.     }
  110.     if (lpAltSymPathEnv = getenv("_NT_ALT_SYMBOL_PATH")) {
  111.         cbSymPath += strlen(lpAltSymPathEnv) + 1;
  112.     }
  113.     if (lpSystemRootEnv = getenv("SystemRoot")) {
  114.         cbSymPath += strlen(lpSystemRootEnv) + 1;
  115.     }
  116.     SymbolSearchPath = LocalAlloc(LMEM_ZEROINIT,cbSymPath);
  117.     if (lpAltSymPathEnv) {
  118.         dw = GetFileAttributes(lpAltSymPathEnv);
  119.         if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) {
  120.             strcat(SymbolSearchPath,lpAltSymPathEnv);
  121.             strcat(SymbolSearchPath,";");
  122.             }
  123.     }
  124.     if (lpSymPathEnv) {
  125.         dw = GetFileAttributes(lpSymPathEnv);
  126.         if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) {
  127.             strcat(SymbolSearchPath,lpSymPathEnv);
  128.             strcat(SymbolSearchPath,";");
  129.             }
  130.     }
  131.     if (lpSystemRootEnv) {
  132.         dw = GetFileAttributes(lpSystemRootEnv);
  133.         if ( dw != 0xffffffff && dw & FILE_ATTRIBUTE_DIRECTORY ) {
  134.             strcat(SymbolSearchPath,lpSystemRootEnv);
  135.             strcat(SymbolSearchPath,";");
  136.             }
  137.     }
  138.     strcat(SymbolSearchPath,".;");
  139. }