|
|
1.1 root 1: /*
1.1.1.6 root 2: Copyright (c) 2007-2009 TrueCrypt Foundation. All rights reserved.
1.1 root 3:
1.1.1.7 ! root 4: Governed by the TrueCrypt License 2.7 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 <atlcomcli.h>
10: #include <atlconv.h>
11: #include <windows.h>
12: #include "BaseCom.h"
1.1.1.3 root 13: #include "BootEncryption.h"
1.1 root 14: #include "Dlgcode.h"
15: #include "MainCom.h"
16: #include "MainCom_h.h"
17: #include "MainCom_i.c"
1.1.1.4 root 18: #include "Mount.h"
1.1 root 19: #include "Password.h"
20:
1.1.1.3 root 21: using namespace TrueCrypt;
22:
1.1 root 23: static volatile LONG ObjectCount = 0;
24:
1.1.1.3 root 25: class TrueCryptMainCom : public ITrueCryptMainCom
1.1 root 26: {
27:
28: public:
1.1.1.3 root 29: TrueCryptMainCom (DWORD messageThreadId) : RefCount (0), MessageThreadId (messageThreadId)
1.1 root 30: {
31: InterlockedIncrement (&ObjectCount);
32: }
33:
1.1.1.3 root 34: ~TrueCryptMainCom ()
1.1 root 35: {
36: if (InterlockedDecrement (&ObjectCount) == 0)
37: PostThreadMessage (MessageThreadId, WM_APP, 0, 0);
38: }
39:
40: virtual ULONG STDMETHODCALLTYPE AddRef ()
41: {
42: return InterlockedIncrement (&RefCount);
43: }
44:
45: virtual ULONG STDMETHODCALLTYPE Release ()
46: {
47: if (!InterlockedDecrement (&RefCount))
48: {
49: delete this;
50: return 0;
51: }
52:
53: return RefCount;
54: }
55:
56: virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void **ppvObject)
57: {
1.1.1.3 root 58: if (riid == IID_IUnknown || riid == IID_ITrueCryptMainCom)
1.1 root 59: *ppvObject = this;
60: else
61: {
62: *ppvObject = NULL;
63: return E_NOINTERFACE;
64: }
65:
66: AddRef ();
67: return S_OK;
68: }
69:
70: virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume)
71: {
72: USES_CONVERSION;
1.1.1.4 root 73: MainDlg = (HWND) hwndDlg;
1.1 root 74: return ::BackupVolumeHeader ((HWND) hwndDlg, bRequireConfirmation, CW2A (lpszVolume));
75: }
76:
77: virtual int STDMETHODCALLTYPE RestoreVolumeHeader (LONG_PTR hwndDlg, BSTR lpszVolume)
78: {
79: USES_CONVERSION;
1.1.1.4 root 80: MainDlg = (HWND) hwndDlg;
1.1 root 81: return ::RestoreVolumeHeader ((HWND) hwndDlg, CW2A (lpszVolume));
82: }
83:
1.1.1.3 root 84: virtual DWORD STDMETHODCALLTYPE CallDriver (DWORD ioctl, BSTR input, BSTR *output)
85: {
86: return BaseCom::CallDriver (ioctl, input, output);
87: }
88:
1.1 root 89: virtual int STDMETHODCALLTYPE ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, LONG_PTR hWnd)
90: {
91: USES_CONVERSION;
1.1.1.4 root 92: MainDlg = (HWND) hWnd;
1.1 root 93: return ::ChangePwd (CW2A (volumePath), oldPassword, newPassword, pkcs5, (HWND) hWnd);
94: }
1.1.1.4 root 95:
1.1.1.5 root 96: virtual BOOL STDMETHODCALLTYPE IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly)
1.1.1.4 root 97: {
1.1.1.5 root 98: return BaseCom::IsPagingFileActive (checkNonWindowsPartitionsOnly);
1.1.1.4 root 99: }
1.1 root 100:
1.1.1.3 root 101: virtual DWORD STDMETHODCALLTYPE ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone)
102: {
103: return BaseCom::ReadWriteFile (write, device, filePath, bufferBstr, offset, size, sizeDone);
104: }
105:
1.1.1.4 root 106: virtual DWORD STDMETHODCALLTYPE RegisterFilterDriver (BOOL registerDriver, BOOL volumeClass)
1.1.1.3 root 107: {
1.1.1.4 root 108: return BaseCom::RegisterFilterDriver (registerDriver, volumeClass);
1.1.1.3 root 109: }
110:
111: virtual DWORD STDMETHODCALLTYPE SetDriverServiceStartType (DWORD startType)
112: {
113: return BaseCom::SetDriverServiceStartType (startType);
114: }
115:
1.1.1.4 root 116: virtual DWORD STDMETHODCALLTYPE WriteLocalMachineRegistryDwordValue (BSTR keyPath, BSTR valueName, DWORD value)
117: {
118: return BaseCom::WriteLocalMachineRegistryDwordValue (keyPath, valueName, value);
119: }
120:
1.1 root 121: protected:
122: DWORD MessageThreadId;
123: LONG RefCount;
124: };
125:
126:
127: extern "C" BOOL ComServerMain ()
128: {
1.1.1.5 root 129: SetProcessShutdownParameters (0x100, 0);
130:
1.1.1.3 root 131: TrueCryptFactory<TrueCryptMainCom> factory (GetCurrentThreadId ());
1.1 root 132: DWORD cookie;
133:
134: if (IsUacSupported ())
135: UacElevated = TRUE;
136:
1.1.1.3 root 137: if (CoRegisterClassObject (CLSID_TrueCryptMainCom, (LPUNKNOWN) &factory,
1.1 root 138: CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &cookie) != S_OK)
139: return FALSE;
140:
141: MSG msg;
1.1.1.2 root 142: while (int r = GetMessage (&msg, NULL, 0, 0))
1.1 root 143: {
1.1.1.2 root 144: if (r == -1)
145: return FALSE;
146:
1.1 root 147: TranslateMessage (&msg);
148: DispatchMessage (&msg);
149:
150: if (msg.message == WM_APP
151: && ObjectCount < 1
152: && !factory.IsServerLocked ())
153: break;
154: }
155: CoRevokeClassObject (cookie);
156:
157: return TRUE;
158: }
159:
160:
1.1.1.3 root 161: static BOOL ComGetInstance (HWND hWnd, ITrueCryptMainCom **tcServer)
1.1 root 162: {
1.1.1.3 root 163: return ComGetInstanceBase (hWnd, CLSID_TrueCryptMainCom, IID_ITrueCryptMainCom, (void **) tcServer);
164: }
165:
166:
167: ITrueCryptMainCom *GetElevatedInstance (HWND parent)
168: {
169: ITrueCryptMainCom *instance;
170:
171: if (!ComGetInstance (parent, &instance))
172: throw UserAbort (SRC_POS);
173:
174: return instance;
1.1 root 175: }
176:
177:
178: extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume)
179: {
1.1.1.3 root 180: CComPtr<ITrueCryptMainCom> tc;
1.1 root 181: int r;
182:
183: CoInitialize (NULL);
184:
185: if (ComGetInstance (hwndDlg, &tc))
186: r = tc->BackupVolumeHeader ((LONG_PTR) hwndDlg, bRequireConfirmation, CComBSTR (lpszVolume));
187: else
188: r = -1;
189:
190: CoUninitialize ();
191:
192: return r;
193: }
194:
195:
196: extern "C" int UacRestoreVolumeHeader (HWND hwndDlg, char *lpszVolume)
197: {
1.1.1.3 root 198: CComPtr<ITrueCryptMainCom> tc;
1.1 root 199: int r;
200:
201: CoInitialize (NULL);
202:
203: if (ComGetInstance (hwndDlg, &tc))
204: r = tc->RestoreVolumeHeader ((LONG_PTR) hwndDlg, CComBSTR (lpszVolume));
205: else
206: r = -1;
207:
208: CoUninitialize ();
209:
210: return r;
211: }
212:
213:
214: extern "C" int UacChangePwd (char *lpszVolume, Password *oldPassword, Password *newPassword, int pkcs5, HWND hwndDlg)
215: {
1.1.1.3 root 216: CComPtr<ITrueCryptMainCom> tc;
1.1 root 217: int r;
218:
219: if (ComGetInstance (hwndDlg, &tc))
220: {
221: WaitCursor ();
1.1.1.6 root 222: r = tc->ChangePassword (CComBSTR (lpszVolume), oldPassword, newPassword, pkcs5, (LONG_PTR) hwndDlg);
1.1 root 223: NormalCursor ();
224: }
225: else
226: r = -1;
227:
228: return r;
229: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.