📄 dlgchpasskeyfilewizard.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 "dlgChpassKeyfileWizard.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...
// Relativly arbitary marker const so we can identify tabs we created as they
// receive WM_INITDIALOG msg
#define SUBTAB_FLAG 0x0ABCDEF0
// The number of steps in the wizard
#define CHPASS_KEYFILEWIZARD_STEPS 7
// Password change/keyfile generation...
#define PAGE_IDX_WELCOME 0
#define PAGE_IDX_SRCFILENAME 1
#define PAGE_IDX_SRCDETAILS 2
// Destination filename for keyfile generation only
#define PAGE_IDX_DESTFILENAME 3
#define PAGE_IDX_DESTDETAILS 4
#define PAGE_IDX_RNGSELECT 5
#define PAGE_IDX_RNGMOUSEMOVEMENT 6
#define SRCDETAILSTAB_IDX_PASSWORD 0
#define SRCDETAILSTAB_IDX_ADVANCED 1
#define DESTDETAILSTAB_IDX_PASSWORD 0
#define DESTDETAILSTAB_IDX_ADVANCED 1
// =========================================================================
// Enums...
// Mount source
typedef enum _DLG_MODE {
DLGMODE_CHPASS = 1,
DLGMODE_NEWKEYFILE = 2
} DLG_MODE, *PDLG_MODE;
// =========================================================================
// Structures...
// Selected RNG
typedef struct _CHPASSKEYFILE_PARAMETERS {
BOOL ParamsOK;
int ErrorPageIdx;
WCHAR SrcFilename[FREEOTFE_MAX_FILENAME_LENGTH];
unsigned char* SrcUserPassword;
LARGE_INTEGER SrcOffset;
unsigned int SrcSaltLength; // In *bits*
unsigned int SrcKeyIterations;
WCHAR DestFilename[FREEOTFE_MAX_FILENAME_LENGTH];
unsigned char* DestUserPassword;
unsigned char* DestUserPasswordConfirm;
unsigned int DestSaltLength; // In *bits*
unsigned int DestKeyIterations;
RNG_SYSTEM SelectedRNG; // Combination of the RNGs
// The following buffers store random data as collected...
unsigned int RandomPoolFilled_UserInput; // In *bits*
FREEOTFEBYTE RandomPool_UserInput[(CRITICAL_DATA_LENGTH / 8)];
unsigned int RandomPoolFilled_MSCryptoAPI; // In *bits*
FREEOTFEBYTE RandomPool_MSCryptoAPI[(CRITICAL_DATA_LENGTH / 8)];
} CHPASSKEYFILE_PARAMETERS, *PCHPASSKEYFILE_PARAMETERS;
// =========================================================================
// Local to this file...
HWND G_dlgChpassKeyfileWizard_MenuBar = NULL;
HWND G_dlgChpassKeyfileWizard_UserRNG = NULL;
BOOL G_dlgChpassKeyfileWizard_PageCompleted[CHPASS_KEYFILEWIZARD_STEPS];
CHPASSKEYFILE_PARAMETERS G_dlgChpassKeyfileWizard_ChpassKeyfileParams;
BOOL G_dlgChpassKeyfileWizard_AllowFinish = FALSE;
HWND hSrcDetailsWndPassword = NULL;
HWND hSrcDetailsWndAdvanced = NULL;
HWND hDestDetailsWndPassword = NULL;
HWND hDestDetailsWndAdvanced = NULL;
DLG_MODE G_dlgChpassKeyfileWizard_DlgMode;
// The last page changes depending on RNG selected
int G_dlgChpassKeyfileWizard_LastPageIdx = (CHPASS_KEYFILEWIZARD_STEPS - 1);
// =========================================================================
// Forward declarations...
void _dlgChpassKeyfileWizard_EnableDisableControls(HWND hDlg);
BOOL CALLBACK dlgChpassKeyfileWizard_ChpassKeyfile(HWND hDlg);
BOOL CALLBACK dlgChpassKeyfileWizard_PropSheetProc(
HWND hDlg,
UINT message,
LPARAM lParam
);
BOOL CALLBACK dlgChpassKeyfileWizard_PropSheetPageProc(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
void _dlgChpassKeyfileWizard_SecZeroParams();
BOOL dlgChpassKeyfileWizard_ValidatePage(HWND hDlg);
BOOL dlgChpassKeyfileWizard_ValidateAll(HWND hDlg);
void _dlgChpassKeyfileWizard_SizeWindowTab(
HWND hTabWnd,
HWND hWnd
);
void _dlgChpassKeyfileWizard_SizeWindowTab_CtrlID(
HWND hTabParentWnd,
int tabCtrlID,
HWND hWnd
);
BOOL _dlgChpassKeyfileWizard_QuerySiblings(HWND hDlg);
int _dlgChpassKeyfileWizard_GetCurrPageIdx(HWND hDlg);
int _dlgChpassKeyfileWizard_GetPageIdxOfPage(HWND hDlg);
void _DisplayDlgChpassKeyfileWizard(HWND hWnd);
// =========================================================================
void DisplayDlgChpassWizard(HWND hWnd)
{
G_dlgChpassKeyfileWizard_DlgMode = DLGMODE_CHPASS;
_DisplayDlgChpassKeyfileWizard(hWnd);
}
// =========================================================================
void DisplayDlgKeyfileWizard(HWND hWnd)
{
G_dlgChpassKeyfileWizard_DlgMode = DLGMODE_NEWKEYFILE;
_DisplayDlgChpassKeyfileWizard(hWnd);
}
// =========================================================================
void _DisplayDlgChpassKeyfileWizard(HWND hWnd)
{
PROPSHEETHEADER propHeader;
PROPSHEETPAGE propPage[CHPASS_KEYFILEWIZARD_STEPS];
int i;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("DisplayDlgKeyfileWizard\n")));
for (
i = 0;
i < (sizeof(G_dlgChpassKeyfileWizard_PageCompleted) / sizeof(G_dlgChpassKeyfileWizard_PageCompleted[0]));
i++
)
{
G_dlgChpassKeyfileWizard_PageCompleted[i] = FALSE;
}
memset(
&G_dlgChpassKeyfileWizard_ChpassKeyfileParams,
0,
sizeof(G_dlgChpassKeyfileWizard_ChpassKeyfileParams)
);
// 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 = dlgChpassKeyfileWizard_PropSheetPageProc;
// Src filename step...
propPage[PAGE_IDX_SRCFILENAME].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_SRCFILENAME].lParam = PAGE_IDX_SRCFILENAME;
propPage[PAGE_IDX_SRCFILENAME].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_SRCFILENAME].pszTitle = TEXT("Source filename");
propPage[PAGE_IDX_SRCFILENAME].hInstance = G_hInstance;
propPage[PAGE_IDX_SRCFILENAME].pszTemplate = MAKEINTRESOURCE(IDD_FILENAME);
propPage[PAGE_IDX_SRCFILENAME].pfnDlgProc = dlgChpassKeyfileWizard_PropSheetPageProc;
// Src details step...
propPage[PAGE_IDX_SRCDETAILS].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_SRCDETAILS].lParam = PAGE_IDX_SRCDETAILS;
propPage[PAGE_IDX_SRCDETAILS].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_SRCDETAILS].pszTitle = TEXT("Source details");
propPage[PAGE_IDX_SRCDETAILS].hInstance = G_hInstance;
propPage[PAGE_IDX_SRCDETAILS].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_TAB);
propPage[PAGE_IDX_SRCDETAILS].pfnDlgProc = dlgChpassKeyfileWizard_PropSheetPageProc;
// Dest filename step...
propPage[PAGE_IDX_DESTFILENAME].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_DESTFILENAME].lParam = PAGE_IDX_DESTFILENAME;
propPage[PAGE_IDX_DESTFILENAME].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_DESTFILENAME].pszTitle = TEXT("Destination filename");
propPage[PAGE_IDX_DESTFILENAME].hInstance = G_hInstance;
propPage[PAGE_IDX_DESTFILENAME].pszTemplate = MAKEINTRESOURCE(IDD_FILENAME);
propPage[PAGE_IDX_DESTFILENAME].pfnDlgProc = dlgChpassKeyfileWizard_PropSheetPageProc;
// Dest details step...
propPage[PAGE_IDX_DESTDETAILS].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_DESTDETAILS].lParam = PAGE_IDX_DESTDETAILS;
propPage[PAGE_IDX_DESTDETAILS].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_DESTDETAILS].pszTitle = TEXT("Destination details");
propPage[PAGE_IDX_DESTDETAILS].hInstance = G_hInstance;
propPage[PAGE_IDX_DESTDETAILS].pszTemplate = MAKEINTRESOURCE(IDD_DIALOG_TAB);
propPage[PAGE_IDX_DESTDETAILS].pfnDlgProc = dlgChpassKeyfileWizard_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 = dlgChpassKeyfileWizard_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 = dlgChpassKeyfileWizard_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
);
if (G_dlgChpassKeyfileWizard_DlgMode == DLGMODE_CHPASS)
{
propHeader.pszCaption = TEXT("Change password");
}
else
{
propHeader.pszCaption = TEXT("New keyfile");
}
propHeader.hwndParent = hWnd;
propHeader.hInstance = G_hInstance;
propHeader.nPages = CHPASS_KEYFILEWIZARD_STEPS;
propHeader.nStartPage = 0;
propHeader.ppsp = propPage;
propHeader.pfnCallback = dlgChpassKeyfileWizard_PropSheetProc; // Needed to get WinCE
// look & feel control
// Returns +ve value on success
PropertySheet(&propHeader);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("DisplayDlgKeyfileWizard\n")));
}
// =========================================================================
// Returns 0 based index of current page specified
// Pass this the HWND for the *main* dialog
int _dlgChpassKeyfileWizard_GetCurrPageIdx(HWND hDlg)
{
return _dlgChpassKeyfileWizard_GetPageIdxOfPage(PropSheet_GetCurrentPageHwnd(hDlg));
}
// =========================================================================
// Returns 0 based index of current page specified
int _dlgChpassKeyfileWizard_GetPageIdxOfPage(HWND hDlg)
{
int retval;
retval = GetWindowLong(hDlg, GWL_USERDATA);
return retval;
}
// =========================================================================
// Returns 0 based index of the last page
int _dlgChpassKeyfileWizard_GetPageIdxOfLastPage()
{
int retval;
retval = G_dlgChpassKeyfileWizard_LastPageIdx;
return retval;
}
// =========================================================================
void _dlgChpassKeyfileWizard_SetWizardButtons(int PageIdx)
{
MenuButtonEnable(
G_dlgChpassKeyfileWizard_MenuBar,
ID_WIZ_BACK,
(PageIdx > 0)
);
MenuButtonEnable(
G_dlgChpassKeyfileWizard_MenuBar,
ID_WIZ_NEXT,
(PageIdx < _dlgChpassKeyfileWizard_GetPageIdxOfLastPage())
);
MenuButtonEnable(
G_dlgChpassKeyfileWizard_MenuBar,
IDOK,
// G_dlgChpassKeyfileWizard_AllowFinish
(PageIdx == _dlgChpassKeyfileWizard_GetPageIdxOfLastPage())
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -