VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Mount/MainCom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mount/MainCom.cpp')
-rw-r--r--src/Mount/MainCom.cpp588
1 files changed, 294 insertions, 294 deletions
diff --git a/src/Mount/MainCom.cpp b/src/Mount/MainCom.cpp
index 738b243..6955897 100644
--- a/src/Mount/MainCom.cpp
+++ b/src/Mount/MainCom.cpp
@@ -1,294 +1,294 @@
-/*
- Derived from source code of TrueCrypt 7.1a, which is
- Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
- by the TrueCrypt License 3.0.
-
- Modifications and additions to the original source code (contained in this file)
- and all other portions of this file are Copyright (c) 2013-2016 IDRIX
- and are governed by the Apache License 2.0 the full text of which is
- contained in the file License.txt included in VeraCrypt binary and source
- code distribution packages.
-*/
-
-#include <atlcomcli.h>
-#include <atlconv.h>
-#include <windows.h>
-#include "BaseCom.h"
-#include "BootEncryption.h"
-#include "Dlgcode.h"
-#include "MainCom.h"
-#include "MainCom_h.h"
-#include "MainCom_i.c"
-#include "Mount.h"
-#include "Password.h"
-
-using namespace VeraCrypt;
-
-static volatile LONG ObjectCount = 0;
-
-class TrueCryptMainCom : public ITrueCryptMainCom
-{
-
-public:
- TrueCryptMainCom (DWORD messageThreadId) : RefCount (0), MessageThreadId (messageThreadId)
- {
- InterlockedIncrement (&ObjectCount);
- }
-
- virtual ~TrueCryptMainCom ()
- {
- if (InterlockedDecrement (&ObjectCount) == 0)
- PostThreadMessage (MessageThreadId, WM_APP, 0, 0);
- }
-
- virtual ULONG STDMETHODCALLTYPE AddRef ()
- {
- return InterlockedIncrement (&RefCount);
- }
-
- virtual ULONG STDMETHODCALLTYPE Release ()
- {
- if (!InterlockedDecrement (&RefCount))
- {
- delete this;
- return 0;
- }
-
- return RefCount;
- }
-
- virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void **ppvObject)
- {
- if (riid == IID_IUnknown || riid == IID_ITrueCryptMainCom)
- *ppvObject = this;
- else
- {
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
-
- AddRef ();
- return S_OK;
- }
-
- virtual void STDMETHODCALLTYPE AnalyzeKernelMiniDump (LONG_PTR hwndDlg)
- {
- // Do nothing
- MainDlg = (HWND) hwndDlg;
- }
-
- virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume)
- {
- MainDlg = (HWND) hwndDlg;
- return ::BackupVolumeHeader ((HWND) hwndDlg, bRequireConfirmation, lpszVolume);
- }
-
- virtual int STDMETHODCALLTYPE RestoreVolumeHeader (LONG_PTR hwndDlg, BSTR lpszVolume)
- {
- MainDlg = (HWND) hwndDlg;
- return ::RestoreVolumeHeader ((HWND) hwndDlg, lpszVolume);
- }
-
- virtual DWORD STDMETHODCALLTYPE CallDriver (DWORD ioctl, BSTR input, BSTR *output)
- {
- return BaseCom::CallDriver (ioctl, input, output);
- }
-
- virtual int STDMETHODCALLTYPE ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
- {
- MainDlg = (HWND) hWnd;
- return ::ChangePwd (volumePath, oldPassword, 0, 0, FALSE, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
- }
-
- virtual DWORD STDMETHODCALLTYPE CopyFile (BSTR sourceFile, BSTR destinationFile)
- {
- return BaseCom::CopyFile (sourceFile, destinationFile);
- }
-
- virtual DWORD STDMETHODCALLTYPE DeleteFile (BSTR file)
- {
- return BaseCom::DeleteFile (file);
- }
-
- virtual BOOL STDMETHODCALLTYPE IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly)
- {
- return BaseCom::IsPagingFileActive (checkNonWindowsPartitionsOnly);
- }
-
- virtual DWORD STDMETHODCALLTYPE ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone)
- {
- return BaseCom::ReadWriteFile (write, device, filePath, bufferBstr, offset, size, sizeDone);
- }
-
- virtual DWORD STDMETHODCALLTYPE RegisterFilterDriver (BOOL registerDriver, int filterType)
- {
- return BaseCom::RegisterFilterDriver (registerDriver, filterType);
- }
-
- virtual DWORD STDMETHODCALLTYPE RegisterSystemFavoritesService (BOOL registerService)
- {
- return BaseCom::RegisterSystemFavoritesService (registerService);
- }
-
- virtual DWORD STDMETHODCALLTYPE SetDriverServiceStartType (DWORD startType)
- {
- return BaseCom::SetDriverServiceStartType (startType);
- }
-
- virtual DWORD STDMETHODCALLTYPE WriteLocalMachineRegistryDwordValue (BSTR keyPath, BSTR valueName, DWORD value)
- {
- return BaseCom::WriteLocalMachineRegistryDwordValue (keyPath, valueName, value);
- }
-
- virtual int STDMETHODCALLTYPE ChangePasswordEx (BSTR volumePath, Password *oldPassword, int old_pkcs5, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
- {
- MainDlg = (HWND) hWnd;
- return ::ChangePwd (volumePath, oldPassword, old_pkcs5, 0, FALSE, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
- }
-
- virtual int STDMETHODCALLTYPE ChangePasswordEx2 (BSTR volumePath, Password *oldPassword, int old_pkcs5, BOOL truecryptMode, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
- {
- MainDlg = (HWND) hWnd;
- return ::ChangePwd (volumePath, oldPassword, old_pkcs5, 0, truecryptMode, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
- }
-
- virtual int STDMETHODCALLTYPE ChangePasswordEx3 (BSTR volumePath, Password *oldPassword, int old_pkcs5, int old_pim, BOOL truecryptMode, Password *newPassword, int pkcs5, int pim, int wipePassCount, LONG_PTR hWnd)
- {
- MainDlg = (HWND) hWnd;
- return ::ChangePwd (volumePath, oldPassword, old_pkcs5, old_pim, truecryptMode, newPassword, pkcs5, pim, wipePassCount, (HWND) hWnd);
- }
-
-protected:
- DWORD MessageThreadId;
- LONG RefCount;
-};
-
-
-extern "C" BOOL ComServerMain ()
-{
- SetProcessShutdownParameters (0x100, 0);
-
- TrueCryptFactory<TrueCryptMainCom> factory (GetCurrentThreadId ());
- DWORD cookie;
-
- if (IsUacSupported ())
- UacElevated = TRUE;
-
- if (CoRegisterClassObject (CLSID_TrueCryptMainCom, (LPUNKNOWN) &factory,
- CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &cookie) != S_OK)
- return FALSE;
-
- MSG msg;
- while (int r = GetMessageW (&msg, NULL, 0, 0))
- {
- if (r == -1)
- return FALSE;
-
- TranslateMessage (&msg);
- DispatchMessageW (&msg);
-
- if (msg.message == WM_APP
- && ObjectCount < 1
- && !factory.IsServerLocked ())
- break;
- }
- CoRevokeClassObject (cookie);
-
- return TRUE;
-}
-
-
-static BOOL ComGetInstance (HWND hWnd, ITrueCryptMainCom **tcServer)
-{
- return ComGetInstanceBase (hWnd, CLSID_TrueCryptMainCom, IID_ITrueCryptMainCom, (void **) tcServer);
-}
-
-
-ITrueCryptMainCom *GetElevatedInstance (HWND parent)
-{
- ITrueCryptMainCom *instance;
-
- if (!ComGetInstance (parent, &instance))
- throw UserAbort (SRC_POS);
-
- return instance;
-}
-
-
-extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, wchar_t *lpszVolume)
-{
- CComPtr<ITrueCryptMainCom> tc;
- int r;
-
- CoInitialize (NULL);
-
- if (ComGetInstance (hwndDlg, &tc))
- {
- CComBSTR volumeBstr;
- BSTR bstr = W2BSTR(lpszVolume);
- if (bstr)
- {
- volumeBstr.Attach (bstr);
- r = tc->BackupVolumeHeader ((LONG_PTR) hwndDlg, bRequireConfirmation, volumeBstr);
- }
- else
- r = ERR_OUTOFMEMORY;
- }
- else
- r = -1;
-
- CoUninitialize ();
-
- return r;
-}
-
-
-extern "C" int UacRestoreVolumeHeader (HWND hwndDlg, wchar_t *lpszVolume)
-{
- CComPtr<ITrueCryptMainCom> tc;
- int r;
-
- CoInitialize (NULL);
-
- if (ComGetInstance (hwndDlg, &tc))
- {
- CComBSTR volumeBstr;
- BSTR bstr = W2BSTR(lpszVolume);
- if (bstr)
- {
- volumeBstr.Attach (bstr);
- r = tc->RestoreVolumeHeader ((LONG_PTR) hwndDlg, volumeBstr);
- }
- else
- r = ERR_OUTOFMEMORY;
- }
- else
- r = -1;
-
- CoUninitialize ();
-
- return r;
-}
-
-
-extern "C" int UacChangePwd (wchar_t *lpszVolume, Password *oldPassword, int old_pkcs5, int old_pim, BOOL truecryptMode, Password *newPassword, int pkcs5, int pim, int wipePassCount, HWND hwndDlg)
-{
- CComPtr<ITrueCryptMainCom> tc;
- int r;
-
- CoInitialize (NULL);
-
- if (ComGetInstance (hwndDlg, &tc))
- {
- CComBSTR bstrVolume (lpszVolume);
- WaitCursor ();
- r = tc->ChangePasswordEx3 (bstrVolume, oldPassword, old_pkcs5, old_pim, truecryptMode, newPassword, pkcs5, pim, wipePassCount, (LONG_PTR) hwndDlg);
- NormalCursor ();
- }
- else
- r = -1;
-
- CoUninitialize ();
-
- return r;
-}
+/*
+ Derived from source code of TrueCrypt 7.1a, which is
+ Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
+ by the TrueCrypt License 3.0.
+
+ Modifications and additions to the original source code (contained in this file)
+ and all other portions of this file are Copyright (c) 2013-2016 IDRIX
+ and are governed by the Apache License 2.0 the full text of which is
+ contained in the file License.txt included in VeraCrypt binary and source
+ code distribution packages.
+*/
+
+#include <atlcomcli.h>
+#include <atlconv.h>
+#include <windows.h>
+#include "BaseCom.h"
+#include "BootEncryption.h"
+#include "Dlgcode.h"
+#include "MainCom.h"
+#include "MainCom_h.h"
+#include "MainCom_i.c"
+#include "Mount.h"
+#include "Password.h"
+
+using namespace VeraCrypt;
+
+static volatile LONG ObjectCount = 0;
+
+class TrueCryptMainCom : public ITrueCryptMainCom
+{
+
+public:
+ TrueCryptMainCom (DWORD messageThreadId) : RefCount (0), MessageThreadId (messageThreadId)
+ {
+ InterlockedIncrement (&ObjectCount);
+ }
+
+ virtual ~TrueCryptMainCom ()
+ {
+ if (InterlockedDecrement (&ObjectCount) == 0)
+ PostThreadMessage (MessageThreadId, WM_APP, 0, 0);
+ }
+
+ virtual ULONG STDMETHODCALLTYPE AddRef ()
+ {
+ return InterlockedIncrement (&RefCount);
+ }
+
+ virtual ULONG STDMETHODCALLTYPE Release ()
+ {
+ if (!InterlockedDecrement (&RefCount))
+ {
+ delete this;
+ return 0;
+ }
+
+ return RefCount;
+ }
+
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface (REFIID riid, void **ppvObject)
+ {
+ if (riid == IID_IUnknown || riid == IID_ITrueCryptMainCom)
+ *ppvObject = this;
+ else
+ {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+
+ AddRef ();
+ return S_OK;
+ }
+
+ virtual void STDMETHODCALLTYPE AnalyzeKernelMiniDump (LONG_PTR hwndDlg)
+ {
+ // Do nothing
+ MainDlg = (HWND) hwndDlg;
+ }
+
+ virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume)
+ {
+ MainDlg = (HWND) hwndDlg;
+ return ::BackupVolumeHeader ((HWND) hwndDlg, bRequireConfirmation, lpszVolume);
+ }
+
+ virtual int STDMETHODCALLTYPE RestoreVolumeHeader (LONG_PTR hwndDlg, BSTR lpszVolume)
+ {
+ MainDlg = (HWND) hwndDlg;
+ return ::RestoreVolumeHeader ((HWND) hwndDlg, lpszVolume);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE CallDriver (DWORD ioctl, BSTR input, BSTR *output)
+ {
+ return BaseCom::CallDriver (ioctl, input, output);
+ }
+
+ virtual int STDMETHODCALLTYPE ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
+ {
+ MainDlg = (HWND) hWnd;
+ return ::ChangePwd (volumePath, oldPassword, 0, 0, FALSE, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE CopyFile (BSTR sourceFile, BSTR destinationFile)
+ {
+ return BaseCom::CopyFile (sourceFile, destinationFile);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE DeleteFile (BSTR file)
+ {
+ return BaseCom::DeleteFile (file);
+ }
+
+ virtual BOOL STDMETHODCALLTYPE IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly)
+ {
+ return BaseCom::IsPagingFileActive (checkNonWindowsPartitionsOnly);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone)
+ {
+ return BaseCom::ReadWriteFile (write, device, filePath, bufferBstr, offset, size, sizeDone);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE RegisterFilterDriver (BOOL registerDriver, int filterType)
+ {
+ return BaseCom::RegisterFilterDriver (registerDriver, filterType);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE RegisterSystemFavoritesService (BOOL registerService)
+ {
+ return BaseCom::RegisterSystemFavoritesService (registerService);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE SetDriverServiceStartType (DWORD startType)
+ {
+ return BaseCom::SetDriverServiceStartType (startType);
+ }
+
+ virtual DWORD STDMETHODCALLTYPE WriteLocalMachineRegistryDwordValue (BSTR keyPath, BSTR valueName, DWORD value)
+ {
+ return BaseCom::WriteLocalMachineRegistryDwordValue (keyPath, valueName, value);
+ }
+
+ virtual int STDMETHODCALLTYPE ChangePasswordEx (BSTR volumePath, Password *oldPassword, int old_pkcs5, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
+ {
+ MainDlg = (HWND) hWnd;
+ return ::ChangePwd (volumePath, oldPassword, old_pkcs5, 0, FALSE, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
+ }
+
+ virtual int STDMETHODCALLTYPE ChangePasswordEx2 (BSTR volumePath, Password *oldPassword, int old_pkcs5, BOOL truecryptMode, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd)
+ {
+ MainDlg = (HWND) hWnd;
+ return ::ChangePwd (volumePath, oldPassword, old_pkcs5, 0, truecryptMode, newPassword, pkcs5, 0, wipePassCount, (HWND) hWnd);
+ }
+
+ virtual int STDMETHODCALLTYPE ChangePasswordEx3 (BSTR volumePath, Password *oldPassword, int old_pkcs5, int old_pim, BOOL truecryptMode, Password *newPassword, int pkcs5, int pim, int wipePassCount, LONG_PTR hWnd)
+ {
+ MainDlg = (HWND) hWnd;
+ return ::ChangePwd (volumePath, oldPassword, old_pkcs5, old_pim, truecryptMode, newPassword, pkcs5, pim, wipePassCount, (HWND) hWnd);
+ }
+
+protected:
+ DWORD MessageThreadId;
+ LONG RefCount;
+};
+
+
+extern "C" BOOL ComServerMain ()
+{
+ SetProcessShutdownParameters (0x100, 0);
+
+ TrueCryptFactory<TrueCryptMainCom> factory (GetCurrentThreadId ());
+ DWORD cookie;
+
+ if (IsUacSupported ())
+ UacElevated = TRUE;
+
+ if (CoRegisterClassObject (CLSID_TrueCryptMainCom, (LPUNKNOWN) &factory,
+ CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &cookie) != S_OK)
+ return FALSE;
+
+ MSG msg;
+ while (int r = GetMessageW (&msg, NULL, 0, 0))
+ {
+ if (r == -1)
+ return FALSE;
+
+ TranslateMessage (&msg);
+ DispatchMessageW (&msg);
+
+ if (msg.message == WM_APP
+ && ObjectCount < 1
+ && !factory.IsServerLocked ())
+ break;
+ }
+ CoRevokeClassObject (cookie);
+
+ return TRUE;
+}
+
+
+static BOOL ComGetInstance (HWND hWnd, ITrueCryptMainCom **tcServer)
+{
+ return ComGetInstanceBase (hWnd, CLSID_TrueCryptMainCom, IID_ITrueCryptMainCom, (void **) tcServer);
+}
+
+
+ITrueCryptMainCom *GetElevatedInstance (HWND parent)
+{
+ ITrueCryptMainCom *instance;
+
+ if (!ComGetInstance (parent, &instance))
+ throw UserAbort (SRC_POS);
+
+ return instance;
+}
+
+
+extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, wchar_t *lpszVolume)
+{
+ CComPtr<ITrueCryptMainCom> tc;
+ int r;
+
+ CoInitialize (NULL);
+
+ if (ComGetInstance (hwndDlg, &tc))
+ {
+ CComBSTR volumeBstr;
+ BSTR bstr = W2BSTR(lpszVolume);
+ if (bstr)
+ {
+ volumeBstr.Attach (bstr);
+ r = tc->BackupVolumeHeader ((LONG_PTR) hwndDlg, bRequireConfirmation, volumeBstr);
+ }
+ else
+ r = ERR_OUTOFMEMORY;
+ }
+ else
+ r = -1;
+
+ CoUninitialize ();
+
+ return r;
+}
+
+
+extern "C" int UacRestoreVolumeHeader (HWND hwndDlg, wchar_t *lpszVolume)
+{
+ CComPtr<ITrueCryptMainCom> tc;
+ int r;
+
+ CoInitialize (NULL);
+
+ if (ComGetInstance (hwndDlg, &tc))
+ {
+ CComBSTR volumeBstr;
+ BSTR bstr = W2BSTR(lpszVolume);
+ if (bstr)
+ {
+ volumeBstr.Attach (bstr);
+ r = tc->RestoreVolumeHeader ((LONG_PTR) hwndDlg, volumeBstr);
+ }
+ else
+ r = ERR_OUTOFMEMORY;
+ }
+ else
+ r = -1;
+
+ CoUninitialize ();
+
+ return r;
+}
+
+
+extern "C" int UacChangePwd (wchar_t *lpszVolume, Password *oldPassword, int old_pkcs5, int old_pim, BOOL truecryptMode, Password *newPassword, int pkcs5, int pim, int wipePassCount, HWND hwndDlg)
+{
+ CComPtr<ITrueCryptMainCom> tc;
+ int r;
+
+ CoInitialize (NULL);
+
+ if (ComGetInstance (hwndDlg, &tc))
+ {
+ CComBSTR bstrVolume (lpszVolume);
+ WaitCursor ();
+ r = tc->ChangePasswordEx3 (bstrVolume, oldPassword, old_pkcs5, old_pim, truecryptMode, newPassword, pkcs5, pim, wipePassCount, (LONG_PTR) hwndDlg);
+ NormalCursor ();
+ }
+ else
+ r = -1;
+
+ CoUninitialize ();
+
+ return r;
+}