119 lines
4 KiB
C
119 lines
4 KiB
C
|
|
/*
|
|
* deb.h - Debug API/events include file
|
|
*
|
|
* 4/25/93 mikem
|
|
*/
|
|
|
|
#define INVALID_ADDRESS ((PVOID)0xfffffbad)
|
|
|
|
#ifdef DEBUG
|
|
|
|
#define DER_SIGNATURE_VALUE 0x20524544 // "DER "
|
|
#define DEE_SIGNATURE_VALUE 0x20454544 // "DEE "
|
|
|
|
#define debAssertCreateDER(pder) {(pder)->der_signature = DER_SIGNATURE_VALUE;}
|
|
#define debAssertCreateDEE(pdee) {(pdee)->dee_signature = DEE_SIGNATURE_VALUE;}
|
|
#define debAssertDestroyDER(pder) {(pder)->der_signature = 0x44414544;}
|
|
#define debAssertDestroyDEE(pdee) {(pdee)->dee_signature = 0x44414544;}
|
|
#define debAssertSignature(type) ULONG type##_signature;
|
|
#define debAssertDER(pder) Assert((pder)->der_signature==DER_SIGNATURE_VALUE)
|
|
#define debAssertDEE(pdee) Assert((pdee)->dee_signature==DEE_SIGNATURE_VALUE)
|
|
|
|
#else
|
|
|
|
#define debAssertCreateDER(pder)
|
|
#define debAssertCreateDEE(pdee)
|
|
#define debAssertDestroyDER(pder)
|
|
#define debAssertDestroyDEE(pdee)
|
|
#define debAssertSignature(type)
|
|
#define debAssertDER(pder)
|
|
#define debAssertDEE(pdee)
|
|
|
|
#endif
|
|
|
|
/* Debugger data block. Pointed to by "tdb_pderDebugger" in the tdb. */
|
|
|
|
typedef struct _der {
|
|
struct _dee *der_pdeeHead; // list of debuggee data blocks - MUST BE FIRST
|
|
PTDB der_ptdbDebugger; // the debugger's thread data block
|
|
PPDB der_ppdbDebugger; // the debugger's process data block
|
|
CRST der_crst; // critical section for protecting DER
|
|
PEVT der_pevtDebugger; // debugger's wait event
|
|
PEVT der_pevtDebuggee; // debuggee's wait event
|
|
DEBUG_EVENT der_de; // debug event block for this debugger
|
|
BOOL der_fContinueStatus; // continue status for exception events
|
|
CONTEXT der_context; // context record while in an exception
|
|
debAssertSignature(der)
|
|
} DER;
|
|
|
|
typedef DER *PDER;
|
|
|
|
/* Debuggee data block. Pointed to by "pdb_pdeeDebuggee" in the pdb. */
|
|
|
|
typedef struct _dee {
|
|
struct _dee *dee_pdeeNext; // next in list, 0 if end - MUST BE FIRST
|
|
PPDB dee_ppdbDebuggee; // pointer to debuggee's process data block
|
|
PDER dee_pderDebugger; // pointer to debugger's data block
|
|
HANDLE dee_ihteProcess; // debuggee process handle for debugger
|
|
DWORD dee_cThreads; // count of threads in process
|
|
HANDLE dee_hheapShared; // shared-arena heap for storing thunks
|
|
debAssertSignature(dee)
|
|
} DEE;
|
|
|
|
typedef DEE *PDEE;
|
|
|
|
/* Debug IAT thunk template */
|
|
|
|
typedef struct _dit {
|
|
BYTE dit_pushop; // 0x68
|
|
DWORD dit_oldiat; // old iat address
|
|
BYTE dit_jmpop; // 0xe9
|
|
DWORD dit_relcom; // relative offset to DEBCommonIATThunk
|
|
} DIT;
|
|
|
|
typedef DIT *PDIT;
|
|
|
|
/* Shared DLL debug entry record */
|
|
|
|
typedef struct _DEBDLLCONTEXT {
|
|
struct _DEBDLLCONTEXT *NextActive; // null terminated active list
|
|
struct _DEBDLLCONTEXT *NextFree; // null terminated free list
|
|
struct { // exception registration record
|
|
PVOID Next;
|
|
PVOID Handler;
|
|
} ExRegRec;
|
|
CONTEXT Context; // context record
|
|
} DEBDLLCONTEXT, *PDEBDLLCONTEXT;
|
|
|
|
/* Shared DLL debug entry record sentinel */
|
|
|
|
typedef struct _DEBDLLCONTEXTSENTINEL {
|
|
struct _DEBDLLCONTEXT *NextActive; // null terminated active list
|
|
struct _DEBDLLCONTEXT *NextFree; // null terminated free list
|
|
} DEBDLLCONTEXTSENTINEL, *PDEBDLLCONTEXTSENTINEL;
|
|
|
|
/* Number of initial DEBDLLCONTEXT records per thread */
|
|
|
|
#define N_INITIAL_DEBDLLRECS 1
|
|
|
|
VOID __cdecl DEBCommonIATThunk();
|
|
VOID __cdecl DEBCommonIATThunkUnwindHandler();
|
|
|
|
/* Prototypes for internal debug api functions */
|
|
|
|
BOOL KERNENTRY DEBCreateProcess(DWORD, DWORD, DWORD, PPDB, PTDB);
|
|
VOID KERNENTRY DEBExitProcess(PPDB);
|
|
BOOL KERNENTRY DEBCreateThread(PTDB, DWORD);
|
|
VOID KERNENTRY DEBExitThread(PTDB);
|
|
VOID KERNENTRY DEBCreateProcessEvent(PPDB, PTDB, BOOL);
|
|
VOID KERNENTRY DEBCreateThreadEvent(PTDB, PVOID);
|
|
VOID KERNENTRY DEBExitThreadOrProcessEvent();
|
|
BOOL KERNENTRY DEBExceptionEvent(DWORD, ULONG, PEXCEPTION_RECORD, PCONTEXT);
|
|
VOID KERNENTRY DEBAttachProcessModules(PTDB, BOOL);
|
|
VOID KERNENTRY DEBLoadDLLEvent(PTDB, PVOID, PVOID);
|
|
VOID KERNENTRY DEBUnloadDLLEvent(PVOID);
|
|
VOID KERNENTRY DEBRipEvent(DWORD, DWORD);
|
|
BOOL KERNENTRY DEBMakePrivate(PVOID, ULONG);
|
|
PDIT KERNENTRY DEBCreateDIT(HANDLE, DWORD);
|