|
|
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 <atlcomcli.h> ! 10: #include <atlconv.h> ! 11: #include <strsafe.h> ! 12: #include <windows.h> ! 13: #include "BaseCom.h" ! 14: #include "Dlgcode.h" ! 15: #include "MainCom.h" ! 16: #include "MainCom_h.h" ! 17: #include "MainCom_i.c" ! 18: #include "Password.h" ! 19: ! 20: static volatile LONG ObjectCount = 0; ! 21: ! 22: class TrueCrypt : public ITrueCrypt ! 23: { ! 24: ! 25: public: ! 26: TrueCrypt (DWORD messageThreadId) : RefCount (0), MessageThreadId (messageThreadId) ! 27: { ! 28: InterlockedIncrement (&ObjectCount); ! 29: } ! 30: ! 31: ~TrueCrypt () ! 32: { ! 33: if (InterlockedDecrement (&ObjectCount) == 0) ! 34: PostThreadMessage (MessageThreadId, WM_APP, 0, 0); ! 35: } ! 36: ! 37: virtual ULONG STDMETHODCALLTYPE AddRef () ! 38: { ! 39: return InterlockedIncrement (&RefCount); ! 40: } ! 41: ! 42: virtual ULONG STDMETHODCALLTYPE Release () ! 43: { ! 44: if (!InterlockedDecrement (&RefCount)) ! 45: { ! 46: delete this; ! 47: return 0; ! 48: } ! 49: ! 50: return RefCount; ! 51: } ! 52: ! 53: virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void **ppvObject) ! 54: { ! 55: if (riid == IID_IUnknown || riid == IID_ITrueCrypt) ! 56: *ppvObject = this; ! 57: else ! 58: { ! 59: *ppvObject = NULL; ! 60: return E_NOINTERFACE; ! 61: } ! 62: ! 63: AddRef (); ! 64: return S_OK; ! 65: } ! 66: ! 67: virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume) ! 68: { ! 69: USES_CONVERSION; ! 70: return ::BackupVolumeHeader ((HWND) hwndDlg, bRequireConfirmation, CW2A (lpszVolume)); ! 71: } ! 72: ! 73: virtual int STDMETHODCALLTYPE RestoreVolumeHeader (LONG_PTR hwndDlg, BSTR lpszVolume) ! 74: { ! 75: USES_CONVERSION; ! 76: return ::RestoreVolumeHeader ((HWND) hwndDlg, CW2A (lpszVolume)); ! 77: } ! 78: ! 79: virtual int STDMETHODCALLTYPE ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, LONG_PTR hWnd) ! 80: { ! 81: USES_CONVERSION; ! 82: return ::ChangePwd (CW2A (volumePath), oldPassword, newPassword, pkcs5, (HWND) hWnd); ! 83: } ! 84: ! 85: protected: ! 86: DWORD MessageThreadId; ! 87: LONG RefCount; ! 88: }; ! 89: ! 90: ! 91: extern "C" BOOL ComServerMain () ! 92: { ! 93: TrueCryptFactory<TrueCrypt> factory (GetCurrentThreadId ()); ! 94: DWORD cookie; ! 95: ! 96: if (IsUacSupported ()) ! 97: UacElevated = TRUE; ! 98: ! 99: if (CoRegisterClassObject (CLSID_TrueCrypt, (LPUNKNOWN) &factory, ! 100: CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &cookie) != S_OK) ! 101: return FALSE; ! 102: ! 103: MSG msg; ! 104: while (GetMessage (&msg, NULL, 0, 0)) ! 105: { ! 106: TranslateMessage (&msg); ! 107: DispatchMessage (&msg); ! 108: ! 109: if (msg.message == WM_APP ! 110: && ObjectCount < 1 ! 111: && !factory.IsServerLocked ()) ! 112: break; ! 113: } ! 114: CoRevokeClassObject (cookie); ! 115: ! 116: return TRUE; ! 117: } ! 118: ! 119: ! 120: static BOOL ComGetInstance (HWND hWnd, ITrueCrypt **tcServer) ! 121: { ! 122: return ComGetInstanceBase (hWnd, CLSID_TrueCrypt, IID_ITrueCrypt, (void **) tcServer); ! 123: } ! 124: ! 125: ! 126: extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume) ! 127: { ! 128: CComPtr<ITrueCrypt> tc; ! 129: int r; ! 130: ! 131: CoInitialize (NULL); ! 132: ! 133: if (ComGetInstance (hwndDlg, &tc)) ! 134: r = tc->BackupVolumeHeader ((LONG_PTR) hwndDlg, bRequireConfirmation, CComBSTR (lpszVolume)); ! 135: else ! 136: r = -1; ! 137: ! 138: CoUninitialize (); ! 139: ! 140: return r; ! 141: } ! 142: ! 143: ! 144: extern "C" int UacRestoreVolumeHeader (HWND hwndDlg, char *lpszVolume) ! 145: { ! 146: CComPtr<ITrueCrypt> tc; ! 147: int r; ! 148: ! 149: CoInitialize (NULL); ! 150: ! 151: if (ComGetInstance (hwndDlg, &tc)) ! 152: r = tc->RestoreVolumeHeader ((LONG_PTR) hwndDlg, CComBSTR (lpszVolume)); ! 153: else ! 154: r = -1; ! 155: ! 156: CoUninitialize (); ! 157: ! 158: return r; ! 159: } ! 160: ! 161: ! 162: extern "C" int UacChangePwd (char *lpszVolume, Password *oldPassword, Password *newPassword, int pkcs5, HWND hwndDlg) ! 163: { ! 164: CComPtr<ITrueCrypt> tc; ! 165: int r; ! 166: ! 167: if (ComGetInstance (hwndDlg, &tc)) ! 168: { ! 169: WaitCursor (); ! 170: r = tc->ChangePassword (CComBSTR (lpszVolume), oldPassword, newPassword, 0, (LONG_PTR) hwndDlg); ! 171: NormalCursor (); ! 172: } ! 173: else ! 174: r = -1; ! 175: ! 176: return r; ! 177: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.