From 587e6db4f16291d8b6f22d0937a4bff87bc8ffc0 Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Wed, 22 Jul 2020 17:04:32 +0200 Subject: Windows: Warn about Fast Startup if it is enabled during system encryption or volume creation and propose to disable it --- src/Format/FormatCom.cpp | 39 +++++++++++++++++++++++++++++++++++++++ src/Format/FormatCom.h | 1 + src/Format/Tcformat.c | 18 ++++++++++++++++++ 3 files changed, 58 insertions(+) (limited to 'src/Format') diff --git a/src/Format/FormatCom.cpp b/src/Format/FormatCom.cpp index 10757765..4acf7a3e 100644 --- a/src/Format/FormatCom.cpp +++ b/src/Format/FormatCom.cpp @@ -291,3 +291,42 @@ extern "C" int UacAnalyzeHiddenVolumeHost (HWND hwndDlg, int *driveNo, __int64 h return r; } + +extern "C" BOOL UacWriteLocalMachineRegistryDword (HWND hwndDlg, wchar_t *keyPath, wchar_t *valueName, DWORD value) +{ + CComPtr tc; + int r = 0; + + CoInitialize (NULL); + + if (ComGetInstance (hwndDlg, &tc)) + { + CComBSTR keyPathBstr, valueNameBstr; + BSTR bstr = W2BSTR(keyPath); + if (bstr) + { + keyPathBstr.Attach (bstr); + bstr = W2BSTR(valueName); + if (bstr) + { + valueNameBstr.Attach (bstr); + r = tc->WriteLocalMachineRegistryDwordValue (keyPathBstr, valueNameBstr, value); + } + else + r = ERROR_OUTOFMEMORY; + } + else + r = ERROR_OUTOFMEMORY; + } + + CoUninitialize (); + + if (r == ERROR_SUCCESS) + return TRUE; + else + { + SetLastError (r); + return FALSE; + } +} + diff --git a/src/Format/FormatCom.h b/src/Format/FormatCom.h index 5f03961b..5ab6bd52 100644 --- a/src/Format/FormatCom.h +++ b/src/Format/FormatCom.h @@ -29,6 +29,7 @@ int UacFormatFs (HWND hWnd, int driveNo, int clusterSize, int fsType); int UacAnalyzeHiddenVolumeHost (HWND hwndDlg, int *driveNo, __int64 hiddenVolHostSize, int *realClusterSize, __int64 *nbrFreeClusters); int UacFormatVolume (char *cvolumePath , BOOL bDevice , unsigned __int64 size , unsigned __int64 hiddenVolHostSize , Password *password , int cipher , int pkcs5 , BOOL quickFormat, BOOL sparseFileSwitch, int fileSystem , int clusterSize, HWND hwndDlg , BOOL hiddenVol , int *realClusterSize); BOOL UacUpdateProgressBar (__int64 nSecNo, BOOL *bVolTransformThreadCancel); +BOOL UacWriteLocalMachineRegistryDword (HWND hwndDlg, wchar_t *keyPath, wchar_t *valueName, DWORD value); #ifdef __cplusplus } diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c index 6a31883c..69118669 100644 --- a/src/Format/Tcformat.c +++ b/src/Format/Tcformat.c @@ -8453,6 +8453,7 @@ retryCDDriveCheck: else if (nCurPageNo == FORMAT_PAGE) { /* Format start (the 'Next' button has been clicked on the Format page) */ + static BOOL g_bFastStartupCheckDone = FALSE; if (bVolTransformThreadRunning || bVolTransformThreadToRun) return 1; @@ -8461,6 +8462,23 @@ retryCDDriveCheck: bVolTransformThreadToRun = TRUE; + // check if Fast Startup is enabled and if yes then offer to disable it + if (!g_bFastStartupCheckDone) + { + BOOL bHibernateEnabled = FALSE, bHiberbootEnabled = FALSE; + if (GetHibernateStatus (bHibernateEnabled, bHiberbootEnabled) && bHiberbootEnabled) + { + if (AskWarnYesNo ("CONFIRM_DISABLE_FAST_STARTUP", hwndDlg) == IDYES) + { + if (!IsAdmin () && IsUacSupported ()) + UacWriteLocalMachineRegistryDword (hwndDlg, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power", L"HiberbootEnabled", 0); + else + WriteLocalMachineRegistryDword (L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power", L"HiberbootEnabled", 0); + } + } + g_bFastStartupCheckDone = true; + } + fileSystem = (int) SendMessage (GetDlgItem (hCurPage, IDC_FILESYS), CB_GETITEMDATA, SendMessage (GetDlgItem (hCurPage, IDC_FILESYS), CB_GETCURSEL, 0, 0) , 0); -- cgit v1.2.3