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

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1993  Microsoft Corporation
  3. Module Name:
  4.     module.c
  5. Abstract:
  6.     This file implements the module load debug events.
  7. Author:
  8.     Wesley Witt (wesw) 1-May-1993
  9. Environment:
  10.     User Mode
  11. --*/
  12. #include <windows.h>
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include "drwatson.h"
  17. #include "proto.h"
  18. #include "messages.h"
  19. //
  20. // defines for symbol (.dbg) file searching
  21. //
  22. #define SYMBOL_PATH             "_NT_SYMBOL_PATH"
  23. #define ALTERNATE_SYMBOL_PATH   "_NT_ALT_SYMBOL_PATH"
  24. char szApp[MAX_PATH];
  25. //
  26. // local prototypes
  27. //
  28. LPSTR GetSymbolSearchPath( void );
  29. BOOL
  30. ProcessModuleLoad ( PDEBUGPACKET dp, LPDEBUG_EVENT de )
  31. /*++
  32. Routine Description:
  33.     Process all module load debug events, create process & dll load.
  34.     The purpose is to allocate a MODULEINFO structure, fill in the
  35.     necessary values, and load the symbol table.
  36. Arguments:
  37.     dp      - pointer to a debug packet
  38.     de      - pointer to a debug event structure
  39. Return Value:
  40.     TRUE    - everything worked
  41.     FALSE   - we're hosed
  42. --*/
  43. {
  44.     HANDLE      hFile;
  45.     DWORD       dwBaseOfImage;
  46.     LPSTR       SymbolPath;
  47.     if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
  48.         hFile = de->u.CreateProcessInfo.hFile;
  49.         dwBaseOfImage = (DWORD)de->u.CreateProcessInfo.lpBaseOfImage;
  50.         dp->hProcess = de->u.CreateProcessInfo.hProcess;
  51.         dp->dwProcessId = de->dwProcessId;
  52.         SymInitialize( dp->hProcess, NULL, FALSE );
  53.         SymbolPath = GetSymbolSearchPath();
  54.         SymSetSearchPath( dp->hProcess, SymbolPath );
  55.         free( SymbolPath );
  56.     } else if (de->dwDebugEventCode == LOAD_DLL_DEBUG_EVENT) {
  57.         hFile = de->u.LoadDll.hFile;
  58.         dwBaseOfImage = (DWORD)de->u.LoadDll.lpBaseOfDll;
  59.     }
  60.     if ((hFile == NULL) || (hFile == INVALID_HANDLE_VALUE)) {
  61.         return FALSE;
  62.     }
  63.     if (!SymLoadModule( dp->hProcess, hFile, NULL, NULL, dwBaseOfImage, 0 )) {
  64.         return FALSE;
  65.     } else {
  66.         if (de->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT) {
  67.             IMAGEHLP_MODULE   mi;
  68.             if (SymGetModuleInfo( dp->hProcess, dwBaseOfImage, &mi )) {
  69.                 strcpy( szApp, mi.ImageName );
  70.             }
  71.         }
  72.     }
  73.     return TRUE;
  74. }
  75. LPSTR
  76. GetSymbolSearchPath( void )
  77. /*++
  78. Routine Description:
  79.     Gets the search path to be used for locating a .DBG file.
  80. Arguments:
  81.     None.
  82. Return Value:
  83.     pointer to the path string
  84. --*/
  85. {
  86.     LPSTR   lpSymPathEnv      = NULL;
  87.     LPSTR   lpAltSymPathEnv   = NULL;
  88.     LPSTR   lpSystemRootEnv   = NULL;
  89.     LPSTR   SymbolSearchPath  = NULL;
  90.     DWORD   cbSymPath         = 0;
  91.     cbSymPath = 16;
  92.     if (lpSymPathEnv = getenv(SYMBOL_PATH)) {
  93.         cbSymPath += strlen(lpSymPathEnv) + 1;
  94.     }
  95.     if (lpAltSymPathEnv = getenv(ALTERNATE_SYMBOL_PATH)) {
  96.         cbSymPath += strlen(lpAltSymPathEnv) + 1;
  97.     }
  98.     if (lpSystemRootEnv = getenv("SystemRoot")) {
  99.         cbSymPath += strlen(lpSystemRootEnv) + 1;
  100.     }
  101.     SymbolSearchPath = calloc(cbSymPath,1);
  102.     if (lpAltSymPathEnv) {
  103.         strcat(SymbolSearchPath,lpAltSymPathEnv);
  104.         strcat(SymbolSearchPath,";");
  105.     }
  106.     if (lpSymPathEnv) {
  107.         strcat(SymbolSearchPath,lpSymPathEnv);
  108.         strcat(SymbolSearchPath,";");
  109.     }
  110.     if (lpSystemRootEnv) {
  111.         strcat(SymbolSearchPath,lpSystemRootEnv);
  112.         strcat(SymbolSearchPath,";");
  113.     }
  114.     return SymbolSearchPath;
  115. }