245 lines
9 KiB
C++
245 lines
9 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__
|
||
|