267 lines
8 KiB
C++
267 lines
8 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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__
|