📄 dlgmount.c
字号:
// Description:
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW: http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//
#include "main.h"
#include "dlgMount.h"
#include "FreeOTFEDebug.h"
#include "DriverInterface.h"
#include "DriverInterfaceTwo.h"
#include "FreeOTFElib.h"
#include "FreeOTFEGUIlib.h"
#include "FreeOTFE4PDAlib.h"
#include "FreeOTFE4PDAGUIlib.h"
#include "FreeOTFEAPIConstsCommon.h"
#include "resource.h"
#include "SDUGeneral.h"
#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
// =========================================================================
// Constants...
// The number of tabs on the dialog
#define MOUNT_TABS 2
#define PAGE_IDX_MOUNT_BASIC 0
#define PAGE_IDX_MOUNT_ADVANCED 1
// =========================================================================
// Structures...
typedef struct _USER_MOUNT_PARAMETERS {
BOOL ParamsOK;
WCHAR Mountpoint[FREEOTFE_MAX_FILENAME_LENGTH];
WCHAR Filename[FREEOTFE_MAX_FILENAME_LENGTH];
WCHAR Keyfile[FREEOTFE_MAX_FILENAME_LENGTH];
LARGE_INTEGER OffsetWithinFile;
BOOL CDBAtOffset;
unsigned char* UserPassword;
unsigned int SaltLength; // In *bits*
unsigned int KeyIterations;
BOOL ReadOnly;
} USER_MOUNT_PARAMETERS, *PUSER_MOUNT_PARAMETERS;
// =========================================================================
// Local to this file...
HWND G_dlgMount_MenuBar = NULL;
USER_MOUNT_PARAMETERS G_UserMountParams;
HWND G_dlgMount_PropPage[MOUNT_TABS];
// =========================================================================
// Forward declarations...
BOOL CALLBACK dlgMount_Mount(HWND hDlg);
BOOL CALLBACK dlgMount_PropSheetProc(
HWND hDlg,
UINT message,
LPARAM lParam
);
BOOL CALLBACK dlgMount_PropSheetPageProc(
HWND hDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam
);
void _dlgMount_EnableDisableControls(HWND hDlg);
int _dlgMount_GetCurrPageIdx(HWND hDlg);
int _dlgMount_GetPageIdxOfPage(HWND hDlg);
BOOL _dlgMount_QuerySiblings(HWND hDlg);
void _dlgMount_SetDlgMountpoint(WCHAR* Mountpoint);
// =========================================================================
void DisplayDlgMount(HWND hWnd)
{
LARGE_INTEGER offset;
offset.QuadPart = DEFAULT_OFFSET;
DisplayDlgMount_Params(
hWnd,
NULL,
DEFAULT_FILENAME,
DEFAULT_KEYFILE,
offset,
DEFAULT_CDBATOFFSET,
DEFAULT_PASSWORD,
DEFAULT_SALTLENGTH, // In *bits*
DEFAULT_KEYITERATIONS,
DEFAULT_READONLY
);
}
// =========================================================================
void DisplayDlgMount_Params(
HWND hWnd,
WCHAR* Mountpoint,
WCHAR* Filename,
WCHAR* Keyfile,
LARGE_INTEGER OffsetWithinFile,
BOOL CDBAtOffset,
WCHAR* UserPassword,
unsigned int SaltLength, // In *bits*
unsigned int KeyIterations,
BOOL ReadOnly
)
{
PROPSHEETHEADER propHeader;
PROPSHEETPAGE propPage[MOUNT_TABS];
int userPasswordSize;
int pwLen;
char* userPassword;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("DisplayDlgMount_Params\n")));
memset(
&G_UserMountParams,
0,
sizeof(G_UserMountParams)
);
// Populate initial parameters to pass them through to the dialog
// initialization function...
if (Mountpoint != NULL)
{
wcscpy(G_UserMountParams.Mountpoint, Mountpoint);
}
if (Filename != NULL)
{
wcscpy(G_UserMountParams.Filename, Filename);
}
if (Keyfile != NULL)
{
wcscpy(G_UserMountParams.Keyfile, Keyfile);
}
G_UserMountParams.OffsetWithinFile = OffsetWithinFile;
G_UserMountParams.CDBAtOffset = CDBAtOffset;
G_UserMountParams.SaltLength = SaltLength; // In *bits*
G_UserMountParams.KeyIterations = KeyIterations;
G_UserMountParams.ReadOnly = ReadOnly;
G_UserMountParams.UserPassword = NULL;
if (UserPassword != NULL)
{
pwLen = wcslen(UserPassword);
// +1 for terminating NULL
userPasswordSize = (pwLen + 1) * sizeof(*userPassword);
userPassword = malloc(userPasswordSize);
if (userPassword != NULL)
{
memset(userPassword, 0, userPasswordSize);
wcstombs(userPassword, UserPassword, wcslen(UserPassword));
G_UserMountParams.UserPassword = userPassword;
}
}
// Zero unused members...
memset(propPage, 0, sizeof(propPage));
// Basic page...
propPage[PAGE_IDX_MOUNT_BASIC].dwSize = sizeof(propPage[0]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_MOUNT_BASIC].lParam = PAGE_IDX_MOUNT_BASIC;
propPage[PAGE_IDX_MOUNT_BASIC].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_MOUNT_BASIC].pszTitle = TEXT("Basic");
propPage[PAGE_IDX_MOUNT_BASIC].hInstance = G_hInstance;
propPage[PAGE_IDX_MOUNT_BASIC].pszTemplate = MAKEINTRESOURCE(IDD_MOUNT_BASIC);
propPage[PAGE_IDX_MOUNT_BASIC].pfnDlgProc = dlgMount_PropSheetPageProc;
// Advanced page...
propPage[PAGE_IDX_MOUNT_ADVANCED].dwSize = sizeof(propPage[1]);
// Create when property sheet created, and tab caption (title)
propPage[PAGE_IDX_MOUNT_ADVANCED].lParam = PAGE_IDX_MOUNT_ADVANCED;
propPage[PAGE_IDX_MOUNT_ADVANCED].dwFlags = (PSP_PREMATURE | PSP_USETITLE);
propPage[PAGE_IDX_MOUNT_ADVANCED].pszTitle = TEXT("Advanced");
propPage[PAGE_IDX_MOUNT_ADVANCED].hInstance = G_hInstance;
propPage[PAGE_IDX_MOUNT_ADVANCED].pszTemplate = MAKEINTRESOURCE(IDD_VOL_ADV_OPTS);
propPage[PAGE_IDX_MOUNT_ADVANCED].pfnDlgProc = dlgMount_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("Mount volume");
propHeader.hwndParent = hWnd;
propHeader.hInstance = G_hInstance;
propHeader.nPages = MOUNT_TABS;
propHeader.nStartPage = 0;
propHeader.ppsp = propPage;
propHeader.pfnCallback = dlgMount_PropSheetProc; // Needed to get WinCE
// look & feel control
// Returns +ve value on success
PropertySheet(&propHeader);
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("DisplayDlgMount_Params\n")));
}
// =========================================================================
// Pass this the HWND for the *individual* *page*
void _dlgMount_EnableDisableControls(HWND hDlg)
{
if (_dlgMount_QuerySiblings(GetParent(hDlg)))
{
if (_dlgMount_GetPageIdxOfPage(hDlg) == PAGE_IDX_MOUNT_ADVANCED)
{
// If no keyfile is specified, force IDC_CHECK_CDBATOFFSET to be checked
// and disable it.
if (wcslen(G_UserMountParams.Keyfile) == 0)
{
CheckDlgButton(
hDlg,
IDC_CHECK_CDBATOFFSET,
BST_CHECKED
);
SetControlEnabled(hDlg, IDC_CHECK_CDBATOFFSET, FALSE);
}
else
{
SetControlEnabled(hDlg, IDC_CHECK_CDBATOFFSET, TRUE);
}
}
}
}
// =========================================================================
// Returns 0 based index of current page specified
// Pass this the HWND for the *main* dialog
int _dlgMount_GetCurrPageIdx(HWND hDlg)
{
return _dlgMount_GetPageIdxOfPage(PropSheet_GetCurrentPageHwnd(hDlg));
}
// =========================================================================
// Returns 0 based index of current page specified
int _dlgMount_GetPageIdxOfPage(HWND hDlg)
{
int retval;
retval = GetWindowLong(hDlg, GWL_USERDATA);
return retval;
}
// =========================================================================
// Pass this the HWND for the *main* dialog
HWND _dlgMount_GetPageHWNDForPage(int idx)
{
return G_dlgMount_PropPage[idx];
}
// =========================================================================
BOOL CALLBACK dlgMount_HandleMsg_WM_NOTIFY(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
BOOL retval = FALSE;
int idCtrl;
NMHDR* notifHdr;
NMUPDOWN* lpnmud;
DEBUGOUTGUI(DEBUGLEV_VERBOSE_ENTER, (TEXT("dlgMount_HandleMsg_WM_NOTIFY\n")));
idCtrl = (int)wParam;
notifHdr = (NMHDR*)lParam;
switch (notifHdr->code)
{
case PSN_SETACTIVE:
{
_dlgMount_EnableDisableControls(hDlg);
break;
}
// Spin edit up/down button
case UDN_DELTAPOS:
{
switch(idCtrl)
{
case IDC_SPIN_OFFSET:
{
lpnmud = (NMUPDOWN*)lParam;
AdjustSpinControl(
hDlg,
IDC_EDIT_OFFSET,
0,
INT_MAX,
-(lpnmud->iDelta)
);
retval = TRUE;
break;
}
case IDC_SPIN_SALTLENGTH:
{
lpnmud = (NMUPDOWN*)lParam;
AdjustSpinControl(
hDlg,
IDC_EDIT_SALTLENGTH,
0,
INT_MAX,
(-(lpnmud->iDelta) * DELTA_SALT_LENGTH)
);
retval = TRUE;
break;
}
case IDC_SPIN_KEYITERATIONS:
{
lpnmud = (NMUPDOWN*)lParam;
AdjustSpinControl(
hDlg,
IDC_EDIT_KEYITERATIONS,
MIN_KEYITERATIONS,
INT_MAX,
(-(lpnmud->iDelta) * DELTA_KEY_ITERATIONS)
);
retval = TRUE;
break;
}
}
break;
}
case PSN_KILLACTIVE:
{
// (Validate if necessary here)
// Set the DWL_MSGRESULT to PSNRET_NOERROR to receive PSN_APPLY
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -