📄 dlgnewvolwizard.c
字号:
// Description:
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW: http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//
#include <stdlib.h> // Required for _ultow(...)
#include <storemgr.h> // Required for STORAGE_DEVICE_TYPE_PCCARD, etc
#include <Commdlg.h> // Required from OPENFILENAME
#include <winuser.h> // Required for IDOK, etc
#include <aygshell.h> // Required for SH... functions/definitions/etc
#pragma comment(lib, "aygshell") // Link in aygshell.lib
#include "main.h"
#include "dlgNewVolWizard.h"
#include "FreeOTFEDebug.h"
#include "DriverInterface.h"
#include "DriverInterfaceTwo.h"
#include "DriverInterfaceHash.h"
#include "DriverInterfaceCypher.h"
#include "DriverInterfaceCommon.h"
#include "FreeOTFElib.h"
#include "FreeOTFEGUIlib.h"
#include "FreeOTFE4PDAlib.h"
#include "FreeOTFEAPIConstsCommon.h"
#include "resource.h"
#include "SDUGeneral.h"
#include "wndUserRNG.h"
// =========================================================================
// Constants...
// The number of steps in the wizard
#define NEWVOLWIZARD_STEPS 12
#define PAGE_IDX_WELCOME 0
#define PAGE_IDX_FILENAME 1
#define PAGE_IDX_OFFSET 2
#define PAGE_IDX_SIZE 3
#define PAGE_IDX_HASHCYPHERIV 4
#define PAGE_IDX_MASTERKEYLEN 5
#define PAGE_IDX_RNGSELECT 6
#define PAGE_IDX_RNGMOUSEMOVEMENT 7
#define PAGE_IDX_PASSWORD 8
#define PAGE_IDX_SALT 9
#define PAGE_IDX_CDBLOCATION 10
#define PAGE_IDX_SUMMARY 11
const SECTOR_IV_GEN_METHOD ARR_SECTOR_IV_GEN_METHOD[] = {
SCTRIVGEN_NONE,
SCTRIVGEN_32BIT_SECTOR_ID,
SCTRIVGEN_64BIT_SECTOR_ID,
SCTRIVGEN_HASH_32BIT_SECTOR_ID,
SCTRIVGEN_HASH_64BIT_SECTOR_ID,
SCTRIVGEN_ESSIV,
SCTRIVGEN_UNKNOWN
};
#define EDIT_CRLF TEXT("\r\n")
#define BYTES_IN_MEGABYTE (1024 * 1024)
// Arbitary control ID
#define IDCTRL_USERRNG 125
// =========================================================================
// Structures...
typedef struct _NEW_VOL_PARAMETERS {
BOOL ParamsOK;
int ErrorPageIdx;
WCHAR Filename[FREEOTFE_MAX_FILENAME_LENGTH];
LARGE_INTEGER Size; // In bytes
LARGE_INTEGER Offset;
WCHAR PrettyNameHash[MAX_PRETTYPRINTED_TITLE];
WCHAR DriverHash[FREEOTFE_MAX_FILENAME_LENGTH];
GUID ImplGUIDHash;
WCHAR PrettyNameCypher[MAX_PRETTYPRINTED_TITLE];
WCHAR DriverCypher[FREEOTFE_MAX_FILENAME_LENGTH];
GUID ImplGUIDCypher;
unsigned int KeyIterations;
SECTOR_IV_GEN_METHOD SectorIVGenMethod;
BOOL XORIV;
int BlockSizeSelectedCypher;
int KeySizeSelectedCypher;
int KeySizeUser;
RNG_SYSTEM SelectedRNG; // Combination of the RNGs
// The following buffers store random data as collected...
int RandomPoolFilled_UserInput; // In *bits*
FREEOTFEBYTE RandomPool_UserInput[(CRITICAL_DATA_LENGTH / 8)];
int RandomPoolFilled_MSCryptoAPI; // In *bits*
FREEOTFEBYTE RandomPool_MSCryptoAPI[(CRITICAL_DATA_LENGTH / 8)];
unsigned char* UserPassword;
unsigned char* UserPasswordConfirm;
unsigned int SaltLength; // In *bits*
BOOL UseKeyfile;
WCHAR Keyfile[FREEOTFE_MAX_FILENAME_LENGTH];
} NEW_VOL_PARAMETERS, *PNEW_VOL_PARAMETERS;
// =========================================================================
// Local to this file...
HWND G_dlgNewVolWizard_MenuBar = NULL;
HWND G_dlgNewVolWizard_UserRNG = NULL;
BOOL G_dlgNewVolWizard_PageCompleted[NEWVOLWIZARD_STEPS];
NEW_VOL_PARAMETERS G_dlgNewVolWizard_NewVolParams;
BOOL G_dlgNewVolWizard_GotImplDetails = FALSE;
int G_dlgNewVolWizard_CountImplCypher = 0;
DRIVER_AND_ALG* G_dlgNewVolWizard_ImplCypher = NULL; // Array of options
int G_dlgNewVolWizard_CountImplHash = 0;
DRIVER_AND_ALG* G_dlgNewVolWizard_ImplHash = NULL; // Array of options
BOOL G_dlgNewVolWizard_AllowFinish = FALSE;
// =========================================================================
// Forward declarations...
void _dlgNewVolWizard_EnableDisableControls(HWND hDlg);
BOOL CALLBACK dlgNewVolWizard_CreateNew(HWND hDlg);
BOOL CALLBACK dlgNewVolWizard_PropSheetProc(
HWND hDlg,
UINT message,
LPARAM lParam
);
BOOL CALLBACK dlgNewVolWizard_PropSheetPageProc(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
void _dlgNewVolWizard_SecZeroParams();
BOOL dlgNewVolWizard_ValidatePage(HWND hDlg);
BOOL dlgNewVolWizard_ValidateAll(HWND hDlg);
void _dlgNewVolWizard_PopulateComboboxes(HWND hDlg);
BOOL _dlgNewVolWizard_QuerySiblings(HWND hDlg);
int _dlgNewVolWizard_GetCurrPageIdx(HWND hDlg);
int _dlgNewVolWizard_GetPageIdxOfPage(HWND hDlg);
// =========================================================================
void DisplayDlgNewVolWizard(HWND hWnd)
{
PROPSHEETHEADER propHeader;
PROPSHEETPAGE propPage[NEWVOLWIZARD_STEPS];
int i;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("DisplayDlgNewVolWizard\n")));
for (
i = 0;
i < (sizeof(G_dlgNewVolWizard_PageCompleted) / sizeof(G_dlgNewVolWizard_PageCompleted[0]));
i++
)
{
G_dlgNewVolWizard_PageCompleted[i] = FALSE;
}
memset(
&G_dlgNewVolWizard_NewVolParams,
0,
sizeof(G_dlgNewVolWizard_NewVolParams)
);
// Zero unused members...
memset(propPage, 0, sizeof(propPage));
// Welcome step...
propPage[PAGE_IDX_WELCOME].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_WELCOME].lParam = PAGE_IDX_WELCOME;
propPage[PAGE_IDX_WELCOME].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_WELCOME].pszTitle = TEXT("Welcome");
propPage[PAGE_IDX_WELCOME].hInstance = G_hInstance;
propPage[PAGE_IDX_WELCOME].pszTemplate = MAKEINTRESOURCE(IDD_WIZARD_WELCOME);
propPage[PAGE_IDX_WELCOME].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Filename step...
propPage[PAGE_IDX_FILENAME].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_FILENAME].lParam = PAGE_IDX_FILENAME;
propPage[PAGE_IDX_FILENAME].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_FILENAME].pszTitle = TEXT("Filename");
propPage[PAGE_IDX_FILENAME].hInstance = G_hInstance;
propPage[PAGE_IDX_FILENAME].pszTemplate = MAKEINTRESOURCE(IDD_FILENAME);
propPage[PAGE_IDX_FILENAME].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Offset step...
propPage[PAGE_IDX_OFFSET].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_OFFSET].lParam = PAGE_IDX_OFFSET;
propPage[PAGE_IDX_OFFSET].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_OFFSET].pszTitle = TEXT("Offset");
propPage[PAGE_IDX_OFFSET].hInstance = G_hInstance;
propPage[PAGE_IDX_OFFSET].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_OFFSET);
propPage[PAGE_IDX_OFFSET].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Size step...
propPage[PAGE_IDX_SIZE].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_SIZE].lParam = PAGE_IDX_SIZE;
propPage[PAGE_IDX_SIZE].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_SIZE].pszTitle = TEXT("Size");
propPage[PAGE_IDX_SIZE].hInstance = G_hInstance;
propPage[PAGE_IDX_SIZE].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SIZE);
propPage[PAGE_IDX_SIZE].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Hash/cypher/IV step...
propPage[PAGE_IDX_HASHCYPHERIV].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_HASHCYPHERIV].lParam = PAGE_IDX_HASHCYPHERIV;
propPage[PAGE_IDX_HASHCYPHERIV].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_HASHCYPHERIV].pszTitle = TEXT("Hash/cypher/IV");
propPage[PAGE_IDX_HASHCYPHERIV].hInstance = G_hInstance;
propPage[PAGE_IDX_HASHCYPHERIV].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_HASHCYPHERIV);
propPage[PAGE_IDX_HASHCYPHERIV].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Master key length step...
propPage[PAGE_IDX_MASTERKEYLEN].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_MASTERKEYLEN].lParam = PAGE_IDX_MASTERKEYLEN;
propPage[PAGE_IDX_MASTERKEYLEN].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_MASTERKEYLEN].pszTitle = TEXT("Master key length");
propPage[PAGE_IDX_MASTERKEYLEN].hInstance = G_hInstance;
propPage[PAGE_IDX_MASTERKEYLEN].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_MASTERKEYLEN);
propPage[PAGE_IDX_MASTERKEYLEN].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// RNG select step...
propPage[PAGE_IDX_RNGSELECT].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_RNGSELECT].lParam = PAGE_IDX_RNGSELECT;
propPage[PAGE_IDX_RNGSELECT].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_RNGSELECT].pszTitle = TEXT("RNG select");
propPage[PAGE_IDX_RNGSELECT].hInstance = G_hInstance;
propPage[PAGE_IDX_RNGSELECT].pszTemplate = MAKEINTRESOURCE(IDD_RNGSELECT);
propPage[PAGE_IDX_RNGSELECT].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// RNG: Mouse movement step...
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].lParam = PAGE_IDX_RNGMOUSEMOVEMENT;
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].pszTitle = TEXT("RNG: Mouse movement");
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].hInstance = G_hInstance;
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].pszTemplate = MAKEINTRESOURCE(IDD_RNGMOUSEMOVEMENT);
propPage[PAGE_IDX_RNGMOUSEMOVEMENT].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Password step...
propPage[PAGE_IDX_PASSWORD].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_PASSWORD].lParam = PAGE_IDX_PASSWORD;
propPage[PAGE_IDX_PASSWORD].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_PASSWORD].pszTitle = TEXT("Password");
propPage[PAGE_IDX_PASSWORD].hInstance = G_hInstance;
propPage[PAGE_IDX_PASSWORD].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_PASSWORD);
propPage[PAGE_IDX_PASSWORD].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Salt step...
propPage[PAGE_IDX_SALT].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_SALT].lParam = PAGE_IDX_SALT;
propPage[PAGE_IDX_SALT].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_SALT].pszTitle = TEXT("Salt");
propPage[PAGE_IDX_SALT].hInstance = G_hInstance;
propPage[PAGE_IDX_SALT].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SALT);
propPage[PAGE_IDX_SALT].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// CDB location step...
propPage[PAGE_IDX_CDBLOCATION].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_CDBLOCATION].lParam = PAGE_IDX_CDBLOCATION;
propPage[PAGE_IDX_CDBLOCATION].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_CDBLOCATION].pszTitle = TEXT("CDB location");
propPage[PAGE_IDX_CDBLOCATION].hInstance = G_hInstance;
propPage[PAGE_IDX_CDBLOCATION].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_CDBLOCATION);
propPage[PAGE_IDX_CDBLOCATION].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Summary step...
propPage[PAGE_IDX_SUMMARY].dwSize = sizeof(propPage[1]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_SUMMARY].lParam = PAGE_IDX_SUMMARY;
propPage[PAGE_IDX_SUMMARY].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_SUMMARY].pszTitle = TEXT("Summary");
propPage[PAGE_IDX_SUMMARY].hInstance = G_hInstance;
propPage[PAGE_IDX_SUMMARY].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SUMMARY);
propPage[PAGE_IDX_SUMMARY].pfnDlgProc = dlgNewVolWizard_PropSheetPageProc;
// Common...
propHeader.dwSize = sizeof (PROPSHEETHEADER);
propHeader.dwFlags = (
PSH_NOAPPLYNOW |
PSH_USECALLBACK | // Needed to get WinCE
// look & feel control
PSH_PROPSHEETPAGE | // Use templates not handles
PSH_MAXIMIZE // All WinCE dialogs are maximised
);
propHeader.pszCaption = TEXT("New volume");
propHeader.hwndParent = hWnd;
propHeader.hInstance = G_hInstance;
propHeader.nPages = NEWVOLWIZARD_STEPS;
propHeader.nStartPage = 0;
propHeader.ppsp = propPage;
propHeader.pfnCallback = dlgNewVolWizard_PropSheetProc; // Needed to get WinCE
// look & feel control
// Returns +ve value on success
PropertySheet(&propHeader);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("DisplayDlgNewVolWizard\n")));
}
// =========================================================================
// Returns 0 based index of current page specified
// Pass this the HWND for the *main* dialog
int _dlgNewVolWizard_GetCurrPageIdx(HWND hDlg)
{
return _dlgNewVolWizard_GetPageIdxOfPage(PropSheet_GetCurrentPageHwnd(hDlg));
}
// =========================================================================
// Returns 0 based index of current page specified
int _dlgNewVolWizard_GetPageIdxOfPage(HWND hDlg)
{
int retval;
retval = GetWindowLong(hDlg, GWL_USERDATA);
return retval;
}
// =========================================================================
// Returns 0 based index of the last page
int _dlgNewVolWizard_GetPageIdxOfLastPage()
{
int retval;
retval = PAGE_IDX_SUMMARY;
return retval;
}
// =========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -