/* Legal Notice: Some portions of the source code contained in this file were derived from the source code of TrueCrypt 7.1a, which is Copyright (c) 2003-2012 TrueCrypt Developers Association and which is governed by the TrueCrypt License 3.0, also 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) 2013-2017 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"Tcdefs.h"#include<SrRestorePtApi.h>#include<io.h>#include<propkey.h>#include<propvarutil.h>#include<sys/types.h>#include<sys/stat.h>#include<tchar.h>#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"usingnamespaceVeraCrypt;#pragma warning( disable : 4201 )#pragma warning( disable : 4115 )#include<shlobj.h>#pragma warning( default : 4201 )#pragma warning( default : 4115 )#include<Strsafe.h>wchar_tInstallationPath[TC_MAX_PATH];wchar_tSetupFilesDir[TC_MAX_PATH];wchar_tUninstallBatch[MAX_PATH];BOOLbUninstall=FALSE;BOOLbRestartRequired=FALSE;BOOLbMakePackage=FALSE;BOOLbDone=FALSE;BOOLRollback=FALSE;BOOLbUpgrade=FALSE;BOOLbDowngrade=FALSE;BOOLSystemEncryptionUpdate=FALSE;BOOLPortableMode=FALSE;BOOLbRepairMode=FALSE;BOOLbReinstallMode=FALSE;BOOLbChangeMode=FALSE;BOOLbDevm=FALSE;BOOLbPossiblyFirstTimeInstall=FALSE;BOOLbUninstallInProgress=FALSE;BOOLUnloadDriver=TRUE;BOOLbSystemRestore=TRUE;BOOLbDisableSwapFiles=FALSE;BOOLbForAllUsers=TRUE;BOOLbRegisterFileExt=TRUE;BOOLbAddToStartMenu=TRUE;BOOLbDesktopIcon=TRUE;BOOLbDesktopIconStatusDetermined=FALSE;HMODULEvolatileSystemRestoreDll=0;voidlocalcleanup(void){localcleanupwiz();cleanup();CloseAppSetupMutex();}BOOLForceDeleteFile(LPCWSTRszFileName){if(!DeleteFile(szFileName)){/* delete the renamed file when the machine reboots */returnMoveFileEx(szFileName,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);}elsereturnTRUE;}BOOLStatDeleteFile(wchar_t*lpszFile,BOOLbCheckForOldFile){struct__stat64st;if(bCheckForOldFile){wchar_tszOldPath[MAX_PATH+1];StringCbCopyW(szOldPath,sizeof(szOldPath),lpszFile);StringCbCatW(szOldPath,sizeof(szOldPath),VC_FILENAME_RENAMED_SUFFIX);if(_wstat64(szOldPath,&st)==0){ForceDeleteFile(szOldPath);}}if(_wstat64(lpszFile,&st)==0)returnForceDeleteFile(lpszFile);elsereturnTRUE;}BOOLStatRemoveDirectory(wchar_t*lpszDir){struct__stat64st;if(_wstat64(lpszDir,&st)==0){returnDeleteDirectory(lpszDir);}elsereturnTRUE;}/* Recursively set the given OWNER security descriptor to the key and its subkeys */staticvoidRecursiveSetOwner(HKEYhKey,PSECURITY_DESCRIPTORpSD){LSTATUSstatus=0;DWORDdwIndex=0,dwMaxNameLen=0,dwNameLen=0,numberSubKeys=0;HKEYhSubKey;if((ERROR_SUCCESS==status)&&(ERROR_SUCCESS==RegQueryInfoKey(hKey,NULL,NULL,NULL,&numberSubKeys,&dwMaxNameLen,NULL,NULL,NULL,NULL,NULL,NULL))&&(numberSubKeys>=1)){dwMaxNameLen++;wchar_t*szNameValue=newwchar_t[dwMaxNameLen];while(true){dwNameLen=dwMaxNameLen;status=RegEnumKeyExW(hKey,dwIndex++,szNameValue,&dwNameLen,NULL,NULL,NULL,NULL);if(status==ERROR_SUCCESS){status=RegOpenKeyExW(hKey,szNameValue,0,WRITE_OWNER|KEY_READ,&hSubKey);if(ERROR_SUCCESS==status){RecursiveSetOwner(hSubKey,pSD);RegCloseKey(hSubKey);}}elsebreak;}delete[]szNameValue;}RegSetKeySecurity(hKey,OWNER_SECURITY_INFORMATION,pSD);}/* Recursively set the given DACL security descriptor to the key and its subkeys */staticvoidRecursiveSetDACL(HKEYhKey,constwchar_t*SubKeyName,PSECURITY_DESCRIPTORpSD){HKEYhSubKey;DWORDdwIndex=0,dwMaxNameLen=0,dwNameLen=0,numberSubKeys=0;LSTATUSstatus=RegOpenKeyExW(hKey,SubKeyName,0,WRITE_DAC|KEY_READ/*| ACCESS_SYSTEM_SECURITY*/,&hSubKey);if(status==ERROR_SUCCESS){status=RegSetKeySecurity(hSubKey,DACL_SECURITY_INFORMATION,pSD);if(status==ERROR_SUCCESS){RegCloseKey(hSubKey);status=RegOpenKeyExW(hKey,SubKeyName,0,WRITE_DAC|KEY_READ,&hSubKey);}if((ERROR_SUCCESS==status)&&(ERROR_SUCCESS==RegQueryInfoKeyW(hSubKey,NULL,NULL,NULL,&numberSubKeys,&dwMaxNameLen,NULL,NULL,NULL,NULL,NULL,NULL))&&(numberSubKeys>=1)){dwMaxNameLen++;wchar_t*szNameValue=newwchar_t[dwMaxNameLen];while(true){dwNameLen=dwMaxNameLen;status=RegEnumKeyExW(hSubKey,dwIndex++,szNameValue,&dwNameLen,NULL,NULL,NULL,NULL);if(status==ERROR_SUCCESS){RecursiveSetDACL(hSubKey,szNameValue,pSD);}elsebreak;}delete[]szNameValue;}}}/* Correct the key permissions to allow its deletion */staticvoidAllowKeyAccess(HKEYKey,constwchar_t*SubKeyName){LSTATUSRegResult;HKEYSvcKey=NULL;DWORDdwLength=0;HANDLEToken=NULL;PTOKEN_USERpTokenUser=NULL;std::stringsNewSD;RegResult=RegOpenKeyExW(Key,SubKeyName,0,WRITE_OWNER|KEY_READ,&SvcKey);if(RegResult==ERROR_SUCCESS){if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY,&Token)){if(!GetTokenInformation(Token,TokenUser,pTokenUser,0,&dwLength)){if(GetLastError()==ERROR_INSUFFICIENT_BUFFER){pTokenUser=(PTOKEN_USER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwLength);if(pTokenUser){if(GetTokenInformation(Token,TokenUser,pTokenUser,dwLength,&dwLength)){SECURITY_DESCRIPTORSecDesc;if(InitializeSecurityDescriptor(&SecDesc,SECURITY_DESCRIPTOR_REVISION)&&SetSecurityDescriptorDacl(&SecDesc,TRUE,NULL,FALSE)// NULL DACL: full access to everyone&&SetSecurityDescriptorOwner(&SecDesc,pTokenUser->User.Sid,FALSE)){RecursiveSetOwner(SvcKey,&SecDesc);}}}}}}RegCloseKey(SvcKey);}if(pTokenUser){PSIDpSid=pTokenUser->User.Sid;DWORDdwAclSize=sizeof(ACL)+sizeof(ACCESS_ALLOWED_ACE)+::GetLengthSid(pSid)-sizeof(DWORD);PACLpDacl=(PACL)newBYTE[dwAclSize];if(pDacl){if(TRUE==::InitializeAcl(pDacl,dwAclSize,ACL_REVISION)){if(TRUE==AddAccessAllowedAceEx(pDacl,ACL_REVISION,CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE,WRITE_DAC|KEY_ALL_ACCESS,pSid)){SECURITY_DESCRIPTORSecDesc;if(TRUE==::InitializeSecurityDescriptor(&SecDesc,SECURITY_DESCRIPTOR_REVISION)){if(TRUE==::SetSecurityDescriptorDacl(&SecDesc,TRUE,pDacl,FALSE)){RecursiveSetDACL(Key,SubKeyName,&SecDesc);}}}}delete[]pDacl;}}if(pTokenUser)HeapFree(GetProcessHeap(),0,pTokenUser);if(Token)CloseHandle(Token);}voidSearchAndDeleteRegistrySubString(HKEYhKey,constwchar_t*subKey,constwchar_t*str,BOOLbEnumSubKeys,constwchar_t*enumMatchSubStr){HKEYhSubKey=0;LSTATUSstatus=0;DWORDdwIndex=0,dwType,dwValueNameLen,dwDataLen;std::list<std::wstring>subKeysList;size_tsubStringLength=str?wcslen(str):0;if(bEnumSubKeys){DWORDdwMaxNameLen=0;if(ERROR_SUCCESS==RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,&dwMaxNameLen,NULL,NULL,NULL,NULL,NULL,NULL)){dwMaxNameLen++;wchar_t*szNameValue=newwchar_t[dwMaxNameLen];dwIndex=0;while(true){dwValueNameLen=dwMaxNameLen;status=RegEnumKeyExW(hKey,dwIndex++,szNameValue,&dwValueNameLen,NULL,NULL,NULL,NULL);if(status==ERROR_SUCCESS){if(enumMatchSubStr&&!wcsstr(szNameValue,enumMatchSubStr))continue;std::wstringentryName=szNameValue;entryName+=L"\\";entryName+=subKey;entryName+=L"\\";subKeysList.push_back(entryName);}elsebreak;}delete[]szNameValue;}}else{subKeysList.push_back(subKey);}for(std::list<std::wstring>::iteratorItSubKey=subKeysList.begin();ItSubKey!=subKeysList.end();ItSubKey++){// if the string to search for is empty, delete the sub key, otherwise, look for matching value and delete themif(subStringLength==0){if(ERROR_ACCESS_DENIED==DeleteRegistryKey(hKey,ItSubKey->c_str())){// grant permission to deleteAllowKeyAccess(hKey,ItSubKey->c_str());// try againDeleteRegistryKey(hKey,ItSubKey->c_str());}}else{if(RegOpenKeyExW(hKey,ItSubKey->c_str(),0,KEY_ALL_ACCESS,&hSubKey)==ERROR_SUCCESS){DWORDdwMaxNameLen=0,dwMaxDataLen=0;if(ERROR_SUCCESS==RegQueryInfoKey(hSubKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&dwMaxNameLen,&dwMaxDataLen,NULL,NULL)){dwMaxNameLen++;wchar_t*szNameValue=newwchar_t[dwMaxNameLen];LPBYTEpbData=newBYTE[dwMaxDataLen];std::list<std::wstring>foundEntries;dwIndex=0;do{dwValueNameLen=dwMaxNameLen;dwDataLen=dwMaxDataLen;status=RegEnumValueW(hSubKey,dwIndex++,szNameValue,&dwValueNameLen,NULL,&dwType,pbData,&dwDataLen);if(status==ERROR_SUCCESS){if((wcslen(szNameValue)>=subStringLength&&wcsstr(szNameValue,str))||(dwType==REG_SZ&&wcslen((wchar_t*)pbData)>=subStringLength&&wcsstr((wchar_t*)pbData,str))){foundEntries.push_back(szNameValue);}}}while((status==ERROR_SUCCESS)||(status==ERROR_MORE_DATA));// we ignore ERROR_MORE_DATA errors since// we are sure to use the correct sizes// delete the entriesif(!foundEntries.empty()){for(std::list<std::wstring>::iteratorIt=foundEntries.begin();It!=foundEntries.end();It++){RegDeleteValueW(hSubKey,It->c_str());}}delete[]szNameValue;delete[]pbData;}RegCloseKey(hSubKey);}}}}/* Set the given privilege of the current process */BOOLSetPrivilege(LPTSTRszPrivilegeName,BOOLbEnable){TOKEN_PRIVILEGEStp;LUIDluid;HANDLEhProcessToken;BOOLbStatus=FALSE;if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hProcessToken)){if(LookupPrivilegeValue(NULL,szPrivilegeName,&luid)){tp.PrivilegeCount=1;tp.Privileges[0].Luid=luid;tp.Privileges[0].Attributes=bEnable?SE_PRIVILEGE_ENABLED:SE_PRIVILEGE_REMOVED;// Enable the privilegebStatus=AdjustTokenPrivileges(hProcessToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL);}CloseHandle(hProcessToken);}returnbStatus;}/* * Creates a VT_LPWSTR propvariant. * we use our own implementation to use SHStrDupW function pointer * that we retreive ourselves to avoid dll hijacking attacks */inlineHRESULTVCInitPropVariantFromString(__inPCWSTRpsz,__outPROPVARIANT*ppropvar){ppropvar->vt=VT_LPWSTR;HRESULThr=VCStrDupW(psz,&ppropvar->pwszVal);if(FAILED(hr)){PropVariantInit(ppropvar);}returnhr;}HRESULTCreateLink(wchar_t*lpszPathObj,wchar_t*lpszArguments,wchar_t*lpszPathLink,constwchar_t*iconFile,inticonIndex){HRESULThres;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);if(iconFile){psl->SetIconLocation(iconFile,iconIndex);}// Application IDif(_tcsstr(lpszPathObj,_T(TC_APP_NAME)_T(".exe"))){IPropertyStore*propStore;if(SUCCEEDED(psl->QueryInterface(IID_PPV_ARGS(&propStore)))){PROPVARIANTpropVariant;if(SUCCEEDED(VCInitPropVariantFromString(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)){/* Save the link by calling IPersistFile::Save. */hres=ppf->Save(lpszPathLink,TRUE);ppf->Release();}psl->Release();}returnhres;}BOOLIsSystemRestoreEnabled(){BOOLbEnabled=FALSE;HKEYhKey;DWORDdwValue=0,cbValue=sizeof(DWORD);wchar_tszRegPath[MAX_PATH];GetRestorePointRegKeyName(szRegPath,sizeof(szRegPath));if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,szRegPath,0,KEY_READ|KEY_WOW64_64KEY,&hKey)==ERROR_SUCCESS){if(IsOSAtLeast(WIN_VISTA)){if((ERROR_SUCCESS==RegQueryValueEx(hKey,L"RPSessionInterval",NULL,NULL,(LPBYTE)&dwValue,&cbValue))&&(dwValue==1)){bEnabled=TRUE;}}else{if((ERROR_SUCCESS==RegQueryValueEx(hKey,L"DisableSR",NULL,NULL,(LPBYTE)&dwValue,&cbValue))&&(dwValue==0)){bEnabled=TRUE;}}RegCloseKey(hKey);}returnbEnabled;}voidGetProgramPath(HWNDhwndDlg,wchar_t*path){ITEMIDLIST*i;HRESULTres;if(bForAllUsers)res=SHGetSpecialFolderLocation(hwndDlg,CSIDL_COMMON_PROGRAMS,&i);elseres=SHGetSpecialFolderLocation(hwndDlg,CSIDL_PROGRAMS,&i);SHGetPathFromIDList(i,path);}voidStatusMessage(HWNDhwndDlg,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);}voidStatusMessageParam(HWNDhwndDlg,char*stringId,constwchar_t*param){wchar_tszTmp[1024];if(Rollback)return;StringCbPrintfW(szTmp,sizeof(szTmp),L"%s %s",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);}voidClearLogWindow(HWNDhwndDlg){SendMessage(GetDlgItem(hwndDlg,IDC_LOG_WINDOW),LB_RESETCONTENT,0,0);}voidRegMessage(HWNDhwndDlg,constwchar_t*txt){StatusMessageParam(hwndDlg,"ADDING_REG",txt);}void_cdeclCopyMessage(HWNDhwndDlg,constwchar_t*txt){StatusMessageParam(hwndDlg,"INSTALLING",txt);}voidRemoveMessage(HWNDhwndDlg,constwchar_t*txt){if(!Rollback)StatusMessageParam(hwndDlg,"REMOVING",txt);}voidIconMessage(HWNDhwndDlg,constwchar_t*txt){StatusMessageParam(hwndDlg,"ADDING_ICON",txt);}voidDetermineUpgradeDowngradeStatus(BOOLbCloseDriverHandle,LONG*driverVersionPtr){LONGdriverVersion=VERSION_NUM;intstatus=0;if(hDriver==INVALID_HANDLE_VALUE)status=DriverAttach();if((status==0)&&(hDriver!=INVALID_HANDLE_VALUE)){DWORDdwResult;BOOLbResult=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);bReinstallMode=(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;}staticBOOLIsFileInUse(constwstring&filePath){HANDLEuseTestHandle=CreateFile(filePath.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);if(useTestHandle!=INVALID_HANDLE_VALUE)CloseHandle(useTestHandle);elseif(GetLastError()==ERROR_SHARING_VIOLATION)returnTRUE;returnFALSE;}BOOLDoFilesInstall(HWNDhwndDlg,wchar_t*szDestDir){/* WARNING: Note that, despite its name, this function is used during UNinstallation as well. */wchar_tszTmp[TC_MAX_PATH];BOOLbOK=TRUE;inti,x,fileNo;wchar_tcurFileName[TC_MAX_PATH]={0};if(!bUninstall&&!bDevm){// Self-extract all files to memoryGetModuleFileName(NULL,szTmp,ARRAYSIZE(szTmp));if(!SelfExtractInMemory(szTmp))returnFALSE;}x=wcslen(szDestDir);if(x<2)returnFALSE;if(szDestDir[x-1]!=L'\\')StringCbCatW(szDestDir,MAX_PATH,L"\\");for(i=0;i<sizeof(szFiles)/sizeof(szFiles[0]);i++){BOOLbResult,driver64=FALSE,zipFile=FALSE;wchar_tszDir[TC_MAX_PATH];if(wcsstr(szFiles[i],L"VeraCrypt Setup")!=0){if(bUninstall)continue;// Prevent 'access denied' errorif(bRepairMode)continue;// Destination = target}// skip files that don't apply to the current architectureif((Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCrypt-x64.exe")==0))||(Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCryptExpander-x64.exe")==0))||(Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCrypt Format-x64.exe")==0))||(!Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCrypt-x86.exe")==0))||(!Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCryptExpander-x86.exe")==0))||(!Is64BitOs()&&(wcscmp(szFiles[i],L"AVeraCrypt Format-x86.exe")==0))){continue;}if((*szFiles[i]==L'A')||(*szFiles[i]==L'X'))StringCbCopyW(szDir,sizeof(szDir),szDestDir);elseif(*szFiles[i]==L'D'){if(Is64BitOs())driver64=TRUE;GetSystemDirectory(szDir,ARRAYSIZE(szDir));x=wcslen(szDir);if(szDir[x-1]!=L'\\')StringCbCatW(szDir,sizeof(szDir),L"\\");StringCbCatW(szDir,sizeof(szDir),L"Drivers\\");}elseif(*szFiles[i]==L'W')GetWindowsDirectory(szDir,ARRAYSIZE(szDir));if(*szFiles[i]==L'I')continue;if(*szFiles[i]==L'X')zipFile=TRUE;StringCbPrintfW(szTmp,sizeof(szTmp),L"%s%s",szDir,szFiles[i]+1);if(zipFile){// build folder name by removing .zip extensionwchar_t*ptr=wcsrchr(szTmp,L'.');if(ptr)*ptr=0;}if(bUninstall==FALSE)CopyMessage(hwndDlg,szTmp);elseRemoveMessage(hwndDlg,szTmp);if(bUninstall==FALSE){SetCurrentDirectory(SetupFilesDir);if(wcsstr(szFiles[i],L"VeraCrypt Setup")!=0){// Copy ourselves (the distribution package) to the destination location as 'VeraCrypt Setup.exe'wchar_tmp[MAX_PATH];GetModuleFileName(NULL,mp,ARRAYSIZE(mp));bResult=TCCopyFile(mp,szTmp);}else{StringCchCopyNW(curFileName,ARRAYSIZE(curFileName),szFiles[i]+1,wcslen(szFiles[i])-1);curFileName[wcslen(szFiles[i])-1]=0;if(Is64BitOs()&&wcscmp(szFiles[i],L"Dveracrypt.sys")==0){StringCbCopyNW(curFileName,sizeof(curFileName),FILENAME_64BIT_DRIVER,sizeof(FILENAME_64BIT_DRIVER));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCrypt.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCrypt-x64.exe",sizeof(L"VeraCrypt-x64.exe"));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCrypt-x86.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCrypt.exe",sizeof(L"VeraCrypt.exe"));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCryptExpander.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCryptExpander-x64.exe",sizeof(L"VeraCryptExpander-x64.exe"));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCryptExpander-x86.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCryptExpander.exe",sizeof(L"VeraCryptExpander.exe"));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCrypt Format.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCrypt Format-x64.exe",sizeof(L"VeraCrypt Format-x64.exe"));}if(Is64BitOs()&&wcscmp(szFiles[i],L"AVeraCrypt Format-x86.exe")==0){StringCbCopyNW(curFileName,sizeof(curFileName),L"VeraCrypt Format.exe",sizeof(L"VeraCrypt Format.exe"));}if(!bDevm){bResult=FALSE;// Find the correct decompressed file in memoryfor(fileNo=0;fileNo<NBR_COMPRESSED_FILES;fileNo++){// Write the file (stored in memory) directly to the destination location// (there will be no temporary files).if(wmemcmp(curFileName,Decompressed_Files[fileNo].fileName,min(wcslen(curFileName),(size_t)Decompressed_Files[fileNo].fileNameLength))==0){// Dump filter driver cannot be installed to SysWOW64 directoryif(driver64&&!EnableWow64FsRedirection(FALSE)){handleWin32Error(hwndDlg,SRC_POS);bResult=FALSE;gotoerr;}if(zipFile){bResult=DecompressZipToDir(Decompressed_Files[fileNo].fileContent,Decompressed_Files[fileNo].fileLength,szDir,CopyMessage,hwndDlg);}else{bResult=SaveBufferToFile((char*)Decompressed_Files[fileNo].fileContent,szTmp,Decompressed_Files[fileNo].fileLength,FALSE,TRUE);}if(driver64){if(!EnableWow64FsRedirection(TRUE)){handleWin32Error(hwndDlg,SRC_POS);bResult=FALSE;gotoerr;}if(!bResult)gotoerr;}break;}}}else{if(driver64)EnableWow64FsRedirection(FALSE);bResult=TCCopyFile(curFileName,szTmp);if(driver64)EnableWow64FsRedirection(TRUE);}if(bResult&&wcscmp(szFiles[i],L"AVeraCrypt.exe")==0){if(Is64BitOs())EnableWow64FsRedirection(FALSE);wstringservicePath=GetServiceConfigPath(_T(TC_APP_NAME)L".exe",false);wstringserviceLegacyPath=GetServiceConfigPath(_T(TC_APP_NAME)L".exe",true);wstringfavoritesFile=GetServiceConfigPath(TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES,false);wstringfavoritesLegacyFile=GetServiceConfigPath(TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES,true);if(FileExists(servicePath.c_str())||(Is64BitOs()&&FileExists(serviceLegacyPath.c_str()))){CopyMessage(hwndDlg,(wchar_t*)servicePath.c_str());bResult=CopyFile(szTmp,servicePath.c_str(),FALSE);}if(bResult&&Is64BitOs()&&FileExists(favoritesLegacyFile.c_str())&&!FileExists(favoritesFile.c_str())){// copy the favorites XML file to the native system directorybResult=CopyFile(favoritesLegacyFile.c_str(),favoritesFile.c_str(),FALSE);}if(bResult&&Is64BitOs()&&FileExists(favoritesFile.c_str())&&FileExists(servicePath.c_str())){// Update the path of the serviceBootEncryptionBootEncObj(hwndDlg);try{if(BootEncObj.GetDriverServiceStartType()==SERVICE_BOOT_START){BootEncObj.UpdateSystemFavoritesService();}}catch(...){}}if(Is64BitOs()){// delete files from legacy pathif(FileExists(favoritesLegacyFile.c_str())){RemoveMessage(hwndDlg,(wchar_t*)favoritesLegacyFile.c_str());ForceDeleteFile(favoritesLegacyFile.c_str());}if(FileExists(serviceLegacyPath.c_str())){RemoveMessage(hwndDlg,(wchar_t*)serviceLegacyPath.c_str());ForceDeleteFile(serviceLegacyPath.c_str());}EnableWow64FsRedirection(TRUE);}}}}else{if(driver64)EnableWow64FsRedirection(FALSE);if(zipFile)bResult=StatRemoveDirectory(szTmp);elsebResult=StatDeleteFile(szTmp,TRUE);if(driver64)EnableWow64FsRedirection(TRUE);if(bResult&&wcscmp(szFiles[i],L"AVeraCrypt.exe")==0){if(Is64BitOs())EnableWow64FsRedirection(FALSE);wstringservicePath=GetServiceConfigPath(_T(TC_APP_NAME)L".exe",false);wstringserviceLegacyPath=GetServiceConfigPath(_T(TC_APP_NAME)L".exe",true);wstringfavoritesFile=GetServiceConfigPath(TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES,false);wstringfavoritesLegacyFile=GetServiceConfigPath(TC_APPD_FILENAME_SYSTEM_FAVORITE_VOLUMES,true);// delete all files related to system favorites serviceif(FileExists(favoritesFile.c_str())){RemoveMessage(hwndDlg,(wchar_t*)favoritesFile.c_str());ForceDeleteFile(favoritesFile.c_str());}if(FileExists(servicePath.c_str())){RemoveMessage(hwndDlg,(wchar_t*)servicePath.c_str());ForceDeleteFile(servicePath.c_str());}if(Is64BitOs()){if(FileExists(favoritesLegacyFile.c_str())){RemoveMessage(hwndDlg,(wchar_t*)favoritesLegacyFile.c_str());ForceDeleteFile(favoritesLegacyFile.c_str());}if(FileExists(serviceLegacyPath.c_str())){RemoveMessage(hwndDlg,(wchar_t*)serviceLegacyPath.c_str());ForceDeleteFile(serviceLegacyPath.c_str());}EnableWow64FsRedirection(TRUE);}}}err:if(bResult==FALSE){LPVOIDlpMsgBuf;DWORDdwError=GetLastError();wchar_tszTmp2[700];wchar_tszErrorValue[16];wchar_t*pszDesc;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dwError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),/* Default language */(wchar_t*)&lpMsgBuf,0,NULL);if(lpMsgBuf)pszDesc=(wchar_t*)lpMsgBuf;else{StringCbPrintfW(szErrorValue,sizeof(szErrorValue),L"0x%.8X",dwError);pszDesc=szErrorValue;}if(bUninstall==FALSE)StringCbPrintfW(szTmp2,sizeof(szTmp2),GetString("INSTALL_OF_FAILED"),szTmp,pszDesc);elseStringCbPrintfW(szTmp2,sizeof(szTmp2),GetString("UNINSTALL_OF_FAILED"),szTmp,pszDesc);if(lpMsgBuf)LocalFree(lpMsgBuf);if(!Silent&&MessageBoxW(hwndDlg,szTmp2,lpszTitle,MB_YESNO|MB_ICONHAND)!=IDYES)returnFALSE;}}if(bUninstall==FALSE){WIN32_FIND_DATAf;HANDLEh;SetCurrentDirectory(szDestDir);// remove PDF from previous version if anyh=FindFirstFile(L"VeraCrypt User Guide*.pdf",&f);if(h!=INVALID_HANDLE_VALUE){do{StatDeleteFile(f.cFileName,TRUE);}while(FindNextFile(h,&f)!=0);FindClose(h);}// remove language XML files from previous version if anyh=FindFirstFile(L"Language*.xml",&f);if(h!=INVALID_HANDLE_VALUE){do{StatDeleteFile(f.cFileName,TRUE);}while(FindNextFile(h,&f)!=0);FindClose(h);}SetCurrentDirectory(SetupFilesDir);}returnbOK;}BOOLDoRegInstall(HWNDhwndDlg,wchar_t*szDestDir,BOOLbInstallType){wchar_tszDir[TC_MAX_PATH],*key;wchar_tszTmp[TC_MAX_PATH*4];HKEYhkey=0;BOOLbSlash,bOK=FALSE;DWORDdw;intx;if(SystemEncryptionUpdate){if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt",0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_WOW64_32KEY,NULL,&hkey,&dw)==ERROR_SUCCESS){StringCbCopyW(szTmp,sizeof(szTmp),_T(VERSION_STRING));RegSetValueEx(hkey,L"DisplayVersion",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t));StringCbCopyW(szTmp,sizeof(szTmp),TC_HOMEPAGE);RegSetValueEx(hkey,L"URLInfoAbout",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t));RegCloseKey(hkey);}returnTRUE;}StringCbCopyW(szDir,sizeof(szDir),szDestDir);x=wcslen(szDestDir);if(szDestDir[x-1]==L'\\')bSlash=TRUE;elsebSlash=FALSE;if(bSlash==FALSE)StringCbCatW(szDir,sizeof(szDir),L"\\");if(bInstallType){key=L"Software\\Classes\\VeraCryptVolume";RegMessage(hwndDlg,key);if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,key,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkey,&dw)!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),L"VeraCrypt Volume");if(RegSetValueEx(hkey,L"",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"%ws",TC_APPLICATION_ID);if(RegSetValueEx(hkey,L"AppUserModelID",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;RegCloseKey(hkey);hkey=0;key=L"Software\\Classes\\VeraCryptVolume\\DefaultIcon";RegMessage(hwndDlg,key);if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,key,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkey,&dw)!=ERROR_SUCCESS)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"%sVeraCrypt.exe,1",szDir);if(RegSetValueEx(hkey,L"",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;RegCloseKey(hkey);hkey=0;key=L"Software\\Classes\\VeraCryptVolume\\Shell\\open\\command";RegMessage(hwndDlg,key);if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,key,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkey,&dw)!=ERROR_SUCCESS)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"\"%sVeraCrypt.exe\" /v \"%%1\"",szDir);if(RegSetValueEx(hkey,L"",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;RegCloseKey(hkey);hkey=0;key=L"Software\\Classes\\.hc";BOOLtypeClassChanged=TRUE;wchar_ttypeClass[256];DWORDtypeClassSize=sizeof(typeClass);if(ReadLocalMachineRegistryString(key,L"",typeClass,&typeClassSize)&&typeClassSize>0&&wcscmp(typeClass,L"VeraCryptVolume")==0)typeClassChanged=FALSE;RegMessage(hwndDlg,key);if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,key,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hkey,&dw)!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),L"VeraCryptVolume");if(RegSetValueEx(hkey,L"",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;RegCloseKey(hkey);hkey=0;if(typeClassChanged)SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL);}key=L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt";RegMessage(hwndDlg,key);if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,key,0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE|KEY_WOW64_32KEY,NULL,&hkey,&dw)!=ERROR_SUCCESS)gotoerror;/* IMPORTANT: IF YOU CHANGE THIS IN ANY WAY, REVISE AND UPDATE SetInstallationPath() ACCORDINGLY! */StringCbPrintfW(szTmp,sizeof(szTmp),L"\"%sVeraCrypt Setup.exe\" /u",szDir);if(RegSetValueEx(hkey,L"UninstallString",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"\"%sVeraCrypt Setup.exe\" /c",szDir);if(RegSetValueEx(hkey,L"ModifyPath",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"\"%sVeraCrypt Setup.exe\"",szDir);if(RegSetValueEx(hkey,L"DisplayIcon",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),_T(VERSION_STRING));if(RegSetValueEx(hkey,L"DisplayVersion",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),L"VeraCrypt");if(RegSetValueEx(hkey,L"DisplayName",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),L"IDRIX");if(RegSetValueEx(hkey,L"Publisher",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;StringCbCopyW(szTmp,sizeof(szTmp),TC_HOMEPAGE);if(RegSetValueEx(hkey,L"URLInfoAbout",0,REG_SZ,(BYTE*)szTmp,(wcslen(szTmp)+1)*sizeof(wchar_t))!=ERROR_SUCCESS)gotoerror;bOK=TRUE;error:if(hkey!=0)RegCloseKey(hkey);if(bOK==FALSE){handleWin32Error(hwndDlg,SRC_POS);Error("REG_INSTALL_FAILED",hwndDlg);}// Register COM servers for UACif(IsOSAtLeast(WIN_VISTA)){if(!RegisterComServers(szDir)){Error("COM_REG_FAILED",hwndDlg);returnFALSE;}}returnbOK;}BOOLDoApplicationDataUninstall(HWNDhwndDlg){wchar_tpath[MAX_PATH];wchar_tpath2[MAX_PATH];BOOLbOK=TRUE;StatusMessage(hwndDlg,"REMOVING_APPDATA");SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,0,path);StringCbCatW(path,sizeof(path),L"\\VeraCrypt\\");// Delete favorite volumes fileStringCbPrintfW(path2,sizeof(path2),L"%s%s",path,TC_APPD_FILENAME_FAVORITE_VOLUMES);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);// Delete keyfile defaultsStringCbPrintfW(path2,sizeof(path2),L"%s%s",path,TC_APPD_FILENAME_DEFAULT_KEYFILES);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);// Delete history fileStringCbPrintfW(path2,sizeof(path2),L"%s%s",path,TC_APPD_FILENAME_HISTORY);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);// Delete configuration fileStringCbPrintfW(path2,sizeof(path2),L"%s%s",path,TC_APPD_FILENAME_CONFIGURATION);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);// Delete system encryption configuration fileStringCbPrintfW(path2,sizeof(path2),L"%s%s",path,TC_APPD_FILENAME_SYSTEM_ENCRYPTION);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);SHGetFolderPath(NULL,CSIDL_APPDATA,NULL,0,path);StringCbCatW(path,sizeof(path),L"\\VeraCrypt");RemoveMessage(hwndDlg,path);if(!StatRemoveDirectory(path)){handleWin32Error(hwndDlg,SRC_POS);bOK=FALSE;}// remove VeraCrypt under common appdataif(SUCCEEDED(SHGetFolderPath(NULL,CSIDL_COMMON_APPDATA|CSIDL_FLAG_CREATE,NULL,0,path))){StringCbCatW(path,sizeof(path),L"\\VeraCrypt");// Delete original bootloaderStringCbPrintfW(path2,sizeof(path2),L"%s\\%s",path,TC_SYS_BOOT_LOADER_BACKUP_NAME);RemoveMessage(hwndDlg,path2);StatDeleteFile(path2,FALSE);// remove VeraCrypt folderRemoveMessage(hwndDlg,path);StatRemoveDirectory(path);}returnbOK;}BOOLDoRegUninstall(HWNDhwndDlg,BOOLbRemoveDeprecated){wchar_tregk[64];typedefLSTATUS(WINAPI*RegDeleteKeyExWFn)(HKEYhKey,LPCWSTRlpSubKey,REGSAMsamDesired,WORDReserved);RegDeleteKeyExWFnRegDeleteKeyExWPtr=NULL;HMODULEhAdvapiDll=LoadLibrary(L"Advapi32.dll");if(hAdvapiDll){RegDeleteKeyExWPtr=(RegDeleteKeyExWFn)GetProcAddress(hAdvapiDll,"RegDeleteKeyExW");}// Unregister COM serversif(!bRemoveDeprecated&&IsOSAtLeast(WIN_VISTA)){if(!UnregisterComServers(InstallationPath))StatusMessage(hwndDlg,"COM_DEREG_FAILED");}if(!bRemoveDeprecated)StatusMessage(hwndDlg,"REMOVING_REG");if(RegDeleteKeyExWPtr){RegDeleteKeyExWPtr(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt",KEY_WOW64_32KEY,0);RegDeleteKeyExWPtr(HKEY_CURRENT_USER,L"Software\\VeraCrypt",KEY_WOW64_32KEY,0);}else{RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt");RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\VeraCrypt");}RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\VeraCryptVolume\\Shell\\open\\command");RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\VeraCryptVolume\\Shell\\open");RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\VeraCryptVolume\\Shell");RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\VeraCryptVolume\\DefaultIcon");RegDeleteKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\VeraCryptVolume");if(!bRemoveDeprecated){HKEYhKey;GetStartupRegKeyName(regk,sizeof(regk));DeleteRegistryValue(regk,L"VeraCrypt");DeleteRegistryKey(HKEY_LOCAL_MACHINE,L"Software\\Classes\\.hc");// enable the SE_TAKE_OWNERSHIP_NAME privilege for this operationSetPrivilege(SE_TAKE_OWNERSHIP_NAME,TRUE);// clean MuiCache list from VeraCrypt entriesSearchAndDeleteRegistrySubString(HKEY_CLASSES_ROOT,L"Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache",L"VeraCrypt",FALSE,NULL);// clean other VeraCrypt entries from all usersSearchAndDeleteRegistrySubString(HKEY_USERS,L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\.hc",NULL,TRUE,NULL);SearchAndDeleteRegistrySubString(HKEY_USERS,L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Compatibility Assistant\\Persisted",L"VeraCrypt",TRUE,NULL);SearchAndDeleteRegistrySubString(HKEY_USERS,L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage\\NewShortcuts",L"VeraCrypt",TRUE,NULL);if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SYSTEM",0,KEY_ALL_ACCESS|WRITE_DAC|WRITE_OWNER,&hKey)==ERROR_SUCCESS){SearchAndDeleteRegistrySubString(hKey,L"Enum\\Root\\LEGACY_VERACRYPT",NULL,TRUE,L"ControlSet");SearchAndDeleteRegistrySubString(hKey,L"services\\veracrypt",NULL,TRUE,L"ControlSet");RegCloseKey(hKey);}// disable the SE_TAKE_OWNERSHIP_NAME privilege for this operationSetPrivilege(SE_TAKE_OWNERSHIP_NAME,FALSE);SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,NULL,NULL);}if(hAdvapiDll)FreeLibrary(hAdvapiDll);returnTRUE;}BOOLDoServiceUninstall(HWNDhwndDlg,wchar_t*lpszService){SC_HANDLEhManager,hService=NULL;BOOLbOK=FALSE,bRet;SERVICE_STATUSstatus;BOOLfirstTry=TRUE;intx;memset(&status,0,sizeof(status));/* Keep VC6 quiet */retry:hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(hManager==NULL)gotoerror;hService=OpenService(hManager,lpszService,SERVICE_ALL_ACCESS);if(hService==NULL)gotoerror;if(wcscmp(L"veracrypt",lpszService)==0){try{BootEncryptionbootEnc(hwndDlg);if(bootEnc.GetDriverServiceStartType()==SERVICE_BOOT_START){try{bootEnc.RegisterFilterDriver(false,BootEncryption::DriveFilter);}catch(...){}try{bootEnc.RegisterFilterDriver(false,BootEncryption::VolumeFilter);}catch(...){}try{bootEnc.RegisterFilterDriver(false,BootEncryption::DumpFilter);}catch(...){}}}catch(...){}StatusMessage(hwndDlg,"STOPPING_DRIVER");}elseStatusMessageParam(hwndDlg,"STOPPING",lpszService);#define WAIT_PERIOD 3for(x=0;x<WAIT_PERIOD;x++){bRet=QueryServiceStatus(hService,&status);if(bRet!=TRUE)gotoerror;if(status.dwCurrentState!=SERVICE_START_PENDING&&status.dwCurrentState!=SERVICE_STOP_PENDING&&status.dwCurrentState!=SERVICE_CONTINUE_PENDING)break;Sleep(1000);}if(status.dwCurrentState!=SERVICE_STOPPED){bRet=ControlService(hService,SERVICE_CONTROL_STOP,&status);if(bRet==FALSE)gototry_delete;for(x=0;x<WAIT_PERIOD;x++){bRet=QueryServiceStatus(hService,&status);if(bRet!=TRUE)gotoerror;if(status.dwCurrentState!=SERVICE_START_PENDING&&status.dwCurrentState!=SERVICE_STOP_PENDING&&status.dwCurrentState!=SERVICE_CONTINUE_PENDING)break;Sleep(1000);}if(status.dwCurrentState!=SERVICE_STOPPED&&status.dwCurrentState!=SERVICE_STOP_PENDING)gotoerror;}try_delete:if(wcscmp(L"veracrypt",lpszService)==0)StatusMessage(hwndDlg,"REMOVING_DRIVER");elseStatusMessageParam(hwndDlg,"REMOVING",lpszService);if(hService!=NULL){CloseServiceHandle(hService);hService=NULL;}if(hManager!=NULL){CloseServiceHandle(hManager);hManager=NULL;}hManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);if(hManager==NULL)gotoerror;hService=OpenService(hManager,lpszService,SERVICE_ALL_ACCESS);if(hService==NULL)gotoerror;bRet=DeleteService(hService);if(bRet==FALSE){if(firstTry&&GetLastError()==ERROR_SERVICE_MARKED_FOR_DELETE){// Second try for an eventual no-install driver instanceCloseServiceHandle(hService);CloseServiceHandle(hManager);hService=NULL;hManager=NULL;Sleep(1000);firstTry=FALSE;gotoretry;}gotoerror;}bOK=TRUE;error:if(bOK==FALSE&&GetLastError()!=ERROR_SERVICE_DOES_NOT_EXIST){handleWin32Error(hwndDlg,SRC_POS);MessageBoxW(hwndDlg,GetString("DRIVER_UINSTALL_FAILED"),lpszTitle,MB_ICONHAND);}elsebOK=TRUE;if(hService!=NULL)CloseServiceHandle(hService);if(hManager!=NULL)CloseServiceHandle(hManager);returnbOK;}BOOLDoDriverUnload(HWNDhwndDlg){BOOLbOK=TRUE;intstatus;status=DriverAttach();if(status!=0){if(status==ERR_OS_ERROR&&GetLastError()!=ERROR_FILE_NOT_FOUND){handleWin32Error(hwndDlg,SRC_POS);AbortProcess("NODRIVER");}if(status!=ERR_OS_ERROR){handleError(NULL,status,SRC_POS);AbortProcess("NODRIVER");}}if(hDriver!=INVALID_HANDLE_VALUE){MOUNT_LIST_STRUCTdriver;LONGdriverVersion=VERSION_NUM;intrefCount;DWORDdwResult;BOOLbResult;// Try to determine if it's upgrade (and not reinstall, downgrade, or first-time install).DetermineUpgradeDowngradeStatus(FALSE,&driverVersion);// Test for encrypted boot drivetry{BootEncryptionbootEnc(hwndDlg);if(bootEnc.GetDriverServiceStartType()==SERVICE_BOOT_START){try{// Check hidden OS update consistencyif(IsHiddenOSRunning()){if(bootEnc.GetInstalledBootLoaderVersion()!=VERSION_NUM){if(AskWarnNoYes("UPDATE_TC_IN_DECOY_OS_FIRST",hwndDlg)==IDNO)AbortProcessSilent();}}}catch(...){}if(bUninstallInProgress&&!bootEnc.GetStatus().DriveMounted){try{bootEnc.RegisterFilterDriver(false,BootEncryption::DriveFilter);}catch(...){}try{bootEnc.RegisterFilterDriver(false,BootEncryption::VolumeFilter);}catch(...){}try{bootEnc.RegisterFilterDriver(false,BootEncryption::DumpFilter);}catch(...){}bootEnc.SetDriverServiceStartType(SERVICE_SYSTEM_START);}elseif(bUninstallInProgress||bDowngrade){Error(bDowngrade?"SETUP_FAILED_BOOT_DRIVE_ENCRYPTED_DOWNGRADE":"SETUP_FAILED_BOOT_DRIVE_ENCRYPTED",hwndDlg);returnFALSE;}else{if(CurrentOSMajor==6&&CurrentOSMinor==0&&CurrentOSServicePack<1)AbortProcess("SYS_ENCRYPTION_UPGRADE_UNSUPPORTED_ON_VISTA_SP0");SystemEncryptionUpdate=TRUE;PortableMode=FALSE;}}}catch(...){}if(!bUninstall&&(bUpgrade||SystemEncryptionUpdate)&&(!bDevm||SystemEncryptionUpdate)){UnloadDriver=FALSE;}if(PortableMode&&!SystemEncryptionUpdate)UnloadDriver=TRUE;if(UnloadDriver){intvolumesMounted=0;// Check mounted volumesbResult=DeviceIoControl(hDriver,TC_IOCTL_IS_ANY_VOLUME_MOUNTED,NULL,0,&volumesMounted,sizeof(volumesMounted),&dwResult,NULL);if(!bResult){bResult=DeviceIoControl(hDriver,TC_IOCTL_LEGACY_GET_MOUNTED_VOLUMES,NULL,0,&driver,sizeof(driver),&dwResult,NULL);if(bResult)volumesMounted=driver.ulMountedDrives;}if(bResult){if(volumesMounted!=0){bOK=FALSE;MessageBoxW(hwndDlg,GetString("DISMOUNT_ALL_FIRST"),lpszTitle,MB_ICONHAND);}}else{bOK=FALSE;handleWin32Error(hwndDlg,SRC_POS);}}// Try to close all open TC windowsif(bOK){BOOLTCWindowClosed=FALSE;EnumWindows(CloseTCWindowsEnum,(LPARAM)&TCWindowClosed);if(TCWindowClosed)Sleep(2000);}// Test for any applications attached to driverif(!bUpgrade){bResult=DeviceIoControl(hDriver,TC_IOCTL_GET_DEVICE_REFCOUNT,&refCount,sizeof(refCount),&refCount,sizeof(refCount),&dwResult,NULL);if(bOK&&bResult&&refCount>1){MessageBoxW(hwndDlg,GetString("CLOSE_TC_FIRST"),lpszTitle,MB_ICONSTOP);bOK=FALSE;}}if(!bOK||UnloadDriver){CloseHandle(hDriver);hDriver=INVALID_HANDLE_VALUE;}}else{// Note that the driver may have already been unloaded during this session (e.g. retry after an error, etc.) so it is not// guaranteed that the user is installing VeraCrypt for the first time now (we also cannot know if the user has already// installed and used VeraCrypt on another system before).bPossiblyFirstTimeInstall=TRUE;}returnbOK;}BOOLUpgradeBootLoader(HWNDhwndDlg){if(!SystemEncryptionUpdate)returnTRUE;try{BootEncryptionbootEnc(hwndDlg);uint64bootLoaderVersion=bootEnc.GetInstalledBootLoaderVersion();if((bootLoaderVersion<VERSION_NUM)||(bReinstallMode&&(bootLoaderVersion==VERSION_NUM))){StatusMessage(hwndDlg,"INSTALLER_UPDATING_BOOT_LOADER");bootEnc.InstallBootLoader(true);if(bootEnc.GetInstalledBootLoaderVersion()<=TC_RESCUE_DISK_UPGRADE_NOTICE_MAX_VERSION)Info(IsHiddenOSRunning()?"BOOT_LOADER_UPGRADE_OK_HIDDEN_OS":"BOOT_LOADER_UPGRADE_OK",hwndDlg);}returnTRUE;}catch(Exception&e){e.Show(hwndDlg);}catch(...){}Error("BOOT_LOADER_UPGRADE_FAILED",hwndDlg);returnFALSE;}BOOLDoShortcutsUninstall(HWNDhwndDlg,wchar_t*szDestDir){wchar_tszLinkDir[TC_MAX_PATH];wchar_tszTmp2[TC_MAX_PATH];BOOLbSlash,bOK=FALSE;HRESULThOle;intx;BOOLallUsers=FALSE;hOle=OleInitialize(NULL);// User start menuSHGetSpecialFolderPath(hwndDlg,szLinkDir,CSIDL_PROGRAMS,0);x=wcslen(szLinkDir);if(szLinkDir[x-1]==L'\\')bSlash=TRUE;elsebSlash=FALSE;if(bSlash==FALSE)StringCbCatW(szLinkDir,sizeof(szLinkDir),L"\\");StringCbCatW(szLinkDir,sizeof(szLinkDir),L"VeraCrypt");// Global start menu{struct_statst;wchar_tpath[TC_MAX_PATH];SHGetSpecialFolderPath(hwndDlg,path,CSIDL_COMMON_PROGRAMS,0);StringCbCatW(path,sizeof(path),L"\\VeraCrypt");if(_wstat(path,&st)==0){StringCbCopyW(szLinkDir,sizeof(szLinkDir),path);allUsers=TRUE;}}// Start menu entriesStringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt.lnk");RemoveMessage(hwndDlg,szTmp2);if(StatDeleteFile(szTmp2,FALSE)==FALSE)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCryptExpander.lnk");RemoveMessage(hwndDlg,szTmp2);if(StatDeleteFile(szTmp2,FALSE)==FALSE)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt Website.url");RemoveMessage(hwndDlg,szTmp2);if(StatDeleteFile(szTmp2,FALSE)==FALSE)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\Uninstall VeraCrypt.lnk");RemoveMessage(hwndDlg,szTmp2);if(StatDeleteFile(szTmp2,FALSE)==FALSE)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt User's Guide.lnk");StatDeleteFile(szTmp2,FALSE);// Start menu groupRemoveMessage((HWND)hwndDlg,szLinkDir);if(StatRemoveDirectory(szLinkDir)==FALSE)handleWin32Error((HWND)hwndDlg,SRC_POS);// Desktop iconif(allUsers)SHGetSpecialFolderPath(hwndDlg,szLinkDir,CSIDL_COMMON_DESKTOPDIRECTORY,0);elseSHGetSpecialFolderPath(hwndDlg,szLinkDir,CSIDL_DESKTOPDIRECTORY,0);StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt.lnk");RemoveMessage(hwndDlg,szTmp2);if(StatDeleteFile(szTmp2,FALSE)==FALSE)gotoerror;bOK=TRUE;error:OleUninitialize();returnbOK;}BOOLDoShortcutsInstall(HWNDhwndDlg,wchar_t*szDestDir,BOOLbProgGroup,BOOLbDesktopIcon){wchar_tszLinkDir[TC_MAX_PATH],szDir[TC_MAX_PATH];wchar_tszTmp[TC_MAX_PATH],szTmp2[TC_MAX_PATH],szTmp3[TC_MAX_PATH];BOOLbSlash,bOK=FALSE;HRESULThOle;intx;if(bProgGroup==FALSE&&bDesktopIcon==FALSE)returnTRUE;hOle=OleInitialize(NULL);GetProgramPath(hwndDlg,szLinkDir);x=wcslen(szLinkDir);if(szLinkDir[x-1]==L'\\')bSlash=TRUE;elsebSlash=FALSE;if(bSlash==FALSE)StringCbCatW(szLinkDir,sizeof(szLinkDir),L"\\");StringCbCatW(szLinkDir,sizeof(szLinkDir),L"VeraCrypt");StringCbCopyW(szDir,sizeof(szDir),szDestDir);x=wcslen(szDestDir);if(szDestDir[x-1]==L'\\')bSlash=TRUE;elsebSlash=FALSE;if(bSlash==FALSE)StringCbCatW(szDir,sizeof(szDir),L"\\");if(bProgGroup){FILE*f;if(mkfulldir(szLinkDir,TRUE)!=0){if(mkfulldir(szLinkDir,FALSE)!=0){wchar_tszTmpW[TC_MAX_PATH];handleWin32Error(hwndDlg,SRC_POS);StringCbPrintfW(szTmpW,sizeof(szTmpW),GetString("CANT_CREATE_FOLDER"),szLinkDir);MessageBoxW(hwndDlg,szTmpW,lpszTitle,MB_ICONHAND);gotoerror;}}StringCbPrintfW(szTmp,sizeof(szTmp),L"%s%s",szDir,L"VeraCrypt.exe");StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt.lnk");IconMessage(hwndDlg,szTmp2);if(CreateLink(szTmp,L"",szTmp2,NULL,-1)!=S_OK)gotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"%s%s",szDir,L"VeraCryptExpander.exe");StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCryptExpander.lnk");IconMessage(hwndDlg,szTmp2);if(CreateLink(szTmp,L"",szTmp2,NULL,-1)!=S_OK)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt Website.url");IconMessage(hwndDlg,szTmp2);f=_wfopen(szTmp2,L"w");if(f){fwprintf(f,L"[InternetShortcut]\nURL=%s\n",TC_APPLINK);CheckFileStreamWriteErrors(hwndDlg,f,szTmp2);fclose(f);}elsegotoerror;StringCbPrintfW(szTmp,sizeof(szTmp),L"%s%s",szDir,L"VeraCrypt Setup.exe");StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\Uninstall VeraCrypt.lnk");if(GetSystemDirectory(szTmp3,ARRAYSIZE(szTmp3))){StringCbCatW(szTmp3,sizeof(szTmp3),L"\\control.exe");}elseStringCbCopyW(szTmp3,sizeof(szTmp3),L"C:\\Windows\\System32\\control.exe");IconMessage(hwndDlg,szTmp2);if(CreateLink(szTmp3,L"appwiz.cpl",szTmp2,szTmp,0)!=S_OK)gotoerror;StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt User's Guide.lnk");StatDeleteFile(szTmp2,FALSE);}if(bDesktopIcon){StringCbCopyW(szDir,sizeof(szDir),szDestDir);x=wcslen(szDestDir);if(szDestDir[x-1]==L'\\')bSlash=TRUE;elsebSlash=FALSE;if(bSlash==FALSE)StringCbCatW(szDir,sizeof(szDir),L"\\");if(bForAllUsers)SHGetSpecialFolderPath(hwndDlg,szLinkDir,CSIDL_COMMON_DESKTOPDIRECTORY,0);elseSHGetSpecialFolderPath(hwndDlg,szLinkDir,CSIDL_DESKTOPDIRECTORY,0);StringCbPrintfW(szTmp,sizeof(szTmp),L"%s%s",szDir,L"VeraCrypt.exe");StringCbPrintfW(szTmp2,sizeof(szTmp2),L"%s%s",szLinkDir,L"\\VeraCrypt.lnk");IconMessage(hwndDlg,szTmp2);if(CreateLink(szTmp,L"",szTmp2,NULL,-1)!=S_OK)gotoerror;}bOK=TRUE;error:OleUninitialize();returnbOK;}voidOutcomePrompt(HWNDhwndDlg,BOOLbOK){if(bOK){EnableWindow(GetDlgItem((HWND)hwndDlg,IDCANCEL),FALSE);bDone=TRUE;if(bUninstall==FALSE){if(bDevm)PostMessage(MainDlg,WM_CLOSE,0,0);elseif(bPossiblyFirstTimeInstall||bRepairMode||(!bUpgrade&&!bDowngrade))Info("INSTALL_OK",hwndDlg);elseInfo("SETUP_UPDATE_OK",hwndDlg);}else{wchar_tstr[4096];StringCbPrintfW(str,sizeof(str),GetString("UNINSTALL_OK"),InstallationPath);MessageBoxW(hwndDlg,str,lpszTitle,MB_ICONASTERISK);}}else{if(bUninstall==FALSE)Error("INSTALL_FAILED",hwndDlg);elseError("UNINSTALL_FAILED",hwndDlg);}}staticvoidSetSystemRestorePoint(HWNDhwndDlg,BOOLfinalize){staticRESTOREPOINTINFORestPtInfo;staticSTATEMGRSTATUSSMgrStatus;staticBOOLfailed=FALSE;staticBOOL(__stdcall*_SRSetRestorePoint)(PRESTOREPOINTINFO,PSTATEMGRSTATUS);if(!SystemRestoreDll)return;_SRSetRestorePoint=(BOOL(__stdcall*)(PRESTOREPOINTINFO,PSTATEMGRSTATUS))GetProcAddress(SystemRestoreDll,"SRSetRestorePointW");if(_SRSetRestorePoint==0){FreeLibrary(SystemRestoreDll);SystemRestoreDll=0;return;}if(!finalize){StatusMessage(hwndDlg,"CREATING_SYS_RESTORE");RestPtInfo.dwEventType=BEGIN_SYSTEM_CHANGE;RestPtInfo.dwRestorePtType=bUninstall?APPLICATION_UNINSTALL:APPLICATION_INSTALL|DEVICE_DRIVER_INSTALL;RestPtInfo.llSequenceNumber=0;StringCbCopyW(RestPtInfo.szDescription,sizeof(RestPtInfo.szDescription),bUninstall?L"VeraCrypt uninstallation":L"VeraCrypt installation");if(!_SRSetRestorePoint(&RestPtInfo,&SMgrStatus)){StatusMessage(hwndDlg,"FAILED_SYS_RESTORE");failed=TRUE;}}elseif(!failed){RestPtInfo.dwEventType=END_SYSTEM_CHANGE;RestPtInfo.llSequenceNumber=SMgrStatus.llSequenceNumber;if(!_SRSetRestorePoint(&RestPtInfo,&SMgrStatus)){StatusMessage(hwndDlg,"FAILED_SYS_RESTORE");}}}voidDoUninstall(void*arg){HWNDhwndDlg=(HWND)arg;BOOLbOK=TRUE;BOOLbTempSkipSysRestore=FALSE;if(!Rollback)EnableWindow(GetDlgItem((HWND)hwndDlg,IDC_UNINSTALL),FALSE);WaitCursor();if(!Rollback){ClearLogWindow(hwndDlg);}if(DoDriverUnload(hwndDlg)==FALSE){bOK=FALSE;bTempSkipSysRestore=TRUE;// Volumes are possibly mounted; defer System Restore point creation for this uninstall attempt.}else{if(!Rollback&&bSystemRestore&&!bTempSkipSysRestore)SetSystemRestorePoint(hwndDlg,FALSE);if(DoServiceUninstall(hwndDlg,L"veracrypt")==FALSE){bOK=FALSE;}elseif(DoRegUninstall((HWND)hwndDlg,FALSE)==FALSE){bOK=FALSE;}elseif(DoFilesInstall((HWND)hwndDlg,InstallationPath)==FALSE){bOK=FALSE;}elseif(DoShortcutsUninstall(hwndDlg,InstallationPath)==FALSE){bOK=FALSE;}elseif(!DoApplicationDataUninstall(hwndDlg)){bOK=FALSE;}else{wchar_ttemp[MAX_PATH];FILE*f;// Deprecated serviceDoServiceUninstall(hwndDlg,L"VeraCryptService");GetTempPath(ARRAYSIZE(temp),temp);StringCbPrintfW(UninstallBatch,sizeof(UninstallBatch),L"%sVeraCrypt-Uninstall.bat",temp);UninstallBatch[ARRAYSIZE(UninstallBatch)-1]=0;// Create uninstall batchf=_wfopen(UninstallBatch,L"w");if(!f)bOK=FALSE;else{fwprintf(f,L":loop\n"L"del \"%s%s\"\n"L"if exist \"%s%s\" goto loop\n"L"rmdir \"%s\"\n"L"del \"%s\"",InstallationPath,L"VeraCrypt Setup.exe",InstallationPath,L"VeraCrypt Setup.exe",InstallationPath,UninstallBatch);CheckFileStreamWriteErrors(hwndDlg,f,UninstallBatch);fclose(f);}}}NormalCursor();if(Rollback)return;if(bSystemRestore&&!bTempSkipSysRestore)SetSystemRestorePoint(hwndDlg,TRUE);if(bOK)PostMessage(hwndDlg,TC_APPMSG_UNINSTALL_SUCCESS,0,0);elsebUninstallInProgress=FALSE;EnableWindow(GetDlgItem((HWND)hwndDlg,IDC_UNINSTALL),TRUE);OutcomePrompt(hwndDlg,bOK);}voidDoInstall(void*arg){HWNDhwndDlg=(HWND)arg;BOOLbOK=TRUE;wchar_tpath[MAX_PATH];BootEncryptionbootEnc(hwndDlg);// Refresh the main GUI (wizard thread)InvalidateRect(MainDlg,NULL,TRUE);ClearLogWindow(hwndDlg);if(mkfulldir(InstallationPath,TRUE)!=0){if(mkfulldir(InstallationPath,FALSE)!=0){wchar_tszTmp[TC_MAX_PATH];handleWin32Error(hwndDlg,SRC_POS);StringCbPrintfW(szTmp,sizeof(szTmp),GetString("CANT_CREATE_FOLDER"),InstallationPath);MessageBoxW(hwndDlg,szTmp,lpszTitle,MB_ICONHAND);Error("INSTALL_FAILED",hwndDlg);PostMessage(MainDlg,TC_APPMSG_INSTALL_FAILURE,0,0);return;}}UpdateProgressBarProc(2);if(DoDriverUnload(hwndDlg)==FALSE){NormalCursor();PostMessage(MainDlg,TC_APPMSG_INSTALL_FAILURE,0,0);return;}if(bUpgrade&&(IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L".exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L"-x86.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L"-x64.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L" Format.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L" Format-x86.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L" Format-x64.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L"Expander.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L"Expander-x86.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L"Expander-x64.exe")||IsFileInUse(wstring(InstallationPath)+L'\\'+_T(TC_APP_NAME)L" Setup.exe"))){NormalCursor();Error("CLOSE_TC_FIRST",hwndDlg);PostMessage(MainDlg,TC_APPMSG_INSTALL_FAILURE,0,0);return;}UpdateProgressBarProc(12);if(bSystemRestore)SetSystemRestorePoint(hwndDlg,FALSE);UpdateProgressBarProc(48);if(bDisableSwapFiles&&IsPagingFileActive(FALSE)){if(!DisablePagingFile()){handleWin32Error(hwndDlg,SRC_POS);Error("FAILED_TO_DISABLE_PAGING_FILES",hwndDlg);}elsebRestartRequired=TRUE;}UpdateProgressBarProc(50);// Remove deprecatedDoServiceUninstall(hwndDlg,L"VeraCryptService");UpdateProgressBarProc(55);if(!SystemEncryptionUpdate)DoRegUninstall((HWND)hwndDlg,TRUE);UpdateProgressBarProc(61);GetWindowsDirectory(path,ARRAYSIZE(path));StringCbCatW(path,sizeof(path),L"\\VeraCrypt Setup.exe");StatDeleteFile(path,FALSE);if(UpdateProgressBarProc(63)&&UnloadDriver&&DoServiceUninstall(hwndDlg,L"veracrypt")==FALSE){bOK=FALSE;}elseif(UpdateProgressBarProc(72)&&DoFilesInstall((HWND)hwndDlg,InstallationPath)==FALSE){bOK=FALSE;}elseif(UpdateProgressBarProc(80)&&DoRegInstall((HWND)hwndDlg,InstallationPath,bRegisterFileExt)==FALSE){bOK=FALSE;}elseif(UpdateProgressBarProc(85)&&UnloadDriver&&DoDriverInstall(hwndDlg)==FALSE){bOK=FALSE;}elseif(UpdateProgressBarProc(90)&&SystemEncryptionUpdate&&UpgradeBootLoader(hwndDlg)==FALSE){bOK=FALSE;}elseif(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",hwndDlg);}}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 requiredif(bUpgrade){SavePostInstallTasksSettings(TC_POST_INSTALL_CFG_RELEASE_NOTES);}elseif(bPossiblyFirstTimeInstall){SavePostInstallTasksSettings(TC_POST_INSTALL_CFG_TUTORIAL);}}else{// No restart will be requiredif(bUpgrade){bPromptReleaseNotes=TRUE;}elseif(bPossiblyFirstTimeInstall){bPromptTutorial=TRUE;}}}}PostMessage(MainDlg,bOK?TC_APPMSG_INSTALL_SUCCESS:TC_APPMSG_INSTALL_FAILURE,0,0);}voidSetInstallationPath(HWNDhwndDlg){HKEYhkey;BOOLbInstallPathDetermined=FALSE;wchar_tpath[MAX_PATH+20];ITEMIDLIST*itemList;memset(InstallationPath,0,sizeof(InstallationPath));// Determine if VeraCrypt is already installed and try to determine its "Program Files" locationif(RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt",0,KEY_READ|KEY_WOW64_32KEY,&hkey)==ERROR_SUCCESS){/* Default 'UninstallString' registry strings written by VeraCrypt: ------------------------------------------------------------------------------------ 5.0+ "C:\Program Files\VeraCrypt\VeraCrypt Setup.exe" /u */wchar_trv[MAX_PATH*4];DWORDsize=sizeof(rv);if(RegQueryValueEx(hkey,L"UninstallString",0,0,(LPBYTE)&rv,&size)==ERROR_SUCCESS&&wcsrchr(rv,L'/')){size_tlen=0;// Cut and paste the location (path) where VeraCrypt is installed to InstallationPathif(rv[0]==L'"'){len=wcsrchr(rv,L'/')-rv-2;StringCchCopyNW(InstallationPath,ARRAYSIZE(InstallationPath),rv+1,len);InstallationPath[len]=0;bInstallPathDetermined=TRUE;if(InstallationPath[wcslen(InstallationPath)-1]!=L'\\'){len=wcsrchr(InstallationPath,L'\\')-InstallationPath;InstallationPath[len]=0;}}}RegCloseKey(hkey);}if(bInstallPathDetermined){wchar_tmp[MAX_PATH];// Determine whether we were launched from the folder where VeraCrypt is installedGetModuleFileName(NULL,mp,ARRAYSIZE(mp));if(wcsncmp(InstallationPath,mp,min(wcslen(InstallationPath),wcslen(mp)))==0){// We were launched from the folder where VeraCrypt is installedif(!IsNonInstallMode()&&!bDevm)bChangeMode=TRUE;}}else{/* VeraCrypt 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)wstrings=path;size_tp=s.find(L" (x86)");if(p!=wstring::npos){s=s.substr(0,p);if(_waccess(s.c_str(),0)!=-1)StringCbCopyW(path,sizeof(path),s.c_str());}}StringCbCatW(path,sizeof(path),L"\\VeraCrypt\\");StringCbCopyW(InstallationPath,sizeof(InstallationPath),path);}// Make sure the path ends with a backslashif(InstallationPath[wcslen(InstallationPath)-1]!=L'\\'){StringCbCatW(InstallationPath,sizeof(InstallationPath),L"\\");}}// Handler for uninstall only (install is handled by the wizard)BOOLCALLBACKUninstallDlgProc(HWNDhwndDlg,UINTmsg,WPARAMwParam,LPARAMlParam){WORDlw=LOWORD(wParam);switch(msg){caseWM_INITDIALOG:MainDlg=hwndDlg;if(!CreateAppSetupMutex())AbortProcess("TC_INSTALLER_IS_RUNNING");InitDialog(hwndDlg);LocalizeDialog(hwndDlg,NULL);SetWindowTextW(hwndDlg,lpszTitle);// System RestoreSetCheckBox(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));return1;caseWM_SYSCOMMAND:if(lw==IDC_ABOUT){DialogBoxW(hInst,MAKEINTRESOURCEW(IDD_ABOUT_DLG),hwndDlg,(DLGPROC)AboutDlgProc);return1;}return0;caseWM_COMMAND:if(lw==IDC_UNINSTALL){if(bDone){bUninstallInProgress=FALSE;PostMessage(hwndDlg,WM_CLOSE,0,0);return1;}bUninstallInProgress=TRUE;WaitCursor();if(bUninstall)_beginthread(DoUninstall,0,(void*)hwndDlg);return1;}if(lw==IDC_SYSTEM_RESTORE){bSystemRestore=IsButtonChecked(GetDlgItem(hwndDlg,IDC_SYSTEM_RESTORE));return1;}if(lw==IDCANCEL){PostMessage(hwndDlg,WM_CLOSE,0,0);return1;}return0;caseTC_APPMSG_UNINSTALL_SUCCESS:SetWindowTextW(GetDlgItem((HWND)hwndDlg,IDC_UNINSTALL),GetString("FINALIZE"));NormalCursor();return1;caseWM_CLOSE:if(bUninstallInProgress){NormalCursor();if(AskNoYes("CONFIRM_EXIT_UNIVERSAL",hwndDlg)==IDNO){return1;}WaitCursor();}EndDialog(hwndDlg,IDCANCEL);return1;}return0;}intWINAPIwWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,wchar_t*lpszCommandLine,intnCmdShow){atexit(localcleanup);SelfExtractStartupInit();lpszTitle=L"VeraCrypt Setup";/* 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){FinalizeApp();exit(1);}/* Setup directory */{wchar_t*s;GetModuleFileName(NULL,SetupFilesDir,ARRAYSIZE(SetupFilesDir));s=wcsrchr(SetupFilesDir,L'\\');if(s)s[1]=0;}/* Parse command line arguments */if(lpszCommandLine[0]==L'/'){if(lpszCommandLine[1]==L'u'){// Uninstall: /ubUninstall=TRUE;}elseif(lpszCommandLine[1]==L'c'){// Change: /cbChangeMode=TRUE;}elseif(lpszCommandLine[1]==L'p'){// Create self-extracting package: /pbMakePackage=TRUE;}elseif(lpszCommandLine[1]==L'd'){// Dev mode: /dbDevm=TRUE;}}if(bMakePackage){/* Create self-extracting package */MakeSelfExtractingPackage(NULL,SetupFilesDir);}else{SetInstallationPath(NULL);if(!bUninstall){if(IsSelfExtractingPackage()){if(!VerifyPackageIntegrity()){// Package corruptedexit(1);}bDevm=FALSE;}elseif(!bDevm){MessageBox(NULL,L"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",L"VeraCrypt",MB_ICONERROR|MB_SETFOREGROUND|MB_TOPMOST);FinalizeApp();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 Unistallationswitch(AskMultiChoice((void**)tmpStr,FALSE,NULL)){case1:bRepairMode=TRUE;break;case2:bUninstall=TRUE;break;default:FinalizeApp();exit(1);}}}// System Restoreif(IsSystemRestoreEnabled()){wchar_tdllPath[MAX_PATH];if(GetSystemDirectory(dllPath,MAX_PATH)){StringCbCatW(dllPath,sizeof(dllPath),L"\\srclient.dll");}elseStringCbCopyW(dllPath,sizeof(dllPath),L"C:\\Windows\\System32\\srclient.dll");SystemRestoreDll=LoadLibrary(dllPath);}elseSystemRestoreDll=0;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]){STARTUPINFOsi;PROCESS_INFORMATIONpi;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);}}}}FinalizeApp();return0;}