//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1994. // // File: cthkmgr.hxx // // Contents: CThkMgr deklaration // // Classes: CThkMgr // // Functions: // // History: 5-18-94 JohannP (Johann Posch) Created // //---------------------------------------------------------------------------- #ifndef __CTHKMGR_HXX__ #define __CTHKMGR_HXX__ // // Describes a request for a custom interface // typedef struct tagIIDNODE IIDNODE, *PIIDNODE; struct tagIIDNODE { IID *piid; PIIDNODE pNextNode; }; // // state of thunk call - before or after the 32 or 16 bit call // typedef enum { THKSTATE_NOCALL = 0x0000, THKSTATE_INVOKETHKIN32 = 0x0001, THKSTATE_INVOKETHKOUT32 = 0x0002, THKSTATE_INVOKETHKIN16 = 0x0004, THKSTATE_INVOKETHKOUT16 = 0x0008, THKSTATE_INVOKETHKOUT16_CLIENTSITE = 0x0010, THKSTATE_VERIFY16INPARAM = 0x0020, THKSTATE_VERIFY32INPARAM = 0x0040 } THKSTATE; #define THKSTATE_OUT (THKSTATE_INVOKETHKOUT32 | THKSTATE_INVOKETHKOUT16 | \ THKSTATE_INVOKETHKOUT16_CLIENTSITE) //+--------------------------------------------------------------------------- // // Class: CThkMgr () // // Purpose: // // Interface: QueryInterface -- // AddRef -- // Release -- // IsIIDRequested -- // SetThkState -- // IsIIDSupported -- // AddIIDRequest -- // RemoveIIDRequest -- // ResetThkState -- // GetThkState -- // IsOutParamObj -- // IsProxy1632 -- // FreeProxy1632 -- // QueryInterfaceProxy1632 -- // AddRefProxy1632 -- // ReleaseProxy1632 -- // IsProxy3216 -- // FreeProxy3216 -- // QueryInterfaceProxy3216 -- // AddRefProxy3216 -- // ReleaseProxy3216 -- // PrepareForCleanup -- // DebugDump3216 -- // Create -- // ~CThkMgr -- // CThkMgr -- // _cRefs -- // _thkstate -- // _pProxyTbl3216 -- // _pProxyTbl1632 -- // _pCFL1632 -- // _pCFL3216 -- // _piidnode -- // // History: 6-01-94 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- // Returns from FindProxy #define FST_ERROR 0 #define FST_CREATED_NEW 1 #define FST_USED_EXISTING 2 #define FST_SHORTCUT 4 #define CALLBACK_ALLOWED 1 #define FST_PROXY_STATUS (FST_CREATED_NEW | FST_USED_EXISTING) #define FST_OBJECT_STATUS (FST_SHORTCUT) class CThkMgr : public IThunkManager { public: // *** IUnknown methods *** STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG,AddRef) (THIS); STDMETHOD_(ULONG,Release) (THIS); // *** IThunkManager methods *** STDMETHOD_(BOOL, IsIIDRequested) (THIS_ REFIID riid); STDMETHOD_(BOOL, IsCustom3216Proxy) (THIS_ IUnknown *punk, REFIID riid); // private methods THKSTATE GetThkState(void) { return _thkstate; }; void SetThkState(THKSTATE thkstate) { _thkstate = thkstate; }; BOOL IsOutParamObj(void) { return (_thkstate & THKSTATE_OUT) != 0; } BOOL IsIIDSupported (REFIID riid); BOOL AddIIDRequest (REFIID riid); void RemoveIIDRequest (REFIID riid); void LockProxy(CProxy *pprx); BOOL LookupIdentity(VPVOID vpvUnk, PROXYHOLDER *&pph) { return(_pHolderTbl->Lookup(vpvUnk, (void *&)pph)); } VPVOID CanGetNewProxy1632(IIDIDX iidx); void FreeNewProxy1632(VPVOID vpv, IIDIDX iidx); IUnknown *IsProxy1632(VPVOID vpvObj16); VPVOID LookupProxy1632(IUnknown *punkThis32) { VPVOID vpv; if (_pProxyTbl1632->Lookup((DWORD)punkThis32, (void*&)vpv)) { return vpv; } else { return 0; } } SCODE Object32Identity(IUnknown *punkThis32, PROXYPTR *pProxy, DWORD *pfst); VPVOID CreateOuter16(IUnknown *punkOuter32, PROXYHOLDER **ppAggHolder, DWORD *pfst); VPVOID FindProxy1632(VPVOID vpvPrealloc, IUnknown *punkThis32, PROXYHOLDER *pgHolder, IIDIDX iidx, DWORD *pfst); VPVOID FindAggregate1632(VPVOID vpvPrealloc, IUnknown *punkOuter32, IUnknown *punkThis32, IIDIDX iidx, PROXYHOLDER *pAggHolder, DWORD *pfst); SCODE QueryInterfaceProxy1632(VPVOID vpvThis16, REFIID refiid, LPVOID *ppv); DWORD TransferLocalRefs1632(VPVOID vpvProxy); DWORD AddRefProxy1632(VPVOID vpvThis16); DWORD ReleaseProxy1632(VPVOID vpvThis16); THUNK3216OBJ *CanGetNewProxy3216(IIDIDX iidx); void FreeNewProxy3216(THUNK3216OBJ *ptoProxy, IIDIDX iidx); VPVOID IsProxy3216(IUnknown *punkObj); THUNK3216OBJ *LookupProxy3216(VPVOID vpvObj16) { THUNK3216OBJ *pto; if (_pProxyTbl3216->Lookup((DWORD)vpvObj16, (void *&)pto)) { return pto; } else { return NULL; } } SCODE Object16Identity(VPVOID vpvThis16, PROXYPTR *pProxy, DWORD *pfst, BOOL bCallQI, BOOL bExtraAddRef); IUnknown *CreateOuter32(VPVOID vpvOuter16, PROXYHOLDER **ppAggHolder, DWORD *pfst); IUnknown *FindProxy3216(THUNK3216OBJ *ptoPrealloc, VPVOID vpvThis16, PROXYHOLDER *pgHolder, IIDIDX iidx, BOOL bExtraAddRef, DWORD *pfst); IUnknown *FindAggregate3216(THUNK3216OBJ *ptoPrealloc, VPVOID vpvOuter16, VPVOID vpvThis16, IIDIDX iidx, PROXYHOLDER *pAggHolder, DWORD *fst); SCODE QueryInterfaceProxy3216(THUNK3216OBJ *pto, REFIID refiid, LPVOID *ppv); DWORD TransferLocalRefs3216(VPVOID vpvProxy); DWORD AddRefProxy3216(THUNK3216OBJ *pto); DWORD ReleaseProxy3216(THUNK3216OBJ *pto); void ReleaseUnreferencedProxy3216(THUNK3216OBJ *pto); void PrepareForCleanup( void ); void RemoveAllProxies(void); BOOL AreCallbacksAllowed() { return(_dwState & CALLBACK_ALLOWED); } #if DBG == 1 void DebugDump1632(void); void DebugDump3216(void); #endif // creation static CThkMgr * Create(void); ~CThkMgr(); private: CThkMgr(CMapDwordPtr *pPT1632, CMapDwordPtr *pPT3216, CMapDwordPtr *pHolderTbl); LONG _cRefs; THKSTATE _thkstate; DWORD _dwState; CMapDwordPtr *_pProxyTbl3216; CMapDwordPtr *_pProxyTbl1632; CMapDwordPtr *_pHolderTbl; // list of requested iids PIIDNODE _piidnode; // List of proxy holders for controlling unknowns PROXYHOLDER *_pphHolders; // Holder manipulation routines PROXYHOLDER *NewHolder(VPVOID pUnk, PROXYPTR unkProxy, DWORD dwFlags); void ReleaseHolder(PROXYHOLDER *pph, DWORD ProxyType); inline void AddRefHolder(PROXYHOLDER *pph); void AddProxyToHolder(PROXYHOLDER *pph, CProxy *pprxReal, PROXYPTR &pprx); // Private methods void RemoveProxy1632(VPVOID vpv, THUNK1632OBJ *pto); void RemoveProxy3216(THUNK3216OBJ *pto); void DisableCallbacks() { _dwState &= ~CALLBACK_ALLOWED; } }; #endif // ifndef __CTHKMGR_HXX__