|
|
1.1 root 1: /*
2: Copyright (c) TrueCrypt Foundation. All rights reserved.
3:
1.1.1.2 ! root 4: Covered by the TrueCrypt License 2.3 the full text of which is contained
1.1 root 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.