summaryrefslogtreecommitdiffstats
path: root/private/windbg/osdebug/include
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/windbg/osdebug/include
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/windbg/osdebug/include')
-rw-r--r--private/windbg/osdebug/include/bpprotos.h91
-rw-r--r--private/windbg/osdebug/include/bptypes.h316
-rw-r--r--private/windbg/osdebug/include/cp.h51
-rw-r--r--private/windbg/osdebug/include/ctxptrs.h97
-rw-r--r--private/windbg/osdebug/include/cvexefmt.h364
-rw-r--r--private/windbg/osdebug/include/cvinfo.h3221
-rw-r--r--private/windbg/osdebug/include/cvtypes.h295
-rw-r--r--private/windbg/osdebug/include/cvtypes.hxx264
-rw-r--r--private/windbg/osdebug/include/dbapiver.h6
-rw-r--r--private/windbg/osdebug/include/dbgver.h135
-rw-r--r--private/windbg/osdebug/include/eeapi.h395
-rw-r--r--private/windbg/osdebug/include/emdm.h432
-rw-r--r--private/windbg/osdebug/include/heap.h16
-rw-r--r--private/windbg/osdebug/include/ll.h9
-rw-r--r--private/windbg/osdebug/include/llproto.h70
-rw-r--r--private/windbg/osdebug/include/lltypes.h22
-rw-r--r--private/windbg/osdebug/include/od.h1160
-rw-r--r--private/windbg/osdebug/include/odmsg.h244
-rw-r--r--private/windbg/osdebug/include/osdem.h190
-rw-r--r--private/windbg/osdebug/include/shapi.h386
-rw-r--r--private/windbg/osdebug/include/shapi.hxx411
-rw-r--r--private/windbg/osdebug/include/types.h257
-rw-r--r--private/windbg/osdebug/include/vcver.h6
-rw-r--r--private/windbg/osdebug/include/version.h5
24 files changed, 8443 insertions, 0 deletions
diff --git a/private/windbg/osdebug/include/bpprotos.h b/private/windbg/osdebug/include/bpprotos.h
new file mode 100644
index 000000000..532d6c97f
--- /dev/null
+++ b/private/windbg/osdebug/include/bpprotos.h
@@ -0,0 +1,91 @@
+/***
+ *
+ * Breakpoint Handler API
+ *
+ */
+
+extern BPSTATUS PASCAL BPInit( void );
+extern BPSTATUS PASCAL BPTerm( void );
+
+extern BPSTATUS PASCAL BPParse(HBPT FAR * pHbpt, char FAR * szBpt, char FAR * szMod, char FAR * szFile, HPID hPid);
+extern BPSTATUS PASCAL BPBindHbpt( HBPT, CXF * );
+
+extern BPSTATUS PASCAL BPAddToList( HBPT, int );
+extern BPSTATUS PASCAL BPChange( HBPT, int );
+extern BPSTATUS PASCAL BPDelete( HBPT );
+extern BPSTATUS PASCAL BPDeleteAll( VOID );
+
+extern BPSTATUS PASCAL BPGetFinalHbpt( HBPT, HBPT FAR *);
+extern BPSTATUS PASCAL BPNextHbpt( HBPT FAR *, UINT);
+extern BPSTATUS PASCAL BPFormatHbpt( HBPT, char FAR *, UINT, UINT);
+
+extern BPSTATUS PASCAL BPCommit(void);
+extern BPSTATUS PASCAL BPUnCommit(void);
+
+extern BPSTATUS PASCAL BPHighlightSourceFile( char *fname );
+
+extern BPSTATUS PASCAL BPSetHpid(HBPT, HPID);
+extern BPSTATUS PASCAL BPGetHpid(HBPT, HPID *);
+extern BPSTATUS PASCAL BPGetIpid(HBPT, UINT *);
+extern BPSTATUS PASCAL BPGetHtid(HBPT, HTID *);
+
+extern BPSTATUS PASCAL BPSetTmp(LPADDR, HPID, HTID, HBPT FAR *);
+extern BPSTATUS PASCAL BPClearAllTmp(HPID, HTID);
+
+extern BPSTATUS PASCAL BPDisable(HBPT);
+extern BPSTATUS PASCAL BPEnable(HBPT);
+
+extern BPSTATUS PASCAL BPHbptFromI(HBPT FAR *, UINT);
+
+extern BPSTATUS PASCAL BPHbptFromFileLine(char FAR *, UINT, HBPT FAR *);
+extern BPSTATUS PASCAL BPHbptFromAddr(ADDR FAR *, HBPT FAR *);
+
+extern BPSTATUS PASCAL BPAddrFromHbpt(HBPT, ADDR FAR *);
+extern BPSTATUS PASCAL BPIFromHbpt(UINT FAR *, HBPT);
+extern BPSTATUS PASCAL BPFreeHbpt(HBPT);
+
+extern BPSTATUS PASCAL BPCheckHbpt(CXF, LPFNBPCALLBACK, HPID, HTID, DWORD);
+
+extern BPSTATUS PASCAL BPQueryBPTypeOfHbpt(HBPT, int FAR *);
+extern BPSTATUS PASCAL BPQueryCmdOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryLocationOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryExprOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryMemoryOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryMemorySizeOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryPassCntOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryPassLeftOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryProcessOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryThreadOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPQueryMessageOfHbpt(HBPT, char FAR *, UINT);
+extern BPSTATUS PASCAL BPUpdateMemory( ULONG );
+extern BPSTATUS PASCAL BPQueryHighlightLineOfHbpt( HBPT, UINT *);
+
+extern EESTATUS PASCAL BPADDRFromTM (PHTM, unsigned short FAR *, PADDR);
+
+extern LPSTR PASCAL BPShortenContext(LPSTR lpSrc, LPSTR lpDest);
+
+extern HMOD PASCAL BPFileNameToMod( char * FileName );
+
+/*
+** THe following are the set of callback routines used by the
+** breakpoint engine
+*/
+
+#if 0
+extern BOOL PASCAL BPQuerySrcWinFls(FLS *);
+#endif
+
+extern BOOL PASCAL BPCBBindHbpt( HBPT );
+extern BOOL PASCAL BPCBSetHighlight(char FAR *, UINT, BOOL, BOOL, WORD);
+extern BOOL PASCAL BPCBSetUHighlight(char FAR *, UINT, BOOL, BOOL);
+extern BOOL PASCAL BPCBGetSourceFromAddr(PADDR, char FAR *, int, int FAR *);
+
+extern BOOL PASCAL BPIsMarkedForDeletion( HBPT );
+extern BOOL PASCAL BPIsDisabled( HBPT );
+extern BOOL PASCAL BPIsInstantiated( HBPT );
+extern BOOL PASCAL BPUninstantiate( HBPT );
+extern BOOL PASCAL BPIsQuiet( HBPT );
+extern VOID PASCAL BPSetQuiet( HBPT );
+extern VOID PASCAL BPSegLoad( ULONG );
+extern BOOL PASCAL BPSymbolLoading( BOOL );
+extern BOOL PASCAL BPSymbolsMayBeAvailable( HBPT );
diff --git a/private/windbg/osdebug/include/bptypes.h b/private/windbg/osdebug/include/bptypes.h
new file mode 100644
index 000000000..57f1fbd89
--- /dev/null
+++ b/private/windbg/osdebug/include/bptypes.h
@@ -0,0 +1,316 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ Bptypes.h
+
+Abstract:
+
+Author:
+
+ David J. Gilman (davegi) 04-May-1992
+
+Environment:
+
+ Win32, User Mode
+
+--*/
+
+#if ! defined( _BPTYPES_ )
+#define _BPTYPES_
+
+#include "eeapi.h"
+
+// Just to hide things
+#define HBPI HLLE
+#define hbpiNull hlleNull
+
+#define HBPT HLLE
+#define hbptNull hlleNull
+
+typedef struct cpb FAR * _LPCBP;
+
+#ifdef LATER
+// Types of breakpoints
+#define BPCONTINUE 0
+#define BPBREAKPT 1
+#define BPTMP 2
+#define BPINTERNAL 3
+#define BPSKIPCALL 4
+#define BPDEADCHILD 5
+#define BPABORT 6
+#define BPUSERINT3 7
+#define BPDEADTHREAD 8
+#define BPNMI 9
+
+
+#define BRKPTOPCODE 0xCC
+#define DPLBITS ((unsigned int) 0x3)
+
+#if DOS5
+#define SKIPBPUIFLAGS 7
+#else
+#define SKIPBPUIFLAGS 3
+#endif // dos5
+
+#endif // LATER
+
+#if 0
+typedef union bpf {
+ UINT flags;
+ struct {
+ UINT fBpCode : 1; // Is there a Code bp
+ UINT fBpData : 1; // Is there a watch/trace point
+ UINT fActive : 1; // Breakpoint is active
+ UINT fBPLoaded : 1; // is BRKPTOPCODE in the code
+ UINT fVirtual : 1; // This is a virtual bp
+ UINT fAmbig : 1; // This BP came from an ambiguous expression
+ UINT fPass : 1; // if a passcount was specified
+ UINT fUser : 1; // for use WITHIN a proc, up to you how to use
+ UINT fDlgActive : 1; // Dialog hold are for orignal fActive state
+ UINT fDlgMarkDel : 1; // This breakpoint has been marked for deletion
+ UINT fDlgMarkAdd : 1; // This breakpoint has been marked for addition
+ UINT BpType : 3; // The type of breakpoint
+#if defined(WINDOWS3) || defined(DOS5)
+ UINT BpSubType : 2;
+#endif
+ } f;
+} BPF;
+
+#endif
+
+typedef union dpf {
+ UINT flags;
+ struct {
+ UINT fEmulate : 1; // If emulation is required
+ UINT fFuncBpSet : 1; // if a function breakpoint is set
+ UINT fTpFuncHit : 1; // When we hit a breakpoint set by tracepoint
+ UINT fFuncLoad : 1; // We must load the breakpoint value on function entry
+ UINT fEvalExpr : 1; // Is the expr not an lvalue
+ UINT fDataRange : 1; // if a datarange was specifed
+ UINT fBpRel : 1; // if a code range was specified
+ UINT fContext : 1; // if context checking is required
+ UINT fReg : 1; // if it is in a register
+ UINT fHighReg : 1; // if in the highbyte of reg
+ UINT fUser : 1; // for use WITHIN a proc, up to you how to use
+ UINT fHdwBrk : 1; // Is this a hardware bp
+ UINT HdwReg : 2; // The hardware reg used
+ } f;
+} DPF;
+typedef DPF FAR * PDPF;
+#ifdef LATER
+
+#if defined(WINDOWS3) || defined(DOS5)
+struct cbp; // for forward reference
+#endif
+#endif // LATER
+
+typedef struct dpi {
+ union {
+ struct {
+ ADDR DataAddr; // Data address to watch
+ } d;
+ struct {
+ ADDR BlkAddr; // the start address of the block
+ UOFFSET oEnd; // The end offset of the function
+ short oBp; // ofset from the bp
+ FRAME Frame; // the frame
+ } bp;
+ } u;
+ char * pValue; // pointer to the initial value
+ short iReg; // if in register, the reg index
+ USHORT cData; // Number of data items to watch
+ USHORT cbData; // Number of bytes in data item
+ HTM hTM; // a TM handle for the data breakpoint
+} DPI;
+typedef DPI * PDPI;
+
+
+#if 0
+
+typedef struct bpi {
+ BPF bpf; // flags
+ DPF dpf; // the data bp flags
+ int fLang; // the language type
+ unsigned char OpCode; // The orignal opcode
+ ADDR CodeAddr; // Code address of breakpoint
+ DPI * pdpi; // pointer to the DataBreakpoint
+/*
+ * This defines a function callback mechanism which can be used to
+ * generalize the breakpoint facility.
+ * The messages and responses are defined earlier in this file.
+ */
+ int (FAR *lpfnEval)(_LPCBP);// A breakpoint callback function
+ long lData; // User data
+ USHORT cPass; // Initial Pass count
+ USHORT cPassCur; // Current Pass count
+ char * pCmd; // Offset of the command to Execute
+ USHORT hprc; // The process this bp is associated with
+ USHORT hthd; // The tread to break at
+ // NULL breaks on all threads
+// struct bpi * pbpiNext;
+// struct bpi * pbpiBack;
+} BPI;
+typedef BPI * PBPI;
+typedef BPI FAR * LPBPI;
+
+#endif // 0
+
+#ifdef LATER
+
+#if defined(WINDOWS3) || defined(DOS5)
+/*
+ * This defines a function callback mechanism which can be used to
+ * generalize the breakpoint facility.
+ * The messages and responses are defined earlier in this file.
+ */
+typedef struct cbp {
+ unsigned wMsg; // A message giving the reason for the call
+ unsigned wInstance; // BPBrkExec call count
+ char FAR * lpch; // A buffer for return info
+ HBPI hbpi; // Points to the parent bpi
+ } cbp;
+#endif
+
+#endif // LATER
+
+typedef struct PBPD {
+ USHORT hthd;
+ USHORT BPType;
+ PCXF pCXF;
+ USHORT BPSegType;
+ char FAR * szCmd;
+ unsigned int fAmbig;
+ union {
+ ADDR Addr;
+ struct {
+ unsigned int cBPMax;
+ TML TMLT;
+ } u;
+ } u;
+ PDPI pDPI;
+ DPF DPF;
+ USHORT cPass;
+ char FAR * szOptCmd;
+ int iErr;
+ char SubType;
+ int (FAR *lpfnEval)(_LPCBP);// A possible callback function
+ long lData; // User data
+} PBP;
+typedef PBP FAR * PPBP;
+
+#ifdef LATER
+typedef struct sfi {
+ int fLang;
+ ushort fEnable;
+ ushort hthd;
+} sfi;
+
+// user global variable YUK! this should not be visable to the world!
+// extern PBPI pbpiFirst;
+extern int G_BPfEmulate;
+
+extern HLLI llbpi;
+#endif // LATER
+
+extern UINT radix;
+extern char fCaseSensitive;
+
+
+#define BPCODEADDR 1001
+#define BPDATAADDR 1002
+#define BPLENGTH 1003
+#define BPPASSCNT 1004
+#define BADBKPTCMD 1005
+#define WMSGALL 1006
+#define WMSGTYPE 1007
+#define WMSGCLASS 1008
+#define WMSGBPCLASS 1009
+#define WMSGBPTYPE 1010
+#define WMSGDPCLASS 1011
+#define WMSGDPTYPE 1012
+#define WMSGBPALL 1013
+#define WMSGDPALL 1014
+#define BPSTCALLBACK 1015
+#define NOCODE 1019
+#define NOTLVALUE 1020
+
+
+/**********************************************************************/
+
+#define MHOmfUnLock(a)
+
+
+#define bptNext 1
+#define bptPrevious 2
+#define bptFirst 3
+#define bptLast 4
+
+typedef enum {
+ BPNOERROR = 0, // No Error
+ BPBadDataSize = 1,
+ BPBadPassCount = 2,
+ BPBadCmdString = 3,
+ BPBadOption = 4,
+ BPBadAddrExpr = 5,
+ BPBadContextOp = 6,
+ BPOOMemory = 7,
+ BPError = 8,
+ BPBadBPHandle = 9,
+ BPNoMatch = 10,
+ BPAmbigous = 11,
+ BPNoBreakpoint = 12,
+ BPTmpBreakpoint = 13,
+ BPPassBreakpoint = 14,
+ BPBadExpression = 15,
+ BPOutOfSpace = 16,
+ BPBadThread = 17,
+ BPBadProcess = 18,
+ BPCancel = 19
+} BPSTATUS;
+
+
+#define BPLOC 0
+#define BPLOCEXPRTRUE 1
+#define BPLOCEXPRCHGD 2
+#define BPEXPRTRUE 3
+#define BPEXPRCHGD 4
+#define BPWNDPROC 5
+#define BPWNDPROCEXPRTRUE 6
+#define BPWNDPROCEXPRCHGD 7
+#define BPWNDPROCMSGRCVD 8
+
+
+/*
+** Define the states that a breakpoint can have.
+*/
+
+typedef enum {
+ bpstateNotSet = 1, /* Breakpoint is parsed */
+ bpstateVirtual = 2, /* Breakpoint is parsed & Addr-ed */
+ bpstateSet = 4, /* Breakpoint is parsed, Addr-ed & Set */
+ bpstateSets = 7, /* */
+ bpstateDisabled = 0, /* Breakpoint is Disabled */
+ bpstateEnabled = 16, /* Breakpoint is Enabled */
+ bpstateDeleted = 32 /* Breakpoint has been deleted */
+} BPSTATE;
+
+
+/*
+** BreakPoint Format Control Flags
+*/
+
+#define BPFCF_ITEM_COUNT 0x01
+#define BPFCF_ADD_DELETE 0x02
+#define BPFCF_WNDPROC 0x04
+#define BPFCF_WRKSPACE 0x08
+
+/*
+**
+*/
+
+typedef VOID (LOADDS PASCAL FAR * LPFNBPCALLBACK)(HBPT, BPSTATUS);
+
+#endif // _BPTYPES_
diff --git a/private/windbg/osdebug/include/cp.h b/private/windbg/osdebug/include/cp.h
new file mode 100644
index 000000000..e02b056f6
--- /dev/null
+++ b/private/windbg/osdebug/include/cp.h
@@ -0,0 +1,51 @@
+
+#define BADTYPECAST 101
+#define NOROOM 102
+#define GEXPRERR 105
+
+
+extern int FAR PASCAL CPCopyToken(LPSTR *lplps, LPSTR lpt);
+extern int FAR PASCAL CPCopyString(LPSTR *lplps, LPSTR lpT, char chEscape, BOOL fQuote);
+extern LPSTR FAR PASCAL CPAdvance(char FAR *, char FAR *);
+extern LPSTR FAR PASCAL CPszToken(char FAR *, char FAR *);
+extern LPSTR FAR PASCAL CPTrim(char FAR *, char);
+extern int FAR PASCAL CPQueryChar(char FAR *, char FAR *);
+extern int FAR PASCAL CPQueryQuoteIndex ( char FAR * szSrc );
+extern int FAR PASCAL CPGetCastNbr(char FAR *, USHORT, int, int, PCXF, char FAR *, char FAR *);
+extern long FAR PASCAL CPGetNbr(char FAR *, int, int, PCXF, char FAR *, int FAR *);
+extern long FAR PASCAL CPGetInt(char FAR *, int FAR *, int FAR *);
+extern int FAR PASCAL CPGetAddress(char FAR *, int FAR *, ADDR FAR *, EERADIX, CXF FAR *, BOOL, BOOL);
+extern LPSTR FAR PASCAL CPSkipWhitespace(char FAR *);
+
+extern int FAR PASCAL
+CPGetFPNbr(
+ LPSTR lpExpr,
+ int cBits,
+ int nRadix,
+ int fCase,
+ PCXF pCxf,
+ LPSTR lpBuf,
+ LPSTR lpErr);
+
+extern int FAR PASCAL
+CPGetRange(
+ LPSTR lpszExpr,
+ int FAR *lpcch,
+ LPADDR lpAddr1,
+ LPADDR lpAddr2,
+ EERADIX radix,
+ int cbDefault,
+ int cbSize,
+ CXF FAR *pcxf,
+ BOOL fCase,
+ BOOL fSpecial);
+
+typedef enum {
+ CPNOERROR,
+ CPNOARGS,
+ CPISOPENQUOTE,
+ CPISCLOSEQUOTE,
+ CPISOPENANDCLOSEQUOTE,
+ CPISDELIM,
+ CPNOTINQUOTETABLE
+} CPRETURNS;
diff --git a/private/windbg/osdebug/include/ctxptrs.h b/private/windbg/osdebug/include/ctxptrs.h
new file mode 100644
index 000000000..1e1bb2dda
--- /dev/null
+++ b/private/windbg/osdebug/include/ctxptrs.h
@@ -0,0 +1,97 @@
+#if defined( _NTMIPS_ ) || defined( _NTALPHA_ ) || defined( _NTPPC_ )
+#define _CTXPTRS_H_
+#endif
+
+#ifndef _CTXPTRS_H_
+#define _CTXPTRS_H_
+
+#if !defined( _ALPHA_ ) && !defined (TARGET_ALPHA)
+
+typedef ULONG KNONVOLATILE_CONTEXT_POINTERS;
+typedef PULONG PKNONVOLATILE_CONTEXT_POINTERS;
+
+#else
+
+//
+// modified from ntalpha.h June 7, 1993.
+//
+
+//
+// Nonvolatile context pointer record.
+//
+
+typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
+
+ PLARGE_INTEGER FloatingContext[1];
+ PLARGE_INTEGER FltF1;
+ // Nonvolatile floating point registers start here.
+ PLARGE_INTEGER FltF2;
+ PLARGE_INTEGER FltF3;
+ PLARGE_INTEGER FltF4;
+ PLARGE_INTEGER FltF5;
+ PLARGE_INTEGER FltF6;
+ PLARGE_INTEGER FltF7;
+ PLARGE_INTEGER FltF8;
+ PLARGE_INTEGER FltF9;
+ PLARGE_INTEGER FltF10;
+ PLARGE_INTEGER FltF11;
+ PLARGE_INTEGER FltF12;
+ PLARGE_INTEGER FltF13;
+ PLARGE_INTEGER FltF14;
+ PLARGE_INTEGER FltF15;
+ PLARGE_INTEGER FltF16;
+ PLARGE_INTEGER FltF17;
+ PLARGE_INTEGER FltF18;
+ PLARGE_INTEGER FltF19;
+ PLARGE_INTEGER FltF20;
+ PLARGE_INTEGER FltF21;
+ PLARGE_INTEGER FltF22;
+ PLARGE_INTEGER FltF23;
+ PLARGE_INTEGER FltF24;
+ PLARGE_INTEGER FltF25;
+ PLARGE_INTEGER FltF26;
+ PLARGE_INTEGER FltF27;
+ PLARGE_INTEGER FltF28;
+ PLARGE_INTEGER FltF29;
+ PLARGE_INTEGER FltF30;
+ PLARGE_INTEGER FltF31;
+
+ PLARGE_INTEGER IntegerContext[1];
+ PLARGE_INTEGER IntT0;
+ PLARGE_INTEGER IntT1;
+ PLARGE_INTEGER IntT2;
+ PLARGE_INTEGER IntT3;
+ PLARGE_INTEGER IntT4;
+ PLARGE_INTEGER IntT5;
+ PLARGE_INTEGER IntT6;
+ PLARGE_INTEGER IntT7;
+ // Nonvolatile integer registers start here.
+ PLARGE_INTEGER IntS0;
+ PLARGE_INTEGER IntS1;
+ PLARGE_INTEGER IntS2;
+ PLARGE_INTEGER IntS3;
+ PLARGE_INTEGER IntS4;
+ PLARGE_INTEGER IntS5;
+ PLARGE_INTEGER IntFp;
+ PLARGE_INTEGER IntA0;
+ PLARGE_INTEGER IntA1;
+ PLARGE_INTEGER IntA2;
+ PLARGE_INTEGER IntA3;
+ PLARGE_INTEGER IntA4;
+ PLARGE_INTEGER IntA5;
+ PLARGE_INTEGER IntT8;
+ PLARGE_INTEGER IntT9;
+ PLARGE_INTEGER IntT10;
+ PLARGE_INTEGER IntT11;
+ PLARGE_INTEGER IntRa;
+ PLARGE_INTEGER IntT12;
+ PLARGE_INTEGER IntAt;
+ PLARGE_INTEGER IntGp;
+ PLARGE_INTEGER IntSp;
+ PLARGE_INTEGER IntZero;
+
+} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
+
+#endif // !_ALPHA_ && !TARGET_ALPHA
+
+#endif // _CTXPTRS_H_
diff --git a/private/windbg/osdebug/include/cvexefmt.h b/private/windbg/osdebug/include/cvexefmt.h
new file mode 100644
index 000000000..0b3286c18
--- /dev/null
+++ b/private/windbg/osdebug/include/cvexefmt.h
@@ -0,0 +1,364 @@
+/*** cvexefmt.h - format of CodeView information in exe
+ *
+ * Structures, constants, etc. for reading CodeView information
+ * from the executable.
+ *
+ */
+
+
+/*** The master copy of this file resides in the CodeView project.
+ * All Microsoft projects are required to use the master copy without
+ * modification. Modification of the master version or a copy
+ * without consultation with all parties concerned is extremely
+ * risky.
+ *
+ */
+
+
+
+
+// The following structures and constants describe the format of the
+// CodeView Debug OMF for that will be accepted by CodeView 4.0 and
+// later. These are executables with signatures of NB05, NB06 and NB07.
+// There is some confusion about the signatures NB03 and NB04 so none
+// of the utilites will accept executables with these signatures.
+
+// All of the structures described below must start on a long word boundary
+// to maintain natural alignment. Pad space can be inserted during the
+// write operation and the addresses adjusted without affecting the contents
+// of the structures.
+
+
+// Type of subsection entry.
+
+#define sstModule 0x120
+#define sstTypes 0x121
+#define sstPublic 0x122
+#define sstPublicSym 0x123 // publics as symbol (waiting for link)
+#define sstSymbols 0x124
+#define sstAlignSym 0x125
+#define sstSrcLnSeg 0x126 // because link doesn't emit SrcModule
+#define sstSrcModule 0x127
+#define sstLibraries 0x128
+#define sstGlobalSym 0x129
+#define sstGlobalPub 0x12a
+#define sstGlobalTypes 0x12b
+#define sstMPC 0x12c
+#define sstSegMap 0x12d
+#define sstSegName 0x12e
+#define sstPreComp 0x12f // precompiled types
+#define sstPreCompMap 0x130 // map precompiled types in global types
+#define sstOffsetMap16 0x131
+#define sstOffsetMap32 0x132
+#define sstFileIndex 0x133
+#define sstStaticSym 0x134
+
+
+
+typedef enum OMFHash {
+ OMFHASH_NONE, // no hashing
+ OMFHASH_SUMUC16, // upper case sum of chars in 16 bit table
+ OMFHASH_SUMUC32, // upper case sum of chars in 32 bit table
+ OMFHASH_ADDR16, // sorted by increasing address in 16 bit table
+ OMFHASH_ADDR32 // sorted by increasing address in 32 bit table
+} OMFHASH;
+
+// CodeView Debug OMF signature. The signature at the end of the file is
+// a negative offset from the end of the file to another signature. At
+// the negative offset (base address) is another signature whose filepos
+// field points to the first OMFDirHeader in a chain of directories.
+// The NB05 signature is used by the link utility to indicated a completely
+// unpacked file. The NB06 signature is used by ilink to indicate that the
+// executable has had CodeView information from an incremental link appended
+// to the executable. The NB07 signature is used by cvpack to indicate that
+// the CodeView Debug OMF has been packed. CodeView will only process
+// executables with the NB07 signature.
+
+
+typedef struct OMFSignature {
+ char Signature[4]; // "NB05", "NB06" or "NB07"
+ long filepos; // offset in file
+} OMFSignature;
+
+
+
+// directory information structure
+// This structure contains the information describing the directory.
+// It is pointed to by the signature at the base address or the directory
+// link field of a preceeding directory. The directory entries immediately
+// follow this structure.
+
+
+typedef struct OMFDirHeader {
+ unsigned short cbDirHeader; // length of this structure
+ unsigned short cbDirEntry; // number of bytes in each directory entry
+ unsigned long cDir; // number of directorie entries
+ long lfoNextDir; // offset from base of next directory
+ unsigned long flags; // status flags
+} OMFDirHeader;
+
+
+
+
+// directory structure
+// The data in this structure is used to reference the data for each
+// subsection of the CodeView Debug OMF information. Tables that are
+// not associated with a specific module will have a module index of
+// oxffff. These tables are the global types table, the global symbol
+// table, the global public table and the library table.
+
+
+typedef struct OMFDirEntry {
+ unsigned short SubSection; // subsection type (sst...)
+ unsigned short iMod; // module index
+ long lfo; // large file offset of subsection
+ unsigned long cb; // number of bytes in subsection
+} OMFDirEntry;
+
+
+
+// information decribing each segment in a module
+
+typedef struct OMFSegDesc {
+ unsigned short Seg; // segment index
+ unsigned short pad; // pad to maintain alignment
+ unsigned long Off; // offset of code in segment
+ unsigned long cbSeg; // number of bytes in segment
+} OMFSegDesc;
+
+
+
+
+// per module information
+// There is one of these subsection entries for each module
+// in the executable. The entry is generated by link/ilink.
+// This table will probably require padding because of the
+// variable length module name.
+
+typedef struct OMFModule {
+ unsigned short ovlNumber; // overlay number
+ unsigned short iLib; // library that the module was linked from
+ unsigned short cSeg; // count of number of segments in module
+ char Style[2]; // debugging style "CV"
+ OMFSegDesc SegInfo[1]; // describes segments in module
+ char Name[]; // length prefixed module name padded to
+ // long word boundary
+} OMFModule;
+
+
+
+// Symbol hash table format
+// This structure immediately preceeds the global publics table
+// and global symbol tables.
+
+typedef struct OMFSymHash {
+ unsigned short symhash; // symbol hash function index
+ unsigned short addrhash; // address hash function index
+ unsigned long cbSymbol; // length of symbol information
+ unsigned long cbHSym; // length of symbol hash data
+ unsigned long cbHAddr; // length of address hashdata
+} OMFSymHash;
+
+
+
+// Global types subsection format
+// This structure immediately preceeds the global types table.
+// The offsets in the typeOffset array are relative to the address
+// of ctypes. Each type entry following the typeOffset array must
+// begin on a long word boundary.
+
+typedef struct OMFTypeFlags {
+ unsigned long sig :8;
+ unsigned long unused :24;
+} OMFTypeFlags;
+
+
+typedef struct OMFGlobalTypes {
+ OMFTypeFlags flags;
+ unsigned long cTypes; // number of types
+ unsigned long typeOffset[]; // array of offsets to types
+} OMFGlobalTypes;
+
+
+
+
+// Precompiled types mapping table
+// This table should be ignored by all consumers except the incremental
+// packer.
+
+
+typedef struct OMFPreCompMap {
+ unsigned short FirstType; // first precompiled type index
+ unsigned short cTypes; // number of precompiled types
+ unsigned long signature; // precompiled types signature
+ unsigned short pad;
+ CV_typ_t map[]; // mapping of precompiled types
+} OMFPreCompMap;
+
+
+
+
+// Source line to address mapping table.
+// This table is generated by the link/ilink utility from line number
+// information contained in the object file OMF data. This table contains
+// only the code contribution for one segment from one source file.
+
+
+typedef struct OMFSourceLine {
+ unsigned short Seg; // linker segment index
+ unsigned short cLnOff; // count of line/offset pairs
+ unsigned long offset[1]; // array of offsets in segment
+ unsigned short lineNbr[1]; // array of line lumber in source
+} OMFSourceLine;
+
+typedef OMFSourceLine FAR * LPSL;
+
+
+// Source file description
+// This table is generated by the linker
+
+
+typedef struct OMFSourceFile {
+ unsigned short cSeg; // number of segments from source file
+ unsigned short reserved; // reserved
+ unsigned long baseSrcLn[1]; // base of OMFSourceLine tables
+ // this array is followed by array
+ // of segment start/end pairs followed by
+ // an array of linker indices
+ // for each segment in the file
+ unsigned short cFName; // length of source file name
+ char Name; // name of file padded to long boundary
+} OMFSourceFile;
+
+typedef OMFSourceFile FAR * LPSF;
+
+
+// Source line to address mapping header structure
+// This structure describes the number and location of the
+// OMFAddrLine tables for a module. The offSrcLine entries are
+// relative to the beginning of this structure.
+
+
+typedef struct OMFSourceModule {
+ unsigned short cFile; // number of OMFSourceTables
+ unsigned short cSeg; // number of segments in module
+ unsigned long baseSrcFile[1]; // base of OMFSourceFile table
+ // this array is followed by array
+ // of segment start/end pairs followed
+ // by an array of linker indices
+ // for each segment in the module
+} OMFSourceModule;
+
+typedef OMFSourceModule FAR * LPSM;
+
+// sstLibraries
+
+typedef struct OMFLibrary {
+ unsigned char cbLibs; // count of library names
+ char Libs[1]; // array of length prefixed lib names (first entry zero length)
+} OMFLibrary;
+
+
+// Pcode support. This subsection contains debug information generated
+// by the MPC utility used to process Pcode executables. Currently
+// it contains a mapping table from segment index (zero based) to
+// frame paragraph. MPC converts segmented exe's to non-segmented
+// exe's for DOS support. To avoid backpatching all CV info, this
+// table is provided for the mapping. Additional info may be provided
+// in the future for profiler support.
+
+typedef struct OMFMpcDebugInfo {
+ unsigned short cSeg; // number of segments in module
+ unsigned short mpSegFrame[1]; // map seg (zero based) to frame
+} OMFMpcDebugInfo;
+
+// The following structures and constants describe the format of the
+// CodeView Debug OMF for linkers that emit executables with the NB02
+// signature. Current utilities with the exception of cvpack and cvdump
+// will not accept or emit executables with the NB02 signature. Cvdump
+// will dump an unpacked executable with the NB02 signature. Cvpack will
+// read an executable with the NB02 signature but the packed executable
+// will be written with the table format, contents and signature of NB07.
+
+
+
+
+
+// subsection type constants
+
+#define SSTMODULE 0x101 // Basic info. about object module
+#define SSTPUBLIC 0x102 // Public symbols
+#define SSTTYPES 0x103 // Type information
+#define SSTSYMBOLS 0x104 // Symbol Data
+#define SSTSRCLINES 0x105 // Source line information
+#define SSTLIBRARIES 0x106 // Names of all library files used
+#define SSTIMPORTS 0x107 // Symbols for DLL fixups
+#define SSTCOMPACTED 0x108 // Compacted types section
+#define SSTSRCLNSEG 0x109 // Same as source lines, contains segment
+
+
+typedef struct DirEntry{
+ unsigned short SubSectionType;
+ unsigned short ModuleIndex;
+ long lfoStart;
+ unsigned short Size;
+} DirEntry;
+
+
+// information decribing each segment in a module
+
+typedef struct oldnsg {
+ unsigned short Seg; // segment index
+ unsigned short Off; // offset of code in segment
+ unsigned short cbSeg; // number of bytes in segment
+} oldnsg;
+
+
+// old subsection module information
+
+typedef struct oldsmd {
+ oldnsg SegInfo; // describes first segment in module
+ unsigned short ovlNbr; // overlay number
+ unsigned short iLib;
+ unsigned char cSeg; // Number of segments in module
+ char reserved;
+ unsigned char cbName[1]; // length prefixed name of module
+ oldnsg arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
+} oldsmd;
+
+typedef struct{
+ unsigned short Seg;
+ unsigned long Off;
+ unsigned long cbSeg;
+} oldnsg32;
+
+typedef struct {
+ oldnsg32 SegInfo; // describes first segment in module
+ unsigned short ovlNbr; // overlay number
+ unsigned short iLib;
+ unsigned char cSeg; // Number of segments in module
+ char reserved;
+ unsigned char cbName[1]; // length prefixed name of module
+ oldnsg32 arnsg[]; // cSeg-1 structures exist for alloc text or comdat code
+} oldsmd32;
+
+// OMFSegMap - This table contains the mapping between the logical segment indices
+// used in the symbol table and the physical segments where the program is loaded
+
+typedef struct OMFSegMapDesc {
+ unsigned short flags; // descriptor flags bit field.
+ unsigned short ovl; // the logical overlay number
+ unsigned short group; // group index into the descriptor array
+ unsigned short frame; // logical segment index - interpreted via flags
+ unsigned short iSegName; // segment or group name - index into sstSegName
+ unsigned short iClassName; // class name - index into sstSegName
+ unsigned long offset; // byte offset of the logical within the physical segment
+ unsigned long cbSeg; // byte count of the logical segment or group
+} OMFSegMapDesc;
+
+typedef struct OMFSegMap {
+ unsigned short cSeg; // total number of segment descriptors
+ unsigned short cSegLog; // number of logical segment descriptors
+ OMFSegMapDesc rgDesc[0]; // array of segment descriptors
+} OMFSegMap;
+
diff --git a/private/windbg/osdebug/include/cvinfo.h b/private/windbg/osdebug/include/cvinfo.h
new file mode 100644
index 000000000..7f7dc138a
--- /dev/null
+++ b/private/windbg/osdebug/include/cvinfo.h
@@ -0,0 +1,3221 @@
+/*** cvinfo.h - Generic CodeView information definitions
+ *
+ * Structures, constants, etc. for accessing and interpreting
+ * CodeView information.
+ *
+ */
+
+
+/*** The master copy of this file resides in the langapi project.
+ * All Microsoft projects are required to use the master copy without
+ * modification. Modification of the master version or a copy
+ * without consultation with all parties concerned is extremely
+ * risky.
+ *
+ * When this file is modified, the corresponding documentation file
+ * omfdeb.doc in the langapi project must be updated.
+ */
+
+#ifndef _VC_VER_INC
+#include "..\include\vcver.h"
+#endif
+
+#ifndef _CV_INFO_INCLUDED
+#define _CV_INFO_INCLUDED
+
+#ifdef __cplusplus
+#pragma warning ( disable: 4200 )
+#endif
+
+#ifndef __INLINE
+#ifdef __cplusplus
+#define __INLINE inline
+#else
+#define __INLINE __inline
+#endif
+#endif
+
+#pragma pack ( push, 1 )
+typedef unsigned long CV_uoff32_t;
+typedef long CV_off32_t;
+typedef unsigned short CV_uoff16_t;
+typedef short CV_off16_t;
+typedef unsigned short CV_typ_t;
+
+#if !defined (CV_ZEROLEN)
+#define CV_ZEROLEN
+#endif
+
+#if !defined (FLOAT10)
+#if defined(_M_I86) // 16 bit x86 supporting long double
+typedef long double FLOAT10;
+#else // 32 bit w/o long double support
+typedef struct FLOAT10
+{
+ char b[10];
+} FLOAT10;
+#endif
+#endif
+
+
+#define CV_SIGNATURE_C6 0L // Actual signature is >64K
+#define CV_SIGNATURE_C7 1L // First explicit signature
+#define CV_SIGNATURE_RESERVED 2L // All signatures from 2 to 64K are reserved
+
+#define CV_MAXOFFSET 0xffffffff
+
+/** CodeView Symbol and Type OMF type information is broken up into two
+ * ranges. Type indices less than 0x1000 describe type information
+ * that is frequently used. Type indices above 0x1000 are used to
+ * describe more complex features such as functions, arrays and
+ * structures.
+ */
+
+
+
+
+/** Primitive types have predefined meaning that is encoded in the
+ * values of the various bit fields in the value.
+ *
+ * A CodeView primitive type is defined as:
+ *
+ * 1 1
+ * 1 089 7654 3 210
+ * r mode type r sub
+ *
+ * Where
+ * mode is the pointer mode
+ * type is a type indicator
+ * sub is a subtype enumeration
+ * r is a reserved field
+ *
+ * See Microsoft Symbol and Type OMF (Version 4.0) for more
+ * information.
+ */
+
+
+#define CV_MMASK 0x700 // mode mask
+#define CV_TMASK 0x0f0 // type mask
+
+// can we use the reserved bit ??
+#define CV_SMASK 0x00f // subtype mask
+
+#define CV_MSHIFT 8 // primitive mode right shift count
+#define CV_TSHIFT 4 // primitive type right shift count
+#define CV_SSHIFT 0 // primitive subtype right shift count
+
+// macros to extract primitive mode, type and size
+
+#define CV_MODE(typ) (((typ) & CV_MMASK) >> CV_MSHIFT)
+#define CV_TYPE(typ) (((typ) & CV_TMASK) >> CV_TSHIFT)
+#define CV_SUBT(typ) (((typ) & CV_SMASK) >> CV_SSHIFT)
+
+// macros to insert new primitive mode, type and size
+
+#define CV_NEWMODE(typ, nm) ((CV_typ_t)(((typ) & ~CV_MMASK) | ((nm) << CV_MSHIFT)))
+#define CV_NEWTYPE(typ, nt) (((typ) & ~CV_TMASK) | ((nt) << CV_TSHIFT))
+#define CV_NEWSUBT(typ, ns) (((typ) & ~CV_SMASK) | ((ns) << CV_SSHIFT))
+
+
+
+// pointer mode enumeration values
+
+typedef enum CV_prmode_e {
+ CV_TM_DIRECT = 0, // mode is not a pointer
+ CV_TM_NPTR = 1, // mode is a near pointer
+ CV_TM_FPTR = 2, // mode is a far pointer
+ CV_TM_HPTR = 3, // mode is a huge pointer
+ CV_TM_NPTR32 = 4, // mode is a 32 bit near pointer
+ CV_TM_FPTR32 = 5, // mode is a 32 bit far pointer
+ CV_TM_NPTR64 = 6, // mode is a 64 bit near pointer
+ CV_TM_NPTR128 = 7 // mode is a 128 bit near pointer
+} CV_prmode_e;
+
+
+
+
+// type enumeration values
+
+
+typedef enum CV_type_e {
+ CV_SPECIAL = 0x00, // special type size values
+ CV_SIGNED = 0x01, // signed integral size values
+ CV_UNSIGNED = 0x02, // unsigned integral size values
+ CV_BOOLEAN = 0x03, // Boolean size values
+ CV_REAL = 0x04, // real number size values
+ CV_COMPLEX = 0x05, // complex number size values
+ CV_SPECIAL2 = 0x06, // second set of special types
+ CV_INT = 0x07, // integral (int) values
+ CV_CVRESERVED = 0x0f
+} CV_type_e;
+
+
+
+
+// subtype enumeration values for CV_SPECIAL
+
+
+typedef enum CV_special_e {
+ CV_SP_NOTYPE = 0x00,
+ CV_SP_ABS = 0x01,
+ CV_SP_SEGMENT = 0x02,
+ CV_SP_VOID = 0x03,
+ CV_SP_CURRENCY = 0x04,
+ CV_SP_NBASICSTR = 0x05,
+ CV_SP_FBASICSTR = 0x06,
+ CV_SP_NOTTRANS = 0x07
+} CV_special_e;
+
+
+
+
+// subtype enumeration values for CV_SPECIAL2
+
+
+typedef enum CV_special2_e {
+ CV_S2_BIT = 0x00,
+ CV_S2_PASCHAR = 0x01 // Pascal CHAR
+} CV_special2_e;
+
+
+
+
+
+// subtype enumeration values for CV_SIGNED, CV_UNSIGNED and CV_BOOLEAN
+
+
+typedef enum CV_integral_e {
+ CV_IN_1BYTE = 0x00,
+ CV_IN_2BYTE = 0x01,
+ CV_IN_4BYTE = 0x02,
+ CV_IN_8BYTE = 0x03,
+ CV_IN_16BYTE = 0x04
+} CV_integral_e;
+
+
+
+
+
+// subtype enumeration values for CV_REAL and CV_COMPLEX
+
+
+typedef enum CV_real_e {
+ CV_RC_REAL32 = 0x00,
+ CV_RC_REAL64 = 0x01,
+ CV_RC_REAL80 = 0x02,
+ CV_RC_REAL128 = 0x03,
+ CV_RC_REAL48 = 0x04
+} CV_real_e;
+
+
+
+
+// subtype enumeration values for CV_INT (really int)
+
+
+typedef enum CV_int_e {
+ CV_RI_CHAR = 0x00,
+ CV_RI_INT1 = 0x00,
+ CV_RI_WCHAR = 0x01,
+ CV_RI_UINT1 = 0x01,
+ CV_RI_INT2 = 0x02,
+ CV_RI_UINT2 = 0x03,
+ CV_RI_INT4 = 0x04,
+ CV_RI_UINT4 = 0x05,
+ CV_RI_INT8 = 0x06,
+ CV_RI_UINT8 = 0x07,
+ CV_RI_INT16 = 0x08,
+ CV_RI_UINT16 = 0x09
+} CV_int_e;
+
+
+
+
+// macros to check the type of a primitive
+
+#define CV_TYP_IS_DIRECT(typ) (CV_MODE(typ) == CV_TM_DIRECT)
+#define CV_TYP_IS_PTR(typ) (CV_MODE(typ) != CV_TM_DIRECT)
+#define CV_TYP_IS_NPTR(typ) (CV_MODE(typ) == CV_TM_NPTR)
+#define CV_TYP_IS_FPTR(typ) (CV_MODE(typ) == CV_TM_FPTR)
+#define CV_TYP_IS_HPTR(typ) (CV_MODE(typ) == CV_TM_HPTR)
+#define CV_TYP_IS_NPTR32(typ) (CV_MODE(typ) == CV_TM_NPTR32)
+#define CV_TYP_IS_FPTR32(typ) (CV_MODE(typ) == CV_TM_FPTR32)
+
+#define CV_TYP_IS_SIGNED(typ) (((CV_TYPE(typ) == CV_SIGNED) && CV_TYP_IS_DIRECT(typ)) || \
+ (typ == T_INT1) || \
+ (typ == T_INT2) || \
+ (typ == T_INT4) || \
+ (typ == T_INT8) || \
+ (typ == T_INT16) || \
+ (typ == T_RCHAR))
+
+#define CV_TYP_IS_UNSIGNED(typ) (((CV_TYPE(typ) == CV_UNSIGNED) && CV_TYP_IS_DIRECT(typ)) || \
+ (typ == T_UINT1) || \
+ (typ == T_UINT2) || \
+ (typ == T_UINT4) || \
+ (typ == T_UINT8) || \
+ (typ == T_UINT16))
+
+#define CV_TYP_IS_REAL(typ) ((CV_TYPE(typ) == CV_REAL) && CV_TYP_IS_DIRECT(typ))
+
+#define CV_FIRST_NONPRIM 0x1000
+#define CV_IS_PRIMITIVE(typ) ((typ) < CV_FIRST_NONPRIM)
+#define CV_TYP_IS_COMPLEX(typ) ((CV_TYPE(typ) == CV_COMPLEX) && CV_TYP_IS_DIRECT(typ))
+
+
+
+
+// selected values for type_index - for a more complete definition, see
+// Microsoft Symbol and Type OMF document
+
+
+
+
+// Special Types
+
+
+#define T_NOTYPE 0x0000 // uncharacterized type (no type)
+#define T_ABS 0x0001 // absolute symbol
+#define T_SEGMENT 0x0002 // segment type
+#define T_VOID 0x0003 // void
+#define T_PVOID 0x0103 // near pointer to void
+#define T_PFVOID 0x0203 // far pointer to void
+#define T_PHVOID 0x0303 // huge pointer to void
+#define T_32PVOID 0x0403 // 16:32 near pointer to void
+#define T_32PFVOID 0x0503 // 16:32 far pointer to void
+#define T_CURRENCY 0x0004 // BASIC 8 byte currency value
+#define T_NBASICSTR 0x0005 // Near BASIC string
+#define T_FBASICSTR 0x0006 // Far BASIC string
+#define T_NOTTRANS 0x0007 // type not translated by cvpack
+#define T_BIT 0x0060 // bit
+#define T_PASCHAR 0x0061 // Pascal CHAR
+
+
+
+// Character types
+
+
+#define T_CHAR 0x0010 // 8 bit signed
+#define T_UCHAR 0x0020 // 8 bit unsigned
+#define T_PCHAR 0x0110 // near pointer to 8 bit signed
+#define T_PUCHAR 0x0120 // near pointer to 8 bit unsigned
+#define T_PFCHAR 0x0210 // far pointer to 8 bit signed
+#define T_PFUCHAR 0x0220 // far pointer to 8 bit unsigned
+#define T_PHCHAR 0x0310 // huge pointer to 8 bit signed
+#define T_PHUCHAR 0x0320 // huge pointer to 8 bit unsigned
+#define T_32PCHAR 0x0410 // 16:32 near pointer to 8 bit signed
+#define T_32PUCHAR 0x0420 // 16:32 near pointer to 8 bit unsigned
+#define T_32PFCHAR 0x0510 // 16:32 far pointer to 8 bit signed
+#define T_32PFUCHAR 0x0520 // 16:32 far pointer to 8 bit unsigned
+
+
+
+
+// really a character types
+
+#define T_RCHAR 0x0070 // really a char
+#define T_PRCHAR 0x0170 // 16:16 near pointer to a real char
+#define T_PFRCHAR 0x0270 // 16:16 far pointer to a real char
+#define T_PHRCHAR 0x0370 // 16:16 huge pointer to a real char
+#define T_32PRCHAR 0x0470 // 16:32 near pointer to a real char
+#define T_32PFRCHAR 0x0570 // 16:32 far pointer to a real char
+
+
+
+
+// really a wide character types
+
+#define T_WCHAR 0x0071 // wide char
+#define T_PWCHAR 0x0171 // 16:16 near pointer to a wide char
+#define T_PFWCHAR 0x0271 // 16:16 far pointer to a wide char
+#define T_PHWCHAR 0x0371 // 16:16 huge pointer to a wide char
+#define T_32PWCHAR 0x0471 // 16:32 near pointer to a wide char
+#define T_32PFWCHAR 0x0571 // 16:32 far pointer to a wide char
+
+
+// 8 bit int types
+
+
+#define T_INT1 0x0068 // 8 bit signed int
+#define T_UINT1 0x0069 // 8 bit unsigned int
+#define T_PINT1 0x0168 // near pointer to 8 bit signed int
+#define T_PUINT1 0x0169 // near pointer to 8 bit unsigned int
+#define T_PFINT1 0x0268 // far pointer to 8 bit signed int
+#define T_PFUINT1 0x0269 // far pointer to 8 bit unsigned int
+#define T_PHINT1 0x0368 // huge pointer to 8 bit signed int
+#define T_PHUINT1 0x0369 // huge pointer to 8 bit unsigned int
+
+#define T_32PINT1 0x0468 // 16:32 near pointer to 8 bit signed int
+#define T_32PUINT1 0x0469 // 16:32 near pointer to 8 bit unsigned int
+#define T_32PFINT1 0x0568 // 16:32 far pointer to 8 bit signed int
+#define T_32PFUINT1 0x0569 // 16:32 far pointer to 8 bit unsigned int
+
+
+// 16 bit short types
+
+
+#define T_SHORT 0x0011 // 16 bit signed
+#define T_USHORT 0x0021 // 16 bit unsigned
+#define T_PSHORT 0x0111 // near pointer to 16 bit signed
+#define T_PUSHORT 0x0121 // near pointer to 16 bit unsigned
+#define T_PFSHORT 0x0211 // far pointer to 16 bit signed
+#define T_PFUSHORT 0x0221 // far pointer to 16 bit unsigned
+#define T_PHSHORT 0x0311 // huge pointer to 16 bit signed
+#define T_PHUSHORT 0x0321 // huge pointer to 16 bit unsigned
+
+#define T_32PSHORT 0x0411 // 16:32 near pointer to 16 bit signed
+#define T_32PUSHORT 0x0421 // 16:32 near pointer to 16 bit unsigned
+#define T_32PFSHORT 0x0511 // 16:32 far pointer to 16 bit signed
+#define T_32PFUSHORT 0x0521 // 16:32 far pointer to 16 bit unsigned
+
+
+
+
+// 16 bit int types
+
+
+#define T_INT2 0x0072 // 16 bit signed int
+#define T_UINT2 0x0073 // 16 bit unsigned int
+#define T_PINT2 0x0172 // near pointer to 16 bit signed int
+#define T_PUINT2 0x0173 // near pointer to 16 bit unsigned int
+#define T_PFINT2 0x0272 // far pointer to 16 bit signed int
+#define T_PFUINT2 0x0273 // far pointer to 16 bit unsigned int
+#define T_PHINT2 0x0372 // huge pointer to 16 bit signed int
+#define T_PHUINT2 0x0373 // huge pointer to 16 bit unsigned int
+
+#define T_32PINT2 0x0472 // 16:32 near pointer to 16 bit signed int
+#define T_32PUINT2 0x0473 // 16:32 near pointer to 16 bit unsigned int
+#define T_32PFINT2 0x0572 // 16:32 far pointer to 16 bit signed int
+#define T_32PFUINT2 0x0573 // 16:32 far pointer to 16 bit unsigned int
+
+
+
+
+// 32 bit long types
+
+
+#define T_LONG 0x0012 // 32 bit signed
+#define T_ULONG 0x0022 // 32 bit unsigned
+#define T_PLONG 0x0112 // near pointer to 32 bit signed
+#define T_PULONG 0x0122 // near pointer to 32 bit unsigned
+#define T_PFLONG 0x0212 // far pointer to 32 bit signed
+#define T_PFULONG 0x0222 // far pointer to 32 bit unsigned
+#define T_PHLONG 0x0312 // huge pointer to 32 bit signed
+#define T_PHULONG 0x0322 // huge pointer to 32 bit unsigned
+
+#define T_32PLONG 0x0412 // 16:32 near pointer to 32 bit signed
+#define T_32PULONG 0x0422 // 16:32 near pointer to 32 bit unsigned
+#define T_32PFLONG 0x0512 // 16:32 far pointer to 32 bit signed
+#define T_32PFULONG 0x0522 // 16:32 far pointer to 32 bit unsigned
+
+
+
+
+// 32 bit int types
+
+
+#define T_INT4 0x0074 // 32 bit signed int
+#define T_UINT4 0x0075 // 32 bit unsigned int
+#define T_PINT4 0x0174 // near pointer to 32 bit signed int
+#define T_PUINT4 0x0175 // near pointer to 32 bit unsigned int
+#define T_PFINT4 0x0274 // far pointer to 32 bit signed int
+#define T_PFUINT4 0x0275 // far pointer to 32 bit unsigned int
+#define T_PHINT4 0x0374 // huge pointer to 32 bit signed int
+#define T_PHUINT4 0x0375 // huge pointer to 32 bit unsigned int
+
+#define T_32PINT4 0x0474 // 16:32 near pointer to 32 bit signed int
+#define T_32PUINT4 0x0475 // 16:32 near pointer to 32 bit unsigned int
+#define T_32PFINT4 0x0574 // 16:32 far pointer to 32 bit signed int
+#define T_32PFUINT4 0x0575 // 16:32 far pointer to 32 bit unsigned int
+
+
+
+
+// 64 bit quad types
+
+
+#define T_QUAD 0x0013 // 64 bit signed
+#define T_UQUAD 0x0023 // 64 bit unsigned
+#define T_PQUAD 0x0113 // near pointer to 64 bit signed
+#define T_PUQUAD 0x0123 // near pointer to 64 bit unsigned
+#define T_PFQUAD 0x0213 // far pointer to 64 bit signed
+#define T_PFUQUAD 0x0223 // far pointer to 64 bit unsigned
+#define T_PHQUAD 0x0313 // huge pointer to 64 bit signed
+#define T_PHUQUAD 0x0323 // huge pointer to 64 bit unsigned
+#define T_32PQUAD 0x0413 // 16:32 near pointer to 64 bit signed
+#define T_32PUQUAD 0x0423 // 16:32 near pointer to 64 bit unsigned
+#define T_32PFQUAD 0x0513 // 16:32 far pointer to 64 bit signed
+#define T_32PFUQUAD 0x0523 // 16:32 far pointer to 64 bit unsigned
+
+
+
+// 64 bit int types
+
+
+#define T_INT8 0x0076 // 64 bit signed int
+#define T_UINT8 0x0077 // 64 bit unsigned int
+#define T_PINT8 0x0176 // near pointer to 64 bit signed int
+#define T_PUINT8 0x0177 // near pointer to 64 bit unsigned int
+#define T_PFINT8 0x0276 // far pointer to 64 bit signed int
+#define T_PFUINT8 0x0277 // far pointer to 64 bit unsigned int
+#define T_PHINT8 0x0376 // huge pointer to 64 bit signed int
+#define T_PHUINT8 0x0377 // huge pointer to 64 bit unsigned int
+
+#define T_32PINT8 0x0476 // 16:32 near pointer to 64 bit signed int
+#define T_32PUINT8 0x0477 // 16:32 near pointer to 64 bit unsigned int
+#define T_32PFINT8 0x0576 // 16:32 far pointer to 64 bit signed int
+#define T_32PFUINT8 0x0577 // 16:32 far pointer to 64 bit unsigned int
+
+
+// 128 bit octet types
+
+
+#define T_OCT 0x0014 // 128 bit signed
+#define T_UOCT 0x0024 // 128 bit unsigned
+#define T_POCT 0x0114 // near pointer to 128 bit signed
+#define T_PUOCT 0x0124 // near pointer to 128 bit unsigned
+#define T_PFOCT 0x0214 // far pointer to 128 bit signed
+#define T_PFUOCT 0x0224 // far pointer to 128 bit unsigned
+#define T_PHOCT 0x0314 // huge pointer to 128 bit signed
+#define T_PHUOCT 0x0324 // huge pointer to 128 bit unsigned
+
+#define T_32POCT 0x0414 // 16:32 near pointer to 128 bit signed
+#define T_32PUOCT 0x0424 // 16:32 near pointer to 128 bit unsigned
+#define T_32PFOCT 0x0514 // 16:32 far pointer to 128 bit signed
+#define T_32PFUOCT 0x0524 // 16:32 far pointer to 128 bit unsigned
+
+// 128 bit int types
+
+
+#define T_INT16 0x0078 // 128 bit signed int
+#define T_UINT16 0x0079 // 128 bit unsigned int
+#define T_PINT16 0x0178 // near pointer to 128 bit signed int
+#define T_PUINT16 0x0179 // near pointer to 128 bit unsigned int
+#define T_PFINT16 0x0278 // far pointer to 128 bit signed int
+#define T_PFUINT16 0x0279 // far pointer to 128 bit unsigned int
+#define T_PHINT16 0x0378 // huge pointer to 128 bit signed int
+#define T_PHUINT16 0x0379 // huge pointer to 128 bit unsigned int
+
+#define T_32PINT16 0x0478 // 16:32 near pointer to 128 bit signed int
+#define T_32PUINT16 0x0479 // 16:32 near pointer to 128 bit unsigned int
+#define T_32PFINT16 0x0578 // 16:32 far pointer to 128 bit signed int
+#define T_32PFUINT16 0x0579 // 16:32 far pointer to 128 bit unsigned int
+
+
+
+
+
+// 32 bit real types
+
+
+#define T_REAL32 0x0040 // 32 bit real
+#define T_PREAL32 0x0140 // near pointer to 32 bit real
+#define T_PFREAL32 0x0240 // far pointer to 32 bit real
+#define T_PHREAL32 0x0340 // huge pointer to 32 bit real
+#define T_32PREAL32 0x0440 // 16:32 near pointer to 32 bit real
+#define T_32PFREAL32 0x0540 // 16:32 far pointer to 32 bit real
+
+
+
+// 48 bit real types
+
+
+#define T_REAL48 0x0044 // 48 bit real
+#define T_PREAL48 0x0144 // near pointer to 48 bit real
+#define T_PFREAL48 0x0244 // far pointer to 48 bit real
+#define T_PHREAL48 0x0344 // huge pointer to 48 bit real
+#define T_32PREAL48 0x0444 // 16:32 near pointer to 48 bit real
+#define T_32PFREAL48 0x0544 // 16:32 far pointer to 48 bit real
+
+
+
+
+// 64 bit real types
+
+
+#define T_REAL64 0x0041 // 64 bit real
+#define T_PREAL64 0x0141 // near pointer to 64 bit real
+#define T_PFREAL64 0x0241 // far pointer to 64 bit real
+#define T_PHREAL64 0x0341 // huge pointer to 64 bit real
+#define T_32PREAL64 0x0441 // 16:32 near pointer to 64 bit real
+#define T_32PFREAL64 0x0541 // 16:32 far pointer to 64 bit real
+
+
+
+
+// 80 bit real types
+
+
+#define T_REAL80 0x0042 // 80 bit real
+#define T_PREAL80 0x0142 // near pointer to 80 bit real
+#define T_PFREAL80 0x0242 // far pointer to 80 bit real
+#define T_PHREAL80 0x0342 // huge pointer to 80 bit real
+#define T_32PREAL80 0x0442 // 16:32 near pointer to 80 bit real
+#define T_32PFREAL80 0x0542 // 16:32 far pointer to 80 bit real
+
+
+
+
+// 128 bit real types
+
+
+#define T_REAL128 0x0043 // 128 bit real
+#define T_PREAL128 0x0143 // near pointer to 128 bit real
+#define T_PFREAL128 0x0243 // far pointer to 128 bit real
+#define T_PHREAL128 0x0343 // huge pointer to 128 bit real
+#define T_32PREAL128 0x0443 // 16:32 near pointer to 128 bit real
+#define T_32PFREAL128 0x0543 // 16:32 far pointer to 128 bit real
+
+
+
+
+// 32 bit complex types
+
+
+#define T_CPLX32 0x0050 // 32 bit complex
+#define T_PCPLX32 0x0150 // near pointer to 32 bit complex
+#define T_PFCPLX32 0x0250 // far pointer to 32 bit complex
+#define T_PHCPLX32 0x0350 // huge pointer to 32 bit complex
+#define T_32PCPLX32 0x0450 // 16:32 near pointer to 32 bit complex
+#define T_32PFCPLX32 0x0550 // 16:32 far pointer to 32 bit complex
+
+
+
+
+// 64 bit complex types
+
+
+#define T_CPLX64 0x0051 // 64 bit complex
+#define T_PCPLX64 0x0151 // near pointer to 64 bit complex
+#define T_PFCPLX64 0x0251 // far pointer to 64 bit complex
+#define T_PHCPLX64 0x0351 // huge pointer to 64 bit complex
+#define T_32PCPLX64 0x0451 // 16:32 near pointer to 64 bit complex
+#define T_32PFCPLX64 0x0551 // 16:32 far pointer to 64 bit complex
+
+
+
+
+// 80 bit complex types
+
+
+#define T_CPLX80 0x0052 // 80 bit complex
+#define T_PCPLX80 0x0152 // near pointer to 80 bit complex
+#define T_PFCPLX80 0x0252 // far pointer to 80 bit complex
+#define T_PHCPLX80 0x0352 // huge pointer to 80 bit complex
+#define T_32PCPLX80 0x0452 // 16:32 near pointer to 80 bit complex
+#define T_32PFCPLX80 0x0552 // 16:32 far pointer to 80 bit complex
+
+
+
+
+// 128 bit complex types
+
+
+#define T_CPLX128 0x0053 // 128 bit complex
+#define T_PCPLX128 0x0153 // near pointer to 128 bit complex
+#define T_PFCPLX128 0x0253 // far pointer to 128 bit complex
+#define T_PHCPLX128 0x0353 // huge pointer to 128 bit real
+#define T_32PCPLX128 0x0453 // 16:32 near pointer to 128 bit complex
+#define T_32PFCPLX128 0x0553 // 16:32 far pointer to 128 bit complex
+
+
+
+
+// boolean types
+
+
+#define T_BOOL08 0x0030 // 8 bit boolean
+#define T_BOOL16 0x0031 // 16 bit boolean
+#define T_BOOL32 0x0032 // 32 bit boolean
+#define T_BOOL64 0x0033 // 64 bit boolean
+#define T_PBOOL08 0x0130 // near pointer to 8 bit boolean
+#define T_PBOOL16 0x0131 // near pointer to 16 bit boolean
+#define T_PBOOL32 0x0132 // near pointer to 32 bit boolean
+#define T_PBOOL64 0x0133 // near pointer to 64 bit boolean
+#define T_PFBOOL08 0x0230 // far pointer to 8 bit boolean
+#define T_PFBOOL16 0x0231 // far pointer to 16 bit boolean
+#define T_PFBOOL32 0x0232 // far pointer to 32 bit boolean
+#define T_PFBOOL64 0x0233 // far pointer to 64 bit boolean
+#define T_PHBOOL08 0x0330 // huge pointer to 8 bit boolean
+#define T_PHBOOL16 0x0331 // huge pointer to 16 bit boolean
+#define T_PHBOOL32 0x0332 // huge pointer to 32 bit boolean
+#define T_PHBOOL64 0x0333 // huge pointer to 64 bit boolean
+
+#define T_32PBOOL08 0x0430 // 16:32 near pointer to 8 bit boolean
+#define T_32PFBOOL08 0x0530 // 16:32 far pointer to 8 bit boolean
+#define T_32PBOOL16 0x0431 // 16:32 near pointer to 18 bit boolean
+#define T_32PFBOOL16 0x0531 // 16:32 far pointer to 16 bit boolean
+#define T_32PBOOL32 0x0432 // 16:32 near pointer to 32 bit boolean
+#define T_32PFBOOL32 0x0532 // 16:32 far pointer to 32 bit boolean
+#define T_32PBOOL64 0x0433 // 16:32 near pointer to 64 bit boolean
+#define T_32PFBOOL64 0x0533 // 16:32 far pointer to 64 bit boolean
+
+
+#define T_NCVPTR 0x01f0 // CV Internal type for created near pointers
+#define T_FCVPTR 0x02f0 // CV Internal type for created far pointers
+#define T_HCVPTR 0x03f0 // CV Internal type for created huge pointers
+#define T_32NCVPTR 0x04f0 // CV Internal type for created near 32-bit pointers
+#define T_32FCVPTR 0x05f0 // CV Internal type for created far 32-bit pointers
+#define T_64NCVPTR 0x06f0 // CV Internal type for created near 64-bit pointers
+
+#define CV_IS_INTERNAL_PTR(typ) (CV_IS_PRIMITIVE(typ) && \
+ CV_TYPE(typ) == CV_CVRESERVED && \
+ CV_TYP_IS_PTR(typ))
+
+
+/** No leaf index can have a value of 0x0000. The leaf indices are
+ * separated into ranges depending upon the use of the type record.
+ * The second range is for the type records that are directly referenced
+ * in symbols. The first range is for type records that are not
+ * referenced by symbols but instead are referenced by other type
+ * records. All type records must have a starting leaf index in these
+ * first two ranges. The third range of leaf indices are used to build
+ * up complex lists such as the field list of a class type record. No
+ * type record can begin with one of the leaf indices. The fourth ranges
+ * of type indices are used to represent numeric data in a symbol or
+ * type record. These leaf indices are greater than 0x8000. At the
+ * point that type or symbol processor is expecting a numeric field, the
+ * next two bytes in the type record are examined. If the value is less
+ * than 0x8000, then the two bytes contain the numeric value. If the
+ * value is greater than 0x8000, then the data follows the leaf index in
+ * a format specified by the leaf index. The final range of leaf indices
+ * are used to force alignment of subfields within a complex type record..
+ */
+
+
+
+ // leaf indices starting records but referenced from symbol records
+
+#define LF_MODIFIER 0x0001
+#define LF_POINTER 0x0002
+#define LF_ARRAY 0x0003
+#define LF_CLASS 0x0004
+#define LF_STRUCTURE 0x0005
+#define LF_UNION 0x0006
+#define LF_ENUM 0x0007
+#define LF_PROCEDURE 0x0008
+#define LF_MFUNCTION 0x0009
+#define LF_VTSHAPE 0x000a
+#define LF_COBOL0 0x000b
+#define LF_COBOL1 0x000c
+#define LF_BARRAY 0x000d
+#define LF_LABEL 0x000e
+#define LF_NULL 0x000f
+#define LF_NOTTRAN 0x0010
+#define LF_DIMARRAY 0x0011
+#define LF_VFTPATH 0x0012
+#define LF_PRECOMP 0x0013 // not referenced from symbol
+#define LF_ENDPRECOMP 0x0014 // not referenced from symbol
+#define LF_OEM 0x0015 // oem definable type string
+#define LF_TYPESERVER 0x0016 // not referenced from symbol
+
+ // leaf indices starting records but referenced only from type records
+
+#define LF_SKIP 0x0200
+#define LF_ARGLIST 0x0201
+#define LF_DEFARG 0x0202
+#define LF_LIST 0x0203
+#define LF_FIELDLIST 0x0204
+#define LF_DERIVED 0x0205
+#define LF_BITFIELD 0x0206
+#define LF_METHODLIST 0x0207
+#define LF_DIMCONU 0x0208
+#define LF_DIMCONLU 0x0209
+#define LF_DIMVARU 0x020a
+#define LF_DIMVARLU 0x020b
+#define LF_REFSYM 0x020c
+
+#define LF_BCLASS 0x0400
+#define LF_VBCLASS 0x0401
+#define LF_IVBCLASS 0x0402
+#define LF_ENUMERATE 0x0403
+#define LF_FRIENDFCN 0x0404
+#define LF_INDEX 0x0405
+#define LF_MEMBER 0x0406
+#define LF_STMEMBER 0x0407
+#define LF_METHOD 0x0408
+#define LF_NESTTYPE 0x0409
+#define LF_VFUNCTAB 0x040a
+#define LF_FRIENDCLS 0x040b
+#define LF_ONEMETHOD 0x040c
+#define LF_VFUNCOFF 0x040d
+#define LF_NESTTYPEEX 0x040e
+#define LF_MEMBERMODIFY 0x040f
+
+#define LF_NUMERIC 0x8000
+#define LF_CHAR 0x8000
+#define LF_SHORT 0x8001
+#define LF_USHORT 0x8002
+#define LF_LONG 0x8003
+#define LF_ULONG 0x8004
+#define LF_REAL32 0x8005
+#define LF_REAL64 0x8006
+#define LF_REAL80 0x8007
+#define LF_REAL128 0x8008
+#define LF_QUADWORD 0x8009
+#define LF_UQUADWORD 0x800a
+#define LF_REAL48 0x800b
+#define LF_COMPLEX32 0x800c
+#define LF_COMPLEX64 0x800d
+#define LF_COMPLEX80 0x800e
+#define LF_COMPLEX128 0x800f
+#define LF_VARSTRING 0x8010
+
+#define LF_OCTWORD 0x8017
+#define LF_UOCTWORD 0x8018
+
+#define LF_PAD0 0xf0
+#define LF_PAD1 0xf1
+#define LF_PAD2 0xf2
+#define LF_PAD3 0xf3
+#define LF_PAD4 0xf4
+#define LF_PAD5 0xf5
+#define LF_PAD6 0xf6
+#define LF_PAD7 0xf7
+#define LF_PAD8 0xf8
+#define LF_PAD9 0xf9
+#define LF_PAD10 0xfa
+#define LF_PAD11 0xfb
+#define LF_PAD12 0xfc
+#define LF_PAD13 0xfd
+#define LF_PAD14 0xfe
+#define LF_PAD15 0xff
+
+// end of leaf indices
+
+
+
+
+// Type enum for pointer records
+// Pointers can be one of the following types
+
+
+typedef enum CV_ptrtype_e {
+ CV_PTR_NEAR = 0x00, // near pointer
+ CV_PTR_FAR = 0x01, // far pointer
+ CV_PTR_HUGE = 0x02, // huge pointer
+ CV_PTR_BASE_SEG = 0x03, // based on segment
+ CV_PTR_BASE_VAL = 0x04, // based on value of base
+ CV_PTR_BASE_SEGVAL = 0x05, // based on segment value of base
+ CV_PTR_BASE_ADDR = 0x06, // based on address of base
+ CV_PTR_BASE_SEGADDR = 0x07, // based on segment address of base
+ CV_PTR_BASE_TYPE = 0x08, // based on type
+ CV_PTR_BASE_SELF = 0x09, // based on self
+ CV_PTR_NEAR32 = 0x0a, // 16:32 near pointer
+ CV_PTR_FAR32 = 0x0b, // 16:32 far pointer
+ CV_PTR_UNUSEDPTR = 0x0c // first unused pointer type
+} CV_ptrtype_e;
+
+
+
+
+
+// Mode enum for pointers
+// Pointers can have one of the following modes
+
+
+typedef enum CV_ptrmode_e {
+ CV_PTR_MODE_PTR = 0x00, // "normal" pointer
+ CV_PTR_MODE_REF = 0x01, // reference
+ CV_PTR_MODE_PMEM = 0x02, // pointer to data member
+ CV_PTR_MODE_PMFUNC = 0x03, // pointer to member function
+ CV_PTR_MODE_RESERVED= 0x04 // first unused pointer mode
+} CV_ptrmode_e;
+
+
+
+
+// Enumeration for function call type
+
+
+typedef enum CV_call_e {
+ CV_CALL_NEAR_C = 0x00, // near right to left push, caller pops stack
+ CV_CALL_FAR_C = 0x01, // far right to left push, caller pops stack
+ CV_CALL_NEAR_PASCAL = 0x02, // near left to right push, callee pops stack
+ CV_CALL_FAR_PASCAL = 0x03, // far left to right push, callee pops stack
+ CV_CALL_NEAR_FAST = 0x04, // near left to right push with regs, callee pops stack
+ CV_CALL_FAR_FAST = 0x05, // far left to right push with regs, callee pops stack
+ CV_CALL_SKIPPED = 0x06, // skipped (unused) call index
+ CV_CALL_NEAR_STD = 0x07, // near standard call
+ CV_CALL_FAR_STD = 0x08, // far standard call
+ CV_CALL_NEAR_SYS = 0x09, // near sys call
+ CV_CALL_FAR_SYS = 0x0a, // far sys call
+ CV_CALL_THISCALL = 0x0b, // this call (this passed in register)
+ CV_CALL_MIPSCALL = 0x0c, // Mips call
+ CV_CALL_GENERIC = 0x0d, // Generic call sequence
+ CV_CALL_ALPHACALL = 0x0e, // Alpha call
+ CV_CALL_PPCCALL = 0x0f, // PPC call
+ CV_CALL_RESERVED = 0x10 // first unused call enumeration
+} CV_call_e;
+
+
+
+
+// Values for the access protection of class attributes
+
+
+typedef enum CV_access_e {
+ CV_private = 1,
+ CV_protected = 2,
+ CV_public = 3
+} CV_access_e;
+
+
+
+// enumeration for method properties
+
+typedef enum CV_methodprop_e {
+ CV_MTvanilla = 0x00,
+ CV_MTvirtual = 0x01,
+ CV_MTstatic = 0x02,
+ CV_MTfriend = 0x03,
+ CV_MTintro = 0x04,
+ CV_MTpurevirt = 0x05,
+ CV_MTpureintro = 0x06
+} CV_methodprop_e;
+
+
+
+
+// enumeration for virtual shape table entries
+
+typedef enum CV_VTS_desc_e {
+ CV_VTS_near = 0x00,
+ CV_VTS_far = 0x01,
+ CV_VTS_thin = 0x02,
+ CV_VTS_outer = 0x03,
+ CV_VTS_meta = 0x04,
+ CV_VTS_near32 = 0x05,
+ CV_VTS_far32 = 0x06,
+ CV_VTS_unused = 0x07
+} CV_VTS_desc_e;
+
+
+
+
+// enumeration for LF_LABEL address modes
+
+typedef enum CV_LABEL_TYPE_e {
+ CV_LABEL_NEAR = 0, // near return
+ CV_LABEL_FAR = 4 // far return
+} CV_LABEL_TYPE_e;
+
+
+
+// enumeration for LF_MODIFIER values
+
+
+typedef struct CV_modifier_t {
+ unsigned short MOD_const :1;
+ unsigned short MOD_volatile :1;
+ unsigned short MOD_unaligned :1;
+ unsigned short MOD_unused :13;
+} CV_modifier_t;
+
+
+// bit field structure describing class/struct/union/enum properties
+
+typedef struct CV_prop_t {
+ unsigned short packed :1; // true if structure is packed
+ unsigned short ctor :1; // true if constructors or destructors present
+ unsigned short ovlops :1; // true if overloaded operators present
+ unsigned short isnested :1; // true if this is a nested class
+ unsigned short cnested :1; // true if this class contains nested types
+ unsigned short opassign :1; // true if overloaded assignment (=)
+ unsigned short opcast :1; // true if casting methods
+ unsigned short fwdref :1; // true if forward reference (incomplete defn)
+ unsigned short scoped :1; // scoped definition
+ unsigned short reserved :7;
+} CV_prop_t;
+
+
+
+
+// class field attribute
+
+typedef struct CV_fldattr_t {
+ unsigned short access :2; // access protection CV_access_t
+ unsigned short mprop :3; // method properties CV_methodprop_t
+ unsigned short pseudo :1; // compiler generated fcn and does not exist
+ unsigned short noinherit :1; // true if class cannot be inherited
+ unsigned short noconstruct :1; // true if class cannot be constructed
+ unsigned short compgenx :1; // compiler generated fcn and does exist
+ unsigned short unused :7; // unused
+} CV_fldattr_t;
+
+
+
+// Structures to access to the type records
+
+
+typedef struct TYPTYPE {
+ unsigned short len;
+ unsigned short leaf;
+ unsigned char data[CV_ZEROLEN];
+} TYPTYPE; // general types record
+
+
+__INLINE char *NextType (char * pType) {
+ return (pType + ((TYPTYPE *)pType)->len + sizeof(unsigned short));
+}
+
+typedef enum CV_PMEMBER {
+ CV_PDM16_NONVIRT = 0x00, // 16:16 data no virtual fcn or base
+ CV_PDM16_VFCN = 0x01, // 16:16 data with virtual functions
+ CV_PDM16_VBASE = 0x02, // 16:16 data with virtual bases
+ CV_PDM32_NVVFCN = 0x03, // 16:32 data w/wo virtual functions
+ CV_PDM32_VBASE = 0x04, // 16:32 data with virtual bases
+
+ CV_PMF16_NEARNVSA = 0x05, // 16:16 near method nonvirtual single address point
+ CV_PMF16_NEARNVMA = 0x06, // 16:16 near method nonvirtual multiple address points
+ CV_PMF16_NEARVBASE = 0x07, // 16:16 near method virtual bases
+ CV_PMF16_FARNVSA = 0x08, // 16:16 far method nonvirtual single address point
+ CV_PMF16_FARNVMA = 0x09, // 16:16 far method nonvirtual multiple address points
+ CV_PMF16_FARVBASE = 0x0a, // 16:16 far method virtual bases
+
+ CV_PMF32_NVSA = 0x0b, // 16:32 method nonvirtual single address point
+ CV_PMF32_NVMA = 0x0c, // 16:32 method nonvirtual multiple address point
+ CV_PMF32_VBASE = 0x0d // 16:32 method virtual bases
+} CV_PMEMBER;
+
+
+
+// memory representation of pointer to member. These representations are
+// indexed by the enumeration above in the LF_POINTER record
+
+
+
+
+// representation of a 16:16 pointer to data for a class with no
+// virtual functions or virtual bases
+
+
+struct CV_PDMR16_NONVIRT {
+ CV_off16_t mdisp; // displacement to data (NULL = -1)
+};
+
+
+
+
+// representation of a 16:16 pointer to data for a class with virtual
+// functions
+
+
+struct CV_PMDR16_VFCN {
+ CV_off16_t mdisp; // displacement to data ( NULL = 0)
+};
+
+
+
+
+// representation of a 16:16 pointer to data for a class with
+// virtual bases
+
+
+struct CV_PDMR16_VBASE {
+ CV_off16_t mdisp; // displacement to data
+ CV_off16_t pdisp; // this pointer displacement to vbptr
+ CV_off16_t vdisp; // displacement within vbase table
+ // NULL = (,,0xffff)
+};
+
+
+
+
+// representation of a 16:32 near pointer to data for a class with
+// or without virtual functions and no virtual bases
+
+
+struct CV_PDMR32_NVVFCN {
+ CV_off32_t mdisp; // displacement to data (NULL = 0x80000000)
+};
+
+
+
+
+// representation of a 16:32 near pointer to data for a class
+// with virtual bases
+
+
+struct CV_PDMR32_VBASE {
+ CV_off32_t mdisp; // displacement to data
+ CV_off32_t pdisp; // this pointer displacement
+ CV_off32_t vdisp; // vbase table displacement
+ // NULL = (,,0xffffffff)
+};
+
+
+
+
+// representation of a 16:16 pointer to near member function for a
+// class with no virtual functions or bases and a single address point
+
+
+struct CV_PMFR16_NEARNVSA {
+ CV_uoff16_t off; // near address of function (NULL = 0)
+};
+
+
+
+// representation of a 16:16 near pointer to member functions of a
+// class with no virtual bases and multiple address points
+
+
+struct CV_PMFR16_NEARNVMA {
+ CV_uoff16_t off; // offset of function (NULL = 0,x)
+ signed short disp;
+};
+
+
+
+
+// representation of a 16:16 near pointer to member function of a
+// class with virtual bases
+
+
+struct CV_PMFR16_NEARVBASE {
+ CV_uoff16_t off; // offset of function (NULL = 0,x,x,x)
+ CV_off16_t mdisp; // displacement to data
+ CV_off16_t pdisp; // this pointer displacement
+ CV_off16_t vdisp; // vbase table displacement
+};
+
+
+
+
+// representation of a 16:16 pointer to far member function for a
+// class with no virtual bases and a single address point
+
+
+struct CV_PMFR16_FARNVSA {
+ CV_uoff16_t off; // offset of function (NULL = 0:0)
+ unsigned short seg; // segment of function
+};
+
+
+
+
+// representation of a 16:16 far pointer to member functions of a
+// class with no virtual bases and multiple address points
+
+
+struct CV_PMFR16_FARNVMA {
+ CV_uoff16_t off; // offset of function (NULL = 0:0,x)
+ unsigned short seg;
+ signed short disp;
+};
+
+
+
+
+// representation of a 16:16 far pointer to member function of a
+// class with virtual bases
+
+
+struct CV_PMFR16_FARVBASE {
+ CV_uoff16_t off; // offset of function (NULL = 0:0,x,x,x)
+ unsigned short seg;
+ CV_off16_t mdisp; // displacement to data
+ CV_off16_t pdisp; // this pointer displacement
+ CV_off16_t vdisp; // vbase table displacement
+
+};
+
+
+
+
+// representation of a 16:32 near pointer to member function for a
+// class with no virtual bases and a single address point
+
+
+struct CV_PMFR32_NVSA {
+ CV_uoff32_t off; // near address of function (NULL = 0L)
+};
+
+
+
+
+// representation of a 16:32 near pointer to member function for a
+// class with no virtual bases and multiple address points
+
+
+struct CV_PMFR32_NVMA {
+ CV_uoff32_t off; // near address of function (NULL = 0L,x)
+ CV_off32_t disp;
+};
+
+
+
+
+// representation of a 16:32 near pointer to member function for a
+// class with virtual bases
+
+
+struct CV_PMFR32_VBASE {
+ CV_uoff32_t off; // near address of function (NULL = 0L,x,x,x)
+ CV_off32_t mdisp; // displacement to data
+ CV_off32_t pdisp; // this pointer displacement
+ CV_off32_t vdisp; // vbase table displacement
+};
+
+
+
+
+
+// Easy leaf - used for generic casting to reference leaf field
+// of a subfield of a complex list
+
+typedef struct lfEasy {
+ unsigned short leaf; // LF_...
+} lfEasy;
+
+
+/** The following type records are basically variant records of the
+ * above structure. The "unsigned short leaf" of the above structure and
+ * the "unsigned short leaf" of the following type definitions are the same
+ * symbol. When the OMF record is locked via the MHOMFLock API
+ * call, the address of the "unsigned short leaf" is returned
+ */
+
+
+// Type record for LF_MODIFIER
+
+
+typedef struct lfModifier {
+ unsigned short leaf; // LF_MODIFIER
+ CV_modifier_t attr; // modifier attribute modifier_t
+ CV_typ_t type; // modified type
+} lfModifier;
+
+
+
+
+// type record for LF_POINTER
+
+#ifndef __cplusplus
+typedef struct lfPointer {
+#endif
+ struct lfPointerBody {
+ unsigned short leaf; // LF_POINTER
+ struct lfPointerAttr {
+ unsigned char ptrtype :5; // ordinal specifying pointer type (ptrtype-t)
+ unsigned char ptrmode :3; // ordinal specifying pointer mode (ptrmode_t)
+ unsigned char isflat32 :1; // true if 0:32 pointer
+ unsigned char isvolatile :1; // TRUE if volatile pointer
+ unsigned char isconst :1; // TRUE if const pointer
+ unsigned char isunaligned :1; // TRUE if unaligned pointer
+ unsigned char unused :4;
+ } attr;
+ CV_typ_t utype; // type index of the underlying type
+#if (defined(__cplusplus) || defined(_MSC_VER)) // for C++ and MS compilers that support unnamed unions
+ };
+#else
+ } u;
+#endif
+#ifdef __cplusplus
+typedef struct lfPointer : public lfPointerBody {
+#endif
+ union {
+ struct {
+ CV_typ_t pmclass; // index of containing class for pointer to member
+ unsigned short pmenum; // enumeration specifying pm format
+ } pm;
+ unsigned short bseg; // base segment if PTR_BASE_SEG
+ unsigned char Sym[1]; // copy of base symbol record (including length)
+ struct {
+ CV_typ_t index; // type index if CV_PTR_BASE_TYPE
+ unsigned char name[1]; // name of base type
+ } btype;
+ } pbase;
+} lfPointer;
+
+
+
+
+// type record for LF_ARRAY
+
+
+typedef struct lfArray {
+ unsigned short leaf; // LF_ARRAY
+ CV_typ_t elemtype; // type index of element type
+ CV_typ_t idxtype; // type index of indexing type
+ unsigned char data[CV_ZEROLEN]; // variable length data specifying
+ // size in bytes and name
+} lfArray;
+
+
+
+
+// type record for LF_CLASS, LF_STRUCTURE
+
+
+typedef struct lfClass {
+ unsigned short leaf; // LF_CLASS, LF_STRUCT
+ unsigned short count; // count of number of elements in class
+ CV_typ_t field; // type index of LF_FIELD descriptor list
+ CV_prop_t property; // property attribute field (prop_t)
+ CV_typ_t derived; // type index of derived from list if not zero
+ CV_typ_t vshape; // type index of vshape table for this class
+ unsigned char data[CV_ZEROLEN]; // data describing length of structure in
+ // bytes and name
+} lfClass;
+typedef lfClass lfStructure;
+
+
+
+
+// type record for LF_UNION
+
+
+typedef struct lfUnion {
+ unsigned short leaf; // LF_UNION
+ unsigned short count; // count of number of elements in class
+ CV_typ_t field; // type index of LF_FIELD descriptor list
+ CV_prop_t property; // property attribute field
+ unsigned char data[CV_ZEROLEN]; // variable length data describing length of
+ // structure and name
+} lfUnion;
+
+
+
+
+// type record for LF_ENUM
+
+
+typedef struct lfEnum {
+ unsigned short leaf; // LF_ENUM
+ unsigned short count; // count of number of elements in class
+ CV_typ_t utype; // underlying type of the enum
+ CV_typ_t field; // type index of LF_FIELD descriptor list
+ CV_prop_t property; // property attribute field
+ unsigned char Name[1]; // length prefixed name of enum
+} lfEnum;
+
+
+
+
+// Type record for LF_PROCEDURE
+
+
+typedef struct lfProc {
+ unsigned short leaf; // LF_PROCEDURE
+ CV_typ_t rvtype; // type index of return value
+ unsigned char calltype; // calling convention (CV_call_t)
+ unsigned char reserved; // reserved for future use
+ unsigned short parmcount; // number of parameters
+ CV_typ_t arglist; // type index of argument list
+} lfProc;
+
+
+
+// Type record for member function
+
+
+typedef struct lfMFunc {
+ unsigned short leaf; // LF_MFUNCTION
+ CV_typ_t rvtype; // type index of return value
+ CV_typ_t classtype; // type index of containing class
+ CV_typ_t thistype; // type index of this pointer (model specific)
+ unsigned char calltype; // calling convention (call_t)
+ unsigned char reserved; // reserved for future use
+ unsigned short parmcount; // number of parameters
+ CV_typ_t arglist; // type index of argument list
+ long thisadjust; // this adjuster (long because pad required anyway)
+} lfMFunc;
+
+
+
+
+// type record for virtual function table shape
+
+
+typedef struct lfVTShape {
+ unsigned short leaf; // LF_VTSHAPE
+ unsigned short count; // number of entries in vfunctable
+ unsigned char desc[CV_ZEROLEN]; // 4 bit (CV_VTS_desc) descriptors
+} lfVTShape;
+
+
+
+
+// type record for cobol0
+
+
+typedef struct lfCobol0 {
+ unsigned short leaf; // LF_COBOL0
+ CV_typ_t type; // parent type record index
+ unsigned char data[CV_ZEROLEN];
+} lfCobol0;
+
+
+
+
+// type record for cobol1
+
+
+typedef struct lfCobol1 {
+ unsigned short leaf; // LF_COBOL1
+ unsigned char data[CV_ZEROLEN];
+} lfCobol1;
+
+
+
+
+// type record for basic array
+
+
+typedef struct lfBArray {
+ unsigned short leaf; // LF_BARRAY
+ CV_typ_t utype; // type index of underlying type
+} lfBArray;
+
+// type record for assembler labels
+
+
+typedef struct lfLabel {
+ unsigned short leaf; // LF_LABEL
+ unsigned short mode; // addressing mode of label
+} lfLabel;
+
+
+
+// type record for dimensioned arrays
+
+
+typedef struct lfDimArray {
+ unsigned short leaf; // LF_DIMARRAY
+ CV_typ_t utype; // underlying type of the array
+ CV_typ_t diminfo; // dimension information
+ unsigned char name[1]; // length prefixed name
+} lfDimArray;
+
+
+
+// type record describing path to virtual function table
+
+
+typedef struct lfVFTPath {
+ unsigned short leaf; // LF_VFTPATH
+ unsigned short count; // count of number of bases in path
+ CV_typ_t base[1]; // bases from root to leaf
+} lfVFTPath;
+
+
+// type record describing inclusion of precompiled types
+
+
+typedef struct lfPreComp {
+ unsigned short leaf; // LF_PRECOMP
+ unsigned short start; // starting type index included
+ unsigned short count; // number of types in inclusion
+ unsigned long signature; // signature
+ unsigned char name[CV_ZEROLEN]; // length prefixed name of included type file
+} lfPreComp;
+
+
+// type record describing end of precompiled types that can be
+// included by another file
+
+
+typedef struct lfEndPreComp {
+ unsigned short leaf; // LF_ENDPRECOMP
+ unsigned long signature; // signature
+} lfEndPreComp;
+
+
+
+
+
+// type record for OEM definable type strings
+
+
+typedef struct lfOEM {
+ unsigned short leaf; // LF_OEM
+ unsigned short cvOEM; // MS assigned OEM identified
+ unsigned short recOEM; // OEM assigned type identifier
+ unsigned short count; // count of type indices to follow
+ CV_typ_t index[CV_ZEROLEN]; // array of type indices followed
+ // by OEM defined data
+} lfOEM;
+
+#define OEM_MS_FORTRAN90 0xF090
+#define OEM_ODI 0x0010
+#define OEM_THOMSON_SOFTWARE 0x5453
+#define OEM_ODI_REC_BASELIST 0x0000
+
+
+// type record describing using of a type server
+
+typedef struct lfTypeServer {
+ unsigned short leaf; // LF_TYPESERVER
+ unsigned long signature; // signature
+ unsigned long age; // age of database used by this module
+ unsigned char name[CV_ZEROLEN]; // length prefixed name of PDB
+} lfTypeServer;
+
+// description of type records that can be referenced from
+// type records referenced by symbols
+
+
+
+// type record for skip record
+
+
+typedef struct lfSkip {
+ unsigned short leaf; // LF_SKIP
+ CV_typ_t type; // next valid index
+ unsigned char data[CV_ZEROLEN]; // pad data
+} lfSkip;
+
+
+
+// argument list leaf
+
+
+typedef struct lfArgList {
+ unsigned short leaf; // LF_ARGLIST
+ unsigned short count; // number of arguments
+ CV_typ_t arg[CV_ZEROLEN]; // number of arguments
+} lfArgList;
+
+
+
+
+// derived class list leaf
+
+
+typedef struct lfDerived {
+ unsigned short leaf; // LF_DERIVED
+ unsigned short count; // number of arguments
+ CV_typ_t drvdcls[CV_ZEROLEN]; // type indices of derived classes
+} lfDerived;
+
+
+
+
+// leaf for default arguments
+
+
+typedef struct lfDefArg {
+ unsigned short leaf; // LF_DEFARG
+ CV_typ_t type; // type of resulting expression
+ unsigned char expr[CV_ZEROLEN]; // length prefixed expression string
+} lfDefArg;
+
+
+
+// list leaf
+// This list should no longer be used because the utilities cannot
+// verify the contents of the list without knowing what type of list
+// it is. New specific leaf indices should be used instead.
+
+
+typedef struct lfList {
+ unsigned short leaf; // LF_LIST
+ char data[CV_ZEROLEN]; // data format specified by indexing type
+} lfList;
+
+
+
+
+// field list leaf
+// This is the header leaf for a complex list of class and structure
+// subfields.
+
+
+typedef struct lfFieldList {
+ unsigned short leaf; // LF_FIELDLIST
+ char data[CV_ZEROLEN]; // field list sub lists
+} lfFieldList;
+
+
+
+
+
+
+
+// type record for non-static methods and friends in overloaded method list
+
+typedef struct mlMethod {
+ CV_fldattr_t attr; // method attribute
+ CV_typ_t index; // index to type record for procedure
+ unsigned long vbaseoff[CV_ZEROLEN]; // offset in vfunctable if intro virtual
+} mlMethod;
+
+
+typedef struct lfMethodList {
+ unsigned short leaf;
+ unsigned char mList[CV_ZEROLEN]; // really a mlMethod type
+} lfMethodList;
+
+
+
+
+
+// type record for LF_BITFIELD
+
+
+typedef struct lfBitfield {
+ unsigned short leaf; // LF_BITFIELD
+ unsigned char length;
+ unsigned char position;
+ CV_typ_t type; // type of bitfield
+
+} lfBitfield;
+
+
+
+
+// type record for dimensioned array with constant bounds
+
+
+typedef struct lfDimCon {
+ unsigned short leaf; // LF_DIMCONU or LF_DIMCONLU
+ unsigned short rank; // number of dimensions
+ CV_typ_t typ; // type of index
+ unsigned char dim[CV_ZEROLEN]; // array of dimension information with
+ // either upper bounds or lower/upper bound
+} lfDimCon;
+
+
+
+
+// type record for dimensioned array with variable bounds
+
+
+typedef struct lfDimVar {
+ unsigned short leaf; // LF_DIMVARU or LF_DIMVARLU
+ unsigned short rank; // number of dimensions
+ CV_typ_t typ; // type of index
+ unsigned char dim[CV_ZEROLEN]; // array of type indices for either
+ // variable upper bound or variable
+ // lower/upper bound. The referenced
+ // types must be LF_REFSYM or T_VOID
+} lfDimVar;
+
+
+
+
+// type record for referenced symbol
+
+
+typedef struct lfRefSym {
+ unsigned short leaf; // LF_REFSYM
+ unsigned char Sym[1]; // copy of referenced symbol record
+ // (including length)
+} lfRefSym;
+
+
+
+
+
+/** the following are numeric leaves. They are used to indicate the
+ * size of the following variable length data. When the numeric
+ * data is a single byte less than 0x8000, then the data is output
+ * directly. If the data is more the 0x8000 or is a negative value,
+ * then the data is preceeded by the proper index.
+ */
+
+
+
+// signed character leaf
+
+typedef struct lfChar {
+ unsigned short leaf; // LF_CHAR
+ signed char val; // signed 8-bit value
+} lfChar;
+
+
+
+
+// signed short leaf
+
+typedef struct lfShort {
+ unsigned short leaf; // LF_SHORT
+ short val; // signed 16-bit value
+} lfShort;
+
+
+
+
+// unsigned short leaf
+
+typedef struct lfUShort {
+ unsigned short leaf; // LF_unsigned short
+ unsigned short val; // unsigned 16-bit value
+} lfUShort;
+
+
+
+
+// signed long leaf
+
+typedef struct lfLong {
+ unsigned short leaf; // LF_LONG
+ long val; // signed 32-bit value
+} lfLong;
+
+
+
+
+// unsigned long leaf
+
+typedef struct lfULong {
+ unsigned short leaf; // LF_ULONG
+ unsigned long val; // unsigned 32-bit value
+} lfULong;
+
+
+
+
+// signed quad leaf
+
+typedef struct lfQuad {
+ unsigned short leaf; // LF_QUAD
+ unsigned char val[8]; // signed 64-bit value
+} lfQuad;
+
+
+
+
+// unsigned quad leaf
+
+typedef struct lfUQuad {
+ unsigned short leaf; // LF_UQUAD
+ unsigned char val[8]; // unsigned 64-bit value
+} lfUQuad;
+
+
+// signed int128 leaf
+
+typedef struct lfOct {
+ unsigned short leaf; // LF_OCT
+ unsigned char val[16]; // signed 128-bit value
+} lfOct;
+
+// unsigned int128 leaf
+
+typedef struct lfUOct {
+ unsigned short leaf; // LF_UOCT
+ unsigned char val[16]; // unsigned 128-bit value
+} lfUOct;
+
+
+
+
+// real 32-bit leaf
+
+typedef struct lfReal32 {
+ unsigned short leaf; // LF_REAL32
+ float val; // 32-bit real value
+} lfReal32;
+
+
+
+
+// real 48-bit leaf
+
+typedef struct lfReal48 {
+ unsigned short leaf; // LF_REAL48
+ unsigned char val[6]; // 48-bit real value
+} lfReal48;
+
+
+
+
+// real 64-bit leaf
+
+typedef struct lfReal64 {
+ unsigned short leaf; // LF_REAL64
+ double val; // 64-bit real value
+} lfReal64;
+
+
+
+
+// real 80-bit leaf
+
+typedef struct lfReal80 {
+ unsigned short leaf; // LF_REAL80
+ FLOAT10 val; // real 80-bit value
+} lfReal80;
+
+
+
+
+// real 128-bit leaf
+
+typedef struct lfReal128 {
+ unsigned short leaf; // LF_REAL128
+ char val[16]; // real 128-bit value
+} lfReal128;
+
+
+
+
+// complex 32-bit leaf
+
+typedef struct lfCmplx32 {
+ unsigned short leaf; // LF_COMPLEX32
+ float val_real; // real component
+ float val_imag; // imaginary component
+} lfCmplx32;
+
+
+
+
+// complex 64-bit leaf
+
+typedef struct lfCmplx64 {
+ unsigned short leaf; // LF_COMPLEX64
+ double val_real; // real component
+ double val_imag; // imaginary component
+} flCmplx64;
+
+
+
+
+// complex 80-bit leaf
+
+typedef struct lfCmplx80 {
+ unsigned short leaf; // LF_COMPLEX80
+ FLOAT10 val_real; // real component
+ FLOAT10 val_imag; // imaginary component
+} lfCmplx80;
+
+
+
+
+// complex 128-bit leaf
+
+typedef struct lfCmplx128 {
+ unsigned short leaf; // LF_COMPLEX128
+ char val_real[16]; // real component
+ char val_imag[16]; // imaginary component
+} lfCmplx128;
+
+
+
+// variable length numeric field
+
+typedef struct lfVarString {
+ unsigned short leaf; // LF_VARSTRING
+ unsigned short len; // length of value in bytes
+ unsigned char value[CV_ZEROLEN]; // value
+} lfVarString;
+
+//***********************************************************************
+
+
+// index leaf - contains type index of another leaf
+// a major use of this leaf is to allow the compilers to emit a
+// long complex list (LF_FIELD) in smaller pieces.
+
+typedef struct lfIndex {
+ unsigned short leaf; // LF_INDEX
+ CV_typ_t index; // type index of referenced leaf
+} lfIndex;
+
+
+// subfield record for base class field
+
+typedef struct lfBClass {
+ unsigned short leaf; // LF_BCLASS
+ CV_typ_t index; // type index of base class
+ CV_fldattr_t attr; // attribute
+ unsigned char offset[CV_ZEROLEN]; // variable length offset of base within class
+} lfBClass;
+
+
+
+
+
+// subfield record for direct and indirect virtual base class field
+
+typedef struct lfVBClass {
+ unsigned short leaf; // LF_VBCLASS | LV_IVBCLASS
+ CV_typ_t index; // type index of direct virtual base class
+ CV_typ_t vbptr; // type index of virtual base pointer
+ CV_fldattr_t attr; // attribute
+ unsigned char vbpoff[CV_ZEROLEN]; // virtual base pointer offset from address point
+ // followed by virtual base offset from vbtable
+} lfVBClass;
+
+
+
+
+
+// subfield record for friend class
+
+
+typedef struct lfFriendCls {
+ unsigned short leaf; // LF_FRIENDCLS
+ CV_typ_t index; // index to type record of friend class
+} lfFriendCls;
+
+
+
+
+
+// subfield record for friend function
+
+
+typedef struct lfFriendFcn {
+ unsigned short leaf; // LF_FRIENDFCN
+ CV_typ_t index; // index to type record of friend function
+ unsigned char Name[1]; // name of friend function
+} lfFriendFcn;
+
+
+
+// subfield record for non-static data members
+
+typedef struct lfMember {
+ unsigned short leaf; // LF_MEMBER
+ CV_typ_t index; // index of type record for field
+ CV_fldattr_t attr; // attribute mask
+ unsigned char offset[CV_ZEROLEN]; // variable length offset of field followed
+ // by length prefixed name of field
+} lfMember;
+
+
+
+// type record for static data members
+
+typedef struct lfSTMember {
+ unsigned short leaf; // LF_STMEMBER
+ CV_typ_t index; // index of type record for field
+ CV_fldattr_t attr; // attribute mask
+ unsigned char Name[1]; // length prefixed name of field
+} lfSTMember;
+
+
+
+// subfield record for virtual function table pointer
+
+typedef struct lfVFuncTab {
+ unsigned short leaf; // LF_VFUNCTAB
+ CV_typ_t type; // type index of pointer
+} lfVFuncTab;
+
+
+
+// subfield record for virtual function table pointer with offset
+
+typedef struct lfVFuncOff {
+ unsigned short leaf; // LF_VFUNCTAB
+ CV_typ_t type; // type index of pointer
+ CV_off32_t offset; // offset of virtual function table pointer
+} lfVFuncOff;
+
+
+
+// subfield record for overloaded method list
+
+
+typedef struct lfMethod {
+ unsigned short leaf; // LF_METHOD
+ unsigned short count; // number of occurances of function
+ CV_typ_t mList; // index to LF_METHODLIST record
+ unsigned char Name[1]; // length prefixed name of method
+} lfMethod;
+
+
+
+// subfield record for nonoverloaded method
+
+
+typedef struct lfOneMethod {
+ unsigned short leaf; // LF_ONEMETHOD
+ CV_fldattr_t attr; // method attribute
+ CV_typ_t index; // index to type record for procedure
+ unsigned long vbaseoff[CV_ZEROLEN]; // offset in vfunctable if
+ // intro virtual followed by
+ // length prefixed name of method
+} lfOneMethod;
+
+
+// subfield record for enumerate
+
+typedef struct lfEnumerate {
+ unsigned short leaf; // LF_ENUMERATE
+ CV_fldattr_t attr; // access
+ unsigned char value[CV_ZEROLEN]; // variable length value field followed
+ // by length prefixed name
+} lfEnumerate;
+
+
+// type record for nested (scoped) type definition
+
+typedef struct lfNestType {
+ unsigned short leaf; // LF_NESTTYPE
+ CV_typ_t index; // index of nested type definition
+ unsigned char Name[1]; // length prefixed type name
+} lfNestType;
+
+// type record for nested (scoped) type definition, with attributes
+
+typedef struct lfNestTypeEx {
+ unsigned short leaf; // LF_NESTTYPEEX
+ CV_typ_t index; // index of nested type definition
+ CV_fldattr_t attr; // member access
+ unsigned char Name[1]; // length prefixed type name
+} lfNestTypeEx;
+
+// type record for modifications to members
+
+typedef struct lfMemberModify {
+ unsigned short leaf; // LF_MEMBERMODIFY
+ CV_typ_t index; // index of base class type definition
+ CV_fldattr_t attr; // the new attributes
+ unsigned char Name[1]; // length prefixed member name
+} lfMemberModify;
+
+// type record for pad leaf
+
+typedef struct lfPad {
+ unsigned char leaf;
+} SYM_PAD;
+
+
+
+// Symbol definitions
+
+typedef enum SYM_ENUM_e {
+ S_COMPILE = 0x0001, // Compile flags symbol
+ S_REGISTER = 0x0002, // Register variable
+ S_CONSTANT = 0x0003, // constant symbol
+ S_UDT = 0x0004, // User defined type
+ S_SSEARCH = 0x0005, // Start Search
+ S_END = 0x0006, // Block, procedure, "with" or thunk end
+ S_SKIP = 0x0007, // Reserve symbol space in $$Symbols table
+ S_CVRESERVE = 0x0008, // Reserved symbol for CV internal use
+ S_OBJNAME = 0x0009, // path to object file name
+ S_ENDARG = 0x000a, // end of argument/return list
+ S_COBOLUDT = 0x000b, // special UDT for cobol that does not symbol pack
+ S_MANYREG = 0x000c, // multiple register variable
+ S_RETURN = 0x000d, // return description symbol
+ S_ENTRYTHIS = 0x000e, // description of this pointer on entry
+
+ S_BPREL16 = 0x0100, // BP-relative
+ S_LDATA16 = 0x0101, // Module-local symbol
+ S_GDATA16 = 0x0102, // Global data symbol
+ S_PUB16 = 0x0103, // a public symbol
+ S_LPROC16 = 0x0104, // Local procedure start
+ S_GPROC16 = 0x0105, // Global procedure start
+ S_THUNK16 = 0x0106, // Thunk Start
+ S_BLOCK16 = 0x0107, // block start
+ S_WITH16 = 0x0108, // with start
+ S_LABEL16 = 0x0109, // code label
+ S_CEXMODEL16 = 0x010a, // change execution model
+ S_VFTABLE16 = 0x010b, // address of virtual function table
+ S_REGREL16 = 0x010c, // register relative address
+
+ S_BPREL32 = 0x0200, // BP-relative
+ S_LDATA32 = 0x0201, // Module-local symbol
+ S_GDATA32 = 0x0202, // Global data symbol
+ S_PUB32 = 0x0203, // a public symbol (CV internal reserved)
+ S_LPROC32 = 0x0204, // Local procedure start
+ S_GPROC32 = 0x0205, // Global procedure start
+ S_THUNK32 = 0x0206, // Thunk Start
+ S_BLOCK32 = 0x0207, // block start
+ S_WITH32 = 0x0208, // with start
+ S_LABEL32 = 0x0209, // code label
+ S_CEXMODEL32 = 0x020a, // change execution model
+ S_VFTABLE32 = 0x020b, // address of virtual function table
+ S_REGREL32 = 0x020c, // register relative address
+ S_LTHREAD32 = 0x020d, // local thread storage
+ S_GTHREAD32 = 0x020e, // global thread storage
+ S_SLINK32 = 0x020f, // static link for MIPS EH implementation
+
+ S_LPROCMIPS = 0x0300, // Local procedure start
+ S_GPROCMIPS = 0x0301, // Global procedure start
+
+ S_PROCREF = 0x0400, // Reference to a procedure
+ S_DATAREF = 0x0401, // Reference to data
+ S_ALIGN = 0x0402, // Used for page alignment of symbols
+ S_LPROCREF = 0x0403 // Local Reference to a procedure
+} SYM_ENUM_e;
+
+
+
+
+// enum describing the compile flag source language
+
+
+typedef enum CV_CFL_LANG {
+ CV_CFL_C = 0x00,
+ CV_CFL_CXX = 0x01,
+ CV_CFL_FORTRAN = 0x02,
+ CV_CFL_MASM = 0x03,
+ CV_CFL_PASCAL = 0x04,
+ CV_CFL_BASIC = 0x05,
+ CV_CFL_COBOL = 0x06,
+ CV_CFL_LINK = 0x07,
+ CV_CFL_CVTRES = 0x08,
+} CV_CFL_LANG;
+
+
+
+// enum describing target processor
+
+
+typedef enum CV_CPU_TYPE_e {
+ CV_CFL_8080 = 0x00,
+ CV_CFL_8086 = 0x01,
+ CV_CFL_80286 = 0x02,
+ CV_CFL_80386 = 0x03,
+ CV_CFL_80486 = 0x04,
+ CV_CFL_PENTIUM = 0x05,
+ CV_CFL_MIPSR4000 = 0x10,
+ CV_CFL_M68000 = 0x20,
+ CV_CFL_M68010 = 0x21,
+ CV_CFL_M68020 = 0x22,
+ CV_CFL_M68030 = 0x23,
+ CV_CFL_M68040 = 0x24,
+ CV_CFL_ALPHA = 0x30,
+ CV_CFL_PPC601 = 0x40,
+ CV_CFL_PPC603 = 0x41,
+ CV_CFL_PPC604 = 0x42,
+ CV_CFL_PPC620 = 0x43
+
+} CV_CPU_TYPE_e;
+
+
+
+
+// enum describing compile flag ambiant data model
+
+
+typedef enum CV_CFL_DATA {
+ CV_CFL_DNEAR = 0x00,
+ CV_CFL_DFAR = 0x01,
+ CV_CFL_DHUGE = 0x02
+} CV_CFL_DATA;
+
+
+
+
+// enum describing compile flag ambiant code model
+
+
+typedef enum CV_CFL_CODE_e {
+ CV_CFL_CNEAR = 0x00,
+ CV_CFL_CFAR = 0x01,
+ CV_CFL_CHUGE = 0x02
+} CV_CFL_CODE_e;
+
+
+
+
+// enum describing compile flag target floating point package
+
+typedef enum CV_CFL_FPKG_e {
+ CV_CFL_NDP = 0x00,
+ CV_CFL_EMU = 0x01,
+ CV_CFL_ALT = 0x02
+} CV_CFL_FPKG_e;
+
+
+// enum describing function return method
+
+
+typedef struct CV_PROCFLAGS {
+ union {
+ unsigned char bAll;
+ struct {
+ unsigned char CV_PFLAG_NOFPO:1; // frame pointer present
+ unsigned char CV_PFLAG_INT :1; // interrupt return
+ unsigned char CV_PFLAG_FAR :1; // far return
+ unsigned char CV_PFLAG_NEVER:1; // function does not return
+ unsigned char unused :4; //
+ };
+ };
+} CV_PROCFLAGS;
+
+
+// enum describing function data return method
+
+typedef enum CV_GENERIC_STYLE_e {
+ CV_GENERIC_VOID = 0x00, // void return type
+ CV_GENERIC_REG = 0x01, // return data is in registers
+ CV_GENERIC_ICAN = 0x02, // indirect caller allocated near
+ CV_GENERIC_ICAF = 0x03, // indirect caller allocated far
+ CV_GENERIC_IRAN = 0x04, // indirect returnee allocated near
+ CV_GENERIC_IRAF = 0x05, // indirect returnee allocated far
+ CV_GENERIC_UNUSED = 0x06 // first unused
+} CV_GENERIC_STYLE_e;
+
+
+typedef struct CV_GENERIC_FLAG {
+ unsigned short cstyle :1; // true push varargs right to left
+ unsigned short rsclean :1; // true if returnee stack cleanup
+ unsigned short unused :14; // unused
+} CV_GENERIC_FLAG;
+
+
+
+
+
+typedef struct SYMTYPE {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // Record type
+ char data[CV_ZEROLEN];
+} SYMTYPE;
+
+__INLINE SYMTYPE *NextSym (SYMTYPE * pSym) {
+ return (SYMTYPE *) ((char *)pSym + pSym->reclen + sizeof(unsigned short));
+}
+
+// non-model specific symbol types
+
+
+
+typedef struct REGSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_REGISTER
+ CV_typ_t typind; // Type index
+ unsigned short reg; // register enumerate
+ unsigned char name[1]; // Length-prefixed name
+} REGSYM;
+
+
+
+typedef struct MANYREGSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_MANYREG
+ CV_typ_t typind; // Type index
+ unsigned char count; // count of number of registers
+ unsigned char reg[1]; // count register enumerates followed by
+ // length-prefixed name. Registers are
+ // most significant first.
+} MANYREGSYM;
+
+
+
+typedef struct CONSTSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_CONSTANT
+ CV_typ_t typind; // Type index (containing enum if enumerate)
+ unsigned short value; // numeric leaf containing value
+ unsigned char name[CV_ZEROLEN]; // Length-prefixed name
+} CONSTSYM;
+
+typedef struct UDTSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_UDT | S_COBOLUDT
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} UDTSYM;
+
+typedef struct SEARCHSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_SSEARCH
+ unsigned long startsym; // offset of the procedure
+ unsigned short seg; // segment of symbol
+} SEARCHSYM;
+
+typedef struct CFLAGSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_COMPILE
+ unsigned char machine; // target processor
+ struct {
+ unsigned char language :8; // language index
+ unsigned char pcode :1; // true if pcode present
+ unsigned char floatprec :2; // floating precision
+ unsigned char floatpkg :2; // float package
+ unsigned char ambdata :3; // ambiant data model
+ unsigned char ambcode :3; // ambiant code model
+ unsigned char mode32 :1; // true if compiled 32 bit mode
+ unsigned char pad :4; // reserved
+ } flags;
+ unsigned char ver[1]; // Length-prefixed compiler version string
+} CFLAGSYM;
+
+
+
+
+
+typedef struct OBJNAMESYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_OBJNAME
+ unsigned long signature; // signature
+ unsigned char name[1]; // Length-prefixed name
+} OBJNAMESYM;
+
+
+
+
+typedef struct ENDARGSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_ENDARG
+} ENDARGSYM;
+
+
+typedef struct RETURNSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_RETURN
+ CV_GENERIC_FLAG flags; // flags
+ CV_GENERIC_STYLE_e style; // return style
+ // followed by return method data
+} RETURNSYM;
+
+
+typedef struct ENTRYTHISSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_ENTRYTHIS
+ unsigned char thissym; // symbol describing this pointer on entry
+} ENTRYTHISSYM;
+
+
+// symbol types for 16:16 memory model
+
+
+typedef struct BPRELSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_BPREL16
+ CV_off16_t off; // BP-relative offset
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} BPRELSYM16;
+
+
+
+typedef struct DATASYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_LDATA or S_GDATA
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} DATASYM16;
+typedef DATASYM16 PUBSYM16;
+
+
+typedef struct PROCSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_GPROC16 or S_LPROC16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+ unsigned short len; // Proc length
+ unsigned short DbgStart; // Debug start offset
+ unsigned short DbgEnd; // Debug end offset
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ CV_typ_t typind; // Type index
+ CV_PROCFLAGS flags; // Proc flags
+ unsigned char name[1]; // Length-prefixed name
+} PROCSYM16;
+
+
+
+
+typedef struct THUNKSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_THUNK
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ unsigned short len; // length of thunk
+ unsigned char ord; // ordinal specifying type of thunk
+ unsigned char name[1]; // name of thunk
+ unsigned char variant[CV_ZEROLEN]; // variant portion of thunk
+} THUNKSYM16;
+
+typedef enum {
+ THUNK_ORDINAL_NOTYPE,
+ THUNK_ORDINAL_ADJUSTOR,
+ THUNK_ORDINAL_VCALL,
+ THUNK_ORDINAL_PCODE
+} THUNK_ORDINAL;
+
+typedef struct LABELSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_LABEL16
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ CV_PROCFLAGS flags; // flags
+ unsigned char name[1]; // Length-prefixed name
+} LABELSYM16;
+
+typedef struct BLOCKSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_BLOCK16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned short len; // Block length
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ unsigned char name[1]; // Length-prefixed name
+} BLOCKSYM16;
+
+typedef struct WITHSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_WITH16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned short len; // Block length
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ unsigned char expr[1]; // Length-prefixed expression
+} WITHSYM16;
+
+
+
+
+typedef enum CEXM_MODEL_e {
+ CEXM_MDL_table = 0x00, // not executable
+ CEXM_MDL_jumptable = 0x01, // Compiler generated jump table
+ CEXM_MDL_datapad = 0x02, // Data padding for alignment
+ CEXM_MDL_native = 0x20, // native (actually not-pcode)
+ CEXM_MDL_cobol = 0x21, // cobol
+ CEXM_MDL_codepad = 0x22, // Code padding for alignment
+ CEXM_MDL_code = 0x23, // code
+ CEXM_MDL_pcode = 0x40, // pcode
+ CEXM_MDL_pcode32Mac = 0x41, // macintosh 32 bit pcode
+ CEXM_MDL_pcode32MacNep = 0x42 // macintosh 32 bit pcode native entry point
+} CEXM_MODEL_e;
+
+typedef enum CV_COBOL_e {
+ CV_COBOL_dontstop,
+ CV_COBOL_pfm,
+ CV_COBOL_false,
+ CV_COBOL_extcall
+} CV_COBOL_e;
+
+typedef struct CEXMSYM16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_CEXMODEL16
+ CV_uoff16_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ unsigned short model; // execution model
+ union var16 {
+ struct {
+ CV_uoff16_t pcdtable; // offset to pcode function table
+ CV_uoff16_t pcdspi; // offset to segment pcode information
+ } pcode;
+ struct {
+ unsigned short subtype; // see CV_COBOL_e above
+ unsigned short flag;
+ } cobol;
+ };
+} CEXMSYM16;
+
+
+
+
+typedef struct VPATHSYM16 {
+ unsigned short reclen; // record length
+ unsigned short rectyp; // S_VFTPATH16
+ CV_uoff16_t off; // offset of virtual function table
+ unsigned short seg; // segment of virtual function table
+ CV_typ_t root; // type index of the root of path
+ CV_typ_t path; // type index of the path record
+} VPATHSYM16;
+
+
+
+
+typedef struct REGREL16 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_REGREL16
+ CV_uoff16_t off; // offset of symbol
+ unsigned short reg; // register index
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} REGREL16;
+
+
+
+
+
+typedef struct BPRELSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_BPREL32
+ CV_off32_t off; // BP-relative offset
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} BPRELSYM32;
+
+typedef struct DATASYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_LDATA32, S_GDATA32 or S_PUB32
+ CV_uoff32_t off;
+ unsigned short seg;
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} DATASYM32;
+typedef DATASYM32 PUBSYM32;
+
+
+
+typedef struct PROCSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_GPROC32 or S_LPROC32
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+ unsigned long len; // Proc length
+ unsigned long DbgStart; // Debug start offset
+ unsigned long DbgEnd; // Debug end offset
+ CV_uoff32_t off;
+ unsigned short seg;
+ CV_typ_t typind; // Type index
+ CV_PROCFLAGS flags; // Proc flags
+ unsigned char name[1]; // Length-prefixed name
+} PROCSYM32;
+
+
+
+
+typedef struct THUNKSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_THUNK32
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+ CV_uoff32_t off;
+ unsigned short seg;
+ unsigned short len; // length of thunk
+ unsigned char ord; // ordinal specifying type of thunk
+ unsigned char name[1]; // Length-prefixed name
+ unsigned char variant[CV_ZEROLEN]; // variant portion of thunk
+} THUNKSYM32;
+
+
+
+
+typedef struct LABELSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_LABEL32
+ CV_uoff32_t off;
+ unsigned short seg;
+ CV_PROCFLAGS flags; // flags
+ unsigned char name[1]; // Length-prefixed name
+} LABELSYM32;
+
+
+typedef struct BLOCKSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_BLOCK32
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long len; // Block length
+ CV_uoff32_t off; // Offset in code segment
+ unsigned short seg; // segment of label
+ unsigned char name[1]; // Length-prefixed name
+} BLOCKSYM32;
+
+
+typedef struct WITHSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_WITH32
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long len; // Block length
+ CV_uoff32_t off; // Offset in code segment
+ unsigned short seg; // segment of label
+ unsigned char expr[1]; // Length-prefixed expression string
+} WITHSYM32;
+
+
+
+typedef struct CEXMSYM32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_CEXMODEL32
+ CV_uoff32_t off; // offset of symbol
+ unsigned short seg; // segment of symbol
+ unsigned short model; // execution model
+ union var32 {
+ struct {
+ CV_uoff32_t pcdtable; // offset to pcode function table
+ CV_uoff32_t pcdspi; // offset to segment pcode information
+ } pcode;
+ struct {
+ unsigned short subtype; // see CV_COBOL_e above
+ unsigned short flag;
+ } cobol;
+ struct {
+ CV_uoff32_t calltableOff; // offset to function table
+ unsigned short calltableSeg; // segment of function table
+ } pcode32Mac;
+ };
+} CEXMSYM32;
+
+
+
+typedef struct VPATHSYM32 {
+ unsigned short reclen; // record length
+ unsigned short rectyp; // S_VFTPATH32
+ CV_uoff32_t off; // offset of virtual function table
+ unsigned short seg; // segment of virtual function table
+ CV_typ_t root; // type index of the root of path
+ CV_typ_t path; // type index of the path record
+} VPATHSYM32;
+
+
+
+
+
+typedef struct REGREL32 {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_REGREL32
+ CV_uoff32_t off; // offset of symbol
+ unsigned short reg; // register index for symbol
+ CV_typ_t typind; // Type index
+ unsigned char name[1]; // Length-prefixed name
+} REGREL32, *LPREGREL32;
+
+
+
+typedef struct THREADSYM32 {
+ unsigned short reclen; // record length
+ unsigned short rectyp; // S_LTHREAD32 | S_GTHREAD32
+ CV_uoff32_t off; // offset into thread storage
+ unsigned short seg; // segment of thread storage
+ CV_typ_t typind; // type index
+ unsigned char name[1]; // length prefixed name
+} THREADSYM32;
+
+typedef struct SLINK32 {
+ unsigned short reclen; // record length
+ unsigned short rectyp; // S_SLINK32
+ unsigned long framesize; // frame size of parent procedure
+ CV_off32_t off; // signed offset where the static link was saved relative to the value of reg
+ unsigned short reg;
+} SLINK32;
+
+typedef struct PROCSYMMIPS {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_GPROCMIPS or S_LPROCMIPS
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+ unsigned long len; // Proc length
+ unsigned long DbgStart; // Debug start offset
+ unsigned long DbgEnd; // Debug end offset
+ unsigned long regSave; // int register save mask
+ unsigned long fpSave; // fp register save mask
+ CV_uoff32_t intOff; // int register save offset
+ CV_uoff32_t fpOff; // fp register save offset
+ CV_uoff32_t off; // Symbol offset
+ unsigned short seg; // Symbol segment
+ CV_typ_t typind; // Type index
+ unsigned char retReg; // Register return value is in
+ unsigned char frameReg; // Frame pointer register
+ unsigned char name[1]; // Length-prefixed name
+} PROCSYMMIPS, *PROCPTRMIPS;
+
+
+typedef struct REFSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_PROCREF or S_DATAREF
+ unsigned long sumName; // SUC of the name
+ unsigned long ibSym; // Offset of actual symbol in $$Symbols
+ unsigned short imod; // Module containing the actual symbol
+ unsigned short usFill; // align this record
+} REFSYM;
+
+typedef struct ALIGNSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_PROCREF or S_DATAREF
+} ALIGNSYM;
+
+// generic block definition symbols
+// these are similar to the equivalent 16:16 or 16:32 symbols but
+// only define the length, type and linkage fields
+
+typedef struct PROCSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_GPROC16 or S_LPROC16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+} PROCSYM;
+
+
+typedef struct THUNKSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_THUNK
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+ unsigned long pNext; // pointer to next symbol
+} THUNKSYM;
+
+typedef struct BLOCKSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_BLOCK16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+} BLOCKSYM;
+
+
+typedef struct WITHSYM {
+ unsigned short reclen; // Record length
+ unsigned short rectyp; // S_WITH16
+ unsigned long pParent; // pointer to the parent
+ unsigned long pEnd; // pointer to this blocks end
+} WITHSYM;
+
+
+typedef enum CV_HREG_e {
+ // Register set for the Intel 80x86 and ix86 processor series
+ // (plus PCODE registers)
+
+ CV_REG_NONE = 0,
+ CV_REG_AL = 1,
+ CV_REG_CL = 2,
+ CV_REG_DL = 3,
+ CV_REG_BL = 4,
+ CV_REG_AH = 5,
+ CV_REG_CH = 6,
+ CV_REG_DH = 7,
+ CV_REG_BH = 8,
+ CV_REG_AX = 9,
+ CV_REG_CX = 10,
+ CV_REG_DX = 11,
+ CV_REG_BX = 12,
+ CV_REG_SP = 13,
+ CV_REG_BP = 14,
+ CV_REG_SI = 15,
+ CV_REG_DI = 16,
+ CV_REG_EAX = 17,
+ CV_REG_ECX = 18,
+ CV_REG_EDX = 19,
+ CV_REG_EBX = 20,
+ CV_REG_ESP = 21,
+ CV_REG_EBP = 22,
+ CV_REG_ESI = 23,
+ CV_REG_EDI = 24,
+ CV_REG_ES = 25,
+ CV_REG_CS = 26,
+ CV_REG_SS = 27,
+ CV_REG_DS = 28,
+ CV_REG_FS = 29,
+ CV_REG_GS = 30,
+ CV_REG_IP = 31,
+ CV_REG_FLAGS = 32,
+ CV_REG_EIP = 33,
+ CV_REG_EFLAGS = 34,
+ CV_REG_TEMP = 40, // PCODE Temp
+ CV_REG_TEMPH = 41, // PCODE TempH
+ CV_REG_QUOTE = 42, // PCODE Quote
+ CV_REG_PCDR3 = 43, // PCODE reserved
+ CV_REG_PCDR4 = 44, // PCODE reserved
+ CV_REG_PCDR5 = 45, // PCODE reserved
+ CV_REG_PCDR6 = 46, // PCODE reserved
+ CV_REG_PCDR7 = 47, // PCODE reserved
+ CV_REG_CR0 = 80, // CR0 -- control registers
+ CV_REG_CR1 = 81,
+ CV_REG_CR2 = 82,
+ CV_REG_CR3 = 83,
+ CV_REG_CR4 = 84, // Pentium
+ CV_REG_DR0 = 90, // Debug register
+ CV_REG_DR1 = 91,
+ CV_REG_DR2 = 92,
+ CV_REG_DR3 = 93,
+ CV_REG_DR4 = 94,
+ CV_REG_DR5 = 95,
+ CV_REG_DR6 = 96,
+ CV_REG_DR7 = 97,
+ CV_REG_GDTR = 110,
+ CV_REG_GDTL = 111,
+ CV_REG_IDTR = 112,
+ CV_REG_IDTL = 113,
+ CV_REG_LDTR = 114,
+ CV_REG_TR = 115,
+
+ CV_REG_PSEUDO1 = 116,
+ CV_REG_PSEUDO2 = 117,
+ CV_REG_PSEUDO3 = 118,
+ CV_REG_PSEUDO4 = 119,
+ CV_REG_PSEUDO5 = 120,
+ CV_REG_PSEUDO6 = 121,
+ CV_REG_PSEUDO7 = 122,
+ CV_REG_PSEUDO8 = 123,
+ CV_REG_PSEUDO9 = 124,
+
+ CV_REG_ST0 = 128,
+ CV_REG_ST1 = 129,
+ CV_REG_ST2 = 130,
+ CV_REG_ST3 = 131,
+ CV_REG_ST4 = 132,
+ CV_REG_ST5 = 133,
+ CV_REG_ST6 = 134,
+ CV_REG_ST7 = 135,
+ CV_REG_CTRL = 136,
+ CV_REG_STAT = 137,
+ CV_REG_TAG = 138,
+ CV_REG_FPIP = 139,
+ CV_REG_FPCS = 140,
+ CV_REG_FPDO = 141,
+ CV_REG_FPDS = 142,
+ CV_REG_ISEM = 143,
+ CV_REG_FPEIP = 144,
+ CV_REG_FPEDO = 145,
+
+ // registers for the 68K processors
+
+ CV_R68_D0 = 0,
+ CV_R68_D1 = 1,
+ CV_R68_D2 = 2,
+ CV_R68_D3 = 3,
+ CV_R68_D4 = 4,
+ CV_R68_D5 = 5,
+ CV_R68_D6 = 6,
+ CV_R68_D7 = 7,
+ CV_R68_A0 = 8,
+ CV_R68_A1 = 9,
+ CV_R68_A2 = 10,
+ CV_R68_A3 = 11,
+ CV_R68_A4 = 12,
+ CV_R68_A5 = 13,
+ CV_R68_A6 = 14,
+ CV_R68_A7 = 15,
+ CV_R68_CCR = 16,
+ CV_R68_SR = 17,
+ CV_R68_USP = 18,
+ CV_R68_MSP = 19,
+ CV_R68_SFC = 20,
+ CV_R68_DFC = 21,
+ CV_R68_CACR = 22,
+ CV_R68_VBR = 23,
+ CV_R68_CAAR = 24,
+ CV_R68_ISP = 25,
+ CV_R68_PC = 26,
+ //reserved 27
+ CV_R68_FPCR = 28,
+ CV_R68_FPSR = 29,
+ CV_R68_FPIAR = 30,
+ //reserved 31
+ CV_R68_FP0 = 32,
+ CV_R68_FP1 = 33,
+ CV_R68_FP2 = 34,
+ CV_R68_FP3 = 35,
+ CV_R68_FP4 = 36,
+ CV_R68_FP5 = 37,
+ CV_R68_FP6 = 38,
+ CV_R68_FP7 = 39,
+ //reserved 40
+ CV_R68_MMUSR030 = 41,
+ CV_R68_MMUSR = 42,
+ CV_R68_URP = 43,
+ CV_R68_DTT0 = 44,
+ CV_R68_DTT1 = 45,
+ CV_R68_ITT0 = 46,
+ CV_R68_ITT1 = 47,
+ //reserved 50
+ CV_R68_PSR = 51,
+ CV_R68_PCSR = 52,
+ CV_R68_VAL = 53,
+ CV_R68_CRP = 54,
+ CV_R68_SRP = 55,
+ CV_R68_DRP = 56,
+ CV_R68_TC = 57,
+ CV_R68_AC = 58,
+ CV_R68_SCC = 59,
+ CV_R68_CAL = 60,
+ CV_R68_TT0 = 61,
+ CV_R68_TT1 = 62,
+ //reserved 63
+ CV_R68_BAD0 = 64,
+ CV_R68_BAD1 = 65,
+ CV_R68_BAD2 = 66,
+ CV_R68_BAD3 = 67,
+ CV_R68_BAD4 = 68,
+ CV_R68_BAD5 = 69,
+ CV_R68_BAD6 = 70,
+ CV_R68_BAD7 = 71,
+ CV_R68_BAC0 = 72,
+ CV_R68_BAC1 = 73,
+ CV_R68_BAC2 = 74,
+ CV_R68_BAC3 = 75,
+ CV_R68_BAC4 = 76,
+ CV_R68_BAC5 = 77,
+ CV_R68_BAC6 = 78,
+ CV_R68_BAC7 = 79,
+
+ // Register set for the MIPS 4000
+
+ CV_M4_NOREG = CV_REG_NONE,
+
+ CV_M4_IntZERO = 10, /* CPU REGISTER */
+ CV_M4_IntAT = 11,
+ CV_M4_IntV0 = 12,
+ CV_M4_IntV1 = 13,
+ CV_M4_IntA0 = 14,
+ CV_M4_IntA1 = 15,
+ CV_M4_IntA2 = 16,
+ CV_M4_IntA3 = 17,
+ CV_M4_IntT0 = 18,
+ CV_M4_IntT1 = 19,
+ CV_M4_IntT2 = 20,
+ CV_M4_IntT3 = 21,
+ CV_M4_IntT4 = 22,
+ CV_M4_IntT5 = 23,
+ CV_M4_IntT6 = 24,
+ CV_M4_IntT7 = 25,
+ CV_M4_IntS0 = 26,
+ CV_M4_IntS1 = 27,
+ CV_M4_IntS2 = 28,
+ CV_M4_IntS3 = 29,
+ CV_M4_IntS4 = 30,
+ CV_M4_IntS5 = 31,
+ CV_M4_IntS6 = 32,
+ CV_M4_IntS7 = 33,
+ CV_M4_IntT8 = 34,
+ CV_M4_IntT9 = 35,
+ CV_M4_IntKT0 = 36,
+ CV_M4_IntKT1 = 37,
+ CV_M4_IntGP = 38,
+ CV_M4_IntSP = 39,
+ CV_M4_IntS8 = 40,
+ CV_M4_IntRA = 41,
+ CV_M4_IntLO = 42,
+ CV_M4_IntHI = 43,
+
+ CV_M4_Fir = 50,
+ CV_M4_Psr = 51,
+
+ CV_M4_FltF0 = 60, /* Floating point registers */
+ CV_M4_FltF1 = 61,
+ CV_M4_FltF2 = 62,
+ CV_M4_FltF3 = 63,
+ CV_M4_FltF4 = 64,
+ CV_M4_FltF5 = 65,
+ CV_M4_FltF6 = 66,
+ CV_M4_FltF7 = 67,
+ CV_M4_FltF8 = 68,
+ CV_M4_FltF9 = 69,
+ CV_M4_FltF10 = 70,
+ CV_M4_FltF11 = 71,
+ CV_M4_FltF12 = 72,
+ CV_M4_FltF13 = 73,
+ CV_M4_FltF14 = 74,
+ CV_M4_FltF15 = 75,
+ CV_M4_FltF16 = 76,
+ CV_M4_FltF17 = 77,
+ CV_M4_FltF18 = 78,
+ CV_M4_FltF19 = 79,
+ CV_M4_FltF20 = 80,
+ CV_M4_FltF21 = 81,
+ CV_M4_FltF22 = 82,
+ CV_M4_FltF23 = 83,
+ CV_M4_FltF24 = 84,
+ CV_M4_FltF25 = 85,
+ CV_M4_FltF26 = 86,
+ CV_M4_FltF27 = 87,
+ CV_M4_FltF28 = 88,
+ CV_M4_FltF29 = 89,
+ CV_M4_FltF30 = 90,
+ CV_M4_FltF31 = 91,
+ CV_M4_FltFsr = 92,
+
+
+ // Register set for the ALPHA AXP
+
+ CV_ALPHA_NOREG = CV_REG_NONE,
+
+ CV_ALPHA_FltF0 = 10, // Floating point registers
+ CV_ALPHA_FltF1 = 11,
+ CV_ALPHA_FltF2 = 12,
+ CV_ALPHA_FltF3 = 13,
+ CV_ALPHA_FltF4 = 14,
+ CV_ALPHA_FltF5 = 15,
+ CV_ALPHA_FltF6 = 16,
+ CV_ALPHA_FltF7 = 17,
+ CV_ALPHA_FltF8 = 18,
+ CV_ALPHA_FltF9 = 19,
+ CV_ALPHA_FltF10 = 20,
+ CV_ALPHA_FltF11 = 21,
+ CV_ALPHA_FltF12 = 22,
+ CV_ALPHA_FltF13 = 23,
+ CV_ALPHA_FltF14 = 24,
+ CV_ALPHA_FltF15 = 25,
+ CV_ALPHA_FltF16 = 26,
+ CV_ALPHA_FltF17 = 27,
+ CV_ALPHA_FltF18 = 28,
+ CV_ALPHA_FltF19 = 29,
+ CV_ALPHA_FltF20 = 30,
+ CV_ALPHA_FltF21 = 31,
+ CV_ALPHA_FltF22 = 32,
+ CV_ALPHA_FltF23 = 33,
+ CV_ALPHA_FltF24 = 34,
+ CV_ALPHA_FltF25 = 35,
+ CV_ALPHA_FltF26 = 36,
+ CV_ALPHA_FltF27 = 37,
+ CV_ALPHA_FltF28 = 38,
+ CV_ALPHA_FltF29 = 39,
+ CV_ALPHA_FltF30 = 40,
+ CV_ALPHA_FltF31 = 41,
+
+ CV_ALPHA_IntV0 = 42, // Integer registers
+ CV_ALPHA_IntT0 = 43,
+ CV_ALPHA_IntT1 = 44,
+ CV_ALPHA_IntT2 = 45,
+ CV_ALPHA_IntT3 = 46,
+ CV_ALPHA_IntT4 = 47,
+ CV_ALPHA_IntT5 = 48,
+ CV_ALPHA_IntT6 = 49,
+ CV_ALPHA_IntT7 = 50,
+ CV_ALPHA_IntS0 = 51,
+ CV_ALPHA_IntS1 = 52,
+ CV_ALPHA_IntS2 = 53,
+ CV_ALPHA_IntS3 = 54,
+ CV_ALPHA_IntS4 = 55,
+ CV_ALPHA_IntS5 = 56,
+ CV_ALPHA_IntFP = 57,
+ CV_ALPHA_IntA0 = 58,
+ CV_ALPHA_IntA1 = 59,
+ CV_ALPHA_IntA2 = 60,
+ CV_ALPHA_IntA3 = 61,
+ CV_ALPHA_IntA4 = 62,
+ CV_ALPHA_IntA5 = 63,
+ CV_ALPHA_IntT8 = 64,
+ CV_ALPHA_IntT9 = 65,
+ CV_ALPHA_IntT10 = 66,
+ CV_ALPHA_IntT11 = 67,
+ CV_ALPHA_IntRA = 68,
+ CV_ALPHA_IntT12 = 69,
+ CV_ALPHA_IntAT = 70,
+ CV_ALPHA_IntGP = 71,
+ CV_ALPHA_IntSP = 72,
+ CV_ALPHA_IntZERO = 73,
+
+
+ CV_ALPHA_Fpcr = 74, // Control registers
+ CV_ALPHA_Fir = 75,
+ CV_ALPHA_Psr = 76,
+ CV_ALPHA_FltFsr = 77,
+ CV_ALPHA_SoftFpcr = 78,
+
+ // Register Set for Motorola/IBM PowerPC
+
+ /*
+ ** PowerPC General Registers ( User Level )
+ */
+ CV_PPC_GPR0 = 1,
+ CV_PPC_GPR1 = 2,
+ CV_PPC_GPR2 = 3,
+ CV_PPC_GPR3 = 4,
+ CV_PPC_GPR4 = 5,
+ CV_PPC_GPR5 = 6,
+ CV_PPC_GPR6 = 7,
+ CV_PPC_GPR7 = 8,
+ CV_PPC_GPR8 = 9,
+ CV_PPC_GPR9 = 10,
+ CV_PPC_GPR10 = 11,
+ CV_PPC_GPR11 = 12,
+ CV_PPC_GPR12 = 13,
+ CV_PPC_GPR13 = 14,
+ CV_PPC_GPR14 = 15,
+ CV_PPC_GPR15 = 16,
+ CV_PPC_GPR16 = 17,
+ CV_PPC_GPR17 = 18,
+ CV_PPC_GPR18 = 19,
+ CV_PPC_GPR19 = 20,
+ CV_PPC_GPR20 = 21,
+ CV_PPC_GPR21 = 22,
+ CV_PPC_GPR22 = 23,
+ CV_PPC_GPR23 = 24,
+ CV_PPC_GPR24 = 25,
+ CV_PPC_GPR25 = 26,
+ CV_PPC_GPR26 = 27,
+ CV_PPC_GPR27 = 28,
+ CV_PPC_GPR28 = 29,
+ CV_PPC_GPR29 = 30,
+ CV_PPC_GPR30 = 31,
+ CV_PPC_GPR31 = 32,
+
+ /*
+ ** PowerPC Condition Register ( User Level )
+ */
+ CV_PPC_CR = 33,
+ CV_PPC_CR0 = 34,
+ CV_PPC_CR1 = 35,
+ CV_PPC_CR2 = 36,
+ CV_PPC_CR3 = 37,
+ CV_PPC_CR4 = 38,
+ CV_PPC_CR5 = 39,
+ CV_PPC_CR6 = 40,
+ CV_PPC_CR7 = 41,
+
+ /*
+ ** PowerPC Floating Point Registers ( User Level )
+ */
+ CV_PPC_FPR0 = 42,
+ CV_PPC_FPR1 = 43,
+ CV_PPC_FPR2 = 44,
+ CV_PPC_FPR3 = 45,
+ CV_PPC_FPR4 = 46,
+ CV_PPC_FPR5 = 47,
+ CV_PPC_FPR6 = 48,
+ CV_PPC_FPR7 = 49,
+ CV_PPC_FPR8 = 50,
+ CV_PPC_FPR9 = 51,
+ CV_PPC_FPR10 = 52,
+ CV_PPC_FPR11 = 53,
+ CV_PPC_FPR12 = 54,
+ CV_PPC_FPR13 = 55,
+ CV_PPC_FPR14 = 56,
+ CV_PPC_FPR15 = 57,
+ CV_PPC_FPR16 = 58,
+ CV_PPC_FPR17 = 59,
+ CV_PPC_FPR18 = 60,
+ CV_PPC_FPR19 = 61,
+ CV_PPC_FPR20 = 62,
+ CV_PPC_FPR21 = 63,
+ CV_PPC_FPR22 = 64,
+ CV_PPC_FPR23 = 65,
+ CV_PPC_FPR24 = 66,
+ CV_PPC_FPR25 = 67,
+ CV_PPC_FPR26 = 68,
+ CV_PPC_FPR27 = 69,
+ CV_PPC_FPR28 = 70,
+ CV_PPC_FPR29 = 71,
+ CV_PPC_FPR30 = 72,
+ CV_PPC_FPR31 = 73,
+
+ /*
+ ** PowerPC Floating Point Status and Control Register ( User Level )
+ */
+ CV_PPC_FPSCR = 74,
+
+ /*
+ ** PowerPC Machine State Register ( Supervisor Level )
+ */
+ CV_PPC_MSR = 75,
+
+ /*
+ ** PowerPC Segment Registers ( Supervisor Level )
+ */
+ CV_PPC_SR0 = 76,
+ CV_PPC_SR1 = 77,
+ CV_PPC_SR2 = 78,
+ CV_PPC_SR3 = 79,
+ CV_PPC_SR4 = 80,
+ CV_PPC_SR5 = 81,
+ CV_PPC_SR6 = 82,
+ CV_PPC_SR7 = 83,
+ CV_PPC_SR8 = 84,
+ CV_PPC_SR9 = 85,
+ CV_PPC_SR10 = 86,
+ CV_PPC_SR11 = 87,
+ CV_PPC_SR12 = 88,
+ CV_PPC_SR13 = 89,
+ CV_PPC_SR14 = 90,
+ CV_PPC_SR15 = 91,
+
+ /*
+ ** For all of the special purpose registers add 100 to the SPR# that the
+ ** Motorola/IBM documentation gives with the exception of any imaginary
+ ** registers.
+ */
+
+ /*
+ ** PowerPC Special Purpose Registers ( User Level )
+ */
+ CV_PPC_PC = 99, // PC (imaginary register)
+
+ CV_PPC_MQ = 100, // MPC601
+ CV_PPC_XER = 101,
+ CV_PPC_RTCU = 104, // MPC601
+ CV_PPC_RTCL = 105, // MPC601
+ CV_PPC_LR = 108,
+ CV_PPC_CTR = 109,
+
+ CV_PPC_COMPARE = 110, // part of XER (internal to the debugger only)
+ CV_PPC_COUNT = 111, // part of XER (internal to the debugger only)
+
+ /*
+ ** PowerPC Special Purpose Registers ( Supervisor Level )
+ */
+ CV_PPC_DSISR = 118,
+ CV_PPC_DAR = 119,
+ CV_PPC_DEC = 122,
+ CV_PPC_SDR1 = 125,
+ CV_PPC_SRR0 = 126,
+ CV_PPC_SRR1 = 127,
+ CV_PPC_SPRG0 = 372,
+ CV_PPC_SPRG1 = 373,
+ CV_PPC_SPRG2 = 374,
+ CV_PPC_SPRG3 = 375,
+ CV_PPC_ASR = 280, // 64-bit implementations only
+ CV_PPC_EAR = 382,
+ CV_PPC_PVR = 287,
+ CV_PPC_BAT0U = 628,
+ CV_PPC_BAT0L = 629,
+ CV_PPC_BAT1U = 630,
+ CV_PPC_BAT1L = 631,
+ CV_PPC_BAT2U = 632,
+ CV_PPC_BAT2L = 633,
+ CV_PPC_BAT3U = 634,
+ CV_PPC_BAT3L = 635,
+ CV_PPC_DBAT0U = 636,
+ CV_PPC_DBAT0L = 637,
+ CV_PPC_DBAT1U = 638,
+ CV_PPC_DBAT1L = 639,
+ CV_PPC_DBAT2U = 640,
+ CV_PPC_DBAT2L = 641,
+ CV_PPC_DBAT3U = 642,
+ CV_PPC_DBAT3L = 643,
+
+ /*
+ ** PowerPC Special Purpose Registers Implementation Dependent ( Supervisor Level )
+ */
+
+ /*
+ ** Doesn't appear that IBM/Motorola has finished defining these.
+ */
+
+ CV_PPC_PMR0 = 1044, // MPC620,
+ CV_PPC_PMR1 = 1045, // MPC620,
+ CV_PPC_PMR2 = 1046, // MPC620,
+ CV_PPC_PMR3 = 1047, // MPC620,
+ CV_PPC_PMR4 = 1048, // MPC620,
+ CV_PPC_PMR5 = 1049, // MPC620,
+ CV_PPC_PMR6 = 1050, // MPC620,
+ CV_PPC_PMR7 = 1051, // MPC620,
+ CV_PPC_PMR8 = 1052, // MPC620,
+ CV_PPC_PMR9 = 1053, // MPC620,
+ CV_PPC_PMR10 = 1054, // MPC620,
+ CV_PPC_PMR11 = 1055, // MPC620,
+ CV_PPC_PMR12 = 1056, // MPC620,
+ CV_PPC_PMR13 = 1057, // MPC620,
+ CV_PPC_PMR14 = 1058, // MPC620,
+ CV_PPC_PMR15 = 1059, // MPC620,
+
+ CV_PPC_DMISS = 1076, // MPC603
+ CV_PPC_DCMP = 1077, // MPC603
+ CV_PPC_HASH1 = 1078, // MPC603
+ CV_PPC_HASH2 = 1079, // MPC603
+ CV_PPC_IMISS = 1080, // MPC603
+ CV_PPC_ICMP = 1081, // MPC603
+ CV_PPC_RPA = 1082, // MPC603
+
+ CV_PPC_HID0 = 1108, // MPC601, MPC603, MPC620
+ CV_PPC_HID1 = 1109, // MPC601
+ CV_PPC_HID2 = 1110, // MPC601, MPC603, MPC620 ( IABR )
+ CV_PPC_HID3 = 1111, // Not Defined
+ CV_PPC_HID4 = 1112, // Not Defined
+ CV_PPC_HID5 = 1113, // MPC601, MPC604, MPC620 ( DABR )
+ CV_PPC_HID6 = 1114, // Not Defined
+ CV_PPC_HID7 = 1115, // Not Defined
+ CV_PPC_HID8 = 1116, // MPC620 ( BUSCSR )
+ CV_PPC_HID9 = 1117, // MPC620 ( L2CSR )
+ CV_PPC_HID10 = 1118, // Not Defined
+ CV_PPC_HID11 = 1119, // Not Defined
+ CV_PPC_HID12 = 1120, // Not Defined
+ CV_PPC_HID13 = 1121, // MPC604 ( HCR )
+ CV_PPC_HID14 = 1122, // Not Defined
+ CV_PPC_HID15 = 1123 // MPC601, MPC604, MPC620 ( PIR )
+
+
+} CV_HREG_e;
+
+#pragma pack ( pop )
+
+#endif /* CV_INFO_INCLUDED */
diff --git a/private/windbg/osdebug/include/cvtypes.h b/private/windbg/osdebug/include/cvtypes.h
new file mode 100644
index 000000000..6f181db49
--- /dev/null
+++ b/private/windbg/osdebug/include/cvtypes.h
@@ -0,0 +1,295 @@
+#error Don't include cvtypes.h... Use cvtypes.hxx instead.
+
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ Cvtypes.h
+
+Abstract:
+
+Author:
+
+ David J. Gilman (davegi) 05-Apr-1992
+
+Environment:
+
+ Win32, User Mode
+
+--*/
+
+#if ! defined _CVTYPES_
+#define _CVTYPES_
+
+#include "types.h"
+
+/*
+** HDEP is a machine dependent size and passes as a general handle.
+** HIND is a machine independent sized handle and is used for things
+** which are passed between machines
+**
+*/
+
+#ifdef STRICT
+ DECLARE_HANDLE(HDEP);
+ DECLARE_HANDLE(HIND);
+#else
+ typedef HANDLE HDEP;
+ typedef HANDLE HIND;
+#endif
+
+
+typedef HDEP FAR * LPHDEP;
+typedef HIND FAR * LPHIND;
+
+
+/* HMEM should be avoided (HDEP should be used instead), but for now we'll
+** define it for backwards compatibility.
+*/
+
+typedef HDEP HMEM;
+typedef HMEM FAR * LPHMEM;
+
+/* These values are used in the SegType field of the Expression Evaluator's
+** TI structure, and as the third parameter to the Symbol Handler's
+** SHGetNearestHsym function.
+*/
+#define EECODE 0x01
+#define EEDATA 0x02
+#define EEANYSEG 0xFFFF
+
+/*
+** HPID
+** HTID
+**
+*/
+
+#ifdef STRICT
+DECLARE_HANDLE(HPID);
+DECLARE_HANDLE(HTID);
+#else
+typedef HIND HPID;
+typedef HIND HTID;
+#endif
+
+typedef USHORT SEGMENT; // 32-bit compiler doesn't like "_segment"
+typedef ULONG UOFF32;
+typedef USHORT UOFF16;
+typedef LONG OFF32;
+typedef SHORT OFF16;
+#if defined (ADDR_16)
+ // we are operating as a 16:16 evaluator only
+ // the address packet will be defined as an offset and a 16 bit filler
+ typedef OFF16 SOFFSET;
+ typedef UOFF16 UOFFSET;
+ typedef UOFF16 OFFSET;
+#else
+ typedef OFF32 SOFFSET;
+ typedef UOFF32 UOFFSET;
+ typedef UOFF32 OFFSET;
+#endif
+
+// address definitions
+// the address packet is always a 16:32 address.
+
+typedef struct {
+ UOFF32 off;
+ SEGMENT seg;
+} address_t;
+
+#define SegAddrT(a) ((a).seg)
+#define OffAddrT(a) ((a).off)
+
+#define AddrTInit(paddrT,segSet,offSet) \
+ { \
+ SegAddrT(*(paddrT)) = segSet; \
+ OffAddrT(*(paddrT)) = offSet; \
+ }
+
+typedef struct {
+ BYTE fFlat :1; // true if address is flat
+ BYTE fOff32 :1; // true if offset is 32 bits
+ BYTE fIsLI :1; // true if segment is linker index
+ BYTE fReal :1; // x86: is segment a real mode address
+ BYTE unused :4; // unused
+} memmode_t;
+
+#define MODE_IS_FLAT(m) ((m).fFlat)
+#define MODE_IS_OFF32(m) ((m).fOff32)
+#define MODE_IS_LI(m) ((m).fIsLI)
+#define MODE_IS_REAL(m) ((m).fReal)
+
+#define ModeInit(pmode,fFlat,fOff32,fLi,fRealSet) \
+ { \
+ MODE_IS_FLAT(*(pmode)) = fFlat; \
+ MODE_IS_OFF32(*(pmode)) = fOff32; \
+ MODE_IS_LI(*(pmode)) = fLi; \
+ MODE_IS_REAL(*(pmode)) = fRealSet; \
+ }
+
+#ifdef STRICT
+DECLARE_HANDLE(HEMI);
+#else
+typedef HIND HEMI; // Executable Module Index
+#endif
+
+typedef struct ADDR {
+ address_t addr;
+ HEMI emi;
+ memmode_t mode;
+} ADDR; //* An address specifier
+typedef ADDR FAR * PADDR; //* REVIEW: BUG: shouldn't be explicitly far
+typedef ADDR FAR * LPADDR;
+
+#define addrAddr(a) ((a).addr)
+#define emiAddr(a) ((a).emi)
+#define modeAddr(a) ((a).mode)
+
+#define AddrInit(paddr,emiSet,segSet,offSet,fFlat,fOff32,fLi,fRealSet) \
+ { \
+ AddrTInit( &(addrAddr(*(paddr))), segSet, offSet ); \
+ emiAddr(*(paddr)) = emiSet; \
+ ModeInit( &(modeAddr(*(paddr))),fFlat,fOff32,fLi,fRealSet); \
+ }
+
+#define ADDR_IS_FLAT(a) (MODE_IS_FLAT(modeAddr(a)))
+#define ADDR_IS_OFF32(a) (MODE_IS_OFF32(modeAddr(a)))
+#define ADDR_IS_LI(a) (MODE_IS_LI(modeAddr(a)))
+#define ADDR_IS_REAL(a) (MODE_IS_REAL(modeAddr(a)))
+
+#define ADDRSEG16(a) { ADDR_IS_FLAT(a) = FALSE; ADDR_IS_OFF32(a) = FALSE; }
+#define ADDRSEG32(a) { ADDR_IS_FLAT(a) = FALSE; ADDR_IS_OFF32(a) = TRUE; }
+#define ADDRLIN32(a) { ADDR_IS_FLAT(a) = TRUE; ADDR_IS_OFF32(a) = TRUE; }
+
+#define GetAddrSeg(a) (SegAddrT(addrAddr(a)))
+#define GetAddrOff(a) (OffAddrT(addrAddr(a)))
+#define SetAddrSeg(a,s) (SegAddrT(addrAddr(*(a)))=s)
+#define SetAddrOff(a,o) (OffAddrT(addrAddr(*(a)))=o)
+
+// Because an ADDR has some filler areas (in the mode and the address_t),
+// it's bad to use memcmp two ADDRs to see if they're equal. Use this
+// macro instead. (I deliberately left out the test for fAddr32(), because
+// I think it's probably not necessary when comparing.)
+#define FAddrsEq(a1, a2) \
+ ( \
+ GetAddrOff(a1) == GetAddrOff(a2) && \
+ GetAddrSeg(a1) == GetAddrSeg(a2) && \
+ ADDR_IS_LI(a1) == ADDR_IS_LI(a2) && \
+ emiAddr(a1) == emiAddr(a2) \
+ )
+
+// address definitions
+// the address packet is always a 16:32 address.
+
+typedef struct FRAME {
+ SEGMENT SS;
+ address_t BP;
+ SEGMENT DS;
+ memmode_t mode;
+ HPID PID;
+ HTID TID;
+} FRAME;
+typedef FRAME FAR *PFRAME; //* REVIEW: BUG: shouldn't be explicitly far
+
+#define addrFrameSS(a) ((a).SS)
+#define addrFrameBP(a) ((a).BP)
+#define GetFrameBPOff(a) ((a).BP.off)
+#define GetFrameBPSeg(a) ((a).BP.seg)
+#define SetFrameBPOff(a,o) ((a).BP.off = o)
+#define SetFrameBPSeg(a,s) ((a).BP.seg = s)
+#define FRAMEMODE(a) ((a).mode)
+#define FRAMEPID(a) ((a).PID)
+#define FRAMETID(a) ((a).TID)
+
+#define FrameFlat(a) MODE_IS_FLAT((a).mode)
+#define FrameOff32(a) MODE_IS_OFF32((a).mode)
+#define FrameReal(a) MODE_IS_REAL((a).mode)
+
+
+/*
+** A few public types related to the linked list manager
+*/
+
+typedef HDEP HLLI; //* A handle to a linked list
+typedef HIND HLLE; //* A handle to a linked list entry
+
+typedef void (FAR PASCAL * LPFNKILLNODE)( LPV );
+typedef int (FAR PASCAL * LPFNFCMPNODE)( LPV, LPV, LONG );
+
+typedef USHORT LLF; //* Linked List Flags
+#define llfNull (LLF)0x0
+#define llfAscending (LLF)0x1
+#define llfDescending (LLF)0x2
+
+
+/*
+ *
+ */
+
+typedef struct {
+ char b[10];
+} REAL10;
+
+typedef REAL10 FLOAT10;
+
+//
+// copied from winnt.h:
+//
+#ifndef PAGE_NOACCESS
+
+#define PAGE_NOACCESS 0x01
+#define PAGE_READONLY 0x02
+#define PAGE_READWRITE 0x04
+#define PAGE_WRITECOPY 0x08
+#define PAGE_EXECUTE 0x10
+#define PAGE_EXECUTE_READ 0x20
+#define PAGE_EXECUTE_READWRITE 0x40
+#define PAGE_EXECUTE_WRITECOPY 0x80
+#define PAGE_GUARD 0x100
+#define PAGE_NOCACHE 0x200
+
+#define MEM_COMMIT 0x1000
+#define MEM_RESERVE 0x2000
+#define MEM_FREE 0x10000
+
+#define MEM_PRIVATE 0x20000
+#define MEM_MAPPED 0x40000
+//#define SEC_IMAGE 0x1000000
+//#define MEM_IMAGE SEC_IMAGE
+#define MEM_IMAGE 0x1000000
+
+#endif
+
+typedef struct _MEMINFO {
+ ADDR addr;
+ ADDR addrAllocBase;
+ UOFF32 uRegionSize;
+ DWORD dwProtect;
+ DWORD dwState;
+ DWORD dwType;
+} MEMINFO;
+typedef MEMINFO FAR * LPMEMINFO;
+
+/*
+** Return values for mtrcEndian -- big or little endian -- which
+** byte is [0] most or least significat byte
+*/
+enum _END {
+ endBig,
+ endLittle
+};
+typedef DWORD END;
+
+enum _MPT {
+ mptix86,
+ mptm68k,
+ mptdaxp,
+ mptmips,
+ mptmppc,
+ mptUnknown
+};
+typedef DWORD MPT;
+
+#endif // _CVTYPES_
diff --git a/private/windbg/osdebug/include/cvtypes.hxx b/private/windbg/osdebug/include/cvtypes.hxx
new file mode 100644
index 000000000..018ebf694
--- /dev/null
+++ b/private/windbg/osdebug/include/cvtypes.hxx
@@ -0,0 +1,264 @@
+// CVTYPES.H
+//
+// This file contains a common set of base type declarations
+// between multiple CodeView projects. If you touch this in one
+// project be sure to copy it to all other projects as well.
+
+#ifndef _VC_VER_INC
+#include "..\include\vcver.h"
+#endif
+
+#ifndef CV_PROJECT_BASE_TYPES
+#define CV_PROJECT_BASE_TYPES
+
+#include "dbapiver.h"
+#include "types.h"
+
+// HDEP is a machine dependent size and passes as a general handle.
+// HIND is a machine independent sized handle and is used for things
+// which are passed between machines
+
+#ifdef STRICT
+DECLARE_HANDLE(HDEP);
+DECLARE_HANDLE(HIND);
+#else
+typedef HANDLE HDEP;
+typedef HANDLE HIND;
+#endif
+
+typedef HDEP * LPHDEP;
+typedef HIND * LPHIND;
+
+// HMEM should be avoided (HDEP should be used instead), but for now we'll
+// define it for backwards compatibility.
+
+typedef HDEP HMEM;
+typedef HMEM * LPHMEM;
+
+// These values are used in the SegType field of the Expression Evaluator's
+// TI structure, and as the third parameter to the Symbol Handler's
+// SHGetNearestHsym function.
+
+#define EECODE 0x01
+#define EEDATA 0x02
+#define EEANYSEG 0xFFFF
+
+#ifdef STRICT
+DECLARE_HANDLE(HPID);
+DECLARE_HANDLE(HTID);
+#else
+typedef HIND HPID;
+typedef HIND HTID;
+#endif
+
+typedef USHORT SEGMENT; // 32-bit compiler doesn't like "_segment"
+typedef ULONG UOFF32;
+typedef USHORT UOFF16;
+typedef LONG OFF32;
+typedef SHORT OFF16;
+
+typedef OFF32 SOFFSET;
+typedef UOFF32 UOFFSET;
+typedef UOFF32 OFFSET;
+typedef UOFFSET *LPUOFFSET;
+
+// address definitions
+// the address packet is always a 16:32 address.
+
+typedef struct {
+ UOFF32 off;
+ SEGMENT seg;
+} address_t;
+
+#define SegAddrT(a) ((a).seg)
+#define OffAddrT(a) ((a).off)
+
+#define AddrTInit(paddrT,segSet,offSet) \
+ { \
+ SegAddrT(*(paddrT)) = segSet; \
+ OffAddrT(*(paddrT)) = offSet; \
+ }
+
+typedef struct {
+ BYTE fFlat :1; // true if address is flat
+ BYTE fOff32 :1; // true if offset is 32 bits
+ BYTE fIsLI :1; // true if segment is linker index
+ BYTE fReal :1; // x86: is segment a real mode address
+ BYTE unused :4; // unused
+} memmode_t;
+
+#define MODE_IS_FLAT(m) ((m).fFlat)
+#define MODE_IS_OFF32(m) ((m).fOff32)
+#define MODE_IS_LI(m) ((m).fIsLI)
+#define MODE_IS_REAL(m) ((m).fReal)
+
+#define ModeInit(pmode,fFlat,fOff32,fLi,fRealSet) \
+ { \
+ MODE_IS_FLAT(*(pmode)) = fFlat; \
+ MODE_IS_OFF32(*(pmode)) = fOff32; \
+ MODE_IS_LI(*(pmode)) = fLi; \
+ MODE_IS_REAL(*(pmode)) = fRealSet; \
+ }
+
+#ifdef STRICT
+DECLARE_HANDLE(HEMI);
+#else
+typedef HIND HEMI; // Executable Module Index
+#endif
+
+typedef struct ADDR {
+ address_t addr;
+ HEMI emi;
+ memmode_t mode;
+} ADDR; // An address specifier
+typedef ADDR * PADDR;
+typedef ADDR * LPADDR;
+
+#define addrAddr(a) ((a).addr)
+#define emiAddr(a) ((a).emi)
+#define modeAddr(a) ((a).mode)
+
+#define AddrInit(paddr,emiSet,segSet,offSet,fFlat,fOff32,fLi,fRealSet) \
+ { \
+ AddrTInit( &(addrAddr(*(paddr))), segSet, offSet ); \
+ emiAddr(*(paddr)) = emiSet; \
+ ModeInit( &(modeAddr(*(paddr))),fFlat,fOff32,fLi,fRealSet); \
+ }
+
+#define ADDR_IS_FLAT(a) (MODE_IS_FLAT(modeAddr(a)))
+#define ADDR_IS_OFF32(a) (MODE_IS_OFF32(modeAddr(a)))
+#define ADDR_IS_LI(a) (MODE_IS_LI(modeAddr(a)))
+#define ADDR_IS_REAL(a) (MODE_IS_REAL(modeAddr(a)))
+
+#define ADDRSEG16(a) {ADDR_IS_FLAT(a) = FALSE; ADDR_IS_OFF32(a) = FALSE;}
+#define ADDRSEG32(a) {ADDR_IS_FLAT(a) = FALSE; ADDR_IS_OFF32(a) = TRUE;}
+#define ADDRLIN32(a) {ADDR_IS_FLAT(a) = TRUE; ADDR_IS_OFF32(a) = TRUE;}
+
+#define GetAddrSeg(a) ((a).addr.seg)
+#define GetAddrOff(a) ((a).addr.off)
+#define SetAddrSeg(a,s) ((a)->addr.seg=s)
+#define SetAddrOff(a,o) ((a)->addr.off=o)
+
+// Because an ADDR has some filler areas (in the mode and the address_t),
+// it's bad to use memcmp two ADDRs to see if they're equal. Use this
+// macro instead. (I deliberately left out the test for fAddr32(), because
+// I think it's probably not necessary when comparing.)
+#define FAddrsEq(a1, a2) \
+ ( \
+ GetAddrOff(a1) == GetAddrOff(a2) && \
+ GetAddrSeg(a1) == GetAddrSeg(a2) && \
+ ADDR_IS_LI(a1) == ADDR_IS_LI(a2) && \
+ emiAddr(a1) == emiAddr(a2) \
+ )
+
+// address definitions
+// the address packet is always a 16:32 address.
+
+typedef struct FRAME {
+ SEGMENT SS;
+ address_t BP;
+ SEGMENT DS;
+ memmode_t mode;
+ HPID PID;
+ HTID TID;
+ address_t SLP; // Static link pointer
+} FRAME;
+typedef FRAME *PFRAME;
+
+#define addrFrameSS(a) ((a).SS)
+#define addrFrameBP(a) ((a).BP)
+#define GetFrameBPOff(a) ((a).BP.off)
+#define GetFrameBPSeg(a) ((a).BP.seg)
+#define SetFrameBPOff(a,o) ((a).BP.off = o)
+#define SetFrameBPSeg(a,s) ((a).BP.seg = s)
+#define GetFrameSLPOff(a) ((a).SLP.off)
+#define GetFrameSLPSeg(a) ((a).SLP.seg)
+#define SetFrameSLPOff(a,o) ((a).SLP.off = o)
+#define SetFrameSLPSeg(a,s) ((a).SLP.seg = s)
+#define FRAMEMODE(a) ((a).mode)
+#define FRAMEPID(a) ((a).PID)
+#define FRAMETID(a) ((a).TID)
+
+#define FrameFlat(a) MODE_IS_FLAT((a).mode)
+#define FrameOff32(a) MODE_IS_OFF32((a).mode)
+#define FrameReal(a) MODE_IS_REAL((a).mode)
+
+// A few public types related to the linked list manager
+
+typedef HDEP HLLI; // A handle to a linked list
+// typedef HDEP HLLE; // A handle to a linked list entry
+typedef HIND HLLE; // A handle to a linked list entry
+
+typedef void (* LPFNKILLNODE)(PVOID);
+typedef int (* LPFNFCMPNODE)(PVOID, PVOID, LONG );
+
+typedef USHORT LLF; // Linked List Flags
+#define llfNull (LLF)0x0
+#define llfAscending (LLF)0x1
+#define llfDescending (LLF)0x2
+
+// EXPCALL indicates that a function should use whatever calling
+// convention is preferable for exported functions.
+
+#define EXPCALL __stdcall
+
+// copied from winnt.h:
+
+#ifndef PAGE_NOACCESS
+
+#define PAGE_NOACCESS 0x01
+#define PAGE_READONLY 0x02
+#define PAGE_READWRITE 0x04
+#define PAGE_WRITECOPY 0x08
+#define PAGE_EXECUTE 0x10
+#define PAGE_EXECUTE_READ 0x20
+#define PAGE_EXECUTE_READWRITE 0x40
+#define PAGE_EXECUTE_WRITECOPY 0x80
+#define PAGE_GUARD 0x100
+#define PAGE_NOCACHE 0x200
+
+#define MEM_COMMIT 0x1000
+#define MEM_RESERVE 0x2000
+#define MEM_FREE 0x10000
+
+#define MEM_PRIVATE 0x20000
+#define MEM_MAPPED 0x40000
+#define MEM_IMAGE 0x1000000
+
+#endif
+
+typedef struct _MEMINFO {
+ ADDR addr;
+ ADDR addrAllocBase;
+ UOFF32 uRegionSize;
+ DWORD dwProtect;
+ DWORD dwState;
+ DWORD dwType;
+} MEMINFO;
+typedef MEMINFO * LPMEMINFO;
+
+// Return values for mtrcEndian -- big or little endian -- which
+// byte is [0] most or least significat byte
+
+enum _END {
+ endBig,
+ endLittle
+};
+typedef DWORD END;
+
+// Return values for mtrcProcessorType
+
+enum _MPT {
+ mptix86 = 1, // Intel X86
+ mptm68k = 2, // Mac 68K
+ mptdaxp = 3, // Alpha AXP
+ mptmips = 4, // MIPS
+ mptmppc = 5, // Mac PPC
+ mptntppc = 6, // NT PPC
+ mptUnknown
+};
+typedef DWORD MPT;
+
+#include <dbgver.h> // For AVS definition and support functions
+
+#endif // CV_PROJECT_BASE_TYPES
diff --git a/private/windbg/osdebug/include/dbapiver.h b/private/windbg/osdebug/include/dbapiver.h
new file mode 100644
index 000000000..b80ffe313
--- /dev/null
+++ b/private/windbg/osdebug/include/dbapiver.h
@@ -0,0 +1,6 @@
+#ifndef _VC_VER_INC
+#include "..\include\vcver.h"
+#endif
+
+#define DBG_API_VERSION 6
+#define DBG_API_SUBVERSION 3
diff --git a/private/windbg/osdebug/include/dbgver.h b/private/windbg/osdebug/include/dbgver.h
new file mode 100644
index 000000000..f26b94cf3
--- /dev/null
+++ b/private/windbg/osdebug/include/dbgver.h
@@ -0,0 +1,135 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ dbgver.h
+
+Abstract:
+
+Author:
+
+ Kent D. Forschmiedt (kentf) 25-Jan-1993
+
+Environment:
+
+ Win32, User Mode
+
+--*/
+
+#if ! defined _DBGVER_
+#define _DBGVER_
+
+/*
+** DBG_API_VERSION is the major version number used to specify the
+** api version of the debugger or debug dll. For release versions
+** dlls will export this and debuggers will check against this
+** version to verify that it can use the dll.
+**
+** For beta and debug versions, this number will be used in
+** conjunction with minor and revision numbers (probably derived
+** from SLM rmm & rup) to verify compatibility.
+**
+** Until the API has stabilized, we will most likely have to
+** rev this version number for every major product release.
+**
+*/
+
+#include <dbapiver.h>
+
+/* AVS - Api Version Structure:
+**
+** All debug dlls should be prepared to return a pointer to this
+** structure conaining its vital statistics. The debugger should
+** check first two characters of the dll's name against rgchType
+** and the version numbers as described in the DBG_API_VERSION
+** and show the user an error if any of these tests fail.
+**
+*/
+
+typedef enum {
+ rlvtRelease,
+ rlvtBeta,
+ rlvtDebug
+} RLVT; // ReLease Version Type
+
+typedef struct _AVS {
+ CHAR rgchType [ 2 ]; // Component name (EE,EM,TL,SH,DM)
+ WORD rlvt; // ReLease Version Type
+ BYTE iApiVer; // DBG_API_VERSION
+ BYTE iApiSubVer; // DBG_API_SUBVERSION
+ WORD iRup; // Revision number
+ WORD chBuild; // Build of revision # (a,b,c,d)
+ LSZ lszTitle; // User readable text describing the DLL
+ MPT mpt; // CPU binary is running on
+ WORD iRmj; // Major version number
+ WORD iRmm; // Minor version number
+} AVS; // Api Version Structure
+typedef AVS *LPAVS;
+
+
+/* DBGVersionCheck:
+**
+** All debug dlls should provide this API and support the return
+** of a pointer to the structure described above even before
+** initialization takes place.
+*/
+
+#if defined(_M_IX86)
+#define __dbgver_cpu__ mptix86
+#elif defined(_M_MRX000)
+#define __dbgver_cpu__ mptmips
+#elif defined(_M_ALPHA)
+#define __dbgver_cpu__ mptdaxp
+#elif defined(_M_PPC)
+#define __dbgver_cpu__ mptntppc
+#else
+#error( "unknown host machine" );
+#endif
+
+#define DEBUG_VERSION(C1,C2,TITLE) \
+AVS Avs = { \
+ { C1, C2 }, \
+ rlvtDebug, \
+ DBG_API_VERSION, \
+ DBG_API_SUBVERSION, \
+ 0, \
+ '\0', \
+ TITLE, \
+ __dbgver_cpu__, \
+ 0, \
+ 0, \
+ };
+
+#define RELEASE_VERSION(C1,C2,TITLE) \
+AVS Avs = { \
+ { C1, C2 }, \
+ rlvtRelease, \
+ DBG_API_VERSION, \
+ DBG_API_SUBVERSION, \
+ 0, \
+ '\0', \
+ TITLE, \
+ __dbgver_cpu__, \
+ 0, \
+ 0, \
+};
+
+#undef MINOR
+#undef MAJOR
+
+#define DBGVERSIONPROCNAME "DBGVersionCheck"
+
+typedef LPAVS (*DBGVERSIONPROC)(VOID);
+LPAVS WINDBGVersionCheck(VOID);
+LPAVS DBGVersionCheck(VOID);
+
+
+#define DBGVERSIONFUNCTION() \
+ LPAVS WINDBGVersionCheck( void ) { return &Avs; } \
+ LPAVS DBGVersionCheck( void ) { return &Avs; }
+
+#define DBGVERSIONCHECK() DBGVERSIONFUNCTION()
+
+#endif // _DBGVER_
diff --git a/private/windbg/osdebug/include/eeapi.h b/private/windbg/osdebug/include/eeapi.h
new file mode 100644
index 000000000..cb19423de
--- /dev/null
+++ b/private/windbg/osdebug/include/eeapi.h
@@ -0,0 +1,395 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ Eeapi.h
+
+Abstract:
+
+ This file contains all types and APIs that are defined by the
+ Expression Evaluator and are publicly accessible by other components.
+
+Author:
+
+ David J. Gilman (davegi) 04-May-1992
+
+Environment:
+
+ Win32, User Mode
+
+Notes:
+
+ The master copy of this file resides in the CodeView project. All
+ Microsoft projects are required to use the master copy without
+ modification. Modification of the master version or a copy without
+ consultation with all parties concerned is extremely risky.
+
+ The projects known to use this version (1.00.00) are:
+
+ Codeview
+ Sequoia
+ C/C++ expression evaluator
+ Cobol expression evaluator
+ QC/Windows
+ Pascal 2.0 expression evaluator
+
+--*/
+
+#if ! defined( _EEAPI_ )
+#define _EEAPI_
+
+
+// **********************************************************************
+// * *
+// * Initialization Structures *
+// * *
+// **********************************************************************
+
+typedef struct {
+void FAR * (LOADDS PASCAL *pMHlpvAlloc)( size_t );
+void (LOADDS PASCAL *pMHFreeLpv)(void FAR *);
+HEXE (LOADDS PASCAL *pSHGetNextExe)(HEXE);
+HEXE (LOADDS PASCAL *pSHHexeFromHmod)(HMOD);
+HMOD (LOADDS PASCAL *pSHGetNextMod)(HEXE, HMOD);
+PCXT (LOADDS PASCAL *pSHGetCxtFromHmod)(HMOD, PCXT);
+PCXT (LOADDS PASCAL *pSHGetCxtFromHexe)(HEXE, PCXT);
+PCXT (LOADDS PASCAL *pSHSetCxt)(LPADDR, PCXT);
+PCXT (LOADDS PASCAL *pSHSetCxtMod)(LPADDR, PCXT);
+HSYM (LOADDS PASCAL *pSHFindNameInGlobal)(HSYM, PCXT, LPSSTR, SHFLAG, PFNCMP, PCXT);
+HSYM (LOADDS PASCAL *pSHFindNameInContext)(HSYM, PCXT, LPSSTR, SHFLAG, PFNCMP, PCXT);
+HSYM (LOADDS PASCAL *pSHGoToParent)(PCXT, PCXT);
+HSYM (LOADDS PASCAL *pSHHsymFromPcxt)(PCXT);
+HSYM (LOADDS PASCAL *pSHNextHsym)(HMOD, HSYM);
+PCXF (LOADDS PASCAL *pSHGetFuncCxf)(LPADDR, PCXF);
+char FAR * (LOADDS PASCAL *pSHGetModName)(HMOD);
+char FAR * (LOADDS PASCAL *pSHGetExeName)(HEXE);
+char FAR * (LOADDS PASCAL *pSHGetModNameFromHexe)(HEXE);
+char FAR * (LOADDS PASCAL *pSHGetSymFName)(HEXE);
+HEXE (LOADDS PASCAL *pSHGethExeFromName)(char FAR *);
+HEXE (LOADDS PASCAL *pSHGethExeFromModuleName)(char FAR *);
+UOFF32 (LOADDS PASCAL *pSHGetNearestHsym)(LPADDR, HMOD, int, PHSYM);
+SHFLAG (LOADDS PASCAL *pSHIsInProlog)(PCXT);
+SHFLAG (LOADDS PASCAL *pSHIsAddrInCxt)(PCXT, LPADDR);
+UINT (LOADDS PASCAL *pSHModelFromAddr)(PADDR,LPW,LPB,UOFFSET FAR *);
+
+
+BOOL (LOADDS PASCAL *pSLLineFromAddr) ( LPADDR, unsigned short FAR *, SHOFF FAR *, SHOFF FAR * );
+BOOL (LOADDS PASCAL *pSLFLineToAddr) ( HSF, WORD, LPADDR, SHOFF FAR *, WORD FAR * );
+char FAR * (LOADDS PASCAL *pSLNameFromHsf) ( HSF );
+HMOD (LOADDS PASCAL *pSLHmodFromHsf) ( HEXE, HSF );
+HSF (LOADDS PASCAL *pSLHsfFromPcxt) ( PCXT );
+HSF (LOADDS PASCAL *pSLHsfFromFile) ( HMOD, char FAR * );
+
+UOFF32 (LOADDS PASCAL *pPHGetNearestHsym)(LPADDR, HEXE, PHSYM);
+HSYM (LOADDS PASCAL *pPHFindNameInPublics)(HSYM, HEXE, LPSSTR, SHFLAG, PFNCMP);
+HTYPE (LOADDS PASCAL *pTHGetTypeFromIndex)(HMOD, THIDX);
+HTYPE (LOADDS PASCAL *pTHGetNextType)(HMOD, HTYPE);
+HDEP (LOADDS PASCAL *pMHMemAllocate)(UINT);
+HDEP (LOADDS PASCAL *pMHMemReAlloc)(HDEP, UINT);
+void (LOADDS PASCAL *pMHMemFree)(HDEP);
+LPV (LOADDS PASCAL *pMHMemLock)(HDEP);
+void (LOADDS PASCAL *pMHMemUnLock)(HDEP);
+SHFLAG (LOADDS PASCAL *pMHIsMemLocked)(HDEP);
+UINT (LOADDS PASCAL *pDHGetDebuggeeBytes)(ADDR, UINT, void FAR *);
+UINT (LOADDS PASCAL *pDHPutDebuggeeBytes)(ADDR, UINT, void FAR *);
+PSHREG (LOADDS PASCAL *pDHGetReg)(PSHREG, PCXT);
+PSHREG (LOADDS PASCAL *pDHSetReg)(PSHREG, PCXT);
+UINT (LOADDS PASCAL *pDHSetupExecute)(LPHDEP);
+UINT (LOADDS PASCAL *pDHCleanUpExecute)(HDEP);
+UINT (LOADDS PASCAL *pDHStartExecute)(HDEP, LPADDR, BOOL, SHCALL);
+char FAR *pin386mode;
+char FAR *pis_assign;
+void (LOADDS PASCAL *passert)(LPCH,LPCH,UINT);
+void (LOADDS PASCAL *pquit)(UINT);
+ushort FAR *pArrayDefault;
+SHFLAG (LOADDS PASCAL *pSHCompareRE)(char FAR *, char FAR *, BOOL);
+SHFLAG (LOADDS PASCAL *pSHFixupAddr)(LPADDR);
+SHFLAG (LOADDS PASCAL *pSHUnFixupAddr)(LPADDR);
+SHFLAG (LOADDS PASCAL *pCVfnCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+SHFLAG (LOADDS PASCAL *pCVtdCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+SHFLAG (LOADDS PASCAL *pCVcsCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+BOOL (LOADDS PASCAL *pSYGetAddr)(PADDR, int);
+DWORD (LOADDS PASCAL *pSYGetMemInfo)(LPMEMINFO);
+BOOL (LOADDS PASCAL *pSHWantSymbols)(HEXE);
+} CVF; // CodeView kernel Functions exported to the Expression Evaluator
+typedef CVF FAR * PCVF;
+
+typedef struct {
+ short (CDECL *pintLoadDS)();
+ char NEAR * (CDECL *pultoa)(ulong, char NEAR *, int);
+ char NEAR * (CDECL *pitoa)(int, char NEAR *, int);
+ char NEAR * (CDECL *pltoa)(long, char NEAR *, int);
+ int (CDECL *peprintf)(const char FAR *, char FAR *, char FAR *, int);
+ int (CDECL *psprintf)(char NEAR *, const char FAR *, ...);
+} CRF; // C Runtime functions exported to the Expression Evaluator
+typedef CRF FAR * PCRF;
+
+typedef struct CI {
+ char cbCI;
+ char Version;
+ CVF FAR * pStructCVAPI;
+ CRF FAR * pStructCRuntime;
+} CI;
+typedef CI FAR * PCI;
+
+
+typedef struct HDR_TYPE {
+ ushort offname;
+ ushort lenname;
+ ushort offtrail;
+} HDR_TYPE;
+typedef HDR_TYPE FAR *PHDR_TYPE;
+
+// **********************************************************************
+// * *
+// * the expr evaluator stuff *
+// * *
+// **********************************************************************
+
+typedef HDEP HSYML; //* An hsym list
+typedef HSYML FAR * PHSYML; //* A pointer to a hsym list
+typedef uint EERADIX;
+typedef EERADIX FAR * PEERADIX;
+typedef uchar FAR * PEEFORMAT;
+typedef ushort EESTATUS;
+typedef HDEP EEHSTR;
+typedef EEHSTR FAR * PEEHSTR;
+typedef HDEP HTM;
+typedef HTM FAR * PHTM;
+typedef HDEP HTI;
+typedef HTI FAR * PHTI;
+
+
+typedef enum {
+ fmtAscii = 0,
+ fmtInt = 1,
+ fmtUInt = 2,
+ fmtFloat = 3,
+ fmtAddress = 4,
+ fmtUnicode = 5,
+ fmtBasis = 0x0f,
+
+ fmtOverRide = 0x2000, // override logic to force radix
+ fmtZeroPad = 0x4000
+} FMTTYPE;
+
+
+// Error return values
+#define EENOERROR 0
+#define EENOMEMORY 1
+#define EEGENERAL 2
+#define EEBADADDR 3
+#define EEBADFORMAT 4
+#define EEOVERRUN 5
+#define EEOPTIONAL 6 // expression valid for optional form
+#define EEDEFAULT 7 // argument was missing; default value was used
+#define EECATASTROPHIC 0XFF
+
+typedef enum {
+ EEHORIZONTAL,
+ EEVERTICAL,
+ EEBPADDRESS
+} EEDSP; // Display format specifier
+
+typedef enum {
+ EENOTEXP,
+ EEAGGREGATE,
+ EETYPE,
+ EEPOINTER,
+ EETYPENOTEXP
+} EEPDTYP;
+typedef EEPDTYP FAR *PEEPDTYP;
+
+typedef enum {
+ EEFMT_32 = 0x01, /* Display a 32-bit offset */
+ EEFMT_SEG = 0x02, /* Display a segment */
+ EEFMT_LOWER = 0x04, /* Use lowercase letters */
+ EEFMT_REAL = 0x08 /* Real mode address */
+} EEFMTFLGS;
+
+typedef struct TML {
+ unsigned cTMListMax;
+ unsigned cTMListAct;
+ unsigned iTMError;
+ HDEP hTMList;
+} TML;
+typedef TML FAR *PTML;
+
+#define TMLISTCNT 20 // number of entries in TM list
+
+
+typedef struct RI {
+ ushort fSegType :1;
+ ushort fAddr :1;
+ ushort fValue :1;
+ ushort fSzBits :1;
+ ushort fSzBytes :1;
+ ushort fLvalue :1;
+ ushort Type;
+} RI;
+typedef RI FAR * PRI;
+
+typedef struct TI {
+ RI fResponse;
+ struct {
+ ushort SegType :4;
+ ushort fLvalue :1;
+ ushort fAddrInReg :1;
+ ushort fBPRel :1;
+ ushort fFunction :1;
+ ushort fLData :1; // True if expression references local data
+ ushort fGData :1; // True if expression references global data
+ ushort fFmtStr :1;
+ } u;
+ union {
+ ADDR AI;
+ ushort hReg; // This is really a CV_HREG_e
+ } u2;
+ ulong cbValue;
+#ifdef i386
+ char Value[0];
+#else
+ char Value[1];
+#endif
+} TI;
+typedef TI FAR * PTI;
+
+typedef struct {
+ HSYM hSym;
+ CXT CXT;
+} HCS;
+
+typedef struct {
+ CXT CXT;
+ ushort cHCS;
+#ifdef i386
+ HCS rgHCS[0];
+#else
+ HCS rgHCS[1];
+#endif
+} CXTL;
+
+typedef HDEP HCXTL;
+typedef HCXTL FAR * PHCXTL;
+typedef CXTL FAR * PCXTL;
+
+// Structures for Get/Free HSYMList
+
+// Search request / response flags for Get/Free HSYMList
+
+#define HSYMR_lexical 0x0001 // lexical out to function scope
+#define HSYMR_function 0x0002 // function scope
+#define HSYMR_class 0x0004 // class scope
+#define HSYMR_module 0x0008 // module scope
+#define HSYMR_global 0x0010 // global symbol table scope
+#define HSYMR_exe 0x0020 // all other module scope
+#define HSYMR_public 0x0040 // public symbols
+#define HSYMR_nocase 0x8000 // case insensitive
+#define HSYMR_allscopes \
+ HSYMR_lexical | \
+ HSYMR_function | \
+ HSYMR_class | \
+ HSYMR_module | \
+ HSYMR_global | \
+ HSYMR_exe | \
+ HSYMR_public
+
+// structure describing HSYM list for a context
+
+typedef struct HSL_LIST {
+ ushort request; // context that this block statisfies
+ struct {
+ ushort isused :1; // block contains data if true
+ ushort hascxt :1; // context packet has been stored
+ ushort complete :1; // block is complete if true
+ ushort isclass :1; // context is class if true
+ } status;
+ HSYM hThis; // handle of this pointer if class scope
+ ushort symbolcnt; // number of symbol handles in this block
+ CXT Cxt; // context for this block of symbols
+ HSYM hSym[]; // list of symbol handles
+} HSL_LIST;
+typedef HSL_LIST FAR *PHSL_LIST;
+
+
+typedef struct HSL_HEAD {
+ ushort size; // number of bytes in buffer
+ ushort remaining; // remaining space in buffer
+ PHSL_LIST pHSLList; // pointer to current context list (EE internal)
+ struct {
+ ushort endsearch :1; // end of search reached if true
+ ushort fatal :1; // fatal error if true
+ } status;
+ ushort blockcnt; // number of CXT blocks in buffer
+ ushort symbolcnt; // number of symbol handles in buffer
+ HDEP restart; // handle of search restart information
+} HSL_HEAD;
+typedef HSL_HEAD FAR *PHSL_HEAD;
+
+typedef struct {
+void (LOADDS PASCAL *pEEFreeStr)(EEHSTR);
+EESTATUS (LOADDS PASCAL *pEEGetError)(PHTM, EESTATUS, PEEHSTR);
+EESTATUS (LOADDS PASCAL *pEEParse)(char FAR *, EERADIX, SHFLAG, PHTM, uint FAR *);
+EESTATUS (LOADDS PASCAL *pEEBindTM)(PHTM, PCXT, SHFLAG, SHFLAG,BOOL);
+EESTATUS (LOADDS PASCAL *pEEvaluateTM)(PHTM, PFRAME, EEDSP);
+EESTATUS (LOADDS PASCAL *pEEGetExprFromTM)(PHTM, PEERADIX, PEEHSTR, ushort FAR *);
+EESTATUS (LOADDS PASCAL *pEEGetValueFromTM)(PHTM, EERADIX, PEEFORMAT, PEEHSTR);
+EESTATUS (LOADDS PASCAL *pEEGetNameFromTM)(PHTM, PEEHSTR);
+EESTATUS (LOADDS PASCAL *pEEGetTypeFromTM)(PHTM, EEHSTR, PEEHSTR, ulong);
+EESTATUS (LOADDS PASCAL *pEEFormatCXTFromPCXT)(PCXT, PEEHSTR, BOOL);
+void (LOADDS PASCAL *pEEFreeTM)(PHTM);
+EESTATUS (LOADDS PASCAL *pEEParseBP)(char FAR *, EERADIX, SHFLAG, PCXF, PTML, ulong, uint FAR *, SHFLAG);
+void (LOADDS PASCAL *pEEFreeTML)(PTML);
+EESTATUS (LOADDS PASCAL *pEEInfoFromTM)(PHTM, PRI, PHTI);
+void (LOADDS PASCAL *pEEFreeTI)(PHTI);
+EESTATUS (LOADDS PASCAL *pEEGetCXTLFromTM)(PHTM, PHCXTL);
+void (LOADDS PASCAL *pEEFreeCXTL)(PHCXTL);
+EESTATUS (LOADDS PASCAL *pEEAssignTMToTM)(PHTM, PHTM);
+EEPDTYP (LOADDS PASCAL *pEEIsExpandable)(PHTM);
+SHFLAG (LOADDS PASCAL *pEEAreTypesEqual)(PHTM, PHTM);
+EESTATUS (LOADDS PASCAL *pEEcChildrenTM)(PHTM, long FAR *, PSHFLAG);
+EESTATUS (LOADDS PASCAL *pEEGetChildTM)(PHTM, long, PHTM, uint FAR *, SHFLAG, uint);
+EESTATUS (LOADDS PASCAL *pEEDereferenceTM)(PHTM, PHTM, uint FAR *, SHFLAG);
+EESTATUS (LOADDS PASCAL *pEEcParamTM)(PHTM, ushort FAR *, PSHFLAG);
+EESTATUS (LOADDS PASCAL *pEEGetParmTM)(PHTM, uint, PHTM, uint FAR *, SHFLAG, uint);
+EESTATUS (LOADDS PASCAL *pEEGetTMFromHSYM)(HSYM, PCXT, PHTM, uint FAR *, SHFLAG);
+EESTATUS (LOADDS PASCAL *pEEFormatAddress)(SHSEG, SHOFF, char FAR *, uint, uint);
+EESTATUS (LOADDS PASCAL *pEEGetHSYMList)(PHSYML, PCXT, ushort, uchar FAR *, SHFLAG);
+void (LOADDS PASCAL *pEEFreeHSYMList)(PHSYML);
+EESTATUS (LOADDS PASCAL *pEEFormatAddr)(LPADDR, char FAR *, uint, uint);
+EESTATUS (LOADDS PASCAL *pEEUnFormatAddr)(LPADDR, char FAR *);
+SHFLAG (LOADDS PASCAL *pfnCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+SHFLAG (LOADDS PASCAL *ptdCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+SHFLAG (LOADDS PASCAL *pcsCmp)(HVOID, HVOID, char FAR *, SHFLAG);
+EESTATUS (LOADDS PASCAL *pEEFormatMemory)(char FAR *, uint, char FAR *, uint, FMTTYPE, uint);
+EESTATUS (LOADDS PASCAL *pEEUnformatMemory)(uchar FAR *, char FAR *, uint, FMTTYPE, uint);
+EESTATUS (LOADDS PASCAL *pEEFormatEnumerate)(uint, uint FAR *, uint FAR *, uint FAR *,
+ uint FAR *, uint FAR *, LPCH FAR *);
+HTYPE (LOADDS PASCAL *pEEGetHtypeFromTM)(PHTM);
+void (LOADDS PASCAL *pEESetSuffix)(char);
+
+} EXF;
+typedef EXF FAR * PEXF;
+
+typedef struct EI {
+ char cbEI;
+ char Version;
+ PEXF pStructExprAPI;
+ char Language;
+ char FAR *IdCharacters;
+ char FAR *EETitle;
+ char FAR *EESuffixes;
+ char FAR *Assign; // length prefixed assignment operator
+} EI;
+typedef EI FAR * PEI;
+
+// FNEEINIT is the prototype for the EEInitializeExpr function
+typedef VOID LOADDS PASCAL FAR FNEEINIT(PCI, PEI);
+typedef VOID (PASCAL LOADDS FAR * LPFNEEINIT)(PCI, PEI);
+
+// This is the only EE function that's actually exported from the DLL
+//FNEEINIT EEInitializeExpr;
+
+#endif // _EEAPI_
diff --git a/private/windbg/osdebug/include/emdm.h b/private/windbg/osdebug/include/emdm.h
new file mode 100644
index 000000000..a58f712b3
--- /dev/null
+++ b/private/windbg/osdebug/include/emdm.h
@@ -0,0 +1,432 @@
+/**** 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
diff --git a/private/windbg/osdebug/include/heap.h b/private/windbg/osdebug/include/heap.h
new file mode 100644
index 000000000..2052e0877
--- /dev/null
+++ b/private/windbg/osdebug/include/heap.h
@@ -0,0 +1,16 @@
+
+#if USE_HEAP_CHECKING
+
+void
+ValidateTheHeap(
+ char *fName,
+ unsigned long dwLine
+ );
+
+#define ValidateHeap() ValidateTheHeap( __FILE__, __LINE__ )
+
+#else
+
+#define ValidateHeap()
+
+#endif
diff --git a/private/windbg/osdebug/include/ll.h b/private/windbg/osdebug/include/ll.h
new file mode 100644
index 000000000..f971f906c
--- /dev/null
+++ b/private/windbg/osdebug/include/ll.h
@@ -0,0 +1,9 @@
+/*
+** This file can be used as a single include file to get all of
+** the list manager types and prototypes. The files can also be
+** included independently
+**
+*/
+
+#include "lltypes.h"
+#include "llproto.h"
diff --git a/private/windbg/osdebug/include/llproto.h b/private/windbg/osdebug/include/llproto.h
new file mode 100644
index 000000000..c1f54960b
--- /dev/null
+++ b/private/windbg/osdebug/include/llproto.h
@@ -0,0 +1,70 @@
+/*
+** This file contains the set of prototypes and defines which pass
+** as functions for the list manager subsystem.
+**
+*/
+
+#ifndef LL_PROTO_INCLUDED
+#define LL_PROTO_INCLUDED 1
+
+
+/*
+** Prototypes for the list manager system
+*/
+
+extern HLLI PASCAL LOADDS LLHlliInit( UINT, LLF, LPFNKILLNODE, LPFNFCMPNODE );
+extern HLLE PASCAL LOADDS LLHlleCreate( HLLI );
+extern void PASCAL LOADDS LLAddHlleToLl( HLLI, HLLE );
+extern void PASCAL LOADDS LLInsertHlleInLl( HLLI, HLLE, DWORD );
+extern BOOL PASCAL LLFDeleteHlleIndexed( HLLI, DWORD );
+extern BOOL PASCAL LLFDeleteLpvFromLl( HLLI, HLLE, LPV, DWORD );
+extern BOOL PASCAL LOADDS LLFDeleteHlleFromLl( HLLI, HLLE );
+extern HLLE PASCAL LOADDS LLHlleFindNext( HLLI, HLLE );
+extern LONG PASCAL LOADDS LLChlleDestroyLl( HLLI );
+extern HLLE PASCAL LOADDS LLHlleFindLpv( HLLI, HLLE, LPV, DWORD );
+extern DWORD PASCAL LOADDS LLChlleInLl( HLLI );
+extern LPV PASCAL LOADDS LLLpvFromHlle( HLLE );
+extern VOID PASCAL LOADDS LLUnlockHlle( HLLE );
+extern HLLE PASCAL LOADDS LLHlleGetLast( HLLI );
+extern void PASCAL LOADDS LLHlleAddToHeadOfLI( HLLI, HLLE );
+extern BOOL PASCAL LOADDS LLFRemoveHlleFromLl( HLLI, HLLE );
+
+
+#ifdef DBLLINK
+extern HLLE PASCAL LOADDS LLHlleFindPrev( HLLI, HLLE );
+#endif // DBLLINK
+
+//
+// FCheckHlli is for debug versions ONLY as an integrety check
+//
+
+#ifdef DEBUGVER
+extern BOOL PASCAL LLFCheckHlli( HLLI );
+#else // DEBUGVER
+#define LLFCheckHlli(hlli) TRUE
+#endif // DEBUGVER
+
+//
+// Map memory manager to our source versions
+//
+
+#define AllocHmem(cb) MMhAllocMb(MMDLLHEAP,CVMALLOCED,cb) // _fmalloc(cb)
+#define FreeHmem(h) MMDeallocMb(h) // _ffree(h)
+#define LockHmem(h) MMlpvLockMb(h) // (h)
+#define UnlockHmem(h) MMbUnlockMb(h) //
+
+//
+// This helps the codes appearance!
+//
+
+#define UnlockHlle(hlle) UnlockHmem((HDEP) hlle)
+#define UnlockHlli(hlli) UnlockHmem(hlli)
+
+
+/*
+** More help on code appearance
+*/
+
+#define LLHlleDestroy(hlle) MMDeallocateMb(h)
+
+#endif /* LL_PROTO_INCLUDED */
diff --git a/private/windbg/osdebug/include/lltypes.h b/private/windbg/osdebug/include/lltypes.h
new file mode 100644
index 000000000..4083933f3
--- /dev/null
+++ b/private/windbg/osdebug/include/lltypes.h
@@ -0,0 +1,22 @@
+/*
+** This file contains the basic types used by the list manager.
+**
+** It is assumed that these will not be passed across a transport
+** layer from an EM to a DM or from a DM to an EM. These types are
+** therefore defined in a machine dependent manner.
+*/
+
+#ifndef LL_TYPES_INCLUDED
+#define LL_TYPES_INCLUDED 1
+
+//
+// Return values from lpfnCmpNode functions
+//
+
+#define fCmpLT -1
+#define fCmpEQ 0
+#define fCmpGT 1
+
+#define hlleNull (HLLE)NULL
+
+#endif /* LL_TYPES_INCLUDED */
diff --git a/private/windbg/osdebug/include/od.h b/private/windbg/osdebug/include/od.h
new file mode 100644
index 000000000..619504f01
--- /dev/null
+++ b/private/windbg/osdebug/include/od.h
@@ -0,0 +1,1160 @@
+/*++
+
+Copyright (c) 1992 Microsoft Corporation
+
+Module Name:
+
+ Od.h
+
+Abstract:
+
+Author:
+
+ David J. Gilman (davegi) 05-Apr-1992
+
+Environment:
+
+ Win32, User Mode
+
+--*/
+
+#if ! defined _OD_
+#define _OD_
+
+#include "shapi.hxx"
+#include "odmsg.h"
+
+typedef enum {
+ xosdContinue = 1,
+ xosdNone = 0,
+ xosdQueueEmpty = -1,
+ xosdModLoad = -2,
+ xosdFindProc = -3,
+ xosdOSStruct = -4,
+ xosdSyntax = -5,
+ xosdInvalidProc = -6,
+ xosdInvalidThread = -7,
+ xosdInvalidTL = -8,
+ xosdInvalidEM = -9,
+ xosdNoProc = -10,
+ xosdProcRunning = -11,
+ xosdCreateDBGThread = -12,
+ xosdOutOfMemory = -13,
+ xosdInvalidBreakPoint = -14,
+ xosdBadAddress = -15,
+ xosdNoWatchPoints = -16,
+ xosdInvalidPID = -17,
+ xosdInvalidTID = -18,
+ xosdOutOfThreads = -19,
+ xosdOutOfProcs = -20,
+ xosdPtrace = -21,
+ xosdLoadChild = -22,
+ xosdRead = -23,
+ xosdWrite = -24,
+ xosdBadQueue = -25,
+ xosdEMInUse = -26,
+ xosd27 = -27,
+ xosdTLInUse = -28,
+ xosd29 = -29,
+ xosdFatal = -30,
+ xosdUnknown = -31,
+ xosdInvalidMTE = -32,
+ xosdInvalidSelector = -33,
+ xosdInvalidRegister = -34,
+
+ xosdInvalidParameter = -35,
+ xosdOutOfStructures = -36,
+ xosdPathNotFound = -37,
+ xosdLineBusy = -38,
+ xosdBadLine = -39,
+ xosdBrokenLine = -40,
+ xosdInterrupt = -41,
+ xosdInvalidFunction = -42,
+ xosdLineNotConnected = -43,
+ xosdAccessDenied = -44,
+ xosdCannotMake = -45,
+ xosdFileNotFound = -46,
+ xosdInvalidAccess = -47,
+ xosdOpenFailed = -48,
+ xosdSharingBufferExeeded= -49,
+ xosdSharingViolation = -50,
+ xosdLine = -51,
+ xosdEndOfStack = -52,
+ xosdFPNotLoaded = -53,
+
+ xosdQuit = -54,
+ xosdTooManyObjects = -55,
+ xosdGetModNameFail = -56,
+ xosdCannotConnect = -57,
+ xosdPunt = -58,
+ xosdNotFound = -59,
+ xosdIDError = -60,
+ xosdOverrun = -61,
+ xosdBadFormat = -62,
+
+ xosdAsmTooFew = -63,
+ xosdAsmTooMany = -64,
+ xosdAsmSize = -65,
+ xosdAsmBadRange = -66,
+ xosdAsmOverFlow = -67,
+ xosdAsmSyntax = -68,
+ xosdAsmBadOpcode = -69,
+ xosdAsmExtraChars = -70,
+ xosdAsmOperand = -71,
+ xosdAsmBadSeg = -72,
+ xosdAsmBadReg = -73,
+ xosdAsmDivide = -74,
+ xosdAsmSymbol = -75,
+ xosdErrorMoreInfo = -76,
+ xosdUnsupported = -77,
+ xosdCannotDebug = -78,
+ xosdVDMRunning = -79,
+ xosdBadRemoteVersion = -80,
+ xosdBadVersion = -81,
+ xosdCantOpenComPort = -82,
+ xosdBadComParameters = -83,
+ xosdBadPipeServer = -84,
+ xosdBadPipeName = -85,
+ xosdNotRemote = -86,
+ xosdAttachDeadlock = -87
+} XOSD;
+
+typedef LONG XOSD_;
+
+typedef XOSD FAR *LPXOSD;
+
+
+typedef struct _INF {
+ BOOL fReply; // Reply desired
+ DWORD fUniCode; // Unicode flag
+ BYTE buffer[]; // the string
+} INF; // InfoAvail return
+typedef INF * LPINF;
+
+typedef enum {
+ fctNone,
+ fctNear,
+ fctFar
+} FCT; // Function Call Type for OSDGetCaller
+
+typedef enum {
+ emNative,
+ emNonNative
+} EMTYPE;
+
+typedef enum {
+ stoNone = 0,
+ stoOneThread = 1, // Execute a single thread
+ stoInitialBP = 2, // Skip on initial breakpoint
+ stoQueryStep = 4 // Query before stepping into
+} STO; // STep Options
+
+typedef enum {
+ dopNone = 0x00000000,
+ dopAddr = 0x00000001, // put address (w/ seg) in front of disassm
+ dopFlatAddr = 0x00000002, // put flat address (no seg)
+ dopOpcode = 0x00000004, // dump the Opcode
+ dopOperands = 0x00000008, // dump the Operands
+ dopRaw = 0x00000010, // dump the raw code bytes
+ dopEA = 0x00000020, // calculate the effective address
+ dopSym = 0x00000040, // output symbols
+ dopUpper = 0x00000080, // force upper case for all chars except syms
+ dopDemand = 0x00000100 // disasm window open only on user demand
+} DOP; // Disassembly OPtions
+
+
+typedef struct _SDI {
+ DOP dop; // Disassembly OPtions (see above)
+ ADDR addr; // The address to disassemble
+ BOOL fAssocNext; // This instruction is associated w/ the next one
+ BOOL fIsBranch;
+ BOOL fIsCall;
+ BOOL fJumpTable;
+ ADDR addrEA0; // First effective address
+ ADDR addrEA1; // Second effective address
+ ADDR addrEA2; // Third effective address
+ int cbEA0; // First effective address size
+ int cbEA1; // Second effective address size
+ int cbEA2; // Third effective address size
+ int ichAddr;
+ int ichBytes;
+ int ichOpcode;
+ int ichOperands;
+ int ichComment;
+ int ichEA0;
+ int ichEA1;
+ int ichEA2;
+ LPCH lpch;
+} SDI; // Structured DiSsassembly
+typedef SDI FAR *LPSDI;
+
+typedef HIND HTL; // handle to a transport layer
+typedef HIND HEM; // handle to an execution model
+
+typedef HPID FAR *LPHPID;
+typedef HTID FAR *LPHTID;
+typedef HTL FAR *LPHTL;
+typedef HEM FAR *LPHEM;
+
+typedef struct GIS {
+ BOOL fCanSetup;
+ CHAR rgchInfo [ 80 ];
+} GIS; // Get Info Struct for OSDTLGetInfo
+
+typedef GIS FAR * LPGIS;
+
+
+/*
+** Thread state structure
+*/
+
+typedef enum {
+ tstRunnable = 0, // Thread is not running but has been stopped due
+ // to a debug event on another thread in the
+ // current process, or hasn't run yet.
+ tstStopped = 1, // Thread is at a debug event (other than exception)
+ tstRunning = 2, // Thread is current in the scheduler queue
+ tstExiting = 3, // Thread is in the process of exiting
+ tstDead = 4, // Thread is no longer schedulable (may not exists for
+ tstRunMask = 0xf,
+ // all Ems
+ tstExcept1st = 0x10, // Thread is at first chance exception
+ tstExcept2nd = 0x20, // Thread is at second change exception
+ tstRip = 0x30, // Thread is in a RIP state
+ tstExceptionMask = 0xf0,
+
+ tstFrozen = 0x100, // Thread has been frozen by Debugger
+ tstSuspended = 0x200, // Thread has been frozen by Other
+ tstBlocked = 0x300, // Thread is blocked on something (i.e. a semaphore)
+ tstSuspendMask= 0xf00,
+
+ tstCritSec = 0x1000, // Thread is currently in a critical section
+ tstOtherMask = 0xf000
+} TSTATE;
+
+
+// Process state bits
+typedef enum {
+ pstRunning = 0,
+ pstStopped = 1,
+ pstExited = 2,
+ pstDead = 3
+} PSTATE;
+
+
+#define IDSTRINGSIZE 10
+#define STATESTRINGSIZE 60
+typedef struct _PST {
+ DWORD dwProcessID;
+ DWORD dwProcessState;
+ char rgchProcessID[IDSTRINGSIZE];
+ char rgchProcessState[STATESTRINGSIZE];
+} PST;
+typedef PST FAR * LPPST;
+
+typedef struct _TST {
+ DWORD dwThreadID;
+ DWORD dwSuspendCount;
+ DWORD dwSuspendCountMax;
+ DWORD dwPriority;
+ DWORD dwPriorityMax;
+ DWORD dwState;
+ DWORD dwTeb;
+ char rgchThreadID[IDSTRINGSIZE];
+ char rgchState[STATESTRINGSIZE];
+ char rgchPriority[STATESTRINGSIZE];
+} TST;
+typedef TST FAR * LPTST;
+
+XOSD PASCAL
+OSDGetThreadStatus(
+ HPID hpid,
+ HTID htid,
+ LPTST lptst
+ );
+
+XOSD PASCAL
+OSDGetProcessStatus(
+ HPID hpid,
+ LPPST lppst
+ );
+
+/*
+**
+*/
+
+typedef enum {
+ osdGoXXX, // 00 - Run the debuggee
+ // wParam = nothing
+ // lParam = nothing
+ osdSingleStepXXX, // 01 - Single-step
+ // wParam = sto
+ // stoOneThread = Step only this thread
+ // stoInitialBP = Step over init break
+ // stoQueryStep = Query before stepinto
+ // lParam = nothing
+ osdStepOverXXX, // 02 - Single-step, step over calls and ints
+ // wParam = sto
+ // stoOneThread = Step only this thread
+ // stoInitialBP = Step over init break
+ // lParam = nothing
+ osdStopXXX, // 03 - Do an asynchronous stop of the process
+ // wParam = nothing
+ // lParam = nothing
+ osdFreeze, // 04 - Freeze thread indicated by HTID
+ // wParam = nothing
+ // lParam = nothing
+ osdThaw, // 05 - Thaw thread indicated by HTID
+ // wParam = nothing
+ // lParam = nothing
+ osdIOCTL, // 06 - Special debuggee controls
+ // wParam = command- and DM-dependent
+ // lParam = command- and DM-dependent
+ osdProcStatusXXX, // 07 - Query process status
+ // wParam = nothing
+ // lParam = LPBOOL, filled with fProcRunning
+ osdThreadStatusXXX, // 08 - Query thread status
+ // wParam = nothing
+ // lParam = LPTST (see emp.hmd)
+ osdReadBuf, // 09 - Read memory from address set on last
+ // OSDSetAddr(adrCurrent) call
+ // wParam = number of bytes to read
+ // lParam = pointer to buffer
+ osdWriteBuf, // 0A - Write memory to address set on last
+ // OSDSetAddr(adrCurrent) call
+ // wParam = number of bytes to write
+ // lParam = pointer to buffer
+ osdSetWatchPointXXX, // 0B - Set watchpoint at address set on last
+ // OSDSetAddr(adrCurrent) call (positive
+ // return value is a watchpoint number)
+ // wParam = length of watchpoint
+ // lParam = type and scope [specify]
+ osdRemoveWatchPointXXX, // 0C - Remove a watchpoint
+ // wParam = watchpoint number
+ // lParam = nothing
+ osdSetBreakPointXXX, // 0D - Set a breakpoint.
+ // wParam = fOneThread
+ // lParam = ptr to ADDR
+ osdRemoveBreakPointXXX, // 0E - Remove a breakpoint.
+ // wParam = fOneThread
+ // lParam = ptr to ADDR
+ osdRangeStepXXX, // 0F - Perform osdSingleStep until IP is outside
+ // range from starting IP to ADDR pointed to
+ // by lParam
+ // wParam = sto
+ // stoOneThread = Step only this thread
+ // stoInitialBP = Step over init break
+ // stoQueryStep = Query before stepinto
+ // lParam = ptr to ending ADDR
+ osdRangeOverXXX, // 10 - Perform osdStepOver until IP is outside
+ // range from starting IP to ADDR pointed to
+ // by lParam
+ // wParam = sto
+ // stoOneThread = Step only this thread
+ // stoInitialBP = Step over init break
+ // lParam = ptr to ending ADDR
+ osdHandleExceptionXXX, // 11 - Clear current exception on target and
+ // prepare debuggee for execution
+ // wParam = nothing
+ // lParam = nothing
+ osdGetLibNameXXX, // 12 - Query the name of a module (REVIEW: gone)
+ // wParam = ??
+ // lParam = ??
+ osdShowDebuggee, // 13 - Show debugger's or debuggee's screen
+ // wParam = TRUE for gee's, FALSE for ger's
+ // lParam = nothing
+ osdFixupAddr, // 14 - Map ADDR from un-fixed up to fixed up
+ // wParam = nothing
+ // lParam = ptr to ADDR
+ osdUnFixupAddr, // 15 - Map ADDR from fixed up to un-fixed up
+ // wParam = nothing
+ // lParam = ptr to ADDR
+ osdSetEmi, // 16 - Set EMI field of an ADDR
+ // wParam = nothing
+ // lParam = ptr to ADDR
+ osdEMSvcReqXXX, // 17 - [talk to Jon]
+ // wParam = ??
+ // lParam = ??
+ osdSendChar, // 18 - Send a character to the target OS
+ // wParam = ??
+ // lParam = ??
+ osdFreezeState, // 19 - Freeze or thaw the state of a process.
+ // wParam = TRUE - Freeze, FALSE - Thaw
+ // lParam = nothing
+ osdIsOverlayLoaded, // 1A - Check to see if overlay is loaded
+ // wParam = ??
+ // lParam = point to addr to check
+ osdCompareAddrs, // 1B - Compare addresses
+ //
+ // lParam far pointer to rglpaddr[2];
+ //
+ osdIgnoreExceptionXXX, // 1C - Ignore exception
+ // wParam = nothing
+ // lParam = nothing
+ osdMax // 1D
+} OSD; // OSDebug commands for OSDPtrace
+
+enum _MTRC {
+ mtrcProcessorType,
+ mtrcProcessorLevel,
+ mtrcEndian,
+ mtrcThreads,
+ mtrcCRegs,
+ mtrcCFlags,
+ mtrcExtRegs,
+ mtrcExtFP,
+ mtrcExtMMU,
+ mtrcPidSize,
+ mtrcTidSize,
+ mtrcExceptionHandling,
+ mtrcAssembler,
+ mtrcAsync,
+ mtrcAsyncStop,
+ mtrcBreakPoints,
+ mtrcReturnStep,
+ mtrcShowDebuggee,
+ mtrcHardSoftMode,
+ mtrcRemote,
+ mtrcOleRpc, // Supports OLE Remote Procedure Call debugging?
+ mtrcNativeDebugger, // Supports low-level debugging (eg MacsBug)
+ mtrcOSVersion,
+ mtrcMultInstances
+};
+typedef DWORD MTRC;
+
+enum {
+ adrCurrent = 1, // scratch address, e.g. for reading/writing memory
+ adrPC = 2, // program counter (e.g. CS:EIP)
+ adrBase = 3, // base pointer (e.g. SS:EBP)
+ adrStack = 4, // stack pointer (e.g. SS:ESP)
+ adrData = 5, // pointer to beginning of data (e.g. DS:0)
+// adrBaseProlog = 6, // base pointer while PC is in prolog of a function(?)
+ adrTlsBase = 7 // Thread Local Storage base address
+};
+typedef short ADR; // address passed to OSDGetAddr/OSDSetAddr
+
+/*
+** Register types --- flags describing recommendations on
+** register display
+*/
+
+enum {
+ rtProcessMask = 0x0f, // Mask for processor type bits
+ rtCPU = 0x01, // Central Processing Unit
+ rtFPU = 0x02, // Floating Point Unit
+ rtMMU = 0x03, // Memory Manager Unit
+
+ rtGroupMask = 0xf0, // Which group register falls into
+ rtInvisible = 0x10, // Recommend no display
+ rtRegular = 0x20, // Recommend regular display
+ rtExtended = 0x40, // Recommend extended display
+ rtSpecial = 0x80, // Special registers...
+
+ rtFmtTypeMask = 0xf00, // Mask of display formats
+ rtInteger = 0x100, // Unsigned integer format
+ rtFloat = 0x200, // Floating point format
+ rtAddress = 0x300, // Address format
+
+ rtMiscMask = 0xf000, // misc info
+ rtPC = 0x1000, // this is the PC
+ rtFrame = 0x2000, // this reg affects the stack frame
+ rtNewLine = 0x4000 // print newline when listing
+};
+typedef short RT; // Register Types
+
+#define rtFmtTypeShift 8
+
+
+/*
+** Flag types -- flags describing recommendations on flag display
+*/
+
+enum {
+ ftInvisible = 0x01,
+ ftRegular = 0x02,
+ ftRegularExt= 0x04,
+ ftFP = 0x08,
+ ftFPExt = 0x10,
+ ftMMU = 0x20,
+ ftMMUExt = 0x40
+};
+typedef short FT; // Flag Types
+
+/*
+** Register description: This structure contains the description for
+** a register on the machine. Note that hReg must be used to get
+** the value for this register but a different index is used to get
+** this description structure.
+*/
+
+typedef struct {
+ char FAR * lpsz; /* Pointer into EM for registers name */
+ RT rt; /* Register Type flags */
+ UINT cbits; /* Number of bits in the register */
+ USHORT hReg; /* Value to use with Read/Write Register*/
+} RD; // Register Description
+
+/*
+** Flag Data description: This structure contains the description for
+** a flag on the machine. Note that the hReg field contains the
+** value to be used with Read/Write register to get the register which
+** contains this flag.
+*/
+
+typedef struct {
+ char FAR * lpsz; /* Pointer into EM for flag name */
+ RT ft; /* Flag Type flags */
+ UINT cbits; /* Number of bits in the flag */
+ USHORT hReg; /* register containning this flag */
+} FD; // Flag Data description
+typedef XOSD (PASCAL LOADDS *LPFNSVC) ( DBC, HPID, HTID, DWORD, LONG );
+typedef XOSD (PASCAL LOADDS *TLFUNC) ( TLF, HPID, DWORD, LONG );
+typedef XOSD (PASCAL LOADDS *EMFUNC) ( EMF, HPID, HTID, DWORD, LONG );
+
+typedef void (FAR CDECL LOADDS * LPFNCLDS)( void );
+
+typedef struct {
+ void FAR * (PASCAL LOADDS * lpfnMHAlloc) ( UINT );
+ void FAR * (PASCAL LOADDS * lpfnMHRealloc) ( void FAR *, UINT );
+ void (PASCAL LOADDS * lpfnMHFree) ( void FAR * );
+
+ HDEP (PASCAL LOADDS * lpfnMMAllocHmem) ( UINT );
+ void (PASCAL LOADDS * lpfnMMFreeHmem) ( HDEP );
+ void FAR * (PASCAL LOADDS * lpfnMMLock) ( HDEP );
+ VOID (PASCAL LOADDS * lpfnMMUnlock) ( HDEP );
+
+ HLLI (PASCAL LOADDS * LLInit) ( UINT,
+ LLF,
+ LPFNKILLNODE,
+ LPFNFCMPNODE );
+ HLLE (PASCAL LOADDS * LLCreate) ( HLLI );
+ void (PASCAL LOADDS * LLAdd) ( HLLI, HLLE );
+ void (PASCAL LOADDS * LLInsert) ( HLLI, HLLE, DWORD );
+ BOOL (PASCAL LOADDS * LLDelete) ( HLLI, HLLE );
+ HLLE (PASCAL LOADDS * LLNext) ( HLLI, HLLE );
+ LONG (PASCAL LOADDS * LLDestroy) ( HLLI );
+ HLLE (PASCAL LOADDS * LLFind) ( HLLI,
+ HLLE,
+ VOID FAR *,
+ DWORD );
+ LONG (PASCAL LOADDS * LLSize) ( HLLI );
+ VOID FAR * (PASCAL LOADDS * LLLock) ( HLLE );
+ VOID (PASCAL LOADDS * LLUnlock) ( HLLE );
+ HLLE (PASCAL LOADDS * LLLast) ( HLLI );
+ VOID (PASCAL LOADDS * LLAddHead) ( HLLI, HLLE );
+ BOOL (PASCAL LOADDS * LLRemove) ( HLLI, HLLE );
+
+ int (PASCAL LOADDS * lpfnSHModelFromAddr)( PADDR,
+ WORD FAR *,
+ LPB,
+ UOFFSET FAR * );
+
+ int (PASCAL LOADDS * lpfnSHPublicNameToAddr)(PADDR, PADDR, char FAR *);
+
+ LPSTR (PASCAL LOADDS * lpfnSHAddrToPublicName)(LPADDR, LPADDR);
+
+ BOOL (PASCAL LOADDS * lpfnSHWantSymbols)(HEXE);
+
+ LSZ (PASCAL LOADDS * lpfnSHGetSymbol) ( PADDR,
+ PADDR,
+ SOP,
+ LPODR
+ );
+ BOOL (PASCAL LOADDS * lpfnSHGetPublicAddr)( PADDR, LSZ );
+ VOID FAR * (PASCAL LOADDS * lpfnSHLpGSNGetTable)( HEXE );
+ LPDEBUGDATA (PASCAL LOADDS * lpfnSHGetDebugData) ( HEXE );
+ BOOL (PASCAL LOADDS * lpfnSHFindSymbol) ( LSZ, PADDR, LPASR );
+
+ // DWORD (PASCAL LOADDS * lpfnSHLocateSymbolFile)( LSZ, DWORD );
+
+ int (PASCAL LOADDS * lpfnLBPrintf) ( LPCH, LPCH, UINT );
+ int (PASCAL LOADDS * lpfnLBQuit) ( UINT );
+
+ LPFNCLDS (CDECL LOADDS * lpfnSignal) ( int, LPFNCLDS );
+ VOID (CDECL LOADDS * lpfnAbort) ( VOID );
+ int (CDECL LOADDS * lpfnSpawnL) ( LPV FAR *,
+ int,
+ LSZ,
+ LSZ, ... );
+ BOOL (PASCAL LOADDS * lpfnDHGetNumber) ( char FAR *,
+ int FAR *);
+ int FAR * lpPsp;
+ char FAR * lpchOsMajor;
+
+} DBF; // DeBugger callback Functions
+typedef DBF FAR *LPDBF;
+
+
+//
+// Mesage mask values
+//
+#define MSG_TYPE_MOUSE 0x0001
+#define MSG_TYPE_WINDOW 0x0002
+#define MSG_TYPE_INPUT 0x0004
+#define MSG_TYPE_SYSTEM 0x0008
+#define MSG_TYPE_INIT 0x0010
+#define MSG_TYPE_CLIPBOARD 0x0020
+#define MSG_TYPE_DDE 0x0040
+#define MSG_TYPE_NONCLIENT 0x0080
+#define MSG_TYPE_OTHER 0x0100
+
+typedef struct _FUNCTION_INFO {
+ ADDR AddrStart;
+ ADDR AddrEnd;
+ ADDR AddrPrologEnd;
+} FUNCTION_INFO, *PFUNCTION_INFO;
+
+XOSD PASCAL OSDInit ( LPDBF );
+XOSD PASCAL OSDTerm ( VOID );
+XOSD PASCAL OSDCreatePID ( LPFNSVC, HEM, HTL, LPHPID );
+XOSD PASCAL OSDDestroyPID ( HPID );
+XOSD PASCAL OSDDestroyTID ( HTID );
+XOSD PASCAL OSDDisconnect ( HPID, HTID );
+XOSD PASCAL OSDPtrace ( OSD, UINT, VOID FAR *, HPID, HTID );
+XOSD PASCAL OSDProgramLoad ( HPID, LSZ, LSZ, ULONG );
+XOSD PASCAL OSDProgramFree ( HPID );
+XOSD PASCAL OSDAddEM ( EMFUNC, LPDBF, LPHEM, EMTYPE );
+XOSD PASCAL OSDDeleteEM ( HEM );
+XOSD PASCAL OSDAddTL ( TLFUNC, LPHTL, LPCH );
+XOSD PASCAL OSDDeleteTL ( HTL );
+XOSD PASCAL OSDDeinitTL ( TLFUNC );
+XOSD PASCAL OSDInitTL ( TLFUNC, LPDBF );
+XOSD PASCAL OSDTLGetInfo ( TLFUNC, LPGIS, UINT );
+XOSD PASCAL OSDTLSetup ( TLFUNC, LSZ, UINT, LPV );
+XOSD PASCAL OSDGetAddr ( HPID, HTID, ADR, PADDR );
+XOSD PASCAL OSDSetAddr ( HPID, HTID, ADR, PADDR );
+XOSD PASCAL OSDReadReg ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDWriteReg ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDReadFlag ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDWriteFlag ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDSetFrameContext(HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDFrameReadReg ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDFrameWriteReg ( HPID, HTID, UINT, VOID FAR * );
+XOSD PASCAL OSDGetRegDesc ( HPID, HTID, UINT, RD FAR * );
+XOSD PASCAL OSDGetFlagDesc ( HPID, HTID, UINT, FD FAR * );
+XOSD PASCAL OSDGetCurrentEM ( HPID, HTID, LPHEM );
+XOSD PASCAL OSDNativeOnly ( HPID, HTID, BOOL );
+XOSD PASCAL OSDUseEM ( HPID, HTID );
+XOSD PASCAL OSDDiscardEM ( HPID, HTID );
+XOSD PASCAL OSDGetDebugMetric( HPID, HTID, MTRC, LPV );
+XOSD PASCAL OSDUnassemble ( HPID, HTID, LPSDI );
+XOSD PASCAL OSDGetPrevInst ( HPID, HTID, PADDR );
+XOSD PASCAL OSDAssemble ( HPID, HTID, PADDR, LSZ );
+XOSD PASCAL OSDGetObjLength ( HPID, HTID, LPL, LPL, PADDR );
+XOSD PASCAL OSDGetFrame ( HPID, HTID, PADDR );
+XOSD PASCAL OSDGetCaller ( HPID, HTID, FCT, PADDR, PADDR );
+XOSD PASCAL OSDSaveRegs ( HPID, HTID, LPHIND );
+XOSD PASCAL OSDRestoreRegs ( HPID, HTID, HIND );
+XOSD PASCAL OSDIoctl ( HPID, HTID, UINT, UINT, LPV );
+XOSD PASCAL OSDRegisterEmi ( HPID, HTID, HEMI, LSZ );
+#ifdef KBDMON
+XOSD PASCAL OSDKbdRecord ( HPID, HTID, BOOL );
+XOSD PASCAL OSDKbdPlay ( HPID, HTID, LSZ );
+#endif
+XOSD PASCAL OSDIsStackSetup ( HPID, HTID, LPADDR );
+// XOSD PASCAL OSDTranslateMsg ( HPID, HTID, LPW, LPW, LSZ, LPW );
+XOSD PASCAL OSDGetMsgMap ( HPID, HTID, LPMSGMAP* );
+XOSD PASCAL OSDGetError ( HPID, HTID, LPW, LSZ, LSZ );
+XOSD PASCAL OSDSetupExecute ( HPID, HTID, LPHDEP );
+XOSD PASCAL OSDStartExecute ( HPID, HDEP, LPADDR, BOOL, BOOL);
+XOSD PASCAL OSDCleanUpExecute ( HPID, HDEP );
+XOSD PASCAL OSDLoadDllAck ( HPID );
+XOSD PASCAL OSDUnLoadDllAck ( HPID, HEXE, BOOL );
+XOSD PASCAL OSDDebugActive ( HPID, DWORD, HANDLE, LPDWORD );
+XOSD PASCAL OSDStackWalkSetup ( HPID, HTID, BOOL, LPSTKSTR );
+XOSD PASCAL OSDStackWalkNext ( HPID, HTID, LPSTKSTR );
+XOSD PASCAL OSDStackWalkCleanup ( HPID, HTID, LPSTKSTR );
+XOSD PASCAL OSDSetFrame ( HPID, HTID, PFRAME );
+XOSD PASCAL OSDSetPath ( HPID, BOOL, LSZ );
+//XOSD PASCAL OSDSetBreakpoint ( HPID, HTID, WORD, LPBPARGS );
+//XOSD PASCAL OSDRemoveBreakpoint ( HPID, HTID, WORD, LPBPARGS );
+//XOSD PASCAL OSDBPAccept ( HPID, HTID, BOOL );
+XOSD PASCAL OSDGetPrompt ( HPID, LPPROMPTMSG );
+XOSD PASCAL OSDGetModuleList ( HPID, HTID, BOOL, LSZ, LPMODULE_LIST* );
+XOSD PASCAL OSDSendReply ( HPID, UINT, LPVOID );
+XOSD PASCAL OSDGetFunctionInfo ( HPID, PADDR, PFUNCTION_INFO );
+
+enum {
+ ioctlNull = 0,
+ ioctlDumpLocalHeap,
+ ioctlDumpGlobalHeap,
+ ioctlDumpModuleList,
+ ioctlCrackLocalHmem,
+ ioctlCrackGlobalHmem,
+ ioctlKillApplication,
+ ioctlGetThreadHandle, // get the low level thread handle (NT)
+ ioctlGetProcessHandle, // Get the low level process handle (NT)
+ ioctlGetThreadContext, // get os+machine specific context structure
+ ioctlSetThreadContext, // set os+machine specific context structure
+ ioctlCustomCommand, // random user command for EM
+ ioctlGeneric // generic dm specific
+};
+
+typedef enum {
+ dbcCommError = -1, // -1 - Error occurred in transport layer
+ //
+ dbcInfoAvail = 0x100, // 100 - Display info the the user.
+ // wParam = nothing
+ // lParam = string to be dumped
+ dbcInfoReq, // 101 - DM needs a character.
+ // wParam = nothing
+ // lParam = nothing
+ dbcSuccess, // 102 - A command completed successfully.
+ // (REVIEW: remove?)
+ // wParam = ??
+ // lParam = ??
+ dbcError, // 103 - A command resulted in an error.
+ // wParam = nothing
+ // lParam = zero-terminated string to display
+ dbcSignal, // 104 - A signal has been received.
+ // wParam = nothing(??)
+ // lParam = nothing(??)
+ dbcException, // 105 - An exception occurred.
+ // wParam = exception code (REVIEW: UNDONE)
+ // lParam = nothing
+ dbcBpt, // 106 - A breakpoint was hit.
+ // wParam = nothing
+ // lParam = nothing
+ dbcWatchPoint, // 107 - A watchpoint was hit.
+ // wParam = watchpoint number that was hit
+ // lParam = nothing
+ dbcSingleStepXXX, // 108 - A single-step finished.
+ // wParam = nothing
+ // lParam = nothing
+ dbcRangeStepXXX, // 109 - A range-step finished.
+ // wParam = nothing
+ // lParam = nothing
+ dbcCoProcErr, // 10A - A coprocessor error occurred.
+ // wParam = nothing
+ // lParam = nothing
+ dbcAsyncStop, // 10B - An asynchronous stop occurred.
+ // wParam = nothing
+ // lParam = nothing
+ dbcNewProc, // 10C - A new process was created.
+ // wParam = new process's HPID
+ // lParam = fReallyNew: true if this process
+ // was just created false if it existed
+ // before but this is the first time the
+ // debugger has been told about it (e.g. in
+ // CVW if a bp is hit in a random process)
+ dbcCreateThread, // 10D - A thread was created.
+ // wParam = nothing
+ // lParam = nothing
+ dbcProcTerm, // 10E - A process terminated. May be followed by
+ // dbcDeleteProc if the HPID was created by
+ // OSDebug rather than by the debugger. The
+ // HPID is still valid until dbcDeleteProc
+ // is received.
+ // wParam = nothing
+ // lParam = process termination code (REVIEW:
+ // UNDONE)
+ dbcThreadTerm, // 10F - A thread terminated. Will be followed by
+ // dbcDeleteThread. The HTID is still valid
+ // until dbcDeleteThread is received.
+ // wParam = nothing
+ // lParam = nothing
+ dbcDeleteProc, // 110 - An HPID is no longer valid. Normally
+ // preceded by dbcProcTerm.
+ // wParam = nothing(??)
+ // lParam = nothing(??)
+ dbcDeleteThread, // 111 - An HTID is no longer valid. Normally
+ // preceded by dbcThreadTerm.
+ // wParam = nothing(??)
+ // lParam = nothing(??)
+ dbcModLoad, // 112 - A module was loaded.
+ // wParam = Module Table Entry (MTE)
+ // lParam = ptr to name of module
+ dbcModFree, // 113 - A module was freed.
+ // wParam = ??
+ // lParam = ??
+ dbcPageLoad, // 114 - A page load occurred.
+ // wParam = ??
+ // lParam = ??
+ dbcPageMove, // 115 - A page move occurred.
+ // wParam = ??
+ // lParam = ??
+ dbcPageUnload, // 116 - A page unload occurred.
+ // wParam = ??
+ // lParam = ??
+ dbcAliasFree, // 117 - ??
+ // wParam = ??
+ // lParam = ??
+ dbcEmChange, // 118 - ??
+ // wParam = ??
+ // lParam = ??
+ dbcCanStep, // 119 - ??
+ // wParam = ??
+ // lParam = ??
+ dbcFlipScreen, // 11A - The debugger should return control of the
+ // user screen to the system.
+ // wParam = nothing
+ // lParam = nothing
+ dbcMOVEOverlay, // 11B - DOS M.O.V.E. overlay [un]load notification
+ // wParam = fLoad
+ // lParam = nothing
+ dbcThreadBlocked, // 11C - Single thread execution blocked
+ // wParam = nothing
+ // lParam = nothing
+ dbcKbdRecord, // 11D - recording keyboard message
+ // wParam = handle to pid of keyboard
+ // lParam = nothing
+ dbcSetSession, // 11E - set session index of process in hpid
+ // wParam = index of session (nonzero)
+ // lParam = nothing
+ dbcIoctlDone, // 11F - set session index of process in hpid
+ // wParam = index of session (nonzero)
+ // lParam = nothing
+ dbcThreadDestroy, // 120 - Destory the thread
+ dbcNtRip, // 121 - A RIP occurred
+ // wParam = sizeof(NT_RIP)
+ // lParam = pointer to NT_RIP
+ dbcExecuteDone, // 122 - Execute function call is done
+ // wParam = nothing
+ // lparam = handle of save area
+ dbcLastAddr, // 123 - Get last address in line
+ // wParam = nothing
+ // lparam = pointer to address
+ dbcChangedMemory, // 124 - Changed memory contents
+ // wParam = 0
+ // lparam = size of memory block
+ //
+ dbcSegLoad, // 125 - Loaded selector
+ // wParam = 0
+ // lparam = selector
+ //
+ dbcSegFree, // 126 - Freed selector
+ // wParam = 0
+ // lparam = selector
+ //
+ dbcEntryPoint, // 127 - Program is stopped at entry point
+ // wParam = nothing
+ // lParam = nothing
+ dbcLoadComplete, // 128 - Static DLL loads are complete
+ // wParam =
+ // lParam =
+ dbcRemoteQuit, // 129 - The remote monitor has terminated
+ // wParam = nothing
+ // lParam = nothing
+ dbcCheckBpt,
+
+ dbcStep,
+
+ dbcMax // 12A
+} _DBC; // DeBug Callback
+typedef LONG DBC;
+
+
+//
+// Return values from dbcCanStep
+//
+typedef struct _CANSTEP {
+ DWORD Flags;
+ UOFF32 PrologOffset;
+} CANSTEP;
+
+typedef CANSTEP FAR *LPCANSTEP;
+
+#define CANSTEP_NO 0x00000000
+#define CANSTEP_YES 0x00000001
+#define CANSTEP_THUNK 0x00000002
+
+
+typedef struct _CBP {
+ WORD wMessage;
+ HPID hpid;
+ HTID htid;
+ WORD wParam;
+ LONG lParam;
+} CBP; // CallBack Parameters. Not used by OSDebug itself,
+ // but possibly handy for the debugger.
+typedef CBP FAR *LPCBP;
+
+
+#define hmemNull 0
+#define hpidNull 0
+#define htidNull 0
+#define htlNull 0
+#define hemNull 0
+
+#define wNull 0
+#define lNull 0L
+
+//
+// the kernel debugger reserves the first 255 subtypes
+//
+// the subtypes that are defined here are applicable to all
+// dms that exist today.
+//
+#define IG_TRANSLATE_ADDRESS 256
+#define IG_WATCH_TIME 257
+#define IG_WATCH_TIME_STOP 258
+#define IG_WATCH_TIME_RECALL 259
+#define IG_WATCH_TIME_PROCS 260
+#define IG_DM_PARAMS 261
+#define IG_THREAD_INFO 262
+#define IG_TASK_LIST 263
+#define IG_RELOAD 264
+#define IG_PAGEIN 265
+#define IG_CHANGE_PROC 266
+
+
+typedef struct _IOCTLGENERIC {
+ DWORD ioctlSubType;
+ DWORD length;
+ char data[0];
+} IOCTLGENERIC, *PIOCTLGENERIC;
+
+typedef struct _TASK_LIST {
+ DWORD dwProcessId;
+ char ProcessName[16];
+} TASK_LIST, *PTASK_LIST;
+
+
+XOSD FAR PASCAL
+OSDGetMemInfo(HPID hpid, LPMEMINFO lpMemInfo);
+
+
+
+
+//
+// Breakpoints
+//
+
+enum {
+ bptpExec,
+ bptpDataExec,
+ bptpDataC,
+ bptpDataW,
+ bptpDataR,
+ bptpRegC,
+ bptpRegW,
+ bptpRegR,
+ bptpMessage,
+ bptpMClass,
+ bptpInt,
+ bptpRange
+};
+typedef DWORD BPTP;
+
+enum {
+ bpnsStop,
+ bpnsContinue,
+ bpnsCheck
+};
+typedef DWORD BPNS;
+
+enum _BPTS {
+ bptsExec = 0x0001,
+ bptsDataC = 0x0002,
+ bptsDataW = 0x0004,
+ bptsDataR = 0x0008,
+ bptsRegC = 0x0010,
+ bptsRegW = 0x0020,
+ bptsRegR = 0x0040,
+ bptsMessage = 0x0080,
+ bptsMClass = 0x0100,
+ bptsRange = 0x0200,
+ bptsDataExec = 0x0400
+};
+typedef DWORD BPTS;
+
+
+typedef struct _BPIS {
+ BPTP bptp;
+ BPNS bpns;
+ DWORD fOneThd;
+ HTID htid;
+ union {
+ struct {
+ ADDR addr;
+ } exec;
+ struct {
+ ADDR addr;
+ DWORD cb;
+ } data;
+ struct {
+ DWORD dwId;
+ } reg;
+ struct {
+ ADDR addr;
+ DWORD imsg;
+ DWORD cmsg;
+ } msg;
+ struct {
+ ADDR addr;
+ DWORD dwmask;
+ } mcls;
+ struct {
+ DWORD ipt;
+ } ipt;
+ struct {
+ ADDR addr;
+ DWORD cb;
+ } rng;
+ };
+} BPIS;
+typedef BPIS FAR * LPBPIS;
+
+typedef struct _BPS {
+ DWORD cbpis;
+ DWORD cmsg;
+ DWORD fSet;
+ // BPIS rgbpis[];
+ // DWORD rgdwMessage[];
+ // XOSD rgxosd[];
+ // DWORD rgdwNotification[];
+} BPS;
+typedef BPS FAR * LPBPS;
+
+#define RgBpis(B) ((LPBPIS)(((LPBPS)(B)) + 1))
+#define DwMessage(B) ((LPDWORD)(RgBpis((B)) + ((LPBPS)(B))->cbpis))
+#define RgXosd(B) ((LPXOSD)(DwMessage((B)) + ((LPBPS)(B))->cmsg))
+#define DwNotification(B) ((LPDWORD)(RgXosd((B)) + ((LPBPS)(B))->cbpis))
+#define SizeofBPS(B) ( sizeof(BPS) + \
+ (((LPBPS)(B))->cbpis * \
+ (sizeof(BPIS) + sizeof(XOSD) + sizeof(DWORD))) + \
+ (((LPBPS)(B))->cmsg * sizeof(DWORD)) )
+
+XOSD PASCAL
+OSDBreakpoint(
+ HPID hpid,
+ LPBPS lpbps
+ );
+
+
+
+
+
+
+//
+// Exception handling
+//
+
+//
+// These are the actions which the debugger may take
+// in response to an exception raised in the debuggee.
+//
+typedef enum _EXCEPTION_FILTER_DEFAULT {
+ efdIgnore,
+ efdNotify,
+ efdCommand,
+ efdStop
+} EXCEPTION_FILTER_DEFAULT;
+typedef EXCEPTION_FILTER_DEFAULT FAR * LPEXCEPTION_FILTER_DEFAULT;
+
+//
+// commands understood by OSDGetExceptionState
+//
+
+typedef enum _EXCEPTION_CONTROL {
+ exfFirst,
+ exfNext,
+ exfSpecified
+} EXCEPTION_CONTROL;
+typedef EXCEPTION_CONTROL FAR * LPEXCEPTION_CONTROL;
+
+//
+// Exception information packet
+//
+#define EXCEPTION_STRING_SIZE 60
+typedef struct _EXCEPTION_DESCRIPTION {
+ DWORD dwExceptionCode;
+ EXCEPTION_FILTER_DEFAULT efd;
+ char rgchDescription[EXCEPTION_STRING_SIZE];
+} EXCEPTION_DESCRIPTION;
+typedef EXCEPTION_DESCRIPTION FAR * LPEXCEPTION_DESCRIPTION;
+
+XOSD PASCAL
+OSDGetExceptionState(
+ HPID hpid,
+ HTID htid,
+ LPEXCEPTION_DESCRIPTION lpExd,
+ EXCEPTION_CONTROL exf
+ );
+
+XOSD PASCAL
+OSDSetExceptionState (
+ HPID hpid,
+ HTID htid,
+ LPEXCEPTION_DESCRIPTION lpExd
+ );
+
+
+
+//
+// Target execution control
+//
+
+typedef struct _EXOP {
+ BYTE fSingleThread;
+ BYTE fStepOver;
+ BYTE fQueryStep;
+ BYTE fInitialBP;
+ BYTE fPassException;
+ BYTE fSetFocus;
+} EXOP;
+typedef EXOP FAR * LPEXOP;
+
+
+//
+// Range Step Struct
+//
+typedef struct _RSS {
+ LPADDR lpaddrMin;
+ LPADDR lpaddrMax;
+ LPEXOP lpExop;
+} RSS;
+typedef RSS FAR * LPRSS;
+
+
+XOSD PASCAL
+OSDGo(
+ HPID hpid,
+ HTID htid,
+ LPEXOP lpexop
+ );
+
+XOSD PASCAL
+OSDSingleStep(
+ HPID hpid,
+ HTID htid,
+ LPEXOP lpexop
+ );
+
+XOSD PASCAL
+OSDRangeStep(
+ HPID hpid,
+ HTID htid,
+ LPADDR lpaddrMin,
+ LPADDR lpaddrMax,
+ LPEXOP lpexop
+ );
+
+XOSD PASCAL
+OSDReturnStep(
+ HPID hpid,
+ HTID htid,
+ LPEXOP lpexop
+ );
+
+XOSD PASCAL
+OSDAsyncStop(
+ HPID hpid,
+ DWORD fSetFocus
+ );
+
+
+
+
+
+
+
+typedef XOSD (FAR PASCAL LOADDS *TLFUNCTYPE) ( TLF, HPID, DWORD, LPARAM );
+typedef XOSD (FAR PASCAL LOADDS *DMTLFUNCTYPE) ( TLF, HPID, DWORD, LPARAM );
+typedef XOSD (FAR PASCAL LOADDS *TLCALLBACKTYPE) (HPID, DWORD, LPARAM );
+typedef XOSD (FAR PASCAL LOADDS *LPDMINIT) ( DMTLFUNCTYPE, LPVOID );
+typedef XOSD (FAR PASCAL LOADDS *LPDMFUNC) ( DWORD, LPBYTE );
+typedef DWORD (FAR PASCAL LOADDS *LPDMDLLINIT) ( LPDBF );
+typedef XOSD (FAR PASCAL LOADDS *LPUISERVERCB) ( TLCB, HPID, HTID, DWORD, LONG);
+
+#endif // _OD_
diff --git a/private/windbg/osdebug/include/odmsg.h b/private/windbg/osdebug/include/odmsg.h
new file mode 100644
index 000000000..3d6105c29
--- /dev/null
+++ b/private/windbg/osdebug/include/odmsg.h
@@ -0,0 +1,244 @@
+#ifndef _ODMSG
+#define _ODMSG
+
+//
+// MSG Map structure
+//
+typedef struct _MSGINFO *LPMSGINFO;
+typedef struct _MSGINFO {
+ UINT Msg; // Message number
+ LPSTR MsgText; // Message Text
+ DWORD MsgMask; // Message mask
+} MSGINFO;
+
+//
+// MSG Map structure
+//
+typedef struct _MSGMAP *LPMSGMAP;
+typedef struct _MSGMAP {
+ DWORD Count; // Number of elements
+ LPMSGINFO MsgInfo; // Pointer to array
+} MSGMAP;
+
+
+//
+// =============== Support for OSDGetModuleList ===========
+//
+
+//
+// Module list
+//
+typedef struct _MODULE_LIST *LPMODULE_LIST;
+typedef struct _MODULE_LIST {
+ DWORD Count;
+} MODULE_LIST;
+
+
+//
+// Module entry
+//
+typedef struct _MODULE_ENTRY *LPMODULE_ENTRY;
+typedef struct _MODULE_ENTRY {
+ BOOL Flat;
+ BOOL Real;
+ DWORD Segment;
+ DWORD Selector;
+ DWORD Base;
+ DWORD Limit;
+ DWORD Type;
+ DWORD SectionCount;
+ HEXE hexe;
+} MODULE_ENTRY;
+
+
+#define FreeModuleList(m) free(m)
+#define ModuleListCount(m) ((m)->Count)
+#define FirstModuleEntry(m) ((LPMODULE_ENTRY)((m)+1))
+#define NextModuleEntry(e) ((e)+1)
+#define NthModuleEntry(m,n) (FirstModuleEntry(m)+(n))
+
+#define ModuleEntryFlat(e) ((e)->Flat)
+#define ModuleEntryReal(e) ((e)->Real)
+#define ModuleEntrySegment(e) ((e)->Segment)
+#define ModuleEntrySelector(e) ((e)->Selector)
+#define ModuleEntryBase(e) ((e)->Base)
+#define ModuleEntryLimit(e) ((e)->Limit)
+#define ModuleEntryType(e) ((e)->Type)
+#define ModuleEntrySectionCount(e) ((e)->SectionCount)
+#define ModuleEntryHexe(e) ((e)->hexe)
+
+
+
+//
+// Module list request
+//
+typedef struct _MODULE_LIST_REQUEST *LPMODULE_LIST_REQUEST;
+typedef struct _MODULE_LIST_REQUEST {
+ BOOL Flat;
+ LSZ Name;
+ LPMODULE_LIST *List;
+} MODULE_LIST_REQUEST;
+
+
+//
+// ========================================================
+//
+
+
+typedef struct _GOL {
+ LPL lplBase;
+ LPL lplLen;
+ LPADDR lpaddr;
+} GOL; // Get Object Length Structure
+typedef GOL FAR *LPGOL;
+
+typedef struct _GET {
+ LPW lpwErrNum;
+ LSZ lszErr;
+ LSZ lszErrText;
+} GET; // get error text
+typedef GET FAR *LPGET;
+
+typedef struct _GTM {
+ LPW lpwMsg;
+ LPW lpwType;
+ LSZ lszMsg;
+ LPW lpwMask;
+} GTM; // get translated message
+typedef GTM FAR *LPGTM;
+
+typedef struct _IOL {
+ UINT wFunction;
+ BYTE rgbVar[];
+} IOL; // Ioctl Structure
+typedef IOL FAR *LPIOL;
+
+// packet used by OSDProgramLoad
+typedef struct _PRL {
+ ULONG ulChildFlags;
+ WORD cbCmdLine;
+ WORD cbPad;
+ CHAR lszCmdLine[];
+} PRL; // PRogram Load structure
+typedef PRL FAR * LPPRL;
+
+// Bit flags for ulChildFlags
+#define ulfMultiProcess 0x00000001L // OS2, NT, and ?MAC?
+#define ulfDebugRegisters 0x00000002L // Win and DOS (?MAC?)
+#define ulfDisableNMI 0x00000004L // DOS (CV /N0)
+#define ulfForceNMI 0x00000008L // DOS (CV /N1)
+#define ulfDisableIBM 0x00000010L // DOS (CV /I0)
+#define ulfForceIBM 0x00000020L // DOS (CV /I1)
+#define ulfMinimizeApp 0x00000040L // Win32
+#define ulfNoActivate 0x00000080L // Win32
+#define ulfInheritHandles 0x00000100L // Win32
+#define ulfWowVdm 0x00000200L // Win32
+
+/*
+ * This structure is used in commuicating a stop event to the EM. It
+ * contains the most basic of information about the stopped thread.
+ * A "frame" pointer, a program counter and bits describing the type
+ * of segment stopped in.
+ */
+
+typedef struct _BPR {
+ DWORD dwNotify; /* tag to identify BP # */
+ UOFFSET offEIP; /* Program Counter offset */
+ UOFFSET offEBP; /* Frame pointer offset */
+ UOFFSET offESP; /* Stack pointer offset */
+ SEGMENT segCS; /* Program counter seletor */
+ SEGMENT segSS; /* Frame & Stack pointer offset */
+ BOOL fFlat:1;
+ BOOL fOff32:1;
+ BOOL fReal:1;
+} BPR; // BreakPoint Return
+
+typedef BPR FAR *LPBPR;
+
+#ifdef WIN32
+typedef struct _EPR {
+ BPR bpr;
+ DWORD dwFirstChance;
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ DWORD NumberParameters;
+ DWORD ExceptionInformation[];
+} EPR; // Exception Return
+#else
+typedef struct _EPR {
+ BPR;
+ WORD wException;
+} EPR; // Exception Return
+#endif
+typedef EPR FAR *LPEPR;
+
+/*
+ * RIP reporting structure
+ */
+
+typedef struct _NT_RIP {
+ BPR bpr;
+ ULONG ulErrorCode;
+ ULONG ulErrorLevel;
+} NT_RIP; // RIP Return
+typedef NT_RIP FAR *LPNT_RIP;
+
+/*
+ * Stack walking structure
+ *
+ */
+
+typedef struct _STKSTR {
+ ADDR addrPC; // Program counter address
+ ADDR addrRetAddr; // Return Address
+ ADDR addrFrame; // Frame pointer address
+ ULONG ulParams[4]; // first 4 words off the stack
+ ULONG ul; // Space for EM/DM to use
+ PVOID pFpoData; // pointer to fpo data or null (PFPO_DATA)
+ BOOL fFar; // Far call
+} STKSTR, * LPSTKSTR;
+
+
+/*
+ * The following structure is used by the emfSetupExecute message
+ */
+typedef struct _EXECUTE_STRUCT {
+ ADDR addr; /* Starting address for function */
+ HDEP lphdep; /* Handle of save area */
+ BOOL fIgnoreEvents:1; /* Ignore events coming back? */
+ BOOL fFar:1; /* Is the function a _far routine */
+ HIND hindDm; /* This is the DMs handle */
+} EXECUTE_STRUCT;
+typedef EXECUTE_STRUCT FAR * LPEXECUTE_STRUCT;
+
+/*
+ * this is used to debug an active process
+ */
+typedef struct _DBG_ACTIVE_STRUCT {
+ DWORD dwProcessId;
+ HANDLE hEventGo;
+ DWORD dwStatus;
+} DBG_ACTIVE_STRUCT;
+typedef DBG_ACTIVE_STRUCT FAR *LPDBG_ACTIVE_STRUCT;
+
+typedef struct _PROCESSLIST {
+ DWORD pid;
+ BYTE pname[];
+} PROCESSLIST; // ProcessList return
+typedef PROCESSLIST * LPPROCESSLIST;
+
+typedef struct _PROMPTMSG {
+ DWORD len;
+ BYTE szPrompt[];
+} PROMPTMSG; // GetPrompt return
+typedef PROMPTMSG * LPPROMPTMSG;
+
+typedef struct _DMSYM {
+ ADDR AddrSym;
+ DWORD Ra;
+ char fname[];
+} DMSYM;
+typedef DMSYM *PDMSYM, *LPDMSYM;
+
+
+#endif // _ODMS
diff --git a/private/windbg/osdebug/include/osdem.h b/private/windbg/osdebug/include/osdem.h
new file mode 100644
index 000000000..123959da4
--- /dev/null
+++ b/private/windbg/osdebug/include/osdem.h
@@ -0,0 +1,190 @@
+/**** OSDEM.H - Execution model api ****
+ * *
+ * *
+ * Copyright <C> 1990, Microsoft Corp *
+ * *
+ * Created: October 15, 1990 by David W. Gray *
+ * *
+ * Purpose: *
+ * *
+ * *
+ ***************************************************************************/
+
+#ifndef _OSDEM
+#define _OSDEM
+
+typedef enum {
+ emfFreeze = osdFreeze,
+ emfThaw = osdThaw,
+ emfIOCTL = osdIOCTL,
+ emfReadBuf = osdReadBuf,
+ emfWriteBuf = osdWriteBuf,
+ emfShowDebuggee = osdShowDebuggee,
+ emfFixupAddr = osdFixupAddr,
+ emfUnFixupAddr = osdUnFixupAddr,
+ emfSetEmi = osdSetEmi,
+ emfSendChar = osdSendChar,
+ emfFreezeState = osdFreezeState,
+ emfIsOverlayLoaded = osdIsOverlayLoaded,
+ emfCompareAddrs = osdCompareAddrs,
+
+
+ emfDUMMY = 0x30,
+
+
+////////// OSDEBUG4 emfs, more or less ///////////////
+
+ emfDebugPacket,
+
+ emfRegisterDBF,
+ emfInit,
+ emfGetModel,
+ emfUnInit,
+// emfAttach,
+// emfDetach,
+ emfConnect,
+ emfDisconnect,
+
+ emfCreatePid,
+ emfDestroyPid,
+ emfDestroyTid,
+
+ emfSetMulti,
+ emfDebugger,
+
+ emfProgramLoad,
+ emfDebugActive,
+ emfSetPath,
+ emfProgramFree,
+
+ emfThreadStatus,
+ emfProcessStatus,
+// emfFreezeThread,
+// emfSetThreadPriority,
+
+ emfGetExceptionState,
+ emfSetExceptionState,
+
+ emfGetModuleList,
+
+ emfGo,
+ emfSingleStep,
+ emfRangeStep,
+ emfReturnStep,
+ emfStop,
+
+ emfBreakPoint,
+
+ emfSetupExecute,
+ emfStartExecute,
+ emfCleanUpExecute,
+
+ emfGetAddr,
+ emfSetAddr,
+// emfFixupAddr,
+// emfUnFixupAddr,
+// emfSetEmi,
+ emfRegisterEmi,
+// emfUnRegisterEmi,
+// emfCompareAddrs,
+// emfGetObjLength,
+// emfGetMemoryInfo,
+
+// emfReadMemory,
+// emfWriteMemory,
+
+ emfGetRegStruct,
+ emfGetFlagStruct,
+ emfGetReg,
+ emfSetReg,
+ emfGetFlag,
+ emfSetFlag,
+// emfSaveRegs,
+// emfRestoreRegs,
+
+ emfUnassemble,
+// emfGetPrevInst,
+ emfAssemble,
+
+// emfGetFrame,
+
+ emfMetric,
+
+ emfGetMsgMap,
+// emfGetMessageMaskMap,
+
+// emfInfoReply,
+// emfContinue,
+
+// emfReadFile,
+// emfWriteFile,
+
+// emfShowDebuggee,
+ emfGetProcessList,
+// emfSystemService,
+// emfSetDebugMode,
+
+
+/////////////////////////////////////////////////
+
+ emfIsStackSetup,
+ emfStackWalkSetup,
+ emfStackWalkNext,
+ emfStackWalkCleanup,
+ emfLoadDllAck,
+ emfUnLoadDllAck,
+ emfSetFrame,
+ emfGetPrompt,
+ emfSetFrameContext,
+ emfFrameRegValue,
+ emfFrameSetReg,
+ emfMiscReply,
+ emfGetMemInfo,
+ emfGetFunctionInfo,
+ emfMax
+} _EMF;
+
+typedef DWORD EMF;
+
+typedef enum {
+ dbcoCreateThread = dbcMax,
+ dbcoNewProc,
+ dbcoMax
+} _DBCO; // Debug CallBacks Osdebug specific
+typedef LONG DBCO;
+
+typedef struct _EMCB {
+ XOSD (PASCAL LOADDS *lpfnCallBackDB) ( DBC, HPID, HTID, DWORD, DWORD, VOID FAR * );
+ XOSD (PASCAL LOADDS *lpfnCallBackTL) ( TLF, HPID, DWORD, VOID FAR * );
+ XOSD (PASCAL LOADDS *lpfnCallBackNT) ( EMF, HPID, HTID, DWORD, VOID FAR * );
+ XOSD (PASCAL LOADDS *lpfnCallBackEM) ( EMF, HPID, HTID, DWORD, DWORD, VOID FAR * );
+} EMCB; // Execution Model CallBacks
+typedef EMCB FAR *LPEMCB;
+
+typedef struct _REMI {
+ HEMI hemi;
+ LSZ lsz;
+} REMI; // Register EMI structure
+typedef REMI FAR * LPREMI;
+
+// M.O.V.E. notification types/defs
+
+#define fOvlLoad ((BYTE)0x06)
+#define fOvlUnload ((BYTE)0x07)
+
+#pragma pack(1)
+typedef struct _OVL7 {
+ BYTE bVersion;
+ BYTE cbOvl7;
+ BYTE fOvlOp;
+ unsigned short iovl;
+ WORD dbFrameBase;
+} OVL7;
+#pragma pack()
+typedef OVL7 FAR *LPOVL7;
+
+
+// get od/em/dm message structures
+#include "odmsg.h"
+
+#endif // _OSDEM
diff --git a/private/windbg/osdebug/include/shapi.h b/private/windbg/osdebug/include/shapi.h
new file mode 100644
index 000000000..2414c361c
--- /dev/null
+++ b/private/windbg/osdebug/include/shapi.h
@@ -0,0 +1,386 @@
+#error Don't include shapi.h... Use shapi.hxx instead.
+
+/** shapi.h - Public API to the Symbol Handler
+ *
+ * This file contains all types and APIs that are defined by
+ * the Symbol Handler and are publicly accessible by other
+ * components.
+ *
+ * Before including this file, you must include cvtypes.h.
+ */
+
+
+/*** The master copy of this file resides in the CodeView project.
+ * All Microsoft projects are required to use the master copy without
+ * modification. Modification of the master version or a copy
+ * without consultation with all parties concerned is extremely
+ * risky.
+ *
+ * The projects known to use this version (1.00.00) are:
+ *
+ * Codeview
+ * Sequoia
+ * C/C++ expression evaluator
+ * Cobol expression evaluator
+ * QC/Windows
+ * Pascal 2.0 expression evaluator
+ * Symbol Handler
+ * Stump (OSDebug)
+ */
+
+#ifndef SH_API
+#define SH_API
+
+#ifndef RC_INVOKED
+#pragma pack (1)
+
+typedef enum { // Error returns from some SH functions
+ sheNone = 0,
+ sheNoSymbols = 1, // No CV info
+ sheFutureSymbols = 2, // NB08 to NB99
+ sheMustRelink = 3, // NB00 to NB04
+ sheNotPacked = 4, // NB05 to NB06
+ sheOutOfMemory = 5,
+ sheCorruptOmf = 6,
+ sheFileOpen = 7, // Couldn't open file
+ sheSuppressSyms = 8, // Symbol loading was suppressed
+ sheDeferSyms = 9, // Symbol loading was defered
+ sheSymbolsConverted = 10,
+ sheBadTimeStamp = 11,
+ sheBadCheckSum = 12,
+ sheLastError // Must be last -- used by SHLszGetErrorText as limit
+} SHE;
+
+enum {
+ sopNone = 0,
+ sopData = 1,
+ sopStack = 2
+};
+typedef short SOP; // Symbol OPtions
+
+typedef enum {
+ fcdNone,
+ fcdData,
+ fcdNear,
+ fcdFar
+} FCD; // Function Call Distance (near/far/unknown)
+
+typedef enum {
+ astNone,
+ astAddress,
+ astRegister,
+ astBaseOff
+} AST; // Assembler symbol return Types
+
+typedef struct _ASR {
+ AST ast;
+ union {
+ struct {
+ FCD fcd;
+ ADDR addr;
+ } u;
+ WORD ireg;
+ OFFSET off;
+ } u;
+} ASR; // Assembler Symbol Return structure
+typedef ASR FAR *LPASR;
+
+typedef HEMI SHEMI;
+typedef unsigned int SHFLAG; //* A TRUE/FALSE flag var
+typedef SHFLAG FAR * PSHFLAG;
+typedef SEGMENT SHSEG; //* A segment/selector value
+typedef UOFFSET SHOFF; //* An offset value
+
+typedef HDEP HTYPE; //* A handle to a type
+typedef HDEP HSYM; //* A handle to a symbol
+typedef HDEP HPROC; //* A handle to a procedure
+typedef HDEP HBLK; //* A handle to a block.
+typedef HDEP HSF; //* A handle to source file table
+
+#if defined (WIN32) && defined(STRICT)
+DECLARE_HANDLE( HVOID );
+DECLARE_HANDLE( HMOD );
+DECLARE_HANDLE( HGRP );
+DECLARE_HANDLE( HEXE );
+DECLARE_HANDLE( HPDS );
+#else
+typedef HIND HVOID; //* Generic handle type
+typedef HIND HMOD; //* A module handle
+typedef HIND HGRP; //* A group handle (sub group of module
+ //* currently either a seg or filename)
+typedef HIND HEXE; //* An Executable file handle
+typedef HIND HPDS; //* A handle to a process
+#endif
+
+typedef HSYM FAR * PHSYM;
+
+typedef unsigned short THIDX;
+
+typedef struct CXT {
+ ADDR addr;
+ HMOD hMod;
+ HGRP hGrp;
+ HPROC hProc;
+ HBLK hBlk;
+ } CXT; //* General Symbol context pkt
+typedef CXT FAR *PCXT;
+
+typedef struct CXF {
+ CXT cxt;
+ FRAME Frame;
+ } CXF; //* Symbol context pkt locked to a frame ptr
+typedef CXF FAR *PCXF;
+
+typedef enum {
+ SHFar,
+ SHNear
+ } SHCALL;
+
+typedef struct SHREG {
+ unsigned short hReg;
+ union {
+ unsigned char Byte1;
+ struct {
+ unsigned short Byte2;
+ unsigned short Byte2High;
+ } a;
+ struct {
+ unsigned long Byte4;
+ unsigned long Byte4High;
+ } b;
+ double Byte8;
+ REAL10 Byte10;
+ } u;
+ } SHREG;
+typedef SHREG FAR *PSHREG;
+
+
+
+// structure defining parameters of symbol to be searched for. The address
+// of this structure is passed on the the EE's symbol compare routine. Any
+// additional data required by the EE's routine must follow this structure.
+
+typedef struct _SSTR { // string with length byte and pointer to data
+ LPB lpName; // pointer to the string itself
+ unsigned char cb; // length byte
+ unsigned char searchmask; // mask to control symbol searching
+ unsigned short symtype; // symbol types to be checked
+ unsigned char FAR *pRE; // pointer to regular expression
+} SSTR;
+typedef SSTR FAR *LPSSTR;
+
+#define SSTR_proc 0x0001 // compare only procs with correct type
+#define SSTR_data 0x0002 // compare only global data with correct type
+#define SSTR_RE 0x0004 // compare using regular expression
+#define SSTR_NoHash 0x0008 // do a linear search of the table
+#define SSTR_symboltype 0x0010 // pass only symbols of symtype to the
+ // comparison function.
+
+#define SHpCXTFrompCXF(a) (&((a)->cxt))
+#define SHpFrameFrompCXF(a) (&(a)->Frame)
+#define SHHMODFrompCXT(a) ((a)->hMod)
+#define SHHPROCFrompCXT(a) ((a)->hProc)
+#define SHHBLKFrompCXT(a) ((a)->hBlk)
+#define SHpADDRFrompCXT(a) (&((a)->addr))
+#define SHPAddrFromPCxf(a) (SHpADDRFrompCXT(SHpCXTFrompCXF(a)))
+
+#define SHIsCXTMod(a) ((a)->hMod && !(a)->hProc && !(a)->hBlk)
+#define SHIsCXTProc(a) ((a)->hMod && (a)->hProc && !(a)->hBlk)
+#define SHIsCXTBlk(a) ((a)->hMod && (a)->hProc && (a)->hBlk)
+
+#define SHHGRPFrompCXT(a) ((a)->hGrp)
+
+typedef SHFLAG (PASCAL FAR *PFNCMP)(LPSSTR, LPV, LSZ, SHFLAG);
+ //* comparison prototype
+typedef BOOL (PASCAL FAR *PFNVALIDATEEXE)(UINT, LPV, LPSTR);
+
+#define LPFNSYM PASCAL LOADDS FAR *
+#define LPFNSYMC CDECL LOADDS FAR *
+
+typedef struct omap_tag {
+ DWORD rva;
+ DWORD rvaTo;
+} OMAP, *LPOMAP;
+
+typedef struct {
+ DWORD Offset;
+ DWORD Size;
+ DWORD Flags;
+} SECSTART, *LPSECSTART;
+
+typedef struct _tagDEBUGDATA {
+ LPVOID lpRtf; // Runtime function table - fpo or pdata
+ DWORD cRtf; // Count of rtf entries
+ LPOMAP lpOmapFrom; // Omap table - From Source
+ DWORD cOmapFrom; // Count of omap entries - From Source
+ LPOMAP lpOmapTo; // Omap table - To Source
+ DWORD cOmapTo; // Count of omap entries - To Source
+ LPSECSTART lpSecStart; // Original section table (pre-Lego)
+ SHE she;
+} DEBUGDATA, *LPDEBUGDATA;
+
+typedef struct _KNF {
+ int cb;
+
+ LPV (LPFNSYM lpfnMHAlloc) ( UINT );
+ LPV (LPFNSYM lpfnMHRealloc) ( LPV, UINT );
+ VOID (LPFNSYM lpfnMHFree) ( LPV );
+ VOID _HUGE_ * (LPFNSYM lpfnMHAllocHuge) ( LONG, UINT );
+ VOID (LPFNSYM lpfnMHFreeHuge) ( LPV );
+
+ HDEP (LPFNSYM lpfnMMAllocHmem) ( UINT );
+ VOID (LPFNSYM lpfnMMFreeHmem) ( HDEP );
+ LPV (LPFNSYM lpfnMMLock) ( HDEP );
+ VOID (LPFNSYM lpfnMMUnlock) ( HDEP );
+
+ HLLI (LPFNSYM lpfnLLInit) ( UINT, LLF, LPFNKILLNODE, LPFNFCMPNODE );
+ HLLE (LPFNSYM lpfnLLCreate) ( HLLI );
+ VOID (LPFNSYM lpfnLLAdd) ( HLLI, HLLE );
+ VOID (LPFNSYM lpfnLLAddHead) ( HLLI, HLLE );
+ VOID (LPFNSYM lpfnLLInsert) ( HLLI, HLLE, ULONG );
+ BOOL (LPFNSYM lpfnLLDelete) ( HLLI, HLLE );
+ BOOL (LPFNSYM lpfnLLRemove) ( HLLI, HLLE );
+ LONG (LPFNSYM lpfnLLDestroy) ( HLLI );
+ HLLE (LPFNSYM lpfnLLNext) ( HLLI, HLLE );
+ HLLE (LPFNSYM lpfnLLFind) ( HLLI, HLLE, LPV, ULONG );
+ HLLE (LPFNSYM lpfnLLLast) ( HLLI );
+ LONG (LPFNSYM lpfnLLSize) ( HLLI );
+ LPV (LPFNSYM lpfnLLLock) ( HLLE );
+ VOID (LPFNSYM lpfnLLUnlock) ( HLLE );
+
+ int (LPFNSYM lpfnLBPrintf) ( LPCH, LPCH, UINT );
+ UINT (LPFNSYM lpfnLBQuit) ( UINT );
+
+ UINT (LPFNSYM lpfnSYOpen) ( LSZ );
+ VOID (LPFNSYM lpfnSYClose) ( UINT );
+ UINT (LPFNSYM lpfnSYReadFar) ( UINT, LPB, UINT );
+ LONG (LPFNSYM lpfnSYSeek) ( UINT, LONG, UINT );
+ UINT (LPFNSYM lpfnSYFixupAddr) ( PADDR );
+ UINT (LPFNSYM lpfnSYUnFixupAddr)(PADDR );
+ UINT (LPFNSYM lpfnSYProcessor) ( VOID );
+ UINT (LPFNSYM lpfnSYFIsOverlayLoaded)( PADDR );
+
+ VOID (LPFNSYM lpfn_searchenv)( LSZ, LSZ, LSZ );
+ UINT (LPFNSYMC lpfnsprintf)( LSZ, LSZ, ... );
+ VOID (LPFNSYM lpfn_splitpath)( LSZ, LSZ, LSZ, LSZ, LSZ );
+ LSZ (LPFNSYM lpfn_fullpath)( LSZ, LSZ, UINT );
+ VOID (LPFNSYM lpfn_makepath)( LSZ, LSZ, LSZ, LSZ, LSZ );
+ UINT (LPFNSYM lpfnstat)( LSZ, LPCH );
+ VOID (LPFNSYM lpfnLBLog) ( LSZ);
+ LONG (LPFNSYM lpfnSYTell) ( UINT);
+ UINT (LPFNSYM lpfnSYFindExeFile) ( LSZ, LSZ, UINT, LPV, PFNVALIDATEEXE );
+ VOID (LPFNSYM lpfnLoadedSymbols) ( SHE, HPID, LSZ );
+ BOOL (LPFNSYM lpfnSYGetDefaultShe) ( LSZ, SHE * );
+
+
+} KNF; // codeview KeRnel Functions exported to the Symbol Handler
+typedef KNF FAR *LPKNF;
+
+typedef struct _SHF {
+ int cb;
+ HPDS (LPFNSYM pSHCreateProcess) ( VOID );
+ VOID (LPFNSYM pSHSetHpid) ( HPID );
+ BOOL (LPFNSYM pSHDeleteProcess) ( HPDS );
+ HPDS (LPFNSYM pSHChangeProcess) ( HPDS, BOOL );
+ SHE (LPFNSYM pSHAddDll) ( LSZ, BOOL );
+ SHE (LPFNSYM pSHAddDllsToProcess) ( VOID );
+ SHE (LPFNSYM pSHLoadDll) ( LSZ, BOOL );
+ VOID (LPFNSYM pSHUnloadDll) ( HEXE );
+ UOFFSET (LPFNSYM pSHGetDebugStart) ( HSYM );
+ LSZ (LPFNSYM pSHGetSymName) ( HSYM, LSZ );
+ BOOL (LPFNSYM pSHAddrFromHsym) ( PADDR, HSYM );
+ HMOD (LPFNSYM pSHHModGetNextGlobal) ( HEXE FAR *, HMOD );
+ int (LPFNSYM pSHModelFromAddr) ( PADDR, LPW, LPB, UOFFSET FAR * );
+ int (LPFNSYM pSHPublicNameToAddr) ( PADDR, PADDR, LSZ );
+ LSZ (LPFNSYM pSHGetSymbol) ( PADDR, SOP, PADDR, LSZ, LPL );
+ LSZ (LPFNSYM pSHGetModule) ( PADDR, LSZ );
+ BOOL (LPFNSYM pSHGetPublicAddr) ( PADDR, LSZ );
+ BOOL (LPFNSYM pSHIsLabel) ( HSYM );
+
+ VOID (LPFNSYM pSHSetDebuggeeDir) ( LSZ );
+ VOID (LPFNSYM pSHSetUserDir) ( LSZ );
+ BOOL (LPFNSYM pSHAddrToLabel) ( PADDR, LSZ );
+
+ int (LPFNSYM pSHGetSymLoc) ( HSYM, LSZ, UINT, PCXT );
+ BOOL (LPFNSYM pSHFIsAddrNonVirtual) ( PADDR );
+ BOOL (LPFNSYM pSHIsFarProc) ( HSYM );
+
+ HEXE (LPFNSYM pSHGetNextExe) ( HEXE );
+ HEXE (LPFNSYM pSHHexeFromHmod) ( HMOD );
+ HMOD (LPFNSYM pSHGetNextMod) ( HEXE, HMOD );
+ PCXT (LPFNSYM pSHGetCxtFromHmod) ( HMOD, PCXT );
+ PCXT (LPFNSYM pSHGetCxtFromHexe) ( HEXE, PCXT );
+ PCXT (LPFNSYM pSHSetCxt) ( PADDR, PCXT );
+ PCXT (LPFNSYM pSHSetCxtMod) ( PADDR, PCXT );
+ HSYM (LPFNSYM pSHFindNameInGlobal) ( HSYM,
+ PCXT,
+ LPSSTR,
+ SHFLAG,
+ PFNCMP,
+ SHFLAG,
+ PCXT
+ );
+ HSYM (LPFNSYM pSHFindNameInContext) ( HSYM,
+ PCXT,
+ LPSSTR,
+ SHFLAG,
+ PFNCMP,
+ SHFLAG,
+ PCXT
+ );
+ HSYM (LPFNSYM pSHGoToParent) ( PCXT, PCXT );
+ HSYM (LPFNSYM pSHHsymFromPcxt) ( PCXT );
+ HSYM (LPFNSYM pSHNextHsym) ( HMOD, HSYM );
+ PCXF (LPFNSYM pSHGetFuncCXF) ( PADDR, PCXF );
+ LPCH (LPFNSYM pSHGetModName) ( HMOD );
+ LPCH (LPFNSYM pSHGetExeName) ( HEXE );
+ LPCH (LPFNSYM pSHGetModNameFromHexe) ( HEXE );
+ LPCH (LPFNSYM pSHGetSymFName) ( HEXE );
+ HEXE (LPFNSYM pSHGethExeFromName) ( LPCH );
+ HEXE (LPFNSYM pSHGethExeFromModuleName) ( LPCH );
+ UOFF32 (LPFNSYM pSHGetNearestHsym) ( PADDR, HMOD, int, PHSYM );
+ SHFLAG (LPFNSYM pSHIsInProlog) ( PCXT );
+ SHFLAG (LPFNSYM pSHIsAddrInCxt) ( PCXT, PADDR );
+ SHFLAG (LPFNSYM pSHCompareRE) ( LPCH, LPCH, BOOL );
+ BOOL (LPFNSYM pSHFindSymbol) ( LSZ, PADDR, LPASR );
+ UOFF32 (LPFNSYM pPHGetNearestHsym) ( PADDR, HEXE, PHSYM );
+ HSYM (LPFNSYM pPHFindNameInPublics) ( HSYM,
+ HEXE,
+ LPSSTR,
+ SHFLAG,
+ PFNCMP
+ );
+ HTYPE (LPFNSYM pTHGetTypeFromIndex) ( HMOD, THIDX );
+ HTYPE (LPFNSYM pTHGetNextType) ( HMOD, HTYPE );
+ LPV (LPFNSYM pSHLpGSNGetTable) ( HEXE );
+ LPDEBUGDATA (LPFNSYM pSHGetDebugData) ( HEXE );
+ BOOL (LPFNSYM pSHCanDisplay) ( HSYM );
+
+ // Source Line handler API Exports
+
+ BOOL (LPFNSYM pSLLineFromAddr) ( LPADDR, LPW, SHOFF FAR *, SHOFF FAR * );
+ BOOL (LPFNSYM pSLFLineToAddr) ( HSF, WORD, LPADDR, SHOFF FAR * ,WORD FAR * );
+ LPCH (LPFNSYM pSLNameFromHsf) ( HSF );
+ LPCH (LPFNSYM pSLNameFromHmod) ( HMOD, WORD );
+ BOOL (LPFNSYM pSLFQueryModSrc) ( HMOD );
+ HMOD (LPFNSYM pSLHmodFromHsf) ( HEXE, HSF );
+ HSF (LPFNSYM pSLHsfFromPcxt) ( PCXT );
+ HSF (LPFNSYM pSLHsfFromFile) ( HMOD, LSZ );
+
+ LPV (LPFNSYM pMHOmfLock) ( HDEP );
+ VOID (LPFNSYM pMHOmfUnLock) ( HDEP );
+ LSZ (LPFNSYM pSHLszGetErrorText) ( SHE );
+ BOOL (LPFNSYM pSHIsThunk) ( HSYM );
+ BOOL (LPFNSYM pSHWantSymbols) ( HEXE );
+} SHF; // Symbol Handler Functions
+typedef SHF FAR *LPSHF;
+
+typedef BOOL (*LPFNSHINIT)(LPSHF*,LPKNF);
+typedef BOOL (*LPFNSHUNINIT)(VOID);
+typedef BOOL (*LPFNSHSTARTBACKGROUND)(VOID);
+typedef BOOL (*LPFNSHSTOPBACKGROUND)(VOID);
+
+#pragma pack ()
+
+#endif //RC_INVOKED
+#endif // SH_API
diff --git a/private/windbg/osdebug/include/shapi.hxx b/private/windbg/osdebug/include/shapi.hxx
new file mode 100644
index 000000000..5c40e4159
--- /dev/null
+++ b/private/windbg/osdebug/include/shapi.hxx
@@ -0,0 +1,411 @@
+// shapi.h - Public API to the Symbol Handler
+//
+// This file contains all types and APIs that are defined by
+// the Symbol Handler and are publicly accessible by other
+// components.
+//
+// Before including this file, you must include cvtypes.h.
+
+
+// The master copy of this file resides in the CVINC project.
+// All Microsoft projects are required to use the master copy without
+// modification. Modification of the master version or a copy
+// without consultation with all parties concerned is extremely
+// risky.
+
+#ifndef _VC_VER_INC
+#include "..\include\vcver.h"
+#endif
+
+#if !defined(SH_API) && !defined(RC_INVOKED)
+#define SH_API
+
+typedef enum { // Error returns from some SH functions
+ sheNone = 0,
+ sheNoSymbols = 1, // No CV info
+ sheFutureSymbols = 2, // NB08 to NB99
+ sheMustRelink = 3, // NB00 to NB04
+ sheNotPacked = 4, // NB05 to NB06
+ sheOutOfMemory = 5,
+ sheCorruptOmf = 6,
+ sheFileOpen = 7, // Couldn't open file
+ sheSuppressSyms = 8, // Symbol loading was suppressed
+ sheDeferSyms = 9, // Symbol loading was defered
+ sheSymbolsConverted = 10,
+ sheBadTimeStamp = 11,
+ sheBadCheckSum = 12,
+ shePdbNotFound = 13, // Can't find/open pdb file
+ shePdbBadSig = 14, // internal pdb signature doesn't match sym handler
+ shePdbInvalidAge = 15, // pdb info doesn't match exe/dll
+ shePdbOldFormat = 16, // pdb format is obsolete
+ sheMax // marker for count of she's
+} SHE;
+
+enum {
+ sopNone = 0,
+ sopData = 1,
+ sopStack = 2,
+ sopReg = 4,
+ sopLab = 8,
+ sopFcn = 16,
+ sopExact = 32
+};
+typedef short SOP; // Symbol OPtions
+
+typedef enum {
+ fstNone,
+ fstSymbol,
+ fstPublic
+} FST; // Function Symbol Type
+
+typedef enum {
+ fcdUnknown,
+ fcdNear,
+ fcdFar,
+ fcdData
+} FCD; // Function Call Distance (near/far/unknown)
+
+typedef enum {
+ fptUnknown,
+ fptPresent,
+ fptOmitted
+} FPT; // Frame Pointer Type
+
+typedef struct _ODR {
+ FST fst;
+ FCD fcd;
+ FPT fpt;
+ WORD cbProlog;
+ DWORD dwDeltaOff;
+ LSZ lszName;
+} ODR; // OSDebug Return type
+typedef ODR *LPODR;
+
+
+typedef enum {
+ astNone,
+ astAddress,
+ astRegister,
+ astBaseOff
+} AST; // Assembler symbol return Types
+
+typedef struct _ASR {
+ AST ast;
+ union {
+ struct {
+ FCD fcd;
+ ADDR addr;
+ };
+ WORD ireg;
+ OFFSET off;
+ };
+} ASR; // Assembler Symbol Return structure
+typedef ASR *LPASR;
+
+typedef HEMI SHEMI;
+typedef unsigned int SHFLAG; // A TRUE/FALSE flag var
+typedef SHFLAG * PSHFLAG;
+typedef SEGMENT SHSEG; // A segment/selector value
+typedef UOFFSET SHOFF; // An offset value
+
+typedef void * HVOID; // Generic handle type
+typedef HIND HMOD; // A module handle
+typedef HIND HGRP; // A group handle (sub group of module
+ // currently either a seg or filename)
+typedef HVOID HPROC; // A handle to a procedure
+typedef HVOID HBLK; // A handle to a block.
+typedef HVOID HSF; // A handle to source file table
+typedef HIND HEXE; // An Executable file handle
+typedef HVOID HTYPE; // A handle to a type
+typedef HVOID HSYM; // A handle to a symbol
+typedef HIND HPDS; // A handle to a process
+
+typedef HSYM * PHSYM;
+
+typedef unsigned short THIDX;
+
+typedef struct CXT {
+ ADDR addr;
+ HMOD hMod;
+ HGRP hGrp;
+ HPROC hProc;
+ HBLK hBlk;
+} CXT; // General Symbol context pkt
+typedef CXT *PCXT;
+
+typedef struct CXF {
+ CXT cxt;
+ FRAME Frame;
+} CXF; // Symbol context pkt locked to a frame ptr
+typedef CXF *PCXF;
+
+typedef enum {
+ SHFar,
+ SHNear
+} SHCALL;
+
+typedef struct SHREG {
+ unsigned short hReg;
+ union {
+ unsigned char Byte1;
+ struct {
+ unsigned short Byte2;
+ unsigned short Byte2High;
+ };
+ struct {
+ unsigned long Byte4;
+ unsigned long Byte4High;
+ };
+ double Byte8;
+ FLOAT10 Byte10;
+ };
+} SHREG;
+typedef SHREG *PSHREG;
+
+typedef struct _SLP {
+ ADDR addr;
+ SHOFF cb;
+} SLP; // Source Line Pair (used by SLCAddrFromLine)
+typedef SLP * LPSLP;
+
+// structure defining parameters of symbol to be searched for. The address
+// of this structure is passed on the the EE's symbol compare routine. Any
+// additional data required by the EE's routine must follow this structure.
+
+typedef struct _SSTR { // string with length byte and pointer to data
+ LPB lpName; // pointer to the string itself
+ unsigned char cb; // length byte
+ unsigned char searchmask; // mask to control symbol searching
+ unsigned short symtype; // symbol types to be checked
+ unsigned char * pRE; // pointer to regular expression
+} SSTR;
+typedef SSTR *LPSSTR;
+
+#define SSTR_proc 0x0001 // compare only procs with correct type
+#define SSTR_data 0x0002 // compare only global data with correct type
+#define SSTR_RE 0x0004 // compare using regular expression
+#define SSTR_NoHash 0x0008 // do a linear search of the table
+#define SSTR_symboltype 0x0010 // pass only symbols of symtype to the
+ // comparison function.
+
+#define SHpCXTFrompCXF(a) (&((a)->cxt))
+#define SHpFrameFrompCXF(a) (&(a)->Frame)
+#define SHHMODFrompCXT(a) ((a)->hMod)
+#define SHHPROCFrompCXT(a) ((a)->hProc)
+#define SHHBLKFrompCXT(a) ((a)->hBlk)
+#define SHpADDRFrompCXT(a) (&((a)->addr))
+#define SHPAddrFromPCxf(a) (SHpADDRFrompCXT(SHpCXTFrompCXF(a)))
+
+#define SHIsCXTMod(a) ((a)->hMod && !(a)->hProc && !(a)->hBlk)
+#define SHIsCXTProc(a) ((a)->hMod && (a)->hProc && !(a)->hBlk)
+#define SHIsCXTBlk(a) ((a)->hMod && (a)->hProc && (a)->hBlk)
+
+#define SHHGRPFrompCXT(a) ((a)->hGrp)
+
+// comparison prototype
+typedef SHFLAG (*PFNCMP) (HVOID, HVOID, LSZ, SHFLAG);
+typedef BOOL (*PFNVALIDATEEXE) (UINT, PVOID, LPSTR);
+
+#define LPFNSYM *
+#define LPFNSYMC CDECL *
+
+typedef struct omap_tag {
+ DWORD rva;
+ DWORD rvaTo;
+} OMAP, *LPOMAP;
+
+typedef struct {
+ DWORD Offset;
+ DWORD Size;
+ DWORD Flags;
+} SECSTART, *LPSECSTART;
+
+typedef struct _tagDEBUGDATA {
+ union {
+ PIMAGE_RUNTIME_FUNCTION_ENTRY lpRtf; // Runtime function table - fpo or pdata
+ PFPO_DATA lpFpo;
+ };
+ DWORD cRtf; // Count of rtf entries
+ LPOMAP lpOmapFrom; // Omap table - From Source
+ DWORD cOmapFrom; // Count of omap entries - From Source
+ LPOMAP lpOmapTo; // Omap table - To Source
+ DWORD cOmapTo; // Count of omap entries - To Source
+ LPSECSTART lpSecStart; // Original section table (pre-Lego)
+ SHE she;
+} DEBUGDATA, *LPDEBUGDATA;
+
+typedef struct _KNF {
+ int cb;
+
+ PVOID (LPFNSYM lpfnMHAlloc) (UINT);
+ PVOID (LPFNSYM lpfnMHRealloc) (PVOID, UINT);
+ VOID (LPFNSYM lpfnMHFree) (PVOID);
+ PVOID (LPFNSYM lpfnMHAllocHuge) (LONG, UINT);
+ VOID (LPFNSYM lpfnMHFreeHuge) (PVOID);
+
+ HDEP (LPFNSYM lpfnMMAllocHmem) (UINT);
+ VOID (LPFNSYM lpfnMMFreeHmem) (HDEP);
+ PVOID (LPFNSYM lpfnMMLock) (HDEP);
+ VOID (LPFNSYM lpfnMMUnlock) (HDEP);
+
+ HLLI (LPFNSYM lpfnLLInit) (UINT, LLF, LPFNKILLNODE, LPFNFCMPNODE);
+ HLLE (LPFNSYM lpfnLLCreate) (HLLI);
+ VOID (LPFNSYM lpfnLLAdd) (HLLI, HLLE);
+ VOID (LPFNSYM lpfnLLAddHead) (HLLI, HLLE);
+ VOID (LPFNSYM lpfnLLInsert) (HLLI, HLLE, DWORD);
+ BOOL (LPFNSYM lpfnLLDelete) (HLLI, HLLE);
+ BOOL (LPFNSYM lpfnLLRemove) (HLLI, HLLE);
+ DWORD (LPFNSYM lpfnLLDestroy) (HLLI);
+ HLLE (LPFNSYM lpfnLLNext) (HLLI, HLLE);
+ HLLE (LPFNSYM lpfnLLFind) (HLLI, HLLE, PVOID, DWORD);
+ HLLE (LPFNSYM lpfnLLLast) (HLLI);
+ DWORD (LPFNSYM lpfnLLSize) (HLLI);
+ PVOID (LPFNSYM lpfnLLLock) (HLLE);
+ VOID (LPFNSYM lpfnLLUnlock) (HLLE);
+
+ BOOL (LPFNSYM lpfnLBPrintf) (LPCH, LPCH, UINT);
+ BOOL (LPFNSYM lpfnLBQuit) (UINT);
+
+ UINT (LPFNSYM lpfnSYOpen) (LSZ);
+ VOID (LPFNSYM lpfnSYClose) (UINT);
+ UINT (LPFNSYM lpfnSYReadFar) (UINT, LPB, UINT);
+ LONG (LPFNSYM lpfnSYSeek) (UINT, LONG, UINT);
+ BOOL (LPFNSYM lpfnSYFixupAddr) (PADDR);
+ BOOL (LPFNSYM lpfnSYUnFixupAddr)(PADDR);
+ UINT (LPFNSYM lpfnSYProcessor) (DWORD);
+
+// Added/Changed for NT merge.
+
+// VOID (LPFNSYM lpfn_searchenv) (LSZ, LSZ, LSZ);
+// UINT (LPFNSYMC lpfnsprintf) (LSZ, LSZ, ...);
+// VOID (LPFNSYM lpfn_splitpath) (LSZ, LSZ, LSZ, LSZ, LSZ);
+// LSZ (LPFNSYM lpfn_fullpath) (LSZ, LSZ, UINT);
+// VOID (LPFNSYM lpfn_makepath) (LSZ, LSZ, LSZ, LSZ, LSZ);
+// UINT (LPFNSYM lpfnstat) (LSZ, LPCH);
+
+ LONG (LPFNSYM lpfnSYTell) (UINT);
+ UINT (LPFNSYM lpfnSYFindExeFile) (LSZ, LSZ, UINT, PVOID, PFNVALIDATEEXE);
+ VOID (LPFNSYM lpfnLoadedSymbols) (SHE, HPID, LSZ);
+ BOOL (LPFNSYM lpfnSYGetDefaultShe) (LSZ, SHE *);
+
+} KNF; // KerNel Functions exported to the Symbol Handler
+typedef KNF *LPKNF;
+
+typedef struct _SHF {
+ int cb;
+ HPDS (LPFNSYM pSHCreateProcess) (VOID);
+ VOID (LPFNSYM pSHSetHpid) (HPID);
+ BOOL (LPFNSYM pSHDeleteProcess) (HPDS);
+ HPDS (LPFNSYM pSHChangeProcess) (HPDS);
+ SHE (LPFNSYM pSHAddDll) (LSZ, BOOL); // Changed for NT
+ SHE (LPFNSYM pSHAddDllsToProcess) (VOID);
+ SHE (LPFNSYM pSHLoadDll) (LSZ, BOOL);
+ VOID (LPFNSYM pSHUnloadDll) (HEXE);
+ UOFFSET (LPFNSYM pSHGetDebugStart) (HSYM);
+ LSZ (LPFNSYM pSHGetSymName) (HSYM, LSZ);
+ BOOL (LPFNSYM pSHAddrFromHsym) (PADDR, HSYM); // Changed for NT
+ HMOD (LPFNSYM pSHHModGetNextGlobal) (HEXE *, HMOD);
+ int (LPFNSYM pSHModelFromAddr) (PADDR, LPW, LPB, UOFFSET *);
+ int (LPFNSYM pSHPublicNameToAddr) (PADDR, PADDR, LSZ);
+ LSZ (LPFNSYM pSHGetSymbol) (LPADDR, LPADDR, SOP, LPODR);
+ BOOL (LPFNSYM pSHGetPublicAddr) (PADDR, LSZ);
+ BOOL (LPFNSYM pSHIsLabel) (HSYM);
+
+ VOID (LPFNSYM pSHSetDebuggeeDir) (LSZ);
+// VOID (LPFNSYM pSHSetUserDir) (LSZ); // Deleted for NT
+ BOOL (LPFNSYM pSHAddrToLabel) (PADDR, LSZ);
+
+ int (LPFNSYM pSHGetSymLoc) (HSYM, LSZ, UINT, PCXT);
+ BOOL (LPFNSYM pSHFIsAddrNonVirtual) (PADDR);
+ BOOL (LPFNSYM pSHIsFarProc) (HSYM);
+
+ HEXE (LPFNSYM pSHGetNextExe) (HEXE);
+ HEXE (LPFNSYM pSHHexeFromHmod) (HMOD);
+ HMOD (LPFNSYM pSHGetNextMod) (HEXE, HMOD);
+ PCXT (LPFNSYM pSHGetCxtFromHmod) (HMOD, PCXT);
+ PCXT (LPFNSYM pSHSetCxt) (PADDR, PCXT);
+ PCXT (LPFNSYM pSHSetCxtMod) (PADDR, PCXT);
+ HSYM (LPFNSYM pSHFindNameInGlobal) (HSYM,
+ PCXT,
+ LPSSTR,
+ SHFLAG,
+ PFNCMP,
+ PCXT
+ );
+ HSYM (LPFNSYM pSHFindNameInContext) (HSYM,
+ PCXT,
+ LPSSTR,
+ SHFLAG,
+ PFNCMP,
+ PCXT
+ );
+ HSYM (LPFNSYM pSHGoToParent) (PCXT, PCXT);
+ HSYM (LPFNSYM pSHHsymFromPcxt) (PCXT);
+ HSYM (LPFNSYM pSHNextHsym) (HMOD, HSYM);
+ PCXF (LPFNSYM pSHGetFuncCXF) (PADDR, PCXF);
+ LPCH (LPFNSYM pSHGetModName) (HMOD);
+ LPCH (LPFNSYM pSHGetExeName) (HEXE);
+ HEXE (LPFNSYM pSHGethExeFromName) (LPCH);
+ UOFF32 (LPFNSYM pSHGetNearestHsym) (PADDR, HMOD, int, PHSYM);
+ SHFLAG (LPFNSYM pSHIsInProlog) (PCXT);
+ SHFLAG (LPFNSYM pSHIsAddrInCxt) (PCXT, PADDR);
+ SHFLAG (LPFNSYM pSHCompareRE) (LPCH, LPCH, BOOL);
+ BOOL (LPFNSYM pSHFindSymbol) (LSZ, PADDR, LPASR);
+ UOFF32 (LPFNSYM pPHGetNearestHsym) (PADDR, HEXE, PHSYM);
+ HSYM (LPFNSYM pPHFindNameInPublics) (HSYM, HEXE, LPSSTR, SHFLAG, PFNCMP);
+ HTYPE (LPFNSYM pTHGetTypeFromIndex) (HMOD, THIDX);
+ HTYPE (LPFNSYM pTHGetNextType) (HMOD, HTYPE);
+ PVOID (LPFNSYM pSHLpGSNGetTable) (HEXE);
+ BOOL (LPFNSYM pSHCanDisplay) (HSYM);
+
+ // Source Line handler API Exports
+
+ BOOL (LPFNSYM pSLLineFromAddr) (LPADDR, LPW, SHOFF *, SHOFF *);
+ BOOL (LPFNSYM pSLFLineToAddr) (HSF, WORD, LPADDR, SHOFF *, WORD *);
+ LPCH (LPFNSYM pSLNameFromHsf) (HSF);
+ LPCH (LPFNSYM pSLNameFromHmod) (HMOD, WORD);
+ BOOL (LPFNSYM pSLFQueryModSrc) (HMOD);
+ HMOD (LPFNSYM pSLHmodFromHsf) (HEXE, HSF);
+ HSF (LPFNSYM pSLHsfFromPcxt) (PCXT);
+ HSF (LPFNSYM pSLHsfFromFile) (HMOD, LSZ);
+
+ int (LPFNSYM pSLCAddrFromLine) (HEXE, HMOD, LSZ, WORD, LPSLP *);
+ VOID (LPFNSYM pSHFree) (PVOID);
+ VOID (LPFNSYM pSHUnloadSymbolHandler)(BOOL);
+// REVIEW: piersh
+ SHE (LPFNSYM pSHGetExeTimeStamp) (LPSTR, ULONG *);
+ VOID (LPFNSYM pSHPdbNameFromExe) (LSZ, LSZ, UINT);
+ LPDEBUGDATA (LPFNSYM pSHGetDebugData) (HEXE);
+ BOOL (LPFNSYM pSHIsThunk) (HSYM);
+ HSYM (LPFNSYM pSHFindSymInExe) (HEXE, LPSSTR, BOOL);
+ HSYM (LPFNSYM pSHFindSLink32) (PCXT);
+ BOOL (LPFNSYM pSHIsDllLoaded) (HEXE);
+
+// Entries added for NT work.
+
+ LSZ (LPFNSYM pSHGetModule) (PADDR, LSZ);
+ PCXT (LPFNSYM pSHGetCxtFromHexe) (HEXE, PCXT);
+ LPCH (LPFNSYM pSHGetModNameFromHexe) (HEXE);
+ LPCH (LPFNSYM pSHGetSymFName) (HEXE);
+ HEXE (LPFNSYM pSHGethExeFromModuleName) (LPCH);
+ LSZ (LPFNSYM pSHLszGetErrorText) (SHE);
+ BOOL (LPFNSYM pSHWantSymbols) (HEXE);
+ HSYM (LPFNSYM pSHFindNameInTypes) ( PCXT, LPSSTR, SHFLAG, PFNCMP, PCXT );
+} SHF; // Symbol Handler Functions
+typedef SHF *LPSHF;
+
+// FNSHINIT is the prototype for the SHInit function
+
+typedef BOOL FNSHINIT(LPSHF *, LPKNF);
+
+typedef FNSHINIT * LPFNSHINIT;
+typedef FNSHINIT * PFNSHINIT;
+
+typedef BOOL (* LPFNSHUNINIT)(VOID);
+typedef BOOL (* LPFNSHSTARTBACKGROUND)(VOID);
+typedef BOOL (* LPFNSHSTOPBACKGROUND)(VOID);
+
+// This is the only SH function that's actually exported from the DLL
+FNSHINIT SHInit;
+
+#endif // SH_API
diff --git a/private/windbg/osdebug/include/types.h b/private/windbg/osdebug/include/types.h
new file mode 100644
index 000000000..c8b589a91
--- /dev/null
+++ b/private/windbg/osdebug/include/types.h
@@ -0,0 +1,257 @@
+/** types.h - Generic types
+ *
+ * This file contains generic types such as USHORT, ushort,
+ * WORD, etc., which are not directly related to CodeView.
+ * Every attempt is made to define them in such a way as they
+ * will not conflict with the standard header files such as
+ * windows.h and os2.h.
+ */
+
+
+/*** The master copy of this file resides in the CodeView project.
+ * All Microsoft projects are required to use the master copy without
+ * modification. Modification of the master version or a copy
+ * without consultation with all parties concerned is extremely
+ * risky.
+ *
+ * The projects known to use this file are:
+ *
+ * CodeView
+ * C/C++ expression evaluator
+ * Symbol Handler
+ * Stump (OSDebug)
+ */
+
+#ifndef _TYPES_H_DEFINED
+#define _TYPES_H_DEFINED
+
+
+#ifdef HOST32
+#define _export
+
+#ifndef LOADDS
+#define LOADDS
+#endif
+
+#ifndef PASCAL
+#define PASCAL
+#endif
+
+#ifndef CDECL
+#define CDECL
+#endif
+
+#ifndef FASTCALL
+#define FASTCALL
+#endif
+
+#ifndef FAR
+#define FAR
+#endif
+
+#ifndef NEAR
+#define NEAR
+#endif
+
+#ifndef _HUGE
+#define _HUGE
+#endif
+
+#ifndef _HUGE_
+#define _HUGE_
+#endif
+
+/*
+** This set of functions need to be expanded to deal with
+** unicode and other problems.
+*/
+
+#define _fmemcmp memcmp
+#define _fmemcpy memcpy
+#define _fmemmove memmove
+#define _fmemset memset
+#define _fstrcat strcat
+#define _fstrchr strchr
+#define _fstrcpy strcpy
+#define _fstricmp stricmp
+#define _fstrlen strlen
+#define _fstrncat strncat
+#define _fstrncmp strncmp
+#define _fstrncpy strncpy
+#define _fstrnicmp strnicmp
+#define _fstrstr strstr
+#define _fstrupr strupr
+
+#else // !HOST32
+
+#ifndef LOADDS
+#define LOADDS _loadds
+#endif
+
+#ifndef PASCAL
+#define PASCAL _pascal
+#endif
+
+#ifndef CDECL
+#define CDECL _cdecl
+#endif
+
+#ifndef FASTCALL
+#define FASTCALL _fastcall
+#endif
+
+#ifndef FAR
+#define FAR _far
+#endif
+
+#ifndef NEAR
+#define NEAR _near
+#endif
+
+#ifndef _HUGE
+#define _HUGE _huge
+#endif
+
+#ifndef _HUGE_
+#define _HUGE_ _huge
+#endif
+#endif // HOST32
+
+#ifndef INTERRUPT
+#define INTERRUPT _interrupt
+#endif
+
+#ifndef LOCAL
+#define LOCAL static
+#endif
+
+#ifndef GLOBAL
+#define GLOBAL
+#endif
+
+//
+// Things that come from either windows.h or os2.h
+//
+
+#if !defined(LOWORD) && !defined(OS2_INCLUDED)
+
+#define VOID void
+
+ typedef unsigned char BYTE;
+
+ typedef int BOOL;
+
+#define LONG long
+
+#endif
+
+//
+// Things that come from windows.h
+//
+
+#if !defined(LOWORD)
+
+ typedef unsigned int HANDLE;
+
+ typedef char FAR * LPSTR;
+
+ typedef unsigned short WORD;
+ typedef unsigned long DWORD;
+
+#endif
+
+//
+// Things that come from os2.h
+//
+
+#if !defined(OS2_INCLUDED)
+
+#define CHAR char
+
+#ifndef _WINDOWS_
+ typedef unsigned char UCHAR;
+#endif
+#define SHORT short
+#define INT int
+#ifndef _WINDOWS_
+ typedef unsigned short USHORT;
+ typedef unsigned int UINT;
+ typedef unsigned long ULONG;
+ typedef char * PCH;
+#endif
+#endif
+
+#if !defined(LOWORD)
+
+#define LOWORD(l) ((WORD)(l))
+#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))
+
+#endif
+
+#ifndef NULL
+#define NULL ((void *) 0)
+#endif
+
+#ifndef HNULL
+#define HNULL 0
+#endif
+
+#if !defined(TRUE) || !defined(FALSE)
+#undef TRUE
+#undef FALSE
+
+#define FALSE 0
+#define TRUE 1
+#endif
+
+#if !defined(fTrue) || !defined(fFalse)
+#undef fTrue
+#undef fFalse
+
+#define fFalse 0
+#define fTrue 1
+#endif
+
+#ifndef min
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#endif
+
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#ifndef Unreferenced
+#define Unreferenced(a) ((void)a)
+#endif
+
+typedef unsigned short ushort;
+typedef unsigned char uchar;
+typedef unsigned long ulong;
+typedef unsigned int uint;
+
+typedef void * PV;
+typedef void FAR * LPV;
+
+typedef char * SZ;
+typedef char FAR * LSZ;
+#ifndef _WINDOWS_
+typedef char FAR * LPCH;
+#endif
+
+typedef BOOL FAR * LPF;
+typedef BYTE FAR * LPB;
+typedef WORD FAR * LPW;
+typedef LONG FAR * LPL;
+typedef ULONG FAR * LPUL;
+typedef USHORT FAR *LPUS;
+
+typedef short SWORD;
+
+#ifdef HOST32
+typedef ULONG IWORD;
+#else
+typedef UINT IWORD;
+#define WNDPROC FARPROC
+#endif
+
+#endif // _TYPES_H_DEFINED
diff --git a/private/windbg/osdebug/include/vcver.h b/private/windbg/osdebug/include/vcver.h
new file mode 100644
index 000000000..bd3ee5124
--- /dev/null
+++ b/private/windbg/osdebug/include/vcver.h
@@ -0,0 +1,6 @@
+#ifndef _VC_VER_INC
+#define _VC_VER_INC
+#ifndef _VC_VER
+#define _VC_VER 300
+#endif
+#endif
diff --git a/private/windbg/osdebug/include/version.h b/private/windbg/osdebug/include/version.h
new file mode 100644
index 000000000..9b824fa6e
--- /dev/null
+++ b/private/windbg/osdebug/include/version.h
@@ -0,0 +1,5 @@
+#define rmj 2
+#define rmm 0
+#define rup 4193
+#define szVerName "NT - Windbg"
+#define szVerUser "KENTF2"