Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

432 lines
11 KiB

/**** EMDM.HMD - Common structures for Win32/NT EM and DM ****
* *
* *
* Copyright <C> 1990, Microsoft Corp *
* *
* Created: November 17, 1990 by David W. Gray *
* *
* Purpose: *
* *
* This file defines the types, enums, and constants that are common *
* for all execution models, both debugger and debuggee end. *
* *
***************************************************************************/
#ifndef _EMDM
#define _EMDM
//#if !defined(DOS32) || (defined(DOS32) && defined(DOS32DM))
#include "cvinfo.h"
//#endif
// Shared message structs for od/em/dm
#include "odmsg.h"
//
// This is included to define a NONVOLATILE_CONTEXT_POINTERS structure
// of the appropriate size. The goal is to keep any machine-specific
// reference out of emdp.c here, but we need to know how much data to
// transfer to the thread context on the different architectures.
//
#include "ctxptrs.h"
#define MAXCACHE 16
#define CACHESIZE 0x100
typedef unsigned MTE;
#ifdef TARGET32
#define MAXBIGSEGS 3
#endif
typedef enum {
dmfRemoteDied = -1, /* debugger quit */
dmfCommError = -2, /* transport layer error */
dmfNull = 0,
dmfBreakpoint,
dmfGetExceptionState,
dmfSetExceptionState,
dmfReadMem,
dmfReadReg,
dmfReadFrameReg,
dmfWriteMem,
dmfWriteReg,
dmfWriteFrameReg,
dmfGetFP,
dmfSetFP,
dmfThreadStatus,
dmfProcessStatus,
dmfGo,
dmfTerm,
dmfStop,
dmfFreeze,
dmfResume,
dmfSingleStep,
dmfRangeStep,
//dmfReturnStep,
dmfSelect,
dmfConnect,
dmfInit,
dmfUnInit,
dmfProgLoad,
dmfProgFree,
dmfInit32SegValues,
dmfCreatePid,
dmfDestroyPid,
dmfSelLim,
dmfSetMulti,
dmfClearMulti,
dmfDebugger,
dmfSync,
dmfIOCTL,
dmfSendChar,
//dmfGoToReturn,
dmfSetupExecute,
dmfStartExecute,
dmfCleanUpExecute,
dmfDebugActive,
dmfSetPath,
dmfQueryTlsBase,
dmfPollForDebugEvents, // WIN32S only
dmfPollMessageLoop, // WIN32S only
dmfGetPrompt,
dmfQuerySelector,
dmfVirtualQuery,
dmfOmapCheck, // Lego
dmfOmapToSrc, // Lego
dmfOmapFromSrc, // Lego
dmfReadRegEx,
dmfWriteRegEx,
dmfGetDmInfo,
dmfRemoteQuit,
dmfGetSections,
dmfLast
} _DMF;
typedef LONG DMF;
typedef struct _DM_MSG {
union {
XOSD_ xosdRet;
DWORDLONG Alignment;
};
char rgb[1];
} DM_MSG, *LPDM_MSG;
#define iflgMax 12
#pragma pack(4)
typedef struct _RST {
BOOL fStepOver;
BOOL fAllThreads;
BOOL fInitialBP;
#ifdef TARGET32
CV_uoff32_t offStart;
CV_uoff32_t offEnd;
CV_uoff32_t offPC;
#else
ADDR addrStart;
ADDR addrEnd;
ADDR addrCSIP;
#endif
} RST; // Range STep Packet
typedef struct _SETPTH {
BOOL Set;
char Path[1];
} SETPTH;
#pragma pack()
//
// DM Misc info structure.
//
// Some of these correspond to the debug metrics exposed by OSDebug.
// These cover the differences between user and kernel mode, Win32,
// Win32s and Win32c, maybe Cairo, whatever other DMs might be handled
// by the Win32 EM.
//
typedef struct _PROCESSOR {
MPT Type;
DWORD Level;
END Endian;
} PROCESSOR, FAR * LPPROCESSOR;
typedef struct _DMINFO {
DWORD fAsync:1; // read/write mem and regs while running?
DWORD fHasThreads:1; //
DWORD fReturnStep:1; // step out of function?
DWORD fRemote:1; // target is not on debugger host
DWORD fAsyncStop:1; // OSDAsyncStop supported
DWORD fAlwaysFlat:1; // Addresses are always flat
DWORD fHasReload:1; // !reload support
DWORD cbSpecialRegs; // size of private regs struct for dmfGetRegsEx
WORD MajorVersion; //
WORD MinorVersion; //
BPTS Breakpoints; // OSDebug breakpoints supported
PROCESSOR Processor;
} DMINFO;
typedef DMINFO FAR * LPDMINFO;
typedef RST *PRST;
typedef RST FAR *LPRST;
typedef struct _GOP {
USHORT fBpt;
USHORT fAllThreads;
ADDR addr;
} GOP; // Go until this address
typedef GOP *PGOP;
typedef GOP FAR *LPGOP;
// DO NOT TAKE THIS OUT - *#&*@(#@*(& !!!!!!!!!!!!!!!
#ifdef TARGET32
#define BP_INSTR 0
typedef struct _SBP {
HPID id;
BOOL fAddr;
ADDR addr;
DWORD Size;
DWORD BpType;
} SBP;
typedef SBP FAR* LPSBP;
#endif
typedef struct _WPR {
BPR bpr;
SEGMENT segWP;
UOFFSET offWP;
WORD ireg;
} WPR; // WatchPoint Return
typedef WPR FAR *LPWPR;
typedef struct _EHP {
DWORD iException;
BOOL fHandle;
} EHP; // Exception Handled Packet
typedef EHP FAR *LPEHP;
typedef struct _TTR {
BPR bpr;
ULONG ulExitCode;
} TTR; // Thread (or Process) Term Return;
typedef TTR FAR *LPTTR;
typedef struct _RSR {
WORD segCS;
UOFFSET offIP;
WORD segSS;
UOFFSET offBP;
WORD segCSNext;
UOFFSET offIPNext;
} RSR; // Range Step Return
typedef RSR FAR *LPRSR;
typedef struct _OBJD {
DWORD offset;
DWORD cb;
WORD wSel;
WORD wPad;
} OBJD, FAR * LPOBJD;
typedef struct _MODULELOAD {
WORD mte;
WORD pad0;
LPVOID lpBaseOfDll;
DWORD dwSizeOfDll;
SEGMENT StartingSegment;
BOOL fRealMode;
BOOL fFlatMode;
BOOL fOffset32;
SEGMENT CSSel;
SEGMENT DSSel;
LONG cobj;
OBJD rgobjd[];
} MODULELOAD;
typedef MODULELOAD FAR *LPMODULELOAD;
typedef struct _RWP {
DWORD cb;
ADDR addr;
BYTE rgb[];
} RWP; // Read Write Packet
typedef RWP *PRWP;
typedef RWP FAR *LPRWP;
typedef struct _NPP {
PID pid;
BOOL fReallyNew;
} NPP; // New Process Packet, used with dbcNewProc. See od.h for description
// of fReallyNew
typedef NPP FAR * LPNPP;
typedef struct _WPP {
ADDR addr;
WORD cb;
} WPP; // Watch Point Packet
typedef WPP FAR *LPWPP;
typedef struct _SLI {
WORD wSelector;
WORD wSegNo;
WORD mte;
} SLI, FAR * LPSLI;
// Exception command packet
typedef struct _EXCMD {
EXCEPTION_CONTROL exc;
EXCEPTION_DESCRIPTION exd;
} EXCMD;
typedef EXCMD FAR * LPEXCMD;
// The DBCEs always come back in an RTP structure, which has additional
// info. The comments on the DBCEs below refer to the other fields of
// the RTP structure.
enum {
dbceAssignPID = dbcMax, // Tell the EM what PID is associated with
// a given HPID. At offset 0 of rtp.rgbVar[]
// is the PID.
dbceLoadBigSegTbl, // ??
dbceCheckBpt, // Find out if EM wants us to single-step
// over a specified breakpoint. Upon return,
// rgbVar[0] is fStop to stop at this
// breakpoint; if fStop is FALSE, then
// rgbVar[1] is the byte with which to
// overwrite the INT 3.
dbceFinishedLoad, // Tell the EM we're done with a dmfProgLoad.
// rgbVar is empty.
dbceInstructionLen, // Ask the em how long the instruction is.
// rgbVar contains the cs:ip
dbceSegLoad, // WOW just loaded a segment
dbceSegMove, // Moved a segment
dbceModFree16, // Unload of a 16-bit DLL
dbceModFree32, // Unload of a 32-bit DLL
dbceGetOffsetFromSymbol, // - Call the expression evaluator
// wParam = nothing
// lParam = pointer to the expression
dbceGetSymbolFromOffset, // - Call the expression evaluator
// wParam = nothing
// lParam = pointer to the expression
dbceEnableCache, // - Enable/Disable the em's cache
// wParam = nothing
// lParam = TRUE/FALSE
dbceMax
} _DBCE;
typedef LONG DBCE;
#pragma pack(1)
// it is important that the rgbVar fields be aligned on a DWORD boundary
typedef struct _DBB {
union {
DMF dmf;
DWORD dw0;
};
HPID hpid;
HTID htid;
BYTE rgbVar[ ];
} DBB;
typedef DBB *PDBB;
typedef DBB FAR *LPDBB;
typedef struct _RTP {
union {
DBC dbc; // a DBC or a DBCE
DWORD dw0;
};
HPID hpid;
HTID htid;
union {
WORD cb; // the length of rgbVar
DWORD dw1;
};
BYTE rgbVar[ ]; // additional information - see the
// definitions of the DBCE and DBC codes
} RTP;
#pragma pack()
typedef RTP *PRTP;
typedef RTP FAR *LPRTP;
typedef struct _RTRNSTP {
EXOP exop;
ADDR addrRA; // Address to return to
ADDR addrBase; // Address of what SP should be when returning
} RTRNSTP; // ReTuRN STeP packet
typedef RTRNSTP FAR *LPRTRNSTP;
#define lpregDbb(dbb) ( (LPREG) &dbb )
#define lpfprDbb(dbb) ( (LPFPR) &dbb )
#define lszDbb(dbb) ( (LSZ) &dbb )
#define addrDbb(dbb) (*( (LPADDR) &dbb ))
#define stpDbb(dbb) (*( (LPSTP) &dbb ))
#define rstDbb(dbb) (*( (LPRST) &dbb ))
#define gopDbb(dbb) (*( (LPGOP) &dbb ))
#define tstDbb(dbb) (*( (LPTST) &dbb ))
#define pstDbb(dbb) (*( (LPF) &dbb ))
#define rwpDbb(dbb) (*( (LPRWP) &dbb ))
#define fDbb(dbb) (*( (LPF) &dbb ))
/****************************************************************************
* *
* Packets returned from the debuggee execution model to the debugger *
* execution model. *
* *
****************************************************************************/
#ifdef DOS32DM
#undef BOOL
#endif
typedef struct _FRAME_INFO {
CONTEXT frameRegs;
KNONVOLATILE_CONTEXT_POINTERS frameRegPtrs;
} FRAME_INFO, * PFRAME_INFO;
#ifdef SMARTALIAS
#define GetInvalid(w,i) ((w>>i)&1)
#define SetInvalid(w,i) w=((1<<i)|w)
#endif
#endif // _EMDM