Windows: remove crash dump analysis functionality. It didn't always work and it required external debugging tools.

This commit is contained in:
Mounir IDRASSI 2015-05-20 07:08:03 +02:00
parent 330bed0c42
commit 138d22a254
7 changed files with 4 additions and 541 deletions

View File

@ -67,12 +67,6 @@ class TrueCryptMainCom : public ITrueCryptMainCom
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)
{
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)
{
CComPtr<ITrueCryptMainCom> tc;

View File

@ -20,7 +20,6 @@ extern "C" {
#endif
BOOL ComServerMain ();
void UacAnalyzeKernelMiniDump (HWND hwndDlg);
int UacBackupVolumeHeader (HWND hwndDlg, BOOL bRequireConfirmation, 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);

View File

@ -12,7 +12,7 @@ import "..\Common\Password.h";
[
uuid(9ACF6176-5FC4-4690-A025-B3306A50EB6A),
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
{
@ -24,7 +24,6 @@ library TrueCryptMainCom
]
interface ITrueCryptMainCom : IUnknown
{
void AnalyzeKernelMiniDump (LONG_PTR hwndDlg);
int BackupVolumeHeader (LONG_PTR hwndDlg, BOOL bRequireConfirmation, BSTR lpszVolume);
DWORD CallDriver (DWORD ioctl, BSTR input, BSTR *output);
int ChangePassword (BSTR volumePath, Password *oldPassword, Password *newPassword, int pkcs5, int wipePassCount, LONG_PTR hWnd);

View File

@ -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 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 DisableSystemCrashDetection = FALSE;
BOOL SystemCrashDetected = FALSE;
BOOL Quit = FALSE; /* Exit after processing command line */
BOOL ComServerMode = FALSE;
@ -691,7 +689,6 @@ void LoadSettings (HWND hwndDlg)
mountOptions = defaultMountOptions;
CloseSecurityTokenSessionsAfterMount = ConfigReadInt ("CloseSecurityTokenSessionsAfterMount", 0);
DisableSystemCrashDetection = ConfigReadInt ("DisableSystemCrashDetection", FALSE);
if (IsHiddenOSRunning())
HiddenSysLeakProtectionNotificationStatus = ConfigReadInt ("HiddenSystemLeakProtNotifStatus", TC_HIDDEN_OS_READ_ONLY_NOTIF_MODE_NONE);
@ -795,7 +792,6 @@ void SaveSettings (HWND hwndDlg)
ConfigWriteString ("LastSelectedDrive", szTmp);
ConfigWriteInt ("CloseSecurityTokenSessionsAfterMount", CloseSecurityTokenSessionsAfterMount);
ConfigWriteInt ("DisableSystemCrashDetection", DisableSystemCrashDetection);
// Hotkeys
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)
RegisterWtsNotification(hwndDlg);
DoPostInstallTasks (hwndDlg);
@ -5892,30 +5838,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
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
if (MaxVolumeIdleTime > 0)
@ -6971,15 +6893,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
Applink ("history", TRUE, "");
return 1;
}
else if (lw == IDM_ANALYZE_SYSTEM_CRASH)
{
if (!IsAdmin() && IsUacSupported())
UacAnalyzeKernelMiniDump (hwndDlg);
else
AnalyzeKernelMiniDump (hwndDlg);
return 1;
}
else if (lw == IDM_CONTACT)
{
Applink ("contact", FALSE, "");
@ -9677,429 +9590,6 @@ void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions)
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 eventHandlerActive = FALSE;

View File

@ -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);
void MountSelectedVolume (HWND hwndDlg, BOOL mountWithOptions);
uint32 ReadDriverConfigurationFlags ();
void AnalyzeKernelMiniDump (HWND hwndDlg);
void HookMouseWheel (HWND hwndDlg, UINT ctrlId);
static BOOL HandleDriveListMouseWheelEvent (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL bListMustBePointed);
static BOOL CALLBACK DefaultMountParametersDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
@ -126,6 +125,5 @@ typedef struct
void SetDriverConfigurationFlag (uint32 flag, BOOL state);
BOOL MountFavoriteVolumes (BOOL systemFavorites = FALSE, BOOL logOnMount = FALSE, BOOL hotKeyMount = FALSE, const VeraCrypt::FavoriteVolume &favoriteVolumeToMount = VeraCrypt::FavoriteVolume());
void __cdecl mountFavoriteVolumeThreadFunction (void *pArg);
BOOL GetExecutableImageInformation (const string &path, string &version, string &description, string &companyName, string &productName);
#endif

View File

@ -634,8 +634,6 @@ BEGIN
MENUITEM "News", IDM_NEWS
MENUITEM "Version History", IDM_VERSION_HISTORY
MENUITEM SEPARATOR
MENUITEM "Analyze a System Crash...", IDM_ANALYZE_SYSTEM_CRASH
MENUITEM SEPARATOR
MENUITEM "Donate now...", IDM_DONATE
MENUITEM "Contact", IDM_CONTACT
MENUITEM "Legal Notices", IDM_LICENSE

View File

@ -7,7 +7,7 @@
*/
#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_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_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32);
// 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-1, 0, SYS_WIN32);
@ -72,6 +73,7 @@ extern "C" BOOL UnregisterComServers (char *modulePath)
return FALSE;
// 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-1, 0, SYS_WIN32);