⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlgchpasskeyfilewizard.c

📁 文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-1, SHA-224, SHA-256,
💻 C
📖 第 1 页 / 共 5 页
字号:
// 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 + -