diff options
Diffstat (limited to 'src/Common/BaseCom.cpp')
-rw-r--r-- | src/Common/BaseCom.cpp | 492 |
1 files changed, 246 insertions, 246 deletions
diff --git a/src/Common/BaseCom.cpp b/src/Common/BaseCom.cpp index 8e7d39ff..f6c55974 100644 --- a/src/Common/BaseCom.cpp +++ b/src/Common/BaseCom.cpp @@ -1,246 +1,246 @@ -/*
- 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 <comutil.h>
-#include <windows.h>
-#include "BaseCom.h"
-#include "BootEncryption.h"
-#include "Dlgcode.h"
-#include "Registry.h"
-
-using namespace VeraCrypt;
-
-HRESULT CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv)
-{
- WCHAR monikerName[1024];
- WCHAR clsid[1024];
- BIND_OPTS3 bo;
-
- StringFromGUID2 (guid, clsid, sizeof (clsid) / 2);
- swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid);
-
- memset (&bo, 0, sizeof (bo));
- bo.cbStruct = sizeof (bo);
- bo.hwnd = hwnd;
- bo.dwClassContext = CLSCTX_LOCAL_SERVER;
-
- // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it
- ProcessPaintMessages (hwnd, 5000);
-
- return CoGetObject (monikerName, &bo, iid, ppv);
-}
-
-
-BOOL ComGetInstanceBase (HWND hWnd, REFCLSID clsid, REFIID iid, void **tcServer)
-{
- BOOL r;
-
- if (IsUacSupported ())
- {
- while (true)
- {
- r = CreateElevatedComObject (hWnd, clsid, iid, tcServer) == S_OK;
- if (r)
- break;
- else
- {
- if (IDRETRY == ErrorRetryCancel ("UAC_INIT_ERROR", hWnd))
- continue;
- else
- break;
- }
- }
- }
- else
- {
- r = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER, iid, tcServer) == S_OK;
- if (!r)
- Error ("UAC_INIT_ERROR", hWnd);
- }
-
- return r;
-}
-
-
-DWORD BaseCom::CallDriver (DWORD ioctl, BSTR input, BSTR *output)
-{
- try
- {
- BootEncryption bootEnc (NULL);
- bootEnc.CallDriver (ioctl,
- (BYTE *) input, !(BYTE *) input ? 0 : ((DWORD *) ((BYTE *) input))[-1],
- (BYTE *) *output, !(BYTE *) *output ? 0 : ((DWORD *) ((BYTE *) *output))[-1]);
- }
- catch (SystemException &)
- {
- return GetLastError();
- }
- catch (Exception &e)
- {
- e.Show (NULL);
- return ERROR_EXCEPTION_IN_SERVICE;
- }
- catch (...)
- {
- return ERROR_EXCEPTION_IN_SERVICE;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::CopyFile (BSTR sourceFile, BSTR destinationFile)
-{
-
- if (!::CopyFileW (sourceFile, destinationFile, FALSE))
- return GetLastError();
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::DeleteFile (BSTR file)
-{
-
- if (!::DeleteFileW (file))
- return GetLastError();
-
- return ERROR_SUCCESS;
-}
-
-
-BOOL BaseCom::IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly)
-{
- return ::IsPagingFileActive (checkNonWindowsPartitionsOnly);
-}
-
-
-DWORD BaseCom::ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone)
-{
- try
- {
- auto_ptr <File> file (device ? new Device (filePath, !write) : new File (filePath, !write));
- file->CheckOpened (SRC_POS);
- file->SeekAt (offset);
-
- if (write)
- {
- file->Write ((BYTE *) *bufferBstr, size);
- *sizeDone = size;
- }
- else
- {
- *sizeDone = file->Read ((BYTE *) *bufferBstr, size);
- }
- }
- catch (SystemException &)
- {
- return GetLastError();
- }
- catch (Exception &e)
- {
- e.Show (NULL);
- return ERROR_EXCEPTION_IN_SERVICE;
- }
- catch (...)
- {
- return ERROR_EXCEPTION_IN_SERVICE;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::RegisterFilterDriver (BOOL registerDriver, int filterType)
-{
- try
- {
- BootEncryption bootEnc (NULL);
- bootEnc.RegisterFilterDriver (registerDriver ? true : false, (BootEncryption::FilterType) filterType);
- }
- catch (SystemException &)
- {
- return GetLastError();
- }
- catch (Exception &e)
- {
- e.Show (NULL);
- return ERROR_EXCEPTION_IN_SERVICE;
- }
- catch (...)
- {
- return ERROR_EXCEPTION_IN_SERVICE;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::RegisterSystemFavoritesService (BOOL registerService)
-{
- try
- {
- BootEncryption bootEnc (NULL);
- bootEnc.RegisterSystemFavoritesService (registerService);
- }
- catch (SystemException &)
- {
- return GetLastError();
- }
- catch (Exception &e)
- {
- e.Show (NULL);
- return ERROR_EXCEPTION_IN_SERVICE;
- }
- catch (...)
- {
- return ERROR_EXCEPTION_IN_SERVICE;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::SetDriverServiceStartType (DWORD startType)
-{
- try
- {
- BootEncryption bootEnc (NULL);
- bootEnc.SetDriverServiceStartType (startType);
- }
- catch (SystemException &)
- {
- return GetLastError();
- }
- catch (Exception &e)
- {
- e.Show (NULL);
- return ERROR_EXCEPTION_IN_SERVICE;
- }
- catch (...)
- {
- return ERROR_EXCEPTION_IN_SERVICE;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD BaseCom::WriteLocalMachineRegistryDwordValue (BSTR keyPath, BSTR valueName, DWORD value)
-{
- if (!::WriteLocalMachineRegistryDword (keyPath, valueName, value))
- return GetLastError();
-
- return ERROR_SUCCESS;
-}
+/* + 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 <comutil.h> +#include <windows.h> +#include "BaseCom.h" +#include "BootEncryption.h" +#include "Dlgcode.h" +#include "Registry.h" + +using namespace VeraCrypt; + +HRESULT CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv) +{ + WCHAR monikerName[1024]; + WCHAR clsid[1024]; + BIND_OPTS3 bo; + + StringFromGUID2 (guid, clsid, sizeof (clsid) / 2); + swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid); + + memset (&bo, 0, sizeof (bo)); + bo.cbStruct = sizeof (bo); + bo.hwnd = hwnd; + bo.dwClassContext = CLSCTX_LOCAL_SERVER; + + // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it + ProcessPaintMessages (hwnd, 5000); + + return CoGetObject (monikerName, &bo, iid, ppv); +} + + +BOOL ComGetInstanceBase (HWND hWnd, REFCLSID clsid, REFIID iid, void **tcServer) +{ + BOOL r; + + if (IsUacSupported ()) + { + while (true) + { + r = CreateElevatedComObject (hWnd, clsid, iid, tcServer) == S_OK; + if (r) + break; + else + { + if (IDRETRY == ErrorRetryCancel ("UAC_INIT_ERROR", hWnd)) + continue; + else + break; + } + } + } + else + { + r = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER, iid, tcServer) == S_OK; + if (!r) + Error ("UAC_INIT_ERROR", hWnd); + } + + return r; +} + + +DWORD BaseCom::CallDriver (DWORD ioctl, BSTR input, BSTR *output) +{ + try + { + BootEncryption bootEnc (NULL); + bootEnc.CallDriver (ioctl, + (BYTE *) input, !(BYTE *) input ? 0 : ((DWORD *) ((BYTE *) input))[-1], + (BYTE *) *output, !(BYTE *) *output ? 0 : ((DWORD *) ((BYTE *) *output))[-1]); + } + catch (SystemException &) + { + return GetLastError(); + } + catch (Exception &e) + { + e.Show (NULL); + return ERROR_EXCEPTION_IN_SERVICE; + } + catch (...) + { + return ERROR_EXCEPTION_IN_SERVICE; + } + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::CopyFile (BSTR sourceFile, BSTR destinationFile) +{ + + if (!::CopyFileW (sourceFile, destinationFile, FALSE)) + return GetLastError(); + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::DeleteFile (BSTR file) +{ + + if (!::DeleteFileW (file)) + return GetLastError(); + + return ERROR_SUCCESS; +} + + +BOOL BaseCom::IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly) +{ + return ::IsPagingFileActive (checkNonWindowsPartitionsOnly); +} + + +DWORD BaseCom::ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone) +{ + try + { + auto_ptr <File> file (device ? new Device (filePath, !write) : new File (filePath, !write)); + file->CheckOpened (SRC_POS); + file->SeekAt (offset); + + if (write) + { + file->Write ((BYTE *) *bufferBstr, size); + *sizeDone = size; + } + else + { + *sizeDone = file->Read ((BYTE *) *bufferBstr, size); + } + } + catch (SystemException &) + { + return GetLastError(); + } + catch (Exception &e) + { + e.Show (NULL); + return ERROR_EXCEPTION_IN_SERVICE; + } + catch (...) + { + return ERROR_EXCEPTION_IN_SERVICE; + } + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::RegisterFilterDriver (BOOL registerDriver, int filterType) +{ + try + { + BootEncryption bootEnc (NULL); + bootEnc.RegisterFilterDriver (registerDriver ? true : false, (BootEncryption::FilterType) filterType); + } + catch (SystemException &) + { + return GetLastError(); + } + catch (Exception &e) + { + e.Show (NULL); + return ERROR_EXCEPTION_IN_SERVICE; + } + catch (...) + { + return ERROR_EXCEPTION_IN_SERVICE; + } + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::RegisterSystemFavoritesService (BOOL registerService) +{ + try + { + BootEncryption bootEnc (NULL); + bootEnc.RegisterSystemFavoritesService (registerService); + } + catch (SystemException &) + { + return GetLastError(); + } + catch (Exception &e) + { + e.Show (NULL); + return ERROR_EXCEPTION_IN_SERVICE; + } + catch (...) + { + return ERROR_EXCEPTION_IN_SERVICE; + } + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::SetDriverServiceStartType (DWORD startType) +{ + try + { + BootEncryption bootEnc (NULL); + bootEnc.SetDriverServiceStartType (startType); + } + catch (SystemException &) + { + return GetLastError(); + } + catch (Exception &e) + { + e.Show (NULL); + return ERROR_EXCEPTION_IN_SERVICE; + } + catch (...) + { + return ERROR_EXCEPTION_IN_SERVICE; + } + + return ERROR_SUCCESS; +} + + +DWORD BaseCom::WriteLocalMachineRegistryDwordValue (BSTR keyPath, BSTR valueName, DWORD value) +{ + if (!::WriteLocalMachineRegistryDword (keyPath, valueName, value)) + return GetLastError(); + + return ERROR_SUCCESS; +} |