📄 dlgcode.c
字号:
/* Copyright (C) 2004 TrueCrypt Team, truecrypt.org
This product uses components written by Paul Le Roux <pleroux@swprofessionals.com> */
#include "TCdefs.h"
#include <stdlib.h>
#include "resource.h"
#include "crypto.h"
#include "apidrvr.h"
#include "dlgcode.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;
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"
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);
/* 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)
{
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 *
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;
}
void
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);
}
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];
SetDefaultUserFont (hwndDlg);
SendMessage (GetDlgItem (hwndDlg, ID_WEBSITE), WM_SETFONT, (WPARAM) hUserUnderlineFont, 0);
SendMessage (GetDlgItem (hwndDlg, IDT_ABOUT_VERSION), WM_SETFONT, (WPARAM) hUserBoldFont, 0);
sprintf (szTmp, "TrueCrypt %s", VERSION_STRING);
SetDlgItemText (hwndDlg, IDT_ABOUT_VERSION, szTmp);
return 1;
}
case WM_COMMAND:
if (lw == IDOK || lw == IDCANCEL)
{
EndDialog (hwndDlg, 0);
return 1;
}
if (lw == ID_WEBSITE)
{
ArrowWaitCursor ();
ShellExecute (NULL, "open", "http://www.truecrypt.org", NULL, NULL, SW_SHOWNORMAL);
Sleep (200);
NormalCursor ();
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
{
LPWSTR lpszNewText = (LPWSTR) err_malloc ((j + 1) * 2);
j = MultiByteToWideChar (CP_ACP, 0L, lpszText, -1, lpszNewText, j + 1);
if (j > 0)
wcscpy ((LPWSTR) lpszText, lpszNewText);
else
wcscpy ((LPWSTR) lpszText, (LPWSTR) "");
free (lpszNewText);
}
}
/* InitDialog - initialize the applications main dialog, this function should
be called only once in the dialogs WM_INITDIALOG message handler */
void
InitDialog (HWND hwndDlg)
{
HDC hDC;
int nHeight;
LOGFONT lf;
HMENU hMenu;
hDC = GetDC (hwndDlg);
nHeight = -((8 * GetDeviceCaps (hDC, LOGPIXELSY)) / 72);
lf.lfHeight = nHeight;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_LIGHT;
lf.lfItalic = FALSE;
lf.lfUnderline = FALSE;
lf.lfStrikeOut = FALSE;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = FF_DONTCARE;
strcpy (lf.lfFaceName, "Courier");
hSmallFont = CreateFontIndirect (&lf);
if (hSmallFont == NULL)
{
handleWin32Error (hwndDlg);
AbortProcess (IDS_NOFONT);
}
nHeight = -((10 * GetDeviceCaps (hDC, LOGPIXELSY)) / 72);
lf.lfHeight = nHeight;
lf.lfWeight = FW_BLACK;
strcpy (lf.lfFaceName, "Arial");
hSmallBoldFont = CreateFontIndirect (&lf);
if (hSmallBoldFont == NULL)
{
handleWin32Error (hwndDlg);
AbortProcess (IDS_NOFONT);
}
nHeight = -((16 * GetDeviceCaps (hDC, LOGPIXELSY)) / 72);
lf.lfHeight = nHeight;
lf.lfWeight = FW_BOLD;
strcpy (lf.lfFaceName, "Times");
hBoldFont = CreateFontIndirect (&lf);
if (hBoldFont == NULL)
{
handleWin32Error (hwndDlg);
AbortProcess (IDS_NOFONT);
}
nHeight = -((16 * GetDeviceCaps (hDC, LOGPIXELSY)) / 72);
lf.lfHeight = nHeight;
lf.lfWeight = FW_REGULAR;
hTitleFont = CreateFontIndirect (&lf);
if (hTitleFont == NULL)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -