/* Legal Notice: Some portions of the source code contained in this file were derived from the source code of Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux and which is governed by the 'License Agreement for Encryption for the Masses'. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2003-2012 TrueCrypt Developers Association and are governed by the TrueCrypt License 3.0 the full text of which is contained in the file License.txt included in VeraCrypt binary and source code distribution packages. */ #include "Tcdefs.h" #include #include #include #include #include #include #include "Apidrvr.h" #include "BootEncryption.h" #include "Boot/Windows/BootCommon.h" #include "Combo.h" #include "ComSetup.h" #include "Dlgcode.h" #include "Language.h" #include "Registry.h" #include "Resource.h" #include "Dir.h" #include "Setup.h" #include "SelfExtract.h" #include "Wizard.h" #include "../Common/Resource.h" using namespace TrueCrypt; #pragma warning( disable : 4201 ) #pragma warning( disable : 4115 ) #include #pragma warning( default : 4201 ) #pragma warning( default : 4115 ) char InstallationPath[TC_MAX_PATH]; char SetupFilesDir[TC_MAX_PATH]; char UninstallBatch[MAX_PATH]; BOOL bUninstall = FALSE; BOOL bRestartRequired = FALSE; BOOL bMakePackage = FALSE; BOOL bDone = FALSE; BOOL Rollback = FALSE; BOOL bUpgrade = FALSE; BOOL bDowngrade = FALSE; BOOL SystemEncryptionUpdate = FALSE; BOOL PortableMode = FALSE; BOOL bRepairMode = FALSE; BOOL bChangeMode = FALSE; BOOL bDevm = FALSE; BOOL bPossiblyFirstTimeInstall = FALSE; BOOL bUninstallInProgress = FALSE; BOOL UnloadDriver = TRUE; BOOL bSystemRestore = TRUE; BOOL bDisableSwapFiles = FALSE; BOOL bForAllUsers = TRUE; BOOL bRegisterFileExt = TRUE; BOOL bAddToStartMenu = TRUE; BOOL bDesktopIcon = TRUE; BOOL bDesktopIconStatusDetermined = FALSE; HMODULE volatile SystemRestoreDll = 0; void localcleanup (void) { localcleanupwiz (); cleanup (); CloseAppSetupMutex (); } BOOL StatDeleteFile (char *lpszFile) { struct __stat64 st; if (_stat64 (lpszFile, &st) == 0) return DeleteFile (lpszFile); else return TRUE; } BOOL StatRemoveDirectory (char *lpszDir) { struct __stat64 st; if (_stat64 (lpszDir, &st) == 0) return RemoveDirectory (lpszDir); else return TRUE; } HRESULT CreateLink (char *lpszPathObj, char *lpszArguments, char *lpszPathLink) { HRESULT hres; IShellLink *psl; /* Get a pointer to the IShellLink interface. */ hres = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl); if (SUCCEEDED (hres)) { IPersistFile *ppf; /* Set the path to the shortcut target, and add the description. */ psl->SetPath (lpszPathObj); psl->SetArguments (lpszArguments); // Application ID if (strstr (lpszPathObj, TC_APP_NAME ".exe")) { IPropertyStore *propStore; if (SUCCEEDED (psl->QueryInterface (IID_PPV_ARGS (&propStore)))) { PROPVARIANT propVariant; if (SUCCEEDED (InitPropVariantFromString (TC_APPLICATION_ID, &propVariant))) { if (SUCCEEDED (propStore->SetValue (PKEY_AppUserModel_ID, propVariant))) propStore->Commit(); PropVariantClear (&propVariant); } propStore->Release(); } } /* Query IShellLink for the IPersistFile interface for saving the shortcut in persistent storage. */ hres = psl->QueryInterface (IID_IPersistFile, (void **) &ppf); if (SUCCEEDED (hres)) { wchar_t wsz[TC_MAX_PATH]; /* Ensure that the string is ANSI. */ MultiByteToWideChar (CP_ACP, 0, lpszPathLink, -1, wsz, sizeof(wsz) / sizeof(wsz[0])); /* Save the link by calling IPersistFile::Save. */ hres = ppf->Save (wsz, TRUE); ppf->Release (); } psl->Release (); } return hres; } void GetProgramPath (HWND hwndDlg, char *path) { ITEMIDLIST *i; HRESULT res; if (bForAllUsers) res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_COMMON_PROGRAMS, &i); else res = SHGetSpecialFolderLocation (hwndDlg, CSIDL_PROGRAMS, &i); SHGetPathFromIDList (i, path); } void StatusMessage (HWND hwndDlg, char *stringId) { if (Rollback) return; SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) GetString (stringId)); SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX, SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0); } void StatusMessageParam (HWND hwndDlg, char *stringId, char *param) { wchar_t szTmp[1024]; if (Rollback) return; wsprintfW (szTmp, L"%s %hs", GetString (stringId), param); SendMessageW (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_ADDSTRING, 0, (LPARAM) szTmp); SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_SETTOPINDEX, SendDlgItemMessage (hwndDlg, IDC_LOG_WINDOW, LB_GETCOUNT, 0, 0) - 1, 0); } void ClearLogWindow (HWND hwndDlg) { SendMessage (GetDlgItem (hwndDlg, IDC_LOG_WINDOW), LB_RESETCONTENT, 0, 0); } void RegMessage (HWND hwndDlg, char *txt) { StatusMessageParam (hwndDlg, "ADDING_REG", txt); } void CopyMessage (HWND hwndDlg, char *txt) { StatusMessageParam (hwndDlg, "INSTALLING", txt); } void RemoveMessage (HWND hwndDlg, char *txt) { if (!Rollback) StatusMessageParam (hwndDlg, "REMOVING", txt); } void IconMessage (HWND hwndDlg, char *txt) { StatusMessageParam (hwndDlg, "ADDING_ICON", txt); } void DetermineUpgradeDowngradeStatus (BOOL bCloseDriverHandle, LONG *driverVersionPtr) { LONG driverVersion = VERSION_NUM; if (hDriver == INVALID_HANDLE_VALUE) DriverAttach(); if (hDriver != INVALID_HANDLE_VALUE) { DWORD dwResult; BOOL bResult = DeviceIoControl (hDriver, TC_IOCTL_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL); if (!bResult) bResult = DeviceIoControl (hDriver, TC_IOCTL_LEGACY_GET_DRIVER_VERSION, NULL, 0, &driverVersion, sizeof (driverVersion), &dwResult, NULL); bUpgrade = (bResult && driverVersion < VERSION_NUM); bDowngrade = (bResult && driverVersion > VERSION_NUM); PortableMode = DeviceIoControl (hDriver, TC_IOCTL_GET_PORTABLE_MODE_STATUS, NULL, 0, NULL, 0, &dwResult, NULL); if (bCloseDriverHandle) { CloseHandle (hDriver); hDriver = INVALID_HANDLE_VALUE; } } *driverVersionPtr = driverVersion; } static BOOL IsFileInUse (const string &filePath) { HANDLE useTestHandle = CreateFile (filePath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (useTestHandle != INVALID_HANDLE_VALUE) CloseHandle (useTestHandle); else if (GetLastError() == ERROR_SHARING_VIOLATION) return TRUE; return FALSE; } BOOL DoFilesInstall (HWND hwndDlg, char *szDestDir) { /* WARNING: Note that, despite its name, this function is used during UNinstallation as well. */ char szTmp[TC_MAX_PATH]; BOOL bOK = TRUE; int i, x, fileNo; char curFileName [TC_MAX_PATH] = {0}; if (!bUninstall && !bDevm) { // Self-extract all files to memory GetModuleFileName (NULL, szTmp, sizeof (szTmp)); if (!SelfExtractInMemory (szTmp)) return FALSE; } x = strlen (szDestDir); if (x < 2) return FALSE; if (szDestDir[x - 1] != '\\') strcat (szDestDir, "\\"); for (i = 0; i < sizeof (szFiles) / sizeof (szFiles[0]); i++) { BOOL bResult; char szDir[TC_MAX_PATH]; if (strstr (szFiles[i], "VeraCrypt Setup") != 0) { if (bUninstall) continue; // Prevent 'access denied' error if (bRepairMode) continue; // Destination = target } if (*szFiles[i] == 'A') strcpy (szDir, szDestDir); else if (*szFiles[i] == 'D') { GetSystemDirectory (szDir, sizeof (szDir)); x = strlen (szDir); if (szDir[x - 1] != '\\') strcat (szDir, "\\"); strcat (szDir, "Drivers\\"); } else if (*szFiles[i] == 'W') GetWindowsDirectory (szDir, sizeof (szDir)); if (*szFiles[i] == 'I') continue; sprintf (szTmp, "%s%s", szDir, szFiles[i] + 1); if (bUninstall == FALSE) CopyMessage (hwndDlg, szTmp); else RemoveMessage (hwndDlg, szTmp); if (bUninstall == FALSE) { SetCurrentDirectory (SetupFilesDir); if (strstr (szFiles[i], "VeraCrypt Setup") != 0) { // Copy ourselves (the distribution package) to the destination location as 'VeraCrypt Setup.exe' char mp[MAX_PATH]; GetModuleFileName (NULL, mp, sizeof (mp)); bResult = TCCopyFile (mp, szTmp); } else { BOOL driver64 = FALSE; strncpy (curFileName, szFiles[i] + 1, strlen (szFiles[i]) - 1); curFileName [strlen (szFiles[i]) - 1] = 0; if (Is64BitOs () && strcmp (szFiles[i], "Dveracrypt.sys") == 0) { driver64 = TRUE; strncpy (curFileName, FILENAME_64BIT_DRIVER, sizeof (FILENAME_64BIT_DRIVER)); } if (!bDevm) { bResult = FALSE; // Find the correct decompressed file in memory for (fileNo = 0; fileNo < NBR_COMPRESSED_FILES; fileNo++) { // Write the file (stored in memory) directly t
/*
  zip_source_zip_new.c -- prepare data structures for zip_fopen/zip_source_zip
  Copyright (C) 2012-2017 Dieter Baron and Thomas Klausner

  This file is part of libzip, a library to manipulate ZIP archives.
  The authors can be contacted at <libzip@nih.at>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.
  3. The names of the authors may not be used to endorse or promote
     products derived from this software without specific prior
     written permission.

  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


#include <stdlib.h>

#include "zipint.h"


zip_source_t *
_zip_source_zip_new(zip_t *za, zip_t *srcza, zip_uint64_t srcidx, zip_flags_t flags, zip_uint64_t start, zip_uint64_t len, const char *password) {
    zip_source_t *src, *s2;
    struct zip_stat st;
    bool partial_data, needs_crc, needs_decrypt, needs_decompress;

    if (za == NULL)
	return NULL;

    if (srcza == NULL || srcidx >= srcza->nentry) {
	zip_error_set(&za->error, ZIP_ER_INVAL, 0);
	return NULL;
    }

    if ((flags & ZIP_FL_UNCHANGED) == 0 && (ZIP_ENTRY_DATA_CHANGED(srcza->entry + srcidx) || srcza->entry[srcidx].deleted)) {
	zip_error_set(&za->error, ZIP_ER_CHANGED, 0);
	return NULL;
    }

    if (zip_stat_index(srcza, srcidx, flags | ZIP_FL_UNCHANGED, &st) < 0) {
	zip_error_set(&za->error, ZIP_ER_INTERNAL, 0);
	return NULL;
    }

    if (flags & ZIP_FL_ENCRYPTED)
	flags |= ZIP_FL_COMPRESSED;

    if ((start > 0 || len > 0) && (flags & ZIP_FL_COMPRESSED)) {
	zip_error_set(&za->error, ZIP_ER_INVAL, 0);
	return NULL;
    }

    /* overflow or past end of file */
    if ((start > 0 || len > 0) && (start + len < start || start + len > st.size)) {
	zip_error_set(&za->error, ZIP_ER_INVAL, 0);
	return NULL;
    }

    if (len == 0) {
	len = st.size - start;
    }

    partial_data = len < st.size;
    needs_decrypt = ((flags & ZIP_FL_ENCRYPTED) == 0) && (st.encryption_method != ZIP_EM_NONE);
    needs_decompress = ((flags & ZIP_FL_COMPRESSED) == 0) && (st.comp_method != ZIP_CM_STORE);
    /* when reading the whole file, check for CRC errors */
    needs_crc = ((flags & ZIP_FL_COMPRESSED) == 0 || st.comp_method == ZIP_CM_STORE) && !partial_data;

    if (needs_decrypt) {
	if (password == NULL) {
	    password = za->default_password;
	}
	if (password == NULL) {
	    zip_error_set(&za->error, ZIP_ER_NOPASSWD, 0);
	    return NULL;
	}
    }

    if (st.comp_size == 0) {
	return zip_source_buffer(za, NULL, 0, 0);
    }

    if (partial_data && !needs_decrypt && !needs_decompress) {
	struct zip_stat st2;

	st2.size = len;
	st2.comp_size = len;
	st2.comp_method = ZIP_CM_STORE;
	st2.mtime = st.mtime;
	st2.valid = ZIP_STAT_SIZE | ZIP_STAT_COMP_SIZE | ZIP_STAT_COMP_METHOD | ZIP_STAT_MTIME;

	if ((src = _zip_source_window_new(srcza->src, start, len, &st2, 0, srcza, srcidx, &za->error)) == NULL) {
	    return NULL;
	}
    }
    else {
	zip_dirent_t *de;

	if ((de = _zip_get_dirent(srcza, srcidx, flags, &za->error)) == NULL) {
	    return NULL;
	}
	if ((src = _zip_source_window_new(srcza->src, 0, st.comp_size, &st, (de->bitflags >> 1) & 3, srcza, srcidx, &za->error)) == NULL) {
	    return NULL;
	}
    }

    if (_zip_source_set_source_archive(src, srcza) < 0) {
	zip_source_free(src);
	return NULL;
    }

    /* creating a layered source calls zip_keep() on the lower layer, so we free it */

    if (needs_decrypt) {
	zip_encryption_implementation enc_impl;

	if ((enc_impl = _zip_get_encryption_implementation(st.encryption_method, ZIP_CODEC_DECODE)) == NULL) {
	    zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 0);
	    return NULL;
	}

	s2 = enc_impl(za, src, st.encryption_method, 0, password);
	zip_source_free(src);
	if (s2 == NULL) {
	    return NULL;
	}
	src = s2;
    }
    if (needs_decompress) {
	s2 = zip_source_decompress(za, src, st.comp_method);
	zip_source_free(src);
	if (s2 == NULL) {
	    return NULL;
	}
	src = s2;
    }
    if (needs_crc) {
	s2 = zip_source_crc(za, src, 1);
	zip_source_free(src);
	if (s2 == NULL) {
	    return NULL;
	}
	src = s2;
    }

    if (partial_data && (needs_decrypt || needs_decompress)) {
	s2 = zip_source_window(za, src, start, len);
	zip_source_free(src);
	if (s2 == NULL) {
	    return NULL;
	}
	src = s2;
    }

    return src;
}
(12); if (bSystemRestore) SetSystemRestorePoint (hwndDlg, FALSE); UpdateProgressBarProc(48); if (bDisableSwapFiles && IsPagingFileActive (FALSE)) { if (!DisablePagingFile()) { handleWin32Error (hwndDlg); Error ("FAILED_TO_DISABLE_PAGING_FILES"); } else bRestartRequired = TRUE; } UpdateProgressBarProc(50); // Remove deprecated DoServiceUninstall (hwndDlg, "VeraCryptService"); UpdateProgressBarProc(55); if (!SystemEncryptionUpdate) DoRegUninstall ((HWND) hwndDlg, TRUE); UpdateProgressBarProc(61); GetWindowsDirectory (path, sizeof (path)); strcat_s (path, sizeof (path), "\\VeraCrypt Setup.exe"); DeleteFile (path); if (UpdateProgressBarProc(63) && UnloadDriver && DoServiceUninstall (hwndDlg, "veracrypt") == FALSE) { bOK = FALSE; } else if (UpdateProgressBarProc(72) && DoFilesInstall ((HWND) hwndDlg, InstallationPath) == FALSE) { bOK = FALSE; } else if (UpdateProgressBarProc(80) && DoRegInstall ((HWND) hwndDlg, InstallationPath, bRegisterFileExt) == FALSE) { bOK = FALSE; } else if (UpdateProgressBarProc(85) && UnloadDriver && DoDriverInstall (hwndDlg) == FALSE) { bOK = FALSE; } else if (UpdateProgressBarProc(90) && SystemEncryptionUpdate && UpgradeBootLoader (hwndDlg) == FALSE) { bOK = FALSE; } else if (UpdateProgressBarProc(93) && DoShortcutsInstall (hwndDlg, InstallationPath, bAddToStartMenu, bDesktopIcon) == FALSE) { bOK = FALSE; } if (!UnloadDriver) bRestartRequired = TRUE; try { bootEnc.RenameDeprecatedSystemLoaderBackup(); } catch (...) { } if (bOK) UpdateProgressBarProc(97); if (bSystemRestore) SetSystemRestorePoint (hwndDlg, TRUE); if (bOK) { UpdateProgressBarProc(100); UninstallBatch[0] = 0; StatusMessage (hwndDlg, "INSTALL_COMPLETED"); } else { UpdateProgressBarProc(0); if (!SystemEncryptionUpdate) { bUninstall = TRUE; Rollback = TRUE; Silent = TRUE; DoUninstall (hwndDlg); bUninstall = FALSE; Rollback = FALSE; Silent = FALSE; StatusMessage (hwndDlg, "ROLLBACK"); } else { Warning ("SYS_ENC_UPGRADE_FAILED"); } } outcome: OutcomePrompt (hwndDlg, bOK); if (bOK && !bUninstall && !bDowngrade && !bRepairMode && !bDevm) { if (!IsHiddenOSRunning()) // A hidden OS user should not see the post-install notes twice (on decoy OS and then on hidden OS). { if (bRestartRequired || SystemEncryptionUpdate) { // Restart required if (bUpgrade) { SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_RELEASE_NOTES); } else if (bPossiblyFirstTimeInstall) { SavePostInstallTasksSettings (TC_POST_INSTALL_CFG_TUTORIAL); } } else { // No restart will be required if (bUpgrade) { bPromptReleaseNotes = TRUE; } else if (bPossiblyFirstTimeInstall) { bPromptTutorial = TRUE; } } } } PostMessage (MainDlg, bOK ? TC_APPMSG_INSTALL_SUCCESS : TC_APPMSG_INSTALL_FAILURE, 0, 0); } void SetInstallationPath (HWND hwndDlg) { HKEY hkey; BOOL bInstallPathDetermined = FALSE; char path[MAX_PATH+20]; ITEMIDLIST *itemList; memset (InstallationPath, 0, sizeof (InstallationPath)); // Determine if VeraCrypt is already installed and try to determine its "Program Files" location if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt", 0, KEY_READ, &hkey) == ERROR_SUCCESS) { /* Default 'UninstallString' registry strings written by past versions of VeraCrypt: ------------------------------------------------------------------------------------ 1.0 C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 1.0a C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 2.0 C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 2.1 C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 2.1a C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 3.0 C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 3.0a C:\WINDOWS\VeraCrypt Setup.exe /u [optional] 3.1 The UninstallString was NEVER written (fortunately, 3.1a replaced 3.1 after 2 weeks) 3.1a C:\WINDOWS\VeraCrypt Setup.exe /u 4.0 C:\WINDOWS\VeraCrypt Setup.exe /u C:\Program Files\VeraCrypt 4.1 C:\WINDOWS\VeraCrypt Setup.exe /u C:\Program Files\VeraCrypt 4.2 C:\WINDOWS\VeraCrypt Setup.exe /u C:\Program Files\VeraCrypt 4.2a C:\WINDOWS\VeraCrypt Setup.exe /u C:\Program Files\VeraCrypt 4.3 "C:\Program Files\VeraCrypt\VeraCrypt Setup.exe" /u C:\Program Files\VeraCrypt\ 4.3a "C:\Program Files\VeraCrypt\VeraCrypt Setup.exe" /u C:\Program Files\VeraCrypt\ 5.0+ "C:\Program Files\VeraCrypt\VeraCrypt Setup.exe" /u Note: In versions 1.0-3.0a the user was able to choose whether to install the uninstaller. The default was to install it. If it wasn't installed, there was no UninstallString. */ char rv[MAX_PATH*4]; DWORD size = sizeof (rv); if (RegQueryValueEx (hkey, "UninstallString", 0, 0, (LPBYTE) &rv, &size) == ERROR_SUCCESS && strrchr (rv, '/')) { size_t len = 0; // Cut and paste the location (path) where VeraCrypt is installed to InstallationPath if (rv[0] == '"') { // 4.3 or later len = strrchr (rv, '/') - rv - 2; strncpy (InstallationPath, rv + 1, len); InstallationPath [len] = 0; bInstallPathDetermined = TRUE; if (InstallationPath [strlen (InstallationPath) - 1] != '\\') { len = strrchr (InstallationPath, '\\') - InstallationPath; InstallationPath [len] = 0; } } else { // 1.0-4.2a (except 3.1) len = strrchr (rv, '/') - rv; if (rv[len+2] == ' ') { // 4.0-4.2a strncpy (InstallationPath, rv + len + 3, strlen (rv) - len - 3); InstallationPath [strlen (rv) - len - 3] = 0; bInstallPathDetermined = TRUE; } else { // 1.0-3.1a (except 3.1) // We know that VeraCrypt is installed but don't know where. It's not safe to continue installing // over the old version. Error ("UNINSTALL_OLD_VERSION_FIRST"); len = strrchr (rv, '/') - rv - 1; strncpy (InstallationPath, rv, len); // Path and filename of the uninstaller InstallationPath [len] = 0; bInstallPathDetermined = FALSE; ShellExecute (NULL, "open", InstallationPath, "/u", NULL, SW_SHOWNORMAL); RegCloseKey (hkey); exit (1); } } } RegCloseKey (hkey); } if (bInstallPathDetermined) { char mp[MAX_PATH]; // Determine whether we were launched from the folder where VeraCrypt is installed GetModuleFileName (NULL, mp, sizeof (mp)); if (strncmp (InstallationPath, mp, min (strlen(InstallationPath), strlen(mp))) == 0) { // We were launched from the folder where VeraCrypt is installed if (!IsNonInstallMode() && !bDevm) bChangeMode = TRUE; } } else { /* TrueCypt is not installed or it wasn't possible to determine where it is installed. */ // Default "Program Files" path. SHGetSpecialFolderLocation (hwndDlg, CSIDL_PROGRAM_FILES, &itemList); SHGetPathFromIDList (itemList, path); if (Is64BitOs()) { // Use a unified default installation path (registry redirection of %ProgramFiles% does not work if the installation path is user-selectable) string s = path; size_t p = s.find (" (x86)"); if (p != string::npos) { s = s.substr (0, p); if (_access (s.c_str(), 0) != -1) strcpy_s (path, sizeof (path), s.c_str()); } } strncat (path, "\\VeraCrypt\\", min (strlen("\\VeraCrypt\\"), sizeof(path)-strlen(path)-1)); strncpy (InstallationPath, path, sizeof(InstallationPath)-1); } // Make sure the path ends with a backslash if (InstallationPath [strlen (InstallationPath) - 1] != '\\') { strcat (InstallationPath, "\\"); } } // Handler for uninstall only (install is handled by the wizard) BOOL CALLBACK UninstallDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WORD lw = LOWORD (wParam); switch (msg) { case WM_INITDIALOG: MainDlg = hwndDlg; if (!CreateAppSetupMutex ()) AbortProcess ("TC_INSTALLER_IS_RUNNING"); InitDialog (hwndDlg); LocalizeDialog (hwndDlg, NULL); SetWindowTextW (hwndDlg, lpszTitle); // System Restore SetCheckBox (hwndDlg, IDC_SYSTEM_RESTORE, bSystemRestore); if (SystemRestoreDll == 0) { SetCheckBox (hwndDlg, IDC_SYSTEM_RESTORE, FALSE); EnableWindow (GetDlgItem (hwndDlg, IDC_SYSTEM_RESTORE), FALSE); } SetFocus (GetDlgItem (hwndDlg, IDC_UNINSTALL)); return 1; case WM_SYSCOMMAND: if (lw == IDC_ABOUT) { DialogBoxW (hInst, MAKEINTRESOURCEW (IDD_ABOUT_DLG), hwndDlg, (DLGPROC) AboutDlgProc); return 1; } return 0; case WM_COMMAND: if (lw == IDC_UNINSTALL) { if (bDone) { bUninstallInProgress = FALSE; PostMessage (hwndDlg, WM_CLOSE, 0, 0); return 1; } bUninstallInProgress = TRUE; WaitCursor (); if (bUninstall) _beginthread (DoUninstall, 0, (void *) hwndDlg); return 1; } if (lw == IDC_SYSTEM_RESTORE) { bSystemRestore = IsButtonChecked (GetDlgItem (hwndDlg, IDC_SYSTEM_RESTORE)); return 1; } if (lw == IDCANCEL) { PostMessage (hwndDlg, WM_CLOSE, 0, 0); return 1; } return 0; case TC_APPMSG_UNINSTALL_SUCCESS: SetWindowTextW (GetDlgItem ((HWND) hwndDlg, IDC_UNINSTALL), GetString ("FINALIZE")); NormalCursor (); return 1; case WM_CLOSE: if (bUninstallInProgress) { NormalCursor(); if (AskNoYes("CONFIRM_EXIT_UNIVERSAL") == IDNO) { return 1; } WaitCursor (); } EndDialog (hwndDlg, IDCANCEL); return 1; } return 0; } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, char *lpszCommandLine, int nCmdShow) { atexit (localcleanup); SelfExtractStartupInit(); lpszTitle = L"VeraCrypt Setup"; InitCommonControls (); /* Call InitApp to initialize the common code */ InitApp (hInstance, NULL); if (IsAdmin () != TRUE) if (MessageBoxW (NULL, GetString ("SETUP_ADMIN"), lpszTitle, MB_YESNO | MB_ICONQUESTION) != IDYES) { exit (1); } /* Setup directory */ { char *s; GetModuleFileName (NULL, SetupFilesDir, sizeof (SetupFilesDir)); s = strrchr (SetupFilesDir, '\\'); if (s) s[1] = 0; } /* Parse command line arguments */ if (lpszCommandLine[0] == '/') { if (lpszCommandLine[1] == 'u') { // Uninstall: /u bUninstall = TRUE; } else if (lpszCommandLine[1] == 'c') { // Change: /c bChangeMode = TRUE; } else if (lpszCommandLine[1] == 'p') { // Create self-extracting package: /p bMakePackage = TRUE; } else if (lpszCommandLine[1] == 'd') { // Dev mode: /d bDevm = TRUE; } } if (bMakePackage) { /* Create self-extracting package */ MakeSelfExtractingPackage (NULL, SetupFilesDir); } else { SetInstallationPath (NULL); if (!bUninstall) { if (IsSelfExtractingPackage()) { if (!VerifyPackageIntegrity()) { // Package corrupted exit (1); } bDevm = FALSE; } else if (!bDevm) { MessageBox (NULL, "Error: This installer file does not contain any compressed files.\n\nTo create a self-extracting installation package (with embedded compressed files), run:\n\"VeraCrypt Setup.exe\" /p", "VeraCrypt", MB_ICONERROR | MB_SETFOREGROUND | MB_TOPMOST); exit (1); } if (bChangeMode) { /* VeraCrypt is already installed on this system and we were launched from the Program Files folder */ char *tmpStr[] = {0, "SELECT_AN_ACTION", "REPAIR_REINSTALL", "UNINSTALL", "EXIT", 0}; // Ask the user to select either Repair or Unistallation switch (AskMultiChoice ((void **) tmpStr, FALSE)) { case 1: bRepairMode = TRUE; break; case 2: bUninstall = TRUE; break; default: exit (1); } } } // System Restore SystemRestoreDll = LoadLibrary ("srclient.dll"); if (!bUninstall) { /* Create the main dialog for install */ DialogBoxParamW (hInstance, MAKEINTRESOURCEW (IDD_INSTL_DLG), NULL, (DLGPROC) MainDialogProc, (LPARAM)lpszCommandLine); } else { /* Create the main dialog for uninstall */ DialogBoxW (hInstance, MAKEINTRESOURCEW (IDD_UNINSTALL), NULL, (DLGPROC) UninstallDlgProc); if (UninstallBatch[0]) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory (&si, sizeof (si)); si.cb = sizeof (si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; if (!CreateProcess (UninstallBatch, NULL, NULL, NULL, FALSE, IDLE_PRIORITY_CLASS, NULL, NULL, &si, &pi)) DeleteFile (UninstallBatch); else { CloseHandle (pi.hProcess); CloseHandle (pi.hThread); } } } } return 0; }