245 lines
9.2 KiB
C++
245 lines
9.2 KiB
C++
|
//+---------------------------------------------------------------------------
|
|||
|
//
|
|||
|
// Microsoft Windows
|
|||
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
|||
|
//
|
|||
|
// File: thop.hxx
|
|||
|
//
|
|||
|
// Contents: Defines the available thops
|
|||
|
//
|
|||
|
// History: 22-Feb-94 DrewB Created
|
|||
|
//
|
|||
|
//----------------------------------------------------------------------------
|
|||
|
|
|||
|
#ifndef __THOP_HXX__
|
|||
|
#define __THOP_HXX__
|
|||
|
|
|||
|
//
|
|||
|
// THOP is a single instruction to the interpreter that encodes,
|
|||
|
// decodes parameters sent via LRPC. A string of THOPs describes how to
|
|||
|
// marshal, unmarshal function's paramaters.
|
|||
|
//
|
|||
|
//
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
THOP_END,
|
|||
|
// Basic types size of type (win3.1)
|
|||
|
THOP_SHORTLONG, // Signed ints 2b
|
|||
|
THOP_WORDDWORD, // Unsigned int 2b
|
|||
|
THOP_COPY, // Direct copies
|
|||
|
THOP_LPSTR, // LPSTR -- (zero terminated)
|
|||
|
THOP_LPLPSTR, // LPLPSTR -- (zero terminated)
|
|||
|
THOP_BUFFER, // void FAR* -- (size in next long)
|
|||
|
|
|||
|
// Windows types
|
|||
|
THOP_HUSER, // HWND, HMENU 2b
|
|||
|
THOP_HGDI, // HDC, HICON 2b
|
|||
|
THOP_SIZE, // SIZE 4b
|
|||
|
THOP_RECT, // RECT 8b
|
|||
|
THOP_MSG, // MSG 18b
|
|||
|
|
|||
|
// Ole types
|
|||
|
THOP_HRESULT, // HRESULT 4b
|
|||
|
THOP_STATSTG, // STATSTG > 38b + size of member lpstr
|
|||
|
THOP_DVTARGETDEVICE, // DVTARGETDEVICE > 16b
|
|||
|
THOP_STGMEDIUM, // STGMEDIUM > 12b + size of member lpstr
|
|||
|
THOP_FORMATETC, // FORMATETC > 18b + size of member tdev
|
|||
|
THOP_HACCEL, // HACCEL 2b
|
|||
|
THOP_OIFI, // OLEINPLACEFRAMEINFO 10b
|
|||
|
THOP_BINDOPTS, // BIND_OPTS > 12b
|
|||
|
THOP_LOGPALETTE, // LOGPALETTE > 8b
|
|||
|
THOP_SNB, // SNBs in storage Varies
|
|||
|
THOP_CRGIID, // ciid, rgiid pair from storage
|
|||
|
THOP_OLESTREAM, // OLESTREAM
|
|||
|
THOP_HTASK, // HTASK
|
|||
|
THOP_INTERFACEINFO, // INTERFACEINFO
|
|||
|
|
|||
|
THOP_IFACE, // Known interface type
|
|||
|
THOP_IFACEOWNER, // For IFACE cases with weak references
|
|||
|
THOP_IFACENOADDREF, // For IFACE cases with no references by user (IOleCacheControl)
|
|||
|
THOP_IFACECLEAN, // For IRpcStubBuffer::DebugServerRelease
|
|||
|
THOP_IFACEGEN, // for QueryInterface, etc (refiid, **ppUnk)
|
|||
|
THOP_IFACEGENOWNER, // For IFACEGEN cases with weak references
|
|||
|
THOP_UNKOUTER, // Controling unknown
|
|||
|
THOP_UNKINNER, // Inner unknown
|
|||
|
|
|||
|
THOP_ROUTINEINDEX, // Thop for indicating the call type index
|
|||
|
THOP_RETURNTYPE, // Thop for indicating return type of a routine if
|
|||
|
// not HRESULT
|
|||
|
THOP_NULL, // NULL ptr, for checking of reserved fields
|
|||
|
THOP_ERROR, // Invalid thop, for debugging
|
|||
|
THOP_ENUM, // Enumerator thop start
|
|||
|
THOP_CALLBACK, // Callback function and argument
|
|||
|
THOP_RPCOLEMESSAGE, // RPCOLEMESSAGE
|
|||
|
THOP_ALIAS32, // 16-bit alias for 32-bit quantity
|
|||
|
THOP_CLSCONTEXT, // Flags DWORD with special handling
|
|||
|
THOP_FILENAME, // String which is a filename, needs long/short cvt
|
|||
|
THOP_SIZEDSTRING, // String which cannot exceed a certain length
|
|||
|
|
|||
|
THOP_LASTOP, // Marker for last op
|
|||
|
|
|||
|
THOP_OPMASK = 0x3f, // Mask for basic operation code
|
|||
|
|
|||
|
// Modifiers
|
|||
|
THOP_IOMASK = 0xc0,
|
|||
|
THOP_IN = 0x40, // FAR Pointer to in parameter
|
|||
|
THOP_OUT = 0x80, // FAR Pointer to out parameter
|
|||
|
THOP_INOUT = 0xc0 // FAR Pointer to in, out parameter
|
|||
|
} THOP_TYPE;
|
|||
|
|
|||
|
typedef unsigned char THOP;
|
|||
|
|
|||
|
#define ALIAS_CREATE 0
|
|||
|
#define ALIAS_RESOLVE 1
|
|||
|
#define ALIAS_REMOVE 2
|
|||
|
|
|||
|
#define MAX_PARAMS 16
|
|||
|
|
|||
|
typedef DWORD (__stdcall * VTBLFN)(DWORD dw);
|
|||
|
|
|||
|
typedef struct tagSTACK16INFO
|
|||
|
{
|
|||
|
BYTE UNALIGNED *pbStart;
|
|||
|
BYTE UNALIGNED *pbCurrent;
|
|||
|
int iDir;
|
|||
|
} STACK16INFO;
|
|||
|
|
|||
|
typedef struct tagSTACK32INFO
|
|||
|
{
|
|||
|
BYTE *pbStart;
|
|||
|
BYTE *pbCurrent;
|
|||
|
} STACK32INFO;
|
|||
|
|
|||
|
typedef struct tagTHUNKINFO
|
|||
|
{
|
|||
|
STACK16INFO s16;
|
|||
|
STACK32INFO s32;
|
|||
|
THOP CONST *pThop;
|
|||
|
VTBLFN pvfn;
|
|||
|
SCODE scResult;
|
|||
|
BOOL fResultThunked;
|
|||
|
DWORD dwCallerProxy;
|
|||
|
CThkMgr *pThkMgr;
|
|||
|
IIDIDX iidx;
|
|||
|
DWORD dwMethod;
|
|||
|
IUnknown *this32;
|
|||
|
} THUNKINFO;
|
|||
|
|
|||
|
// These are declared extern "C" because there was a bug in the
|
|||
|
// PPC compiler (aug '95) where the const related decorations on
|
|||
|
// the global data symbols was not done consistantly. By using
|
|||
|
// extern "C" the bug is simply avoided.
|
|||
|
// The problem was only with aThopFunctions*[] but I added
|
|||
|
// aThopEnumFunctions*[] for a consistent look and usage. A related
|
|||
|
// bug is fixed with apthopsApiThops[].
|
|||
|
|
|||
|
extern "C" DWORD (* CONST aThopFunctions1632[])(THUNKINFO *);
|
|||
|
extern "C" DWORD (* CONST aThopFunctions3216[])(THUNKINFO *);
|
|||
|
extern "C" DWORD (* CONST aThopEnumFunctions1632[])(THUNKINFO *);
|
|||
|
extern "C" DWORD (* CONST aThopEnumFunctions3216[])(THUNKINFO *);
|
|||
|
|
|||
|
#define SKIP_STACK16(s16, cb) \
|
|||
|
(s16)->pbCurrent = (s16)->iDir < 0 ? \
|
|||
|
(s16)->pbCurrent-(cb) : \
|
|||
|
(s16)->pbCurrent+(cb)
|
|||
|
|
|||
|
#define PTR_STACK16(s16, cb) \
|
|||
|
((s16)->pbCurrent-((s16)->iDir < 0 ? (cb) : 0))
|
|||
|
|
|||
|
#define GET_STACK16(pti, val, typ) \
|
|||
|
if ((pti)->s16.iDir < 0) \
|
|||
|
{ \
|
|||
|
(pti)->s16.pbCurrent -= sizeof(typ); \
|
|||
|
(val) = *(typ UNALIGNED *)(pti)->s16.pbCurrent; \
|
|||
|
} \
|
|||
|
else \
|
|||
|
{ \
|
|||
|
(val) = *(typ UNALIGNED *)(pti)->s16.pbCurrent; \
|
|||
|
(pti)->s16.pbCurrent += sizeof(typ); \
|
|||
|
}
|
|||
|
|
|||
|
#define TO_STACK16(pti, val, typ) \
|
|||
|
if ((pti)->s16.iDir < 0) \
|
|||
|
{ \
|
|||
|
(pti)->s16.pbCurrent -= sizeof(typ); \
|
|||
|
*(typ UNALIGNED *)(pti)->s16.pbCurrent = (val); \
|
|||
|
} \
|
|||
|
else \
|
|||
|
{ \
|
|||
|
*(typ UNALIGNED *)(pti)->s16.pbCurrent = (val); \
|
|||
|
(pti)->s16.pbCurrent += sizeof(typ); \
|
|||
|
}
|
|||
|
|
|||
|
#define PEEK_STACK16(pti, val, typ) \
|
|||
|
(val) = *(typ UNALIGNED *)(pti)->s16.pbCurrent
|
|||
|
|
|||
|
#define INDEX_STACK16(pti, val, typ, idx, predec) \
|
|||
|
(val) = *(typ UNALIGNED *)((pti)->s16.iDir < 0 ? \
|
|||
|
((pti)->s16.pbCurrent+(idx)-(predec)) : \
|
|||
|
((pti)->s16.pbCurrent-(idx)))
|
|||
|
|
|||
|
#define SKIP_STACK32(s32, cb) \
|
|||
|
(s32)->pbCurrent += (cb)
|
|||
|
|
|||
|
#define PTR_STACK32(s32) \
|
|||
|
(s32)->pbCurrent
|
|||
|
|
|||
|
#define GET_STACK32(pti, val, typ) \
|
|||
|
(val) = *(typ *)(pti)->s32.pbCurrent; \
|
|||
|
SKIP_STACK32(&(pti)->s32, sizeof(typ))
|
|||
|
|
|||
|
#define TO_STACK32(pti, val, typ) \
|
|||
|
*(typ *)(pti)->s32.pbCurrent = (val);\
|
|||
|
SKIP_STACK32(&(pti)->s32, sizeof(typ))
|
|||
|
|
|||
|
#define PEEK_STACK32(pti, val, typ) \
|
|||
|
(val) = *(typ *)(pti)->s32.pbCurrent
|
|||
|
|
|||
|
#define INDEX_STACK32(pti, val, typ, idx) \
|
|||
|
(val) = *(typ *)((pti)->s32.pbCurrent-(idx))
|
|||
|
|
|||
|
#if DBG == 0
|
|||
|
|
|||
|
// In debug builds this goes through a function that can emit
|
|||
|
// debug info about thops being executed
|
|||
|
#define EXECUTE_THOP1632(pti) \
|
|||
|
(*aThopFunctions1632[*((pti)->pThop) & THOP_OPMASK])(pti)
|
|||
|
#define EXECUTE_THOP3216(pti) \
|
|||
|
(*aThopFunctions3216[*((pti)->pThop) & THOP_OPMASK])(pti)
|
|||
|
#define EXECUTE_ENUMTHOP1632(pti) \
|
|||
|
(*aThopEnumFunctions1632[*(pti)->pThop])(pti)
|
|||
|
#define EXECUTE_ENUMTHOP3216(pti) \
|
|||
|
(*aThopEnumFunctions3216[*(pti)->pThop])(pti)
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
DWORD EXECUTE_THOP1632(THUNKINFO *pti);
|
|||
|
DWORD EXECUTE_THOP3216(THUNKINFO *pti);
|
|||
|
DWORD EXECUTE_ENUMTHOP1632(THUNKINFO *pti);
|
|||
|
DWORD EXECUTE_ENUMTHOP3216(THUNKINFO *pti);
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
#define IS_THOP_IN(pti) ((*((pti)->pThop) & THOP_IN) == THOP_IN)
|
|||
|
#define IS_THOP_OUT(pti) ((*((pti)->pThop) & THOP_OUT) == THOP_OUT)
|
|||
|
|
|||
|
// Max size of preallocated strings
|
|||
|
#define CBSTRINGPREALLOC 512
|
|||
|
#define CWCSTRINGPREALLOC (CBSTRINGPREALLOC/sizeof(WCHAR))
|
|||
|
|
|||
|
// Max size?
|
|||
|
#define CCHMAXSTRING 0x1000
|
|||
|
|
|||
|
// Max size of preallocated palettes
|
|||
|
#define NPALETTEPREALLOC 256
|
|||
|
|
|||
|
// Size of a LOGPALETTE structure with N entries
|
|||
|
#define CBPALETTE(n) (sizeof(LOGPALETTE)+((n)-1)*sizeof(PALETTEENTRY))
|
|||
|
|
|||
|
// Hide the exact field in the RPCOLEMESSAGE we use to store thunking data
|
|||
|
#define ROM_THUNK_FIELD(rom) ((rom)->reserved1)
|
|||
|
|
|||
|
#endif // #ifndef __THOP_HXX__
|
|||
|
|