mirror of
https://github.com/veracrypt/VeraCrypt
synced 2024-11-10 13:13:34 +01:00
Windows: remove crash dump analysis functionality. It didn't always work and it required external debugging tools.
This commit is contained in:
parent
330bed0c42
commit
138d22a254
@ -67,12 +67,6 @@ class TrueCryptMainCom : public ITrueCryptMainCom
|
|||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void STDMETHODCALLTYPE AnalyzeKernelMiniDump (LONG_PTR hwndDlg)
|
|
||||||
{
|
|
||||||
MainDlg = (HWND) hwndDlg;
|
|
||||||
::AnalyzeKernelMiniDump ((HWND) hwndDlg);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume)
|
virtual int STDMETHODCALLTYPE BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume)
|
||||||
{
|
{
|
||||||
USES_CONVERSION;
|
USES_CONVERSION;
|
||||||
@ -230,23 +224,6 @@ ITrueCryptMainCom *GetElevatedInstance (HWND parent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" void UacAnalyzeKernelMiniDump (HWND hwndDlg)
|
|
||||||
{
|
|
||||||
CComPtr<ITrueCryptMainCom> tc;
|
|
||||||
|
|
||||||
CoInitialize (NULL);
|
|
||||||
|
|
||||||
if (ComGetInstance (hwndDlg, &tc))
|
|
||||||
{
|
|
||||||
WaitCursor();
|
|
||||||
tc->AnalyzeKernelMiniDump ((LONG_PTR) hwndDlg);
|
|
||||||
NormalCursor();
|
|
||||||
}
|
|
||||||
|
|
||||||
CoUninitialize ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume)
|
extern "C" int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume)
|
||||||
{
|
{
|
||||||
CComPtr<ITrueCryptMainCom> tc;
|
CComPtr<ITrueCryptMainCom> tc;
|
||||||
|
@ -20,7 +20,6 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
BOOL ComServerMain ();
|
BOOL ComServerMain ();
|
||||||
void UacAnalyzeKernelMiniDump (HWND hwndDlg);
|
|
||||||
int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume);
|
int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, char *lpszVolume);
|
||||||
int UacRestoreVolumeHeader (HWND hwndDlg, char *lpszVolume);
|
int UacRestoreVolumeHeader (HWND hwndDlg, char *lpszVolume);
|
||||||
int UacChangePwd (char *lpszVolume, Password *oldPassword, int old_pkcs5, BOOL truecryptMode, Password *newPassword, int pkcs5, int wipePassCount, HWND hwndDlg);
|
int UacChangePwd (char *lpszVolume, Password *oldPassword, int old_pkcs5, BOOL truecryptMode, Password *newPassword, int pkcs5, int wipePassCount, HWND hwndDlg);
|
||||||
|
@ -12,7 +12,7 @@ import "..\Common\Password.h";
|
|||||||
[
|
[
|
||||||
uuid(9ACF6176-5FC4-4690-A025-B3306A50EB6A),
|
uuid(9ACF6176-5FC4-4690-A025-B3306A50EB6A),
|
||||||
helpstring("VeraCrypt Main UAC Support Library"),
|
helpstring("VeraCrypt Main UAC Support Library"),
|
||||||
version(2.6) // Update ComSetup.cpp when changing version number
|
version(2.7) // Update ComSetup.cpp when changing version number
|
||||||
]
|
]
|
||||||
library TrueCryptMainCom
|
library TrueCryptMainCom
|
||||||
{
|
{
|
||||||
@ -24,7 +24,6 @@ library TrueCryptMainCom
|
|||||||
]
|
]
|
||||||
interface ITrueCryptMainCom : IUnknown
|
interface ITrueCryptMainCom : IUnknown
|
||||||
{
|
{
|
||||||
void AnalyzeKernelMiniDump (LONG_PTR hwndDlg);
|
|
||||||
int BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume);
|
int BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume);
|
||||||
DWORD CallDriver (DWORD ioctl, BSTR input, BSTR *output);
|
DWORD CallDriver (DWORD ioctl, BSTR input, BSTR *output);
|
||||||
int ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd);
|
int ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd);
|
||||||
|
@ -107,8 +107,6 @@ BOOL bDisplayBalloonOnSuccessfulHkDismount = TRUE;
|
|||||||
BOOL bHibernationPreventionNotified = FALSE; /* TRUE if the user has been notified that hibernation was prevented (system encryption) during the session. */
|
BOOL bHibernationPreventionNotified = FALSE; /* TRUE if the user has been notified that hibernation was prevented (system encryption) during the session. */
|
||||||
BOOL bHiddenSysLeakProtNotifiedDuringSession = FALSE; /* TRUE if the user has been notified during the session that unencrypted filesystems and non-hidden TrueCrypt volumes are mounted as read-only under hidden OS. */
|
BOOL bHiddenSysLeakProtNotifiedDuringSession = FALSE; /* TRUE if the user has been notified during the session that unencrypted filesystems and non-hidden TrueCrypt volumes are mounted as read-only under hidden OS. */
|
||||||
BOOL CloseSecurityTokenSessionsAfterMount = FALSE;
|
BOOL CloseSecurityTokenSessionsAfterMount = FALSE;
|
||||||
BOOL DisableSystemCrashDetection = FALSE;
|
|
||||||
BOOL SystemCrashDetected = FALSE;
|
|
||||||
|
|
||||||
BOOL Quit = FALSE; /* Exit after processing command line */
|
BOOL Quit = FALSE; /* Exit after processing command line */
|
||||||
BOOL ComServerMode = FALSE;
|
BOOL ComServerMode = FALSE;
|
||||||
@ -691,7 +689,6 @@ void LoadSettings (HWND hwndDlg)
|
|||||||
mountOptions = defaultMountOptions;
|
mountOptions = defaultMountOptions;
|
||||||
|
|
||||||
CloseSecurityTokenSessionsAfterMount = ConfigReadInt ("CloseSecurityTokenSessionsAfterMount", 0);
|
CloseSecurityTokenSessionsAfterMount = ConfigReadInt ("CloseSecurityTokenSessionsAfterMount", 0);
|
||||||
DisableSystemCrashDetection = ConfigReadInt ("DisableSystemCrashDetection", FALSE);
|
|
||||||
|
|
||||||
if (IsHiddenOSRunning())
|
if (IsHiddenOSRunning())
|
||||||
HiddenSysLeakProtectionNotificationStatus = ConfigReadInt ("HiddenSystemLeakProtNotifStatus", TC_HIDDEN_OS_READ_ONLY_NOTIF_MODE_NONE);
|
HiddenSysLeakProtectionNotificationStatus = ConfigReadInt ("HiddenSystemLeakProtNotifStatus", TC_HIDDEN_OS_READ_ONLY_NOTIF_MODE_NONE);
|
||||||
@ -795,7 +792,6 @@ void SaveSettings (HWND hwndDlg)
|
|||||||
ConfigWriteString ("LastSelectedDrive", szTmp);
|
ConfigWriteString ("LastSelectedDrive", szTmp);
|
||||||
|
|
||||||
ConfigWriteInt ("CloseSecurityTokenSessionsAfterMount", CloseSecurityTokenSessionsAfterMount);
|
ConfigWriteInt ("CloseSecurityTokenSessionsAfterMount", CloseSecurityTokenSessionsAfterMount);
|
||||||
ConfigWriteInt ("DisableSystemCrashDetection", DisableSystemCrashDetection);
|
|
||||||
|
|
||||||
// Hotkeys
|
// Hotkeys
|
||||||
ConfigWriteInt ("HotkeyModAutoMountDevices", Hotkeys[HK_AUTOMOUNT_DEVICES].vKeyModifiers);
|
ConfigWriteInt ("HotkeyModAutoMountDevices", Hotkeys[HK_AUTOMOUNT_DEVICES].vKeyModifiers);
|
||||||
@ -5730,56 +5726,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DisableSystemCrashDetection
|
|
||||||
&& IsOSAtLeast (WIN_7))
|
|
||||||
{
|
|
||||||
// Auto-detect a system crash
|
|
||||||
|
|
||||||
const int detectionPeriodInMonthsSinceReleaseDate = 2;
|
|
||||||
int maxYear = TC_RELEASE_DATE_YEAR;
|
|
||||||
int maxMonth = TC_RELEASE_DATE_MONTH + detectionPeriodInMonthsSinceReleaseDate;
|
|
||||||
if (maxMonth > 12)
|
|
||||||
{
|
|
||||||
++maxYear;
|
|
||||||
maxMonth -= 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
SYSTEMTIME systemTime;
|
|
||||||
GetSystemTime (&systemTime);
|
|
||||||
|
|
||||||
if (systemTime.wYear >= TC_RELEASE_DATE_YEAR
|
|
||||||
&& !(systemTime.wYear == TC_RELEASE_DATE_YEAR && systemTime.wMonth < TC_RELEASE_DATE_MONTH)
|
|
||||||
&& systemTime.wYear <= maxYear
|
|
||||||
&& !(systemTime.wYear == maxYear && systemTime.wMonth > maxMonth))
|
|
||||||
{
|
|
||||||
char winDir[MAX_PATH] = { 0 };
|
|
||||||
GetWindowsDirectory (winDir, sizeof (winDir));
|
|
||||||
|
|
||||||
WIN32_FIND_DATA findData;
|
|
||||||
HANDLE find = FindFirstFile ((string (winDir) + "\\MEMORY.DMP").c_str(), &findData);
|
|
||||||
|
|
||||||
if (find != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
SYSTEMTIME systemTime;
|
|
||||||
FILETIME ft;
|
|
||||||
GetSystemTime (&systemTime);
|
|
||||||
SystemTimeToFileTime (&systemTime, &ft);
|
|
||||||
|
|
||||||
ULARGE_INTEGER sysTime, fileTime;
|
|
||||||
sysTime.HighPart = ft.dwHighDateTime;
|
|
||||||
sysTime.LowPart = ft.dwLowDateTime;
|
|
||||||
fileTime.HighPart = findData.ftLastWriteTime.dwHighDateTime;
|
|
||||||
fileTime.LowPart = findData.ftLastWriteTime.dwLowDateTime;
|
|
||||||
|
|
||||||
// Memory dump must not be older than 10 minutes
|
|
||||||
if (sysTime.QuadPart - fileTime.QuadPart < 10I64 * 1000 * 1000 * 60 * 10)
|
|
||||||
SystemCrashDetected = TRUE;
|
|
||||||
|
|
||||||
FindClose (find);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TaskBarIconMutex != NULL)
|
if (TaskBarIconMutex != NULL)
|
||||||
RegisterWtsNotification(hwndDlg);
|
RegisterWtsNotification(hwndDlg);
|
||||||
DoPostInstallTasks (hwndDlg);
|
DoPostInstallTasks (hwndDlg);
|
||||||
@ -5892,30 +5838,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
|
|
||||||
if (TaskBarIconMutex != NULL)
|
if (TaskBarIconMutex != NULL)
|
||||||
{
|
{
|
||||||
// Handle system crash
|
|
||||||
static BOOL systemCrashHandlerLocked = FALSE;
|
|
||||||
if (SystemCrashDetected && !systemCrashHandlerLocked)
|
|
||||||
{
|
|
||||||
systemCrashHandlerLocked = TRUE;
|
|
||||||
|
|
||||||
SetForegroundWindow (hwndDlg);
|
|
||||||
MainWindowHidden = FALSE;
|
|
||||||
ShowWindow (hwndDlg, SW_SHOW);
|
|
||||||
ShowWindow (hwndDlg, SW_RESTORE);
|
|
||||||
|
|
||||||
if (AskYesNoTopmost ("SYSTEM_CRASHED_ASK_REPORT", hwndDlg) == IDYES)
|
|
||||||
{
|
|
||||||
if (!IsAdmin() && IsUacSupported())
|
|
||||||
UacAnalyzeKernelMiniDump (hwndDlg);
|
|
||||||
else
|
|
||||||
AnalyzeKernelMiniDump (hwndDlg);
|
|
||||||
}
|
|
||||||
else if (AskYesNoTopmost ("ASK_KEEP_DETECTING_SYSTEM_CRASH", hwndDlg) == IDNO)
|
|
||||||
{
|
|
||||||
DisableSystemCrashDetection = TRUE;
|
|
||||||
SaveSettings (hwndDlg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Idle auto-dismount
|
// Idle auto-dismount
|
||||||
if (MaxVolumeIdleTime > 0)
|
if (MaxVolumeIdleTime > 0)
|
||||||
@ -6971,15 +6893,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
Applink ("history", TRUE, "");
|
Applink ("history", TRUE, "");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (lw == IDM_ANALYZE_SYSTEM_CRASH)
|
|
||||||
{
|
|
||||||
if (!IsAdmin() && IsUacSupported())
|
|
||||||
UacAnalyzeKernelMiniDump (hwndDlg);
|
|
||||||
else
|
|
||||||
AnalyzeKernelMiniDump (hwndDlg);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else if (lw == IDM_CONTACT)
|
else if (lw == IDM_CONTACT)
|
||||||
{
|
{
|
||||||
Applink ("contact", FALSE, "");
|
Applink ("contact", FALSE, "");
|
||||||
@ -9677,429 +9590,6 @@ void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions)
|
|||||||
Warning ("SELECT_FREE_DRIVE", hwndDlg);
|
Warning ("SELECT_FREE_DRIVE", hwndDlg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BOOL GetExecutableImageInformation (const string &path, string &version, string &description, string &companyName, string &productName)
|
|
||||||
{
|
|
||||||
DWORD handle;
|
|
||||||
DWORD size = GetFileVersionInfoSize (path.c_str(), &handle);
|
|
||||||
if (size == 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
void *buf = err_malloc (size);
|
|
||||||
finally_do_arg (void*, buf, { free (finally_arg); });
|
|
||||||
|
|
||||||
if (!GetFileVersionInfo (path.c_str(), handle, size, buf))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
version = description = companyName = productName = "";
|
|
||||||
|
|
||||||
UINT varSize;
|
|
||||||
VS_FIXEDFILEINFO *fileInfo;
|
|
||||||
if (VerQueryValue (buf, "\\", (LPVOID *) &fileInfo, &varSize) && varSize > 0)
|
|
||||||
{
|
|
||||||
stringstream s;
|
|
||||||
s << HIWORD (fileInfo->dwFileVersionMS) << '.' << LOWORD (fileInfo->dwFileVersionMS) << '.' << HIWORD (fileInfo->dwFileVersionLS) << '.' << LOWORD (fileInfo->dwFileVersionLS);
|
|
||||||
version = s.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD *langCodes;
|
|
||||||
if (VerQueryValue (buf, "\\VarFileInfo\\Translation", (LPVOID *) &langCodes, &varSize) && varSize >= sizeof (DWORD))
|
|
||||||
{
|
|
||||||
char prefix[128];
|
|
||||||
sprintf_s (prefix, sizeof (prefix), "\\StringFileInfo\\%04x%04x\\", LOWORD (langCodes[0]), HIWORD (langCodes[0]));
|
|
||||||
|
|
||||||
char *str;
|
|
||||||
if (VerQueryValue (buf, (string (prefix) + "FileDescription").c_str(), (LPVOID *) &str, &varSize) && varSize > 0)
|
|
||||||
description = str;
|
|
||||||
|
|
||||||
if (VerQueryValue (buf, (string (prefix) + "CompanyName").c_str(), (LPVOID *) &str, &varSize) && varSize > 0)
|
|
||||||
companyName = str;
|
|
||||||
|
|
||||||
if (VerQueryValue (buf, (string (prefix) + "ProductName").c_str(), (LPVOID *) &str, &varSize) && varSize > 0)
|
|
||||||
productName = str;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AnalyzeKernelMiniDump (HWND hwndDlg)
|
|
||||||
{
|
|
||||||
char winDir[MAX_PATH] = { 0 };
|
|
||||||
GetWindowsDirectory (winDir, sizeof (winDir));
|
|
||||||
string memDumpPath = string (winDir) + "\\MEMORY.DMP";
|
|
||||||
string tmpDumpPath;
|
|
||||||
|
|
||||||
string dumpPath = FindLatestFileOrDirectory (string (winDir) + "\\Minidump", "*.dmp", false, true);
|
|
||||||
if (dumpPath.empty())
|
|
||||||
{
|
|
||||||
Error ("NO_MINIDUMP_FOUND", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WIN32_FIND_DATA findData;
|
|
||||||
HANDLE find = FindFirstFile (memDumpPath.c_str(), &findData);
|
|
||||||
|
|
||||||
if (find != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
ULARGE_INTEGER memDumpTime, miniDumpTime;
|
|
||||||
memDumpTime.HighPart = findData.ftLastWriteTime.dwHighDateTime;
|
|
||||||
memDumpTime.LowPart = findData.ftLastWriteTime.dwLowDateTime;
|
|
||||||
|
|
||||||
FindClose (find);
|
|
||||||
|
|
||||||
find = FindFirstFile (dumpPath.c_str(), &findData);
|
|
||||||
if (find != INVALID_HANDLE_VALUE)
|
|
||||||
{
|
|
||||||
miniDumpTime.HighPart = findData.ftLastWriteTime.dwHighDateTime;
|
|
||||||
miniDumpTime.LowPart = findData.ftLastWriteTime.dwLowDateTime;
|
|
||||||
|
|
||||||
if (_abs64 (miniDumpTime.QuadPart - memDumpTime.QuadPart) < 10I64 * 1000 * 1000 * 60 * 5)
|
|
||||||
{
|
|
||||||
// Rename MEMORY.DMP file first as it can be deleted by Windows when system crash dialog is closed
|
|
||||||
tmpDumpPath = memDumpPath + ".hd_crypt.dmp"; // Application name must be mangled to avoid interfering with crash analysis
|
|
||||||
|
|
||||||
if (MoveFile (memDumpPath.c_str(), tmpDumpPath.c_str()))
|
|
||||||
dumpPath = tmpDumpPath;
|
|
||||||
else
|
|
||||||
tmpDumpPath.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
FindClose (find);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
finally_do_arg2 (string, tmpDumpPath, string, memDumpPath,
|
|
||||||
{
|
|
||||||
if (!finally_arg.empty())
|
|
||||||
{
|
|
||||||
if (AskYesNo ("ASK_DELETE_KERNEL_CRASH_DUMP", MainDlg) == IDYES)
|
|
||||||
DeleteFile (finally_arg.c_str());
|
|
||||||
else
|
|
||||||
MoveFile (finally_arg.c_str(), finally_arg2.c_str());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
STARTUPINFO startupInfo;
|
|
||||||
PROCESS_INFORMATION procInfo;
|
|
||||||
|
|
||||||
ZeroMemory (&startupInfo, sizeof (startupInfo));
|
|
||||||
ZeroMemory (&procInfo, sizeof (procInfo));
|
|
||||||
|
|
||||||
if (!IsApplicationInstalled (Is64BitOs() ? "Debugging Tools for Windows (x64)" : "Debugging Tools for Windows (x86)"))
|
|
||||||
{
|
|
||||||
string sDbgCmd;
|
|
||||||
if (AskOkCancel ("ASK_DEBUGGER_INSTALL", hwndDlg) != IDOK)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (Is64BitOs())
|
|
||||||
sDbgCmd = "msiexec.exe /qb /i https://www.idrix.fr/Root/MSDebug/dbg_amd64_6.11.1.404.msi";
|
|
||||||
else
|
|
||||||
sDbgCmd = "msiexec.exe /qb /i https://www.idrix.fr/Root/MSDebug/dbg_x86_6.11.1.404.msi";
|
|
||||||
|
|
||||||
if (!CreateProcess (NULL, (LPSTR) sDbgCmd.c_str(),
|
|
||||||
NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &procInfo))
|
|
||||||
{
|
|
||||||
handleWin32Error (hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
WaitCursor();
|
|
||||||
WaitForSingleObject (procInfo.hProcess, INFINITE);
|
|
||||||
NormalCursor();
|
|
||||||
|
|
||||||
DWORD exitCode;
|
|
||||||
bool bExitCheck = (!GetExitCodeProcess (procInfo.hProcess, &exitCode) || exitCode != 0);
|
|
||||||
|
|
||||||
CloseHandle(procInfo.hProcess);
|
|
||||||
CloseHandle(procInfo.hThread);
|
|
||||||
|
|
||||||
if (bExitCheck)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AskOkCancel ("SYSTEM_CRASH_ANALYSIS_INFO", hwndDlg) == IDCANCEL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ZeroMemory (&startupInfo, sizeof (startupInfo));
|
|
||||||
ZeroMemory (&procInfo, sizeof (procInfo));
|
|
||||||
|
|
||||||
SECURITY_ATTRIBUTES securityAttrib;
|
|
||||||
securityAttrib.bInheritHandle = TRUE;
|
|
||||||
securityAttrib.nLength = sizeof (securityAttrib);
|
|
||||||
securityAttrib.lpSecurityDescriptor = NULL;
|
|
||||||
|
|
||||||
HANDLE hChildStdoutWrite = INVALID_HANDLE_VALUE;
|
|
||||||
HANDLE hChildStdoutRead = INVALID_HANDLE_VALUE;
|
|
||||||
if (!CreatePipe (&hChildStdoutRead, &hChildStdoutWrite, &securityAttrib, 0))
|
|
||||||
{
|
|
||||||
handleWin32Error (hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SetHandleInformation (hChildStdoutRead, HANDLE_FLAG_INHERIT, 0);
|
|
||||||
|
|
||||||
startupInfo.hStdInput = INVALID_HANDLE_VALUE;
|
|
||||||
startupInfo.hStdOutput = hChildStdoutWrite;
|
|
||||||
startupInfo.cb = sizeof (startupInfo);
|
|
||||||
startupInfo.hStdError = hChildStdoutWrite;
|
|
||||||
startupInfo.dwFlags |= STARTF_USESTDHANDLES;
|
|
||||||
|
|
||||||
list <string> kdPaths;
|
|
||||||
string kdPath;
|
|
||||||
char progPath[MAX_PATH];
|
|
||||||
if (SHGetSpecialFolderPath (hwndDlg, progPath, CSIDL_PROGRAM_FILES, FALSE))
|
|
||||||
{
|
|
||||||
if (Is64BitOs())
|
|
||||||
{
|
|
||||||
string s = progPath;
|
|
||||||
size_t p = s.find (" (x86)");
|
|
||||||
if (p != string::npos)
|
|
||||||
{
|
|
||||||
s = s.substr (0, p);
|
|
||||||
if (_access (s.c_str(), 0) != -1)
|
|
||||||
strcpy_s (progPath, sizeof (progPath), s.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
kdPath = string (progPath) + "\\Debugging Tools for Windows (" + (Is64BitOs() ? "x64" : "x86") + ")\\kd.exe";
|
|
||||||
kdPaths.push_back (kdPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
kdPath = FindLatestFileOrDirectory (string (winDir).substr (0, 1) + ":\\WinDDK", "*", true, false);
|
|
||||||
kdPath += "\\Debuggers\\kd.exe";
|
|
||||||
kdPaths.push_back (kdPath);
|
|
||||||
|
|
||||||
kdPaths.push_back ("kd.exe");
|
|
||||||
|
|
||||||
bool kdRunning = false;
|
|
||||||
foreach (const string &kdPath, kdPaths)
|
|
||||||
{
|
|
||||||
if (CreateProcess (NULL, (LPSTR) ("\"" + kdPath + "\" -z \"" + dumpPath + "\" -y http://msdl.microsoft.com/download/symbols -c \".bugcheck; !analyze -v; q\"").c_str(),
|
|
||||||
NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &startupInfo, &procInfo))
|
|
||||||
{
|
|
||||||
kdRunning = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!kdRunning)
|
|
||||||
{
|
|
||||||
handleWin32Error (hwndDlg);
|
|
||||||
Error ("DEBUGGER_NOT_FOUND", hwndDlg);
|
|
||||||
CloseHandle (procInfo.hProcess);
|
|
||||||
CloseHandle (procInfo.hThread);
|
|
||||||
CloseHandle (hChildStdoutRead);
|
|
||||||
CloseHandle (hChildStdoutWrite);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EnableElevatedCursorChange (hwndDlg);
|
|
||||||
WaitCursor();
|
|
||||||
|
|
||||||
CloseHandle (procInfo.hProcess);
|
|
||||||
CloseHandle (procInfo.hThread);
|
|
||||||
CloseHandle (hChildStdoutWrite);
|
|
||||||
|
|
||||||
string output;
|
|
||||||
BOOL bIsValidResponse = TRUE;
|
|
||||||
|
|
||||||
while (TRUE)
|
|
||||||
{
|
|
||||||
DWORD bytesReceived = 0, i;
|
|
||||||
char pipeBuffer [4096] = {0};
|
|
||||||
|
|
||||||
unsigned char uc;
|
|
||||||
|
|
||||||
if (!ReadFile (hChildStdoutRead, pipeBuffer, sizeof (pipeBuffer), &bytesReceived, NULL))
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* check if the buffer contains printable characters only*/
|
|
||||||
for (i = 0; i < bytesReceived; i++)
|
|
||||||
{
|
|
||||||
uc = (unsigned char) pipeBuffer [i];
|
|
||||||
if ( uc >= 0x7f || uc < 0x20) // A non-ASCII or non-printable character?
|
|
||||||
{
|
|
||||||
bIsValidResponse = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!bIsValidResponse)
|
|
||||||
break;
|
|
||||||
|
|
||||||
output.insert (output.size(), pipeBuffer, bytesReceived);
|
|
||||||
}
|
|
||||||
|
|
||||||
CloseHandle (hChildStdoutRead);
|
|
||||||
|
|
||||||
NormalCursor();
|
|
||||||
|
|
||||||
if (!bIsValidResponse)
|
|
||||||
{
|
|
||||||
Error ("ERR_PARAMETER_INCORRECT", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool otherDriver = (StringToUpperCase (output).find (StringToUpperCase (TC_APP_NAME)) == string::npos);
|
|
||||||
|
|
||||||
size_t p, p2;
|
|
||||||
while ((p = output.find ('`')) != string::npos)
|
|
||||||
output.erase (output.begin() + p);
|
|
||||||
|
|
||||||
p = output.find ("Bugcheck code ");
|
|
||||||
if (p == string::npos)
|
|
||||||
{
|
|
||||||
Error ("ERR_PARAMETER_INCORRECT", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 bugcheckCode;
|
|
||||||
int n = sscanf (output.substr (p + 14, 8).c_str(), "%I64uX", &bugcheckCode);
|
|
||||||
if (n != 1)
|
|
||||||
{
|
|
||||||
Error ("ERR_PARAMETER_INCORRECT", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = output.find ("Arguments ", p);
|
|
||||||
|
|
||||||
uint64 bugcheckArgs[4];
|
|
||||||
n = sscanf (output.substr (p + 10, (Is64BitOs() ? 17 : 9) * 4).c_str(), "%I64uX %I64uX %I64uX %I64uX", &bugcheckArgs[0], &bugcheckArgs[1], &bugcheckArgs[2], &bugcheckArgs[3]);
|
|
||||||
if (n != 4)
|
|
||||||
{
|
|
||||||
Error ("ERR_PARAMETER_INCORRECT", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Image name
|
|
||||||
string imageName, imageVersion;
|
|
||||||
p = output.find ("IMAGE_NAME:");
|
|
||||||
if (p != string::npos)
|
|
||||||
{
|
|
||||||
p += 13;
|
|
||||||
p2 = output.find ('\n', p);
|
|
||||||
if (p2 != string::npos)
|
|
||||||
imageName = output.substr (p, p2 - p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stack trace
|
|
||||||
p = output.find ("STACK_TEXT:");
|
|
||||||
if (p == string::npos)
|
|
||||||
{
|
|
||||||
Error ("ERR_PARAMETER_INCORRECT", hwndDlg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
p2 = output.find ("FOLLOWUP_IP:", p);
|
|
||||||
if (p2 == string::npos)
|
|
||||||
p2 = output.find ("STACK_COMMAND:", p);
|
|
||||||
if (p2 == string::npos)
|
|
||||||
p2 = output.size();
|
|
||||||
|
|
||||||
output = output.substr (p, p2 - p);
|
|
||||||
|
|
||||||
list <string> retAddrs;
|
|
||||||
p = 0;
|
|
||||||
while ((p = output.find ("+", p)) != string::npos)
|
|
||||||
{
|
|
||||||
size_t p1 = output.rfind (" ", p);
|
|
||||||
if (p1 == string::npos)
|
|
||||||
break;
|
|
||||||
|
|
||||||
p = output.find ('\n', p);
|
|
||||||
if (p == string::npos)
|
|
||||||
p = output.size() - 1;
|
|
||||||
|
|
||||||
string s = output.substr (p1 + 1, p - p1 - 1);
|
|
||||||
|
|
||||||
if (s.find ('(') == 0)
|
|
||||||
s = s.substr (1);
|
|
||||||
if (s.rfind (')') == s.size() - 1)
|
|
||||||
s = s.substr (0, s.size() - 1);
|
|
||||||
|
|
||||||
retAddrs.push_back (s);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
char url[MAX_URL_LENGTH];
|
|
||||||
sprintf (url, TC_APPLINK_SECURE "&dest=syserr-report&os=%s&osver=%d.%d.%d&arch=%s&err=%I64x&arg1=%I64x&arg2=%I64x&arg3=%I64x&arg4=%I64x&flag=%s&drv=%s",
|
|
||||||
GetWindowsEdition().c_str(),
|
|
||||||
CurrentOSMajor,
|
|
||||||
CurrentOSMinor,
|
|
||||||
CurrentOSServicePack,
|
|
||||||
Is64BitOs() ? "x64" : "x86",
|
|
||||||
bugcheckCode,
|
|
||||||
bugcheckArgs[0],
|
|
||||||
bugcheckArgs[1],
|
|
||||||
bugcheckArgs[2],
|
|
||||||
bugcheckArgs[3],
|
|
||||||
otherDriver ? "0" : "1",
|
|
||||||
imageName.empty() ? "-" : imageName.c_str()
|
|
||||||
);
|
|
||||||
*/
|
|
||||||
stringstream stackTraceArgs;
|
|
||||||
int i = 0;
|
|
||||||
foreach (const string &retAddr, retAddrs)
|
|
||||||
{
|
|
||||||
stackTraceArgs << "&st" << i++ << "=" << retAddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
wstring msg;
|
|
||||||
|
|
||||||
if (!imageName.empty() && StringToUpperCase (imageName) != StringToUpperCase (TC_APP_NAME) + ".SYS")
|
|
||||||
{
|
|
||||||
msg += wstring (GetString ("SYSTEM_CRASH_UPDATE_DRIVER")) + L"\n\n" + SingleStringToWide (imageName);
|
|
||||||
|
|
||||||
string description, company, product;
|
|
||||||
if (GetExecutableImageInformation (string (winDir) + "\\System32\\drivers\\" + imageName, imageVersion, description, company, product))
|
|
||||||
{
|
|
||||||
string s;
|
|
||||||
if (!description.empty())
|
|
||||||
s += description;
|
|
||||||
if (!company.empty())
|
|
||||||
s += "; " + company;
|
|
||||||
if (!product.empty())
|
|
||||||
s += "; " + product;
|
|
||||||
|
|
||||||
if (s.find ("; ") == 0)
|
|
||||||
s = s.substr (3);
|
|
||||||
|
|
||||||
if (!s.empty())
|
|
||||||
msg += SingleStringToWide (" (" + s + ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
msg += L"\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (otherDriver)
|
|
||||||
{
|
|
||||||
msg += GetString ("SYSTEM_CRASH_NO_VERACRYPT");
|
|
||||||
msg += L"\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
InfoDirect(msg.c_str(), hwndDlg);
|
|
||||||
/*
|
|
||||||
string urlStr = string (url) + "&drvver=" + (imageVersion.empty() ? "-" : imageVersion) + stackTraceArgs.str();
|
|
||||||
|
|
||||||
for (size_t i = 0; i < urlStr.size(); ++i)
|
|
||||||
{
|
|
||||||
if (urlStr[i] == '+')
|
|
||||||
urlStr[i] = '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
msg += GetString ("SYSTEM_CRASH_REPORT");
|
|
||||||
msg += L"\n\n";
|
|
||||||
|
|
||||||
msg += SingleStringToWide (urlStr);
|
|
||||||
|
|
||||||
msg += L"\n\n";
|
|
||||||
msg += GetString ("ASK_SEND_ERROR_REPORT");
|
|
||||||
|
|
||||||
if (AskYesNoString (msg.c_str()) == IDYES)
|
|
||||||
ShellExecute (NULL, "open", urlStr.c_str(), NULL, NULL, SW_SHOWNORMAL);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static BOOL HandleDriveListMouseWheelEvent (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bListMustBePointed)
|
static BOOL HandleDriveListMouseWheelEvent (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bListMustBePointed)
|
||||||
{
|
{
|
||||||
static BOOL eventHandlerActive = FALSE;
|
static BOOL eventHandlerActive = FALSE;
|
||||||
|
@ -107,7 +107,6 @@ static BOOL CALLBACK PerformanceSettingsDlgProc (HWND hwndDlg, UINT msg, WPARAM
|
|||||||
static BOOL CALLBACK BootLoaderPreferencesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
static BOOL CALLBACK BootLoaderPreferencesDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions);
|
void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions);
|
||||||
uint32 ReadDriverConfigurationFlags ();
|
uint32 ReadDriverConfigurationFlags ();
|
||||||
void AnalyzeKernelMiniDump (HWND hwndDlg);
|
|
||||||
void HookMouseWheel (HWND hwndDlg, UINT ctrlId);
|
void HookMouseWheel (HWND hwndDlg, UINT ctrlId);
|
||||||
static BOOL HandleDriveListMouseWheelEvent (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bListMustBePointed);
|
static BOOL HandleDriveListMouseWheelEvent (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bListMustBePointed);
|
||||||
static BOOL CALLBACK DefaultMountParametersDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
static BOOL CALLBACK DefaultMountParametersDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||||
@ -126,6 +125,5 @@ typedef struct
|
|||||||
void SetDriverConfigurationFlag (uint32 flag, BOOL state);
|
void SetDriverConfigurationFlag (uint32 flag, BOOL state);
|
||||||
BOOL MountFavoriteVolumes (BOOL systemFavorites = FALSE, BOOL logOnMount = FALSE, BOOL hotKeyMount = FALSE, const VeraCrypt::FavoriteVolume &favoriteVolumeToMount = VeraCrypt::FavoriteVolume());
|
BOOL MountFavoriteVolumes (BOOL systemFavorites = FALSE, BOOL logOnMount = FALSE, BOOL hotKeyMount = FALSE, const VeraCrypt::FavoriteVolume &favoriteVolumeToMount = VeraCrypt::FavoriteVolume());
|
||||||
void __cdecl mountFavoriteVolumeThreadFunction (void *pArg);
|
void __cdecl mountFavoriteVolumeThreadFunction (void *pArg);
|
||||||
BOOL GetExecutableImageInformation (const string &path, string &version, string &description, string &companyName, string &productName);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -634,8 +634,6 @@ BEGIN
|
|||||||
MENUITEM "News", IDM_NEWS
|
MENUITEM "News", IDM_NEWS
|
||||||
MENUITEM "Version History", IDM_VERSION_HISTORY
|
MENUITEM "Version History", IDM_VERSION_HISTORY
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Analyze a System Crash...", IDM_ANALYZE_SYSTEM_CRASH
|
|
||||||
MENUITEM SEPARATOR
|
|
||||||
MENUITEM "Donate now...", IDM_DONATE
|
MENUITEM "Donate now...", IDM_DONATE
|
||||||
MENUITEM "Contact", IDM_CONTACT
|
MENUITEM "Contact", IDM_CONTACT
|
||||||
MENUITEM "Legal Notices", IDM_LICENSE
|
MENUITEM "Legal Notices", IDM_LICENSE
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define TC_MAIN_COM_VERSION_MAJOR 2
|
#define TC_MAIN_COM_VERSION_MAJOR 2
|
||||||
#define TC_MAIN_COM_VERSION_MINOR 6
|
#define TC_MAIN_COM_VERSION_MINOR 7
|
||||||
|
|
||||||
#define TC_FORMAT_COM_VERSION_MAJOR 2
|
#define TC_FORMAT_COM_VERSION_MAJOR 2
|
||||||
#define TC_FORMAT_COM_VERSION_MINOR 4
|
#define TC_FORMAT_COM_VERSION_MINOR 4
|
||||||
@ -35,6 +35,7 @@ extern "C" BOOL RegisterComServers (char *modulePath)
|
|||||||
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR, 0, SYS_WIN32);
|
||||||
UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32);
|
||||||
// unregister older versions that may still exist
|
// unregister older versions that may still exist
|
||||||
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-3, 0, SYS_WIN32);
|
||||||
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-2, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-2, 0, SYS_WIN32);
|
||||||
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-1, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-1, 0, SYS_WIN32);
|
||||||
|
|
||||||
@ -72,6 +73,7 @@ extern "C" BOOL UnregisterComServers (char *modulePath)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
// unregister older versions that may still exist
|
// unregister older versions that may still exist
|
||||||
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-3, 0, SYS_WIN32);
|
||||||
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-2, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-2, 0, SYS_WIN32);
|
||||||
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-1, 0, SYS_WIN32);
|
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-1, 0, SYS_WIN32);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user