📄 dlgchpasskeyfilewizard.c
字号:
}
// =========================================================================
void _dlgChpassKeyfileWizard_ShowDetailsTabPage(HWND hWnd, BOOL show)
{
if (hWnd != NULL)
{
if (show)
{
ShowWindow(hWnd, SW_SHOW);
}
else
{
ShowWindow(hWnd, SW_HIDE);
}
}
}
// =========================================================================
void _dlgChpassKeyfileWizard_DisplayDetailsTabPage(
HWND hDlg,
int CurrPage
)
{
HWND tabHWND = NULL;
HWND ctrlShow = NULL;
int tabIdx;
// Hide all.
_dlgChpassKeyfileWizard_ShowDetailsTabPage(
hSrcDetailsWndPassword,
FALSE
);
_dlgChpassKeyfileWizard_ShowDetailsTabPage(
hSrcDetailsWndAdvanced,
FALSE
);
_dlgChpassKeyfileWizard_ShowDetailsTabPage(
hDestDetailsWndPassword,
FALSE
);
_dlgChpassKeyfileWizard_ShowDetailsTabPage(
hDestDetailsWndAdvanced,
FALSE
);
if (
(CurrPage == PAGE_IDX_SRCDETAILS) ||
(CurrPage == PAGE_IDX_DESTDETAILS)
)
{
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 = hSrcDetailsWndPassword;
}
else if (tabIdx == SRCDETAILSTAB_IDX_ADVANCED)
{
ctrlShow = hSrcDetailsWndAdvanced;
}
}
else if (CurrPage == PAGE_IDX_DESTDETAILS)
{
if (tabIdx == DESTDETAILSTAB_IDX_PASSWORD)
{
ctrlShow = hDestDetailsWndPassword;
}
else if (tabIdx == DESTDETAILSTAB_IDX_ADVANCED)
{
ctrlShow = hDestDetailsWndAdvanced;
}
}
// If changing password on an existing volume/keyfile, set the
// offset on the dest advanced tab to the src advanced tab
if (
(G_dlgChpassKeyfileWizard_DlgMode == DLGMODE_CHPASS) &&
(ctrlShow == hDestDetailsWndAdvanced)
)
{
SetDlgItemInt(
hDestDetailsWndAdvanced,
IDC_EDIT_OFFSET,
G_dlgChpassKeyfileWizard_ChpassKeyfileParams.SrcOffset.LowPart,
TRUE
);
}
_dlgChpassKeyfileWizard_ShowDetailsTabPage(ctrlShow, TRUE);
}
}
}
// =========================================================================
BOOL CALLBACK dlgChpassKeyfileWizard_HandleMsg_WM_NOTIFY(HWND hDlg, WPARAM wParam, LPARAM lParam)
{
BOOL retval = FALSE;
int idCtrl;
NMHDR* notifHdr;
NMUPDOWN* lpnmud;
NMUSERRNG_BYTEGEN* lpnmRNG;
int currPage;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("dlgChpassKeyfileWizard_HandleMsg_WM_NOTIFY\n")));
idCtrl = (int)wParam;
notifHdr = (NMHDR*)lParam;
switch (notifHdr->code)
{
case URNG_BYTEGEN:
{
if (idCtrl == IDCTRL_USERRNG)
{
lpnmRNG = (NMUSERRNG_BYTEGEN*)lParam;
if ((G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPoolFilled_UserInput / 8) < sizeof(G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPool_UserInput))
{
// Store random byte...
G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPool_UserInput[G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPoolFilled_UserInput / 8] = lpnmRNG->Byte;
G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPoolFilled_UserInput += 8;
// Update display of bits generated...
SetDlgItemInt(
hDlg,
IDC_STATIC_USERRNG_STORED,
G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPoolFilled_UserInput,
TRUE
);
// Disable control if the userRNG pool is full...
if ((G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPoolFilled_UserInput / 8) >= sizeof(G_dlgChpassKeyfileWizard_ChpassKeyfileParams.RandomPool_UserInput))
{
SetControlEnabled(hDlg, IDCTRL_USERRNG, FALSE);
}
}
}
break;
}
case TCN_SELCHANGE:
{
currPage = _dlgChpassKeyfileWizard_GetPageIdxOfPage(hDlg);
if (
(
(currPage == PAGE_IDX_SRCDETAILS) ||
(currPage == PAGE_IDX_DESTDETAILS)
) &&
(idCtrl == IDC_TAB1)
)
{
_dlgChpassKeyfileWizard_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 == hSrcDetailsWndAdvanced)
{
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_SETACTIVE:
{
currPage = _dlgChpassKeyfileWizard_GetPageIdxOfPage(hDlg);
_dlgChpassKeyfileWizard_DisplayDetailsTabPage(hDlg, currPage);
_dlgChpassKeyfileWizard_SetWizardButtons(currPage);
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;
}
case PSN_APPLY:
{
// This notification is received when the user clicks
// "OK"/"Apply"
// This is called once for each of the tabs.
// When called, we validate the tab it is called for (this
// has the effect that the first invalid tab will be automatically
// selected)
// If the tab being called for is the last one (the summary),
// we create the new volume.
currPage = _dlgChpassKeyfileWizard_GetPageIdxOfPage(hDlg);
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("PSN_APPLY for page idx: %d\n"), currPage));
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
if (dlgChpassKeyfileWizard_ValidatePage(hDlg))
{
// If it's the last page, only succeed if the volume can be
// created
if (currPage != _dlgChpassKeyfileWizard_GetPageIdxOfLastPage())
{
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
}
else
{
if (dlgChpassKeyfileWizard_ChpassKeyfile(hDlg))
{
if (G_dlgChpassKeyfileWizard_DlgMode == DLGMODE_NEWKEYFILE)
{
MsgInfo(hDlg, TEXT("Keyfile created successfully."));
}
else
{
MsgInfo(hDlg, TEXT("Volume/keyfile changed successfully."));
}
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
}
else
{
if (G_dlgChpassKeyfileWizard_DlgMode == DLGMODE_NEWKEYFILE)
{
MsgError(hDlg, TEXT("Unable to create keyfile; please check your password and other settings, and ensure you have enough storage space to hold a new keyfile"));
}
else
{
MsgError(hDlg, TEXT("Unable to update the volume/keyfile as requested; please check your password and other settings"));
}
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_INVALID);
}
}
}
else
{
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_INVALID);
}
break;
}
case PSN_RESET:
{
// This notification is received when the user clicks
// "Close"/"Cancel"
DEBUGOUTGUI(DEBUGLEV_INFO, (TEXT("Dialog cancelled by user\n")));
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
break;
}
}
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("dlgChpassKeyfileWizard_HandleMsg_WM_NOTIFY\n")));
return TRUE;
}
// =========================================================================
// This function is required in order to get the WinCE look & feel to the
// tabbed dialog.
int CALLBACK dlgChpassKeyfileWizard_PropSheetProc(
HWND hwndDlg,
UINT uMsg,
LPARAM lParam
)
{
int retval = 0;
switch (uMsg)
{
case PSCB_GETVERSION:
{
// We do *NOT* set the version here. The resize causes the page
// to be displayed *over* the property sheet's tabs. Setting
// this version prevents this from working correctly
retval = COMCTL32_VERSION;
break;
}
}
return retval;
}
// =========================================================================
HWND _dlgChpassKeyfileWizard_CreateDialogWindow(
HWND ParentHWND,
int ResourceID
)
{
DLGTEMPLATE* dlgtempl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -