📄 dlgcode.c
字号:
/* The source code contained in this file has been derived from the source code
of Encryption for the Masses 2.02a by Paul Le Roux. Modifications and
additions to that source code contained in this file are Copyright (c) 2004-2005
TrueCrypt Foundation and Copyright (c) 2004 TrueCrypt Team. Unmodified
parts are Copyright (c) 1998-99 Paul Le Roux. This is a TrueCrypt Foundation
release. Please see the file license.txt for full license details. */
#include "TCdefs.h"
#include <stdlib.h>
#include <time.h>
#include <shlobj.h>
#include <dbt.h>
#include "resource.h"
#include "crypto.h"
#include "apidrvr.h"
#include "dlgcode.h"
#include "volumes.h"
char szHelpFile[TC_MAX_PATH];
HFONT hSmallFont = NULL;
HFONT hBoldFont = NULL;
HFONT hSmallBoldFont = NULL;
HFONT hTitleFont = NULL;
HFONT hFixedFont = NULL;
HFONT hUserFont = NULL;
HFONT hUserUnderlineFont = NULL;
HFONT hUserBoldFont = NULL;
HFONT hUserUnderlineBoldFont = NULL;
char *lpszTitle = NULL;
int nCurrentOS = 0;
int CurrentOSMajor = 0;
int CurrentOSMinor = 0;
/* Handle to the device driver */
HANDLE hDriver = INVALID_HANDLE_VALUE;
HINSTANCE hInst = NULL;
HANDLE hMutex = NULL;
HCURSOR hCursor = NULL;
ATOM hDlgClass, hSplashClass;
/* Windows dialog class */
#define WINDOWS_DIALOG_CLASS "#32770"
/* Custom class names */
#define TC_DLG_CLASS "CustomDlg"
#define TC_SPLASH_CLASS "SplashDlg"
/* Benchmark */
#ifndef SETUP
#define BENCHMARK_MAX_ITEMS 100
#define BENCHMARK_DEFAULT_BUF_SIZE (1*BYTES_PER_MB)
enum
{
BENCHMARK_SORT_BY_NAME = 0,
BENCHMARK_SORT_BY_SPEED
};
typedef struct
{
int id;
char name[100];
unsigned __int64 encSpeed;
unsigned __int64 decSpeed;
unsigned __int64 meanBytesPerSec;
} BENCHMARK_REC;
BENCHMARK_REC benchmarkTable [BENCHMARK_MAX_ITEMS];
int benchmarkTotalItems = 0;
int benchmarkBufferSize = BENCHMARK_DEFAULT_BUF_SIZE;
int benchmarkLastBufferSize = BENCHMARK_DEFAULT_BUF_SIZE;
int benchmarkSortMethod = BENCHMARK_SORT_BY_SPEED;
LARGE_INTEGER benchmarkPerformanceFrequency;
#endif // #ifndef SETUP
void
cleanup ()
{
/* Cleanup the GDI fonts */
if (hFixedFont != NULL)
DeleteObject (hFixedFont);
if (hSmallFont != NULL)
DeleteObject (hSmallFont);
if (hBoldFont != NULL)
DeleteObject (hBoldFont);
if (hSmallBoldFont != NULL)
DeleteObject (hSmallBoldFont);
if (hTitleFont != NULL)
DeleteObject (hTitleFont);
if (hUserFont != NULL)
DeleteObject (hUserFont);
if (hUserUnderlineFont != NULL)
DeleteObject (hUserUnderlineFont);
if (hUserBoldFont != NULL)
DeleteObject (hUserBoldFont);
if (hUserUnderlineBoldFont != NULL)
DeleteObject (hUserUnderlineBoldFont);
/* Cleanup our dialog class */
if (hDlgClass)
UnregisterClass (TC_DLG_CLASS, hInst);
if (hSplashClass)
UnregisterClass (TC_SPLASH_CLASS, hInst);
/* Close the device driver handle */
if (hDriver != INVALID_HANDLE_VALUE)
{
// Unload driver mode if possible (non-install mode)
if (IsNonInstallMode ())
DriverUnload ();
else
CloseHandle (hDriver);
}
if (hMutex != NULL)
{
CloseHandle (hMutex);
}
}
void
LowerCaseCopy (char *lpszDest, char *lpszSource)
{
int i = strlen (lpszSource);
lpszDest[i] = 0;
while (--i >= 0)
{
lpszDest[i] = (char) tolower (lpszSource[i]);
}
}
void
UpperCaseCopy (char *lpszDest, char *lpszSource)
{
int i = strlen (lpszSource);
lpszDest[i] = 0;
while (--i >= 0)
{
lpszDest[i] = (char) toupper (lpszSource[i]);
}
}
void
CreateFullVolumePath (char *lpszDiskFile, char *lpszFileName, BOOL * bDevice)
{
if (strcmp (lpszFileName, "Floppy (A:)") == 0)
strcpy (lpszFileName, "\\Device\\Floppy0");
else if (strcmp (lpszFileName, "Floppy (B:)") == 0)
strcpy (lpszFileName, "\\Device\\Floppy1");
UpperCaseCopy (lpszDiskFile, lpszFileName);
*bDevice = FALSE;
if (memcmp (lpszDiskFile, "\\DEVICE", sizeof (char) * 7) == 0)
{
*bDevice = TRUE;
}
strcpy (lpszDiskFile, lpszFileName);
#if _DEBUG
OutputDebugString ("CreateFullVolumePath: ");
OutputDebugString (lpszDiskFile);
OutputDebugString ("\n");
#endif
}
int
FakeDosNameForDevice (char *lpszDiskFile, char *lpszDosDevice, char *lpszCFDevice, BOOL bNameOnly)
{
BOOL bDosLinkCreated = TRUE;
sprintf (lpszDosDevice, "truecrypt%lu", GetCurrentProcessId ());
if (bNameOnly == FALSE)
bDosLinkCreated = DefineDosDevice (DDD_RAW_TARGET_PATH, lpszDosDevice, lpszDiskFile);
if (bDosLinkCreated == FALSE)
{
return ERR_OS_ERROR;
}
else
sprintf (lpszCFDevice, "\\\\.\\%s", lpszDosDevice);
return 0;
}
int
RemoveFakeDosName (char *lpszDiskFile, char *lpszDosDevice)
{
BOOL bDosLinkRemoved = DefineDosDevice (DDD_RAW_TARGET_PATH | DDD_EXACT_MATCH_ON_REMOVE |
DDD_REMOVE_DEFINITION, lpszDosDevice, lpszDiskFile);
if (bDosLinkRemoved == FALSE)
{
return ERR_OS_ERROR;
}
return 0;
}
char *
getstr (UINT nID)
{
static char szMsg[256];
if (LoadString (hInst, nID, szMsg, sizeof (szMsg)) == 0)
return "";
else
return szMsg;
}
char *
getmultilinestr (UINT nID[4])
{
static char szMsg[1024];
if (nID[0])
strcpy (szMsg, getstr (nID[0]));
if (nID[1])
strcat (szMsg, getstr (nID[1]));
if (nID[2])
strcat (szMsg, getstr (nID[2]));
if (nID[3])
strcat (szMsg, getstr (nID[3]));
return szMsg;
}
void
AbortProcess (UINT nID)
{
MessageBeep (MB_ICONEXCLAMATION);
MessageBox (NULL, getstr (nID), lpszTitle, ICON_HAND);
exit (1);
}
void
AbortProcessSilent (void)
{
exit (1);
}
void *
err_malloc (size_t size)
{
void *z = (void *) TCalloc (size);
if (z)
return z;
AbortProcess (IDS_OUTOFMEMORY);
return 0;
}
char *
err_strdup (char *lpszText)
{
int j = (strlen (lpszText) + 1) * sizeof (char);
char *z = (char *) err_malloc (j);
memmove (z, lpszText, j);
return z;
}
DWORD
handleWin32Error (HWND hwndDlg)
{
LPVOID lpMsgBuf;
DWORD dwError = GetLastError ();
FormatMessage (
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwError,
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
(char *) &lpMsgBuf,
0,
NULL
);
MessageBox (hwndDlg, lpMsgBuf, lpszTitle, ICON_HAND);
LocalFree (lpMsgBuf);
return dwError;
}
BOOL
translateWin32Error (char *lpszMsgBuf, int nSizeOfBuf)
{
DWORD dwError = GetLastError ();
if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
lpszMsgBuf, nSizeOfBuf, NULL))
return TRUE;
else
return FALSE;
}
/* Except in response to the WM_INITDIALOG message, the dialog box procedure
should return nonzero if it processes the message, and zero if it does
not. - see DialogProc */
BOOL WINAPI
AboutDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
if (lParam); /* remove warning */
switch (msg)
{
case WM_INITDIALOG:
{
char szTmp[32];
char credits[5000];
SetDefaultUserFont (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, IDC_HOMEPAGE), WM_SETFONT, (WPARAM) hUserUnderlineFont, 0);
SendMessage (GetDlgItem (hwndDlg, IDC_FORUMS), WM_SETFONT, (WPARAM) hUserUnderlineFont, 0);
// Version
SendMessage (GetDlgItem (hwndDlg, IDT_ABOUT_VERSION), WM_SETFONT, (WPARAM) hUserBoldFont, 0);
sprintf (szTmp, "TrueCrypt %s", VERSION_STRING);
SetDlgItemText (hwndDlg, IDT_ABOUT_VERSION, szTmp);
// Credits
SendMessage (GetDlgItem (hwndDlg, IDC_ABOUT_CREDITS), WM_SETFONT, (WPARAM) hUserFont, (LPARAM) 0);
sprintf (credits,"\
Based on E4M by Paul Le Roux.\r\n\
Portions of this software are based in part on the works of the following people: \
Bruce Schneier, \
Horst Feistel, Don Coppersmith, \
Whitfield Diffie, Martin Hellman, Walt Tuchmann, \
Joan Daemen, Vincent Rijmen, \
Lars Knudsen, Ross Anderson, Eli Biham, \
David Wagner, John Kelsey, Niels Ferguson, Doug Whiting, Chris Hall, \
Carlisle Adams, Stafford Tavares, \
Hans Dobbertin, Antoon Bosselaers, Bart Preneel, \
Steve Reid, Peter Gutmann, and many others.\r\n\r\n\
Portions of this software:\r\n\
Copyright \xA9 2004-2005 TrueCrypt Foundation. All Rights Reserved.\r\n\
Copyright \xA9 1998-2000 Paul Le Roux. All Rights Reserved.\r\n\
Copyright \xA9 2004 TrueCrypt Team. All Rights Reserved.\r\n\
Copyright \xA9 1995-1997 Eric Young. All Rights Reserved.\r\n\
Copyright \xA9 1999-2004 Dr. Brian Gladman. All Rights Reserved.\r\n\
Copyright \xA9 2001 Markus Friedl. All Rights Reserved.\r\n\
Copyright \xA9 2000 Dag Arne Osvik. All Rights Reserved.\r\n\r\n\
A TrueCrypt Foundation Release");
SetWindowText (GetDlgItem (hwndDlg, IDC_ABOUT_CREDITS), credits);
return 1;
}
case WM_COMMAND:
if (lw == IDOK || lw == IDCANCEL)
{
EndDialog (hwndDlg, 0);
return 1;
}
if (lw == IDC_HOMEPAGE)
{
char tmpstr [256];
ArrowWaitCursor ();
sprintf (tmpstr, "http://truecrypt.sourceforge.net/applink.php?version=%s", VERSION_STRING);
ShellExecute (NULL, "open", (LPCTSTR) tmpstr, NULL, NULL, SW_SHOWNORMAL);
Sleep (200);
NormalCursor ();
return 1;
}
if (lw == IDC_FORUMS)
{
char tmpstr [256];
ArrowWaitCursor ();
sprintf (tmpstr, "http://truecrypt.sourceforge.net/applink.php?version=%s&dest=forum", VERSION_STRING);
ShellExecute (NULL, "open", (LPCTSTR) tmpstr, NULL, NULL, SW_SHOWNORMAL);
Sleep (200);
NormalCursor ();
return 1;
}
// Disallow modification of credits
if (HIWORD (wParam) == EN_UPDATE)
{
SendMessage (hwndDlg, WM_INITDIALOG, 0, 0);
return 1;
}
return 0;
case WM_CLOSE:
EndDialog (hwndDlg, 0);
return 1;
}
return 0;
}
/* Except in response to the WM_INITDIALOG message, the dialog box procedure
should return nonzero if it processes the message, and zero if it does
not. - see DialogProc */
BOOL WINAPI
WarningDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
WORD lw = LOWORD (wParam);
if (lParam); /* remove warning */
switch (msg)
{
case WM_INITDIALOG:
SetDefaultUserFont (hwndDlg);
SetWindowText (GetDlgItem (hwndDlg, IDC_WARNING_TEXT), (char*) lParam);
return 1;
case WM_COMMAND:
if (lw == IDOK || lw == IDCANCEL)
{
BOOL x = IsButtonChecked (GetDlgItem (hwndDlg, IDC_NEVER_SHOW));
if (x == TRUE)
EndDialog (hwndDlg, IDOK);
else
EndDialog (hwndDlg, IDCANCEL);
return 1;
}
return 0;
case WM_CLOSE:
EndDialog (hwndDlg, 0);
return 1;
}
return 0;
}
BOOL
IsButtonChecked (HWND hButton)
{
if (SendMessage (hButton, BM_GETCHECK, 0, 0) == BST_CHECKED)
return TRUE;
else
return FALSE;
}
void
CheckButton (HWND hButton)
{
SendMessage (hButton, BM_SETCHECK, BST_CHECKED, 0);
}
/*****************************************************************************
ToSBCS: converts a unicode string to Single Byte Character String (SBCS).
***************************************************************************/
void
ToSBCS (LPWSTR lpszText)
{
int j = wcslen (lpszText);
if (j == 0)
{
strcpy ((char *) lpszText, "");
return;
}
else
{
char *lpszNewText = (char *) err_malloc (j + 1);
j = WideCharToMultiByte (CP_ACP, 0L, lpszText, -1, lpszNewText, j + 1, NULL, NULL);
if (j > 0)
strcpy ((char *) lpszText, lpszNewText);
else
strcpy ((char *) lpszText, "");
free (lpszNewText);
}
}
/*****************************************************************************
ToUNICODE: converts a SBCS string to a UNICODE string.
***************************************************************************/
void
ToUNICODE (char *lpszText)
{
int j = strlen (lpszText);
if (j == 0)
{
wcscpy ((LPWSTR) lpszText, (LPWSTR) WIDE (""));
return;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -