PFMONP.H

/*++ 

Copyright 1995 - 1998 Microsoft Corporation

Module Name:

instaler.h

Abstract:

Main include file for the INSTALER application.

Author:

Steve Wood (stevewo) 09-Aug-1994

Revision History:

--*/

#ifdef RC_INVOKED
#include <windows.h>
#else

#include <windows.h>
#include <imagehlp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "errormsg.h"


typedef struct _PSAPI_WS_WATCH_INFORMATION {
LPVOID FaultingPc;
LPVOID FaultingVa;
} PSAPI_WS_WATCH_INFORMATION, *PPSAPI_WS_WATCH_INFORMATION;

BOOL
WINAPI
GetWsChanges(
HANDLE hProcess,
PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
DWORD cb
);


BOOL
WINAPI
InitializeProcessForWsWatch(
HANDLE hProcess
);



// Doubly-linked list manipulation routines. Implemented as macros
// but logically these are procedures.
//

//
// VOID
// InitializeListHead(
// PLIST_ENTRY ListHead
// );
//

#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))

//
// BOOL
// IsListEmpty(
// PLIST_ENTRY ListHead
// );
//

#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))

//
// PLIST_ENTRY
// RemoveHeadList(
// PLIST_ENTRY ListHead
// );
//

#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}

//
// PLIST_ENTRY
// RemoveTailList(
// PLIST_ENTRY ListHead
// );
//

#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}

//
// VOID
// RemoveEntryList(
// PLIST_ENTRY Entry
// );
//

#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}

//
// VOID
// InsertTailList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//

#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}

//
// VOID
// InsertHeadList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//

#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}

//
// Data structures and entry points in init.c
//

DWORD TotalSoftFaults;
DWORD TotalHardFaults;
DWORD TotalCodeFaults;
DWORD TotalDataFaults;
DWORD TotalKernelFaults;
DWORD TotalUserFaults;

BOOL fCodeOnly;
BOOL fHardOnly;

VOID
ProcessPfMonData(
VOID
);

//
// Data structures and entry points in init.c
//

BOOL fVerbose;
BOOL fLogOnly;
BOOL fKernelOnly; //flag for displaying kernel pagefaults
BOOL fKernel; //flag for displaying kernel pagefaults
BOOL fDatabase; //flag for outputing information in a
//tab-delimited database format
FILE *LogFile;

BOOL
InitializePfmon(
VOID
);

BOOL
LoadApplicationForDebug(
LPSTR CommandLine
);

BOOL
AttachApplicationForDebug(
DWORD Pid
);

HANDLE hProcess;

//
// Data structures and entry points in error.c
//

HANDLE PfmonModuleHandle;

VOID
CDECL
DeclareError(
UINT ErrorCode,
UINT SupplementalErrorCode,
...
);

//
// Data structures and entry points in DEBUG.C
//

VOID
DebugEventLoop( VOID );

//
// Data structures and entry points in process.c
//

typedef struct _PROCESS_INFO {
LIST_ENTRY Entry;
LIST_ENTRY ThreadListHead;
DWORD Id;
HANDLE Handle;
} PROCESS_INFO, *PPROCESS_INFO;

typedef struct _THREAD_INFO {
LIST_ENTRY Entry;
DWORD Id;
HANDLE Handle;
PVOID StartAddress;
} THREAD_INFO, *PTHREAD_INFO;

LIST_ENTRY ProcessListHead;

BOOL
AddProcess(
LPDEBUG_EVENT DebugEvent,
PPROCESS_INFO *ReturnedProcess
);

BOOL
DeleteProcess(
PPROCESS_INFO Process
);

BOOL
AddThread(
LPDEBUG_EVENT DebugEvent,
PPROCESS_INFO Process,
PTHREAD_INFO *ReturnedThread
);

BOOL
DeleteThread(
PPROCESS_INFO Process,
PTHREAD_INFO Thread
);

PPROCESS_INFO
FindProcessById(
ULONG Id
);

BOOL
FindProcessAndThreadForEvent(
LPDEBUG_EVENT DebugEvent,
PPROCESS_INFO *ReturnedProcess,
PTHREAD_INFO *ReturnedThread
);
//
// Data structures and entry points in module.c
//

typedef struct _MODULE_INFO {
LIST_ENTRY Entry;
LPVOID BaseAddress;
DWORD VirtualSize;
DWORD NumberFaultedSoftVas;
DWORD NumberFaultedHardVas;
DWORD NumberCausedFaults;
HANDLE Handle;
PIMAGE_DEBUG_INFORMATION DebugInfo;
} MODULE_INFO, *PMODULE_INFO;

LPSTR SymbolSearchPath;
LIST_ENTRY ModuleListHead;

BOOL
LazyLoad(
LPVOID Address
);

// hack PRTL_PROCESS_MODULES LazyModuleInformation;

BOOL
AddModule(
LPDEBUG_EVENT DebugEvent
);

BOOL
DeleteModule(
PMODULE_INFO Module
);

PMODULE_INFO
FindModuleContainingAddress(
LPVOID Address
);

VOID
SetSymbolSearchPath( );

LONG
AddKernelDrivers( );


#ifdef _ALPHA_
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
#define BPSKIP 4
#endif // _ALPHA_

#ifdef _MIPS_
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Fir)
#define BPSKIP 4
#endif // _MIPS_

#ifdef _PPC_
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Iar)
#define BPSKIP 4
#endif // _PPC_

#ifdef _X86_
#define CONTEXT_TO_PROGRAM_COUNTER(Context) ((Context)->Eip)
#define BPSKIP 1
#endif // _X86_


#endif // defined( RC_INVOKED )