📄 dlgdumpcdbwizard.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 "dlgDumpCDBWizard.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 DUMP_CDB_WIZARD_STEPS 3
// Password change/keyfile generation...
#define PAGE_IDX_SRCFILENAME 0
#define PAGE_IDX_SRCDETAILS 1
#define PAGE_IDX_DESTFILENAME 2
#define SRCDETAILSTAB_IDX_PASSWORD 0
#define SRCDETAILSTAB_IDX_ADVANCED 1
// =========================================================================
// Structures...
// Selected RNG
typedef struct _DUMPCDB_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];
} DUMPCDB_PARAMETERS, *PDUMPCDB_PARAMETERS;
// =========================================================================
// Local to this file...
HWND G_dlgDumpCDBWizard_MenuBar = NULL;
BOOL G_dlgDumpCDBWizard_PageCompleted[DUMP_CDB_WIZARD_STEPS];
DUMPCDB_PARAMETERS G_dlgDumpCDBWizard_UserParams;
BOOL G_dlgDumpCDBWizard_AllowFinish = FALSE;
HWND hDumpCDBSrcDetailsWndPassword = NULL;
HWND hDumpCDBSrcDetailsWndAdvanced = NULL;
// The last page changes depending on RNG selected
int G_dlgDumpCDBWizard_LastPageIdx = (DUMP_CDB_WIZARD_STEPS - 1);
// =========================================================================
// Forward declarations...
void _dlgDumpCDBWizard_EnableDisableControls(HWND hDlg);
BOOL CALLBACK dlgDumpCDBWizard_Finish(HWND hDlg);
BOOL CALLBACK dlgDumpCDBWizard_PropSheetProc(
HWND hDlg,
UINT message,
LPARAM lParam
);
BOOL CALLBACK dlgDumpCDBWizard_PropSheetPageProc(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
void _dlgDumpCDBWizard_SecZeroParams();
BOOL dlgDumpCDBWizard_ValidatePage(HWND hDlg);
BOOL dlgDumpCDBWizard_ValidateAll(HWND hDlg);
void _dlgDumpCDBWizard_SizeWindowTab(
HWND hTabWnd,
HWND hWnd
);
void _dlgDumpCDBWizard_SizeWindowTab_CtrlID(
HWND hTabParentWnd,
int tabCtrlID,
HWND hWnd
);
BOOL _dlgDumpCDBWizard_QuerySiblings(HWND hDlg);
int _dlgDumpCDBWizard_GetCurrPageIdx(HWND hDlg);
int _dlgDumpCDBWizard_GetPageIdxOfPage(HWND hDlg);
// =========================================================================
void DisplayDlgDumpCDBWizard(HWND hWnd)
{
PROPSHEETHEADER propHeader;
PROPSHEETPAGE propPage[DUMP_CDB_WIZARD_STEPS];
int i;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("DisplayDlgDumpCDBWizard\n")));
for (
i = 0;
i < (sizeof(G_dlgDumpCDBWizard_PageCompleted) / sizeof(G_dlgDumpCDBWizard_PageCompleted[0]));
i++
)
{
G_dlgDumpCDBWizard_PageCompleted[i] = FALSE;
}
memset(
&G_dlgDumpCDBWizard_UserParams,
0,
sizeof(G_dlgDumpCDBWizard_UserParams)
);
// Zero unused members...
memset(propPage, 0, sizeof(propPage));
// 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 = dlgDumpCDBWizard_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 = dlgDumpCDBWizard_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 = dlgDumpCDBWizard_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("Dump CDB");
propHeader.hwndParent = hWnd;
propHeader.hInstance = G_hInstance;
propHeader.nPages = DUMP_CDB_WIZARD_STEPS;
propHeader.nStartPage = 0;
propHeader.ppsp = propPage;
propHeader.pfnCallback = dlgDumpCDBWizard_PropSheetProc; // Needed to get WinCE
// look & feel control
// Returns +ve value on success
PropertySheet(&propHeader);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("DisplayDlgDumpCDBWizard\n")));
}
// =========================================================================
// Give the user the option of displaying the file now.
void _dlgDumpCDBWizard_PromptDisplayDump(HWND hDlg)
{
SHELLEXECUTEINFO seInfo;
if (MessageBox(
hDlg,
TEXT("CDB dumped to file.\n\nDo you wish to view the human readable version now?"),
TEXT("Information"),
(MB_ICONQUESTION | MB_YESNO)
) == IDYES)
{
// Launch viewer with stats report
// We use ShellExecuteEx, rather than by using the executable's
// filename and CreateProcess(...)
seInfo.cbSize = sizeof(seInfo);
seInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
seInfo.hwnd = NULL;
seInfo.lpVerb = TEXT("open");
seInfo.lpFile = G_dlgDumpCDBWizard_UserParams.DestFilename;
seInfo.lpParameters = NULL;
seInfo.lpDirectory = NULL;
seInfo.nShow = SW_SHOWNORMAL;
seInfo.hInstApp = G_hInstance;
// Optional fields
seInfo.lpIDList = 0;
seInfo.lpClass = 0;
seInfo.hkeyClass = NULL;
seInfo.dwHotKey = 0;
seInfo.hIcon = NULL;
seInfo.hProcess = NULL;
ShellExecuteEx(&seInfo);
/*
This will also do the same thing, but ties it to a specific
executable:
CreateProcess(
EXE_whatever_it_is,
G_dlgDumpCDBWizard_UserParams.DestFilename,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
NULL,
NULL
);
*/
}
}
// =========================================================================
// Returns 0 based index of current page specified
// Pass this the HWND for the *main* dialog
int _dlgDumpCDBWizard_GetCurrPageIdx(HWND hDlg)
{
return _dlgDumpCDBWizard_GetPageIdxOfPage(PropSheet_GetCurrentPageHwnd(hDlg));
}
// =========================================================================
// Returns 0 based index of current page specified
int _dlgDumpCDBWizard_GetPageIdxOfPage(HWND hDlg)
{
int retval;
retval = GetWindowLong(hDlg, GWL_USERDATA);
return retval;
}
// =========================================================================
// Returns 0 based index of the last page
int _dlgDumpCDBWizard_GetPageIdxOfLastPage()
{
int retval;
retval = G_dlgDumpCDBWizard_LastPageIdx;
return retval;
}
// =========================================================================
void _dlgDumpCDBWizard_SetWizardButtons(int PageIdx)
{
MenuButtonEnable(
G_dlgDumpCDBWizard_MenuBar,
ID_WIZ_BACK,
(PageIdx > 0)
);
MenuButtonEnable(
G_dlgDumpCDBWizard_MenuBar,
ID_WIZ_NEXT,
(PageIdx < _dlgDumpCDBWizard_GetPageIdxOfLastPage())
);
MenuButtonEnable(
G_dlgDumpCDBWizard_MenuBar,
IDOK,
// G_dlgDumpCDBWizard_AllowFinish
(PageIdx == _dlgDumpCDBWizard_GetPageIdxOfLastPage())
);
}
// =========================================================================
void _dlgDumpCDBWizard_ShowDetailsTabPage(HWND hWnd, BOOL show)
{
if (hWnd != NULL)
{
if (show)
{
ShowWindow(hWnd, SW_SHOW);
}
else
{
ShowWindow(hWnd, SW_HIDE);
}
}
}
// =========================================================================
void _dlgDumpCDBWizard_DisplayDetailsTabPage(
HWND hDlg,
int CurrPage
)
{
HWND tabHWND = NULL;
HWND ctrlShow = NULL;
int tabIdx;
// Hide all.
_dlgDumpCDBWizard_ShowDetailsTabPage(
hDumpCDBSrcDetailsWndPassword,
FALSE
);
_dlgDumpCDBWizard_ShowDetailsTabPage(
hDumpCDBSrcDetailsWndAdvanced,
FALSE
);
if (CurrPage == PAGE_IDX_SRCDETAILS)
{
tabHWND = GetDlgItem(hDlg, IDC_TAB1);
if (tabHWND != NULL)
{
// Show the appropriate tab sheet...
tabIdx = TabCtrl_GetCurSel(tabHWND);
if (CurrPage == PAGE_IDX_SRCDETAILS)
{
if (tabIdx == SRCDETAILSTAB_IDX_PASSWORD)
{
ctrlShow = hDumpCDBSrcDetailsWndPassword;
}
else if (tabIdx == SRCDETAILSTAB_IDX_ADVANCED)
{
ctrlShow = hDumpCDBSrcDetailsWndAdvanced;
}
}
_dlgDumpCDBWizard_ShowDetailsTabPage(ctrlShow, TRUE);
}
}
}
// =========================================================================
BOOL CALLBACK dlgDumpCDBWizard_HandleMsg_WM_NOTIFY(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
BOOL retval = FALSE;
int idCtrl;
NMHDR* notifHdr;
NMUPDOWN* lpnmud;
int currPage;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("dlgDumpCDBWizard_HandleMsg_WM_NOTIFY\n")));
idCtrl = (int)wParam;
notifHdr = (NMHDR*)lParam;
switch (notifHdr->code)
{
case TCN_SELCHANGE:
{
currPage = _dlgDumpCDBWizard_GetPageIdxOfPage(hDlg);
if (
(currPage == PAGE_IDX_SRCDETAILS) &&
(idCtrl == IDC_TAB1)
)
{
_dlgDumpCDBWizard_DisplayDetailsTabPage(hDlg, currPage);
retval = TRUE;
}
break;
}
// Spin edit up/down button
case UDN_DELTAPOS:
{
switch(idCtrl)
{
case IDC_SPIN_OFFSET:
{
// Offset can only be specified for the src
if (hDlg == hDumpCDBSrcDetailsWndAdvanced)
{
lpnmud = (NMUPDOWN*)lParam;
AdjustSpinControl(
hDlg,
IDC_EDIT_OFFSET,
0,
INT_MAX,
-(lpnmud->iDelta)
);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -