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