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