1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2025-11-11 11:08:02 -06:00

Windows: Implement detection of Hibernate and Fast Startup and disable them if RAM encryption is activated.

This commit is contained in:
Mounir IDRASSI
2020-07-21 10:59:44 +02:00
parent 425e4e7d36
commit f9782fb3f6
4 changed files with 112 additions and 0 deletions

View File

@@ -14896,3 +14896,76 @@ void PasswordEditDropTarget::GotDrop(CLIPFORMAT format)
}
}
/*
* Query the status of Hibernate and Fast Startup
*/
typedef BOOLEAN (WINAPI *GetPwrCapabilitiesFn)(
PSYSTEM_POWER_CAPABILITIES lpspc
);
BOOL GetHibernateStatus (BOOL& bHibernateEnabled, BOOL& bHiberbootEnabled)
{
wchar_t szPowrProfPath[MAX_PATH] = {0};
HMODULE hPowrProf = NULL;
BOOL bResult = FALSE;
bHibernateEnabled = bHiberbootEnabled = FALSE;
if (GetSystemDirectory(szPowrProfPath, MAX_PATH))
StringCchCatW (szPowrProfPath, MAX_PATH, L"\\PowrProf.dll");
else
StringCchCopyW (szPowrProfPath, MAX_PATH, L"C:\\Windows\\System32\\PowrProf.dll");
hPowrProf = LoadLibrary (szPowrProfPath);
if (hPowrProf)
{
GetPwrCapabilitiesFn GetPwrCapabilitiesPtr = (GetPwrCapabilitiesFn) GetProcAddress (hPowrProf, "GetPwrCapabilities");
if ( GetPwrCapabilitiesPtr)
{
SYSTEM_POWER_CAPABILITIES spc;
BOOLEAN bRet = GetPwrCapabilitiesPtr (&spc);
if (bRet)
{
DWORD dwHibernateEnabled = 0;
DWORD dwHiberbootEnabled = 0;
if (spc.SystemS4)
{
dwHibernateEnabled = 1;
if(!ReadLocalMachineRegistryDword (L"SYSTEM\\CurrentControlSet\\Control\\Power", L"HibernateEnabled", &dwHibernateEnabled))
{
// starting from Windows 10 1809 (Build 17763), HibernateEnabledDefault is used when HibernateEnabled is absent
if (IsOSVersionAtLeast (WIN_10, 0) && CurrentOSBuildNumber >= 17763)
ReadLocalMachineRegistryDword (L"SYSTEM\\CurrentControlSet\\Control\\Power", L"HibernateEnabledDefault", &dwHibernateEnabled);
}
}
// check if Fast Startup / Hybrid Boot is enabled
if (IsOSVersionAtLeast (WIN_8, 0) && spc.spare2[0])
{
dwHiberbootEnabled = 1;
ReadLocalMachineRegistryDword (L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power", L"HiberbootEnabled", &dwHiberbootEnabled);
}
if (dwHibernateEnabled)
bHibernateEnabled = TRUE;
else
bHibernateEnabled = FALSE;
if (dwHiberbootEnabled)
bHiberbootEnabled = TRUE;
else
bHiberbootEnabled = FALSE;
bResult = TRUE;
}
}
FreeLibrary (hPowrProf);
}
return bResult;
}