windows-nt/Source/XPSP1/NT/com/ole32/olethunk/olethk32/thop.hxx
2020-09-26 16:20:57 +08:00

245 lines
9 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//+---------------------------------------------------------------------------
//
// 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__