Annotation of truecrypt/mount/maincom.cpp, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.