home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / image / winnt / pfmon / pfmonp.h < prev    next >
C/C++ Source or Header  |  1997-10-05  |  6KB  |  349 lines

  1. /*++
  2.  
  3. Copyright (c) 1995-1997  Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     instaler.h
  8.  
  9. Abstract:
  10.  
  11.     Main include file for the INSTALER application.
  12.  
  13. Author:
  14.  
  15.     Steve Wood (stevewo) 09-Aug-1994
  16.  
  17. Revision History:
  18.  
  19. --*/
  20.  
  21. #ifdef RC_INVOKED
  22. #include <windows.h>
  23. #else
  24.  
  25. #include <windows.h>
  26. #include <imagehlp.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30.  
  31. #include "errormsg.h"
  32.  
  33.  
  34. typedef struct _PSAPI_WS_WATCH_INFORMATION {
  35.     LPVOID FaultingPc;
  36.     LPVOID FaultingVa;
  37. } PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;
  38.  
  39. BOOL
  40. WINAPI
  41. GetWsChanges(
  42.     HANDLE hProcess,
  43.     PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
  44.     DWORD cb
  45.     );
  46.  
  47.  
  48. BOOL
  49. WINAPI
  50. InitializeProcessForWsWatch(
  51.     HANDLE hProcess
  52.     );
  53.  
  54.  
  55.  
  56. //  Doubly-linked list manipulation routines.  Implemented as macros
  57. //  but logically these are procedures.
  58. //
  59.  
  60. //
  61. //  VOID
  62. //  InitializeListHead(
  63. //      PLIST_ENTRY ListHead
  64. //      );
  65. //
  66.  
  67. #define InitializeListHead(ListHead) (\
  68.     (ListHead)->Flink = (ListHead)->Blink = (ListHead))
  69.  
  70. //
  71. //  BOOL
  72. //  IsListEmpty(
  73. //      PLIST_ENTRY ListHead
  74. //      );
  75. //
  76.  
  77. #define IsListEmpty(ListHead) \
  78.     ((ListHead)->Flink == (ListHead))
  79.  
  80. //
  81. //  PLIST_ENTRY
  82. //  RemoveHeadList(
  83. //      PLIST_ENTRY ListHead
  84. //      );
  85. //
  86.  
  87. #define RemoveHeadList(ListHead) \
  88.     (ListHead)->Flink;\
  89.     {RemoveEntryList((ListHead)->Flink)}
  90.  
  91. //
  92. //  PLIST_ENTRY
  93. //  RemoveTailList(
  94. //      PLIST_ENTRY ListHead
  95. //      );
  96. //
  97.  
  98. #define RemoveTailList(ListHead) \
  99.     (ListHead)->Blink;\
  100.     {RemoveEntryList((ListHead)->Blink)}
  101.  
  102. //
  103. //  VOID
  104. //  RemoveEntryList(
  105. //      PLIST_ENTRY Entry
  106. //      );
  107. //
  108.  
  109. #define RemoveEntryList(Entry) {\
  110.     PLIST_ENTRY _EX_Blink;\
  111.     PLIST_ENTRY _EX_Flink;\
  112.     _EX_Flink = (Entry)->Flink;\
  113.     _EX_Blink = (Entry)->Blink;\
  114.     _EX_Blink->Flink = _EX_Flink;\
  115.     _EX_Flink->Blink = _EX_Blink;\
  116.     }
  117.  
  118. //
  119. //  VOID
  120. //  InsertTailList(
  121. //      PLIST_ENTRY ListHead,
  122. //      PLIST_ENTRY Entry
  123. //      );
  124. //
  125.  
  126. #define InsertTailList(ListHead,Entry) {\
  127.     PLIST_ENTRY _EX_Blink;\
  128.     PLIST_ENTRY _EX_ListHead;\
  129.     _EX_ListHead = (ListHead);\
  130.     _EX_Blink = _EX_ListHead->Blink;\
  131.     (Entry)->Flink = _EX_ListHead;\
  132.     (Entry)->Blink = _EX_Blink;\
  133.     _EX_Blink->Flink = (Entry);\
  134.     _EX_ListHead->Blink = (Entry);\
  135.     }
  136.  
  137. //
  138. //  VOID
  139. //  InsertHeadList(
  140. //      PLIST_ENTRY ListHead,
  141. //      PLIST_ENTRY Entry
  142. //      );
  143. //
  144.  
  145. #define InsertHeadList(ListHead,Entry) {\
  146.     PLIST_ENTRY _EX_Flink;\
  147.     PLIST_ENTRY _EX_ListHead;\
  148.     _EX_ListHead = (ListHead);\
  149.     _EX_Flink = _EX_ListHead->Flink;\
  150.     (Entry)->Flink = _EX_Flink;\
  151.     (Entry)->Blink = _EX_ListHead;\
  152.     _EX_Flink->Blink = (Entry);\
  153.     _EX_ListHead->Flink = (Entry);\
  154.     }
  155.  
  156. //
  157. // Data structures and entry points in init.c
  158. //
  159.  
  160. DWORD TotalSoftFaults;
  161. DWORD TotalHardFaults;
  162. DWORD TotalCodeFaults;
  163. DWORD TotalDataFaults;
  164. DWORD TotalKernelFaults;
  165. DWORD TotalUserFaults;
  166.  
  167. BOOL fCodeOnly;
  168. BOOL fHardOnly;
  169.  
  170. VOID
  171. ProcessPfMonData(
  172.     VOID
  173.     );
  174.  
  175. //
  176. // Data structures and entry points in init.c
  177. //
  178.  
  179. BOOL fVerbose;
  180. BOOL fLogOnly;
  181. BOOL fKernelOnly;                 //flag for displaying kernel pagefaults
  182. BOOL fKernel;                     //flag for displaying kernel pagefaults
  183. BOOL fDatabase;                   //flag for outputing information in a
  184.                                   //tab-delimited database format
  185. FILE *LogFile;
  186.  
  187. BOOL
  188. InitializePfmon(
  189.     VOID
  190.     );
  191.  
  192. BOOL
  193. LoadApplicationForDebug(
  194.     LPSTR CommandLine
  195.     );
  196.  
  197. BOOL
  198. AttachApplicationForDebug(
  199.     DWORD Pid
  200.     );
  201.  
  202. HANDLE hProcess;
  203.  
  204. //
  205. // Data structures and entry points in error.c
  206. //
  207.  
  208. HANDLE PfmonModuleHandle;
  209.  
  210. VOID
  211. CDECL
  212. DeclareError(
  213.     UINT ErrorCode,
  214.     UINT SupplementalErrorCode,
  215.     ...
  216.     );
  217.  
  218. //
  219. // Data structures and entry points in DEBUG.C
  220. //
  221.  
  222. VOID
  223. DebugEventLoop( VOID );
  224.  
  225. //
  226. // Data structures and entry points in process.c
  227. //
  228.  
  229. typedef struct _PROCESS_INFO {
  230.     LIST_ENTRY Entry;
  231.     LIST_ENTRY ThreadListHead;
  232.     DWORD Id;
  233.     HANDLE Handle;
  234. } PROCESS_INFO, *PPROCESS_INFO;
  235.  
  236. typedef struct _THREAD_INFO {
  237.     LIST_ENTRY Entry;
  238.     DWORD Id;
  239.     HANDLE Handle;
  240.     PVOID StartAddress;
  241. } THREAD_INFO, *PTHREAD_INFO;
  242.  
  243. LIST_ENTRY ProcessListHead;
  244.  
  245. BOOL
  246. AddProcess(
  247.     LPDEBUG_EVENT DebugEvent,
  248.     PPROCESS_INFO *ReturnedProcess
  249.     );
  250.  
  251. BOOL
  252. DeleteProcess(
  253.     PPROCESS_INFO Process
  254.     );
  255.  
  256. BOOL
  257. AddThread(
  258.     LPDEBUG_EVENT DebugEvent,
  259.     PPROCESS_INFO Process,
  260.     PTHREAD_INFO *ReturnedThread
  261.     );
  262.  
  263. BOOL
  264. DeleteThread(
  265.     PPROCESS_INFO Process,
  266.     PTHREAD_INFO Thread
  267.     );
  268.  
  269. PPROCESS_INFO
  270. FindProcessById(
  271.     ULONG Id
  272.     );
  273.  
  274. BOOL
  275. FindProcessAndThreadForEvent(
  276.     LPDEBUG_EVENT DebugEvent,
  277.     PPROCESS_INFO *ReturnedProcess,
  278.     PTHREAD_INFO *ReturnedThread
  279.     );
  280. //
  281. // Data structures and entry points in module.c
  282. //
  283.  
  284. typedef struct _MODULE_INFO {
  285.     LIST_ENTRY Entry;
  286.     LPVOID BaseAddress;
  287.     DWORD VirtualSize;
  288.     DWORD NumberFaultedSoftVas;
  289.     DWORD NumberFaultedHardVas;
  290.     DWORD NumberCausedFaults;
  291.     HANDLE Handle;
  292.     PIMAGE_DEBUG_INFORMATION DebugInfo;
  293. } MODULE_INFO, *PMODULE_INFO;
  294.  
  295. LPSTR SymbolSearchPath;
  296. LIST_ENTRY ModuleListHead;
  297.  
  298. BOOL
  299. LazyLoad(
  300.     LPVOID Address
  301.     );
  302.  
  303. // hack PRTL_PROCESS_MODULES LazyModuleInformation;
  304.  
  305. BOOL
  306. AddModule(
  307.     LPDEBUG_EVENT DebugEvent
  308.     );
  309.  
  310. BOOL
  311. DeleteModule(
  312.     PMODULE_INFO Module
  313.     );
  314.  
  315. PMODULE_INFO
  316. FindModuleContainingAddress(
  317.     LPVOID Address
  318.     );
  319.  
  320. VOID
  321. SetSymbolSearchPath( );
  322.  
  323. LONG
  324. AddKernelDrivers( );
  325.  
  326.  
  327. #ifdef _ALPHA_
  328. #define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
  329. #define BPSKIP 4
  330. #endif // _ALPHA_
  331.  
  332. #ifdef _MIPS_
  333. #define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
  334. #define BPSKIP 4
  335. #endif // _MIPS_
  336.  
  337. #ifdef _PPC_
  338. #define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Iar)
  339. #define BPSKIP 4
  340. #endif // _PPC_
  341.  
  342. #ifdef _X86_
  343. #define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Eip)
  344. #define BPSKIP 1
  345. #endif // _X86_
  346.  
  347.  
  348. #endif // defined( RC_INVOKED )
  349.