|
|
1.1 ! root 1: /* ! 2: Copyright (c) TrueCrypt Foundation. All rights reserved. ! 3: ! 4: Covered by the TrueCrypt License 2.2 the full text of which is contained ! 5: in the file License.txt included in TrueCrypt binary and source code ! 6: distribution packages. ! 7: */ ! 8: ! 9: #include <guiddef.h> ! 10: ! 11: template <class TClass> ! 12: class TrueCryptFactory : public IClassFactory ! 13: { ! 14: ! 15: public: ! 16: TrueCryptFactory (DWORD messageThreadId) : ! 17: RefCount (1), ServerLockCount (0), MessageThreadId (messageThreadId) { } ! 18: ! 19: ~TrueCryptFactory () { } ! 20: ! 21: virtual ULONG STDMETHODCALLTYPE AddRef () ! 22: { ! 23: return InterlockedIncrement (&RefCount) - 1; ! 24: } ! 25: ! 26: virtual ULONG STDMETHODCALLTYPE Release () ! 27: { ! 28: ULONG r = InterlockedDecrement (&RefCount) + 1; ! 29: ! 30: if (r == 0) ! 31: delete this; ! 32: ! 33: return r; ! 34: } ! 35: ! 36: virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void **ppvObject) ! 37: { ! 38: if (riid == IID_IUnknown || riid == IID_IClassFactory) ! 39: *ppvObject = this; ! 40: else ! 41: { ! 42: *ppvObject = NULL; ! 43: return E_NOINTERFACE; ! 44: } ! 45: ! 46: AddRef (); ! 47: return S_OK; ! 48: } ! 49: ! 50: virtual HRESULT STDMETHODCALLTYPE CreateInstance (IUnknown *pUnkOuter, REFIID riid, void **ppvObject) ! 51: { ! 52: if (pUnkOuter != NULL) ! 53: return CLASS_E_NOAGGREGATION; ! 54: ! 55: TClass *tc = new TClass (MessageThreadId); ! 56: if (tc == NULL) ! 57: return E_OUTOFMEMORY; ! 58: ! 59: HRESULT hr = tc->QueryInterface (riid, ppvObject); ! 60: ! 61: if (hr) ! 62: delete tc; ! 63: ! 64: return hr; ! 65: } ! 66: ! 67: virtual HRESULT STDMETHODCALLTYPE LockServer (BOOL fLock) ! 68: { ! 69: if (fLock) ! 70: { ! 71: InterlockedIncrement (&ServerLockCount); ! 72: } ! 73: else ! 74: { ! 75: if (!InterlockedDecrement (&ServerLockCount)) ! 76: PostThreadMessage (MessageThreadId, WM_APP, 0, 0); ! 77: } ! 78: ! 79: return S_OK; ! 80: } ! 81: ! 82: virtual bool IsServerLocked () ! 83: { ! 84: return ServerLockCount > 0; ! 85: } ! 86: ! 87: protected: ! 88: DWORD MessageThreadId; ! 89: LONG RefCount; ! 90: LONG ServerLockCount; ! 91: }; ! 92: ! 93: ! 94: BOOL ComGetInstanceBase (HWND hWnd, REFCLSID clsid, REFIID iid, void **tcServer); ! 95: HRESULT CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.