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

📄 dlgnewvolwizard.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 "dlgNewVolWizard.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...

// The number of steps in the wizard
#define NEWVOLWIZARD_STEPS 12

#define PAGE_IDX_WELCOME            0
#define PAGE_IDX_FILENAME           1
#define PAGE_IDX_OFFSET             2
#define PAGE_IDX_SIZE               3
#define PAGE_IDX_HASHCYPHERIV       4
#define PAGE_IDX_MASTERKEYLEN       5
#define PAGE_IDX_RNGSELECT          6
#define PAGE_IDX_RNGMOUSEMOVEMENT   7
#define PAGE_IDX_PASSWORD           8
#define PAGE_IDX_SALT               9
#define PAGE_IDX_CDBLOCATION       10
#define PAGE_IDX_SUMMARY           11

const SECTOR_IV_GEN_METHOD ARR_SECTOR_IV_GEN_METHOD[] = {
                                            SCTRIVGEN_NONE,
                                            SCTRIVGEN_32BIT_SECTOR_ID,
                                            SCTRIVGEN_64BIT_SECTOR_ID,
                                            SCTRIVGEN_HASH_32BIT_SECTOR_ID,
                                            SCTRIVGEN_HASH_64BIT_SECTOR_ID,
                                            SCTRIVGEN_ESSIV,
                                            SCTRIVGEN_UNKNOWN
                                            };
#define EDIT_CRLF TEXT("\r\n")
#define BYTES_IN_MEGABYTE (1024 * 1024)

// Arbitary control ID
#define IDCTRL_USERRNG 125


// =========================================================================
// Structures...

typedef struct _NEW_VOL_PARAMETERS {
    BOOL ParamsOK;
    int ErrorPageIdx;

    WCHAR Filename[FREEOTFE_MAX_FILENAME_LENGTH];

    LARGE_INTEGER Size;  // In bytes

    LARGE_INTEGER Offset;

    WCHAR PrettyNameHash[MAX_PRETTYPRINTED_TITLE];
    WCHAR DriverHash[FREEOTFE_MAX_FILENAME_LENGTH];
    GUID ImplGUIDHash;
    WCHAR PrettyNameCypher[MAX_PRETTYPRINTED_TITLE];
    WCHAR DriverCypher[FREEOTFE_MAX_FILENAME_LENGTH];
    GUID ImplGUIDCypher;
    unsigned int KeyIterations;
    SECTOR_IV_GEN_METHOD SectorIVGenMethod;
    BOOL XORIV;

    int BlockSizeSelectedCypher;
    int KeySizeSelectedCypher;
    int KeySizeUser;

    RNG_SYSTEM SelectedRNG;  // Combination of the RNGs

    // The following buffers store random data as collected...
    int RandomPoolFilled_UserInput;  // In *bits*
    FREEOTFEBYTE RandomPool_UserInput[(CRITICAL_DATA_LENGTH / 8)];
    int RandomPoolFilled_MSCryptoAPI;  // In *bits*
    FREEOTFEBYTE RandomPool_MSCryptoAPI[(CRITICAL_DATA_LENGTH / 8)];

    unsigned char* UserPassword;
    unsigned char* UserPasswordConfirm;

    unsigned int SaltLength;  // In *bits*

    BOOL UseKeyfile;
    WCHAR Keyfile[FREEOTFE_MAX_FILENAME_LENGTH];

} NEW_VOL_PARAMETERS, *PNEW_VOL_PARAMETERS;


// =========================================================================
// Local to this file...

HWND G_dlgNewVolWizard_MenuBar = NULL;
HWND G_dlgNewVolWizard_UserRNG = NULL;
BOOL G_dlgNewVolWizard_PageCompleted[NEWVOLWIZARD_STEPS];
NEW_VOL_PARAMETERS G_dlgNewVolWizard_NewVolParams;

BOOL G_dlgNewVolWizard_GotImplDetails = FALSE;
int G_dlgNewVolWizard_CountImplCypher = 0;
DRIVER_AND_ALG* G_dlgNewVolWizard_ImplCypher = NULL;  // Array of options
int G_dlgNewVolWizard_CountImplHash = 0;
DRIVER_AND_ALG* G_dlgNewVolWizard_ImplHash = NULL;  // Array of options

BOOL G_dlgNewVolWizard_AllowFinish = FALSE;

// =========================================================================
// Forward declarations...

void _dlgNewVolWizard_EnableDisableControls(HWND hDlg);

BOOL CALLBACK dlgNewVolWizard_CreateNew(HWND hDlg);
BOOL CALLBACK dlgNewVolWizard_PropSheetProc(
                           HWND hDlg, 
                           UINT message, 
                           LPARAM lParam
                          );
BOOL CALLBACK dlgNewVolWizard_PropSheetPageProc(
                      HWND hDlg, 
                      UINT msg, 
                      WPARAM wParam, 
                      LPARAM lParam
                     );
void _dlgNewVolWizard_SecZeroParams();
BOOL dlgNewVolWizard_ValidatePage(HWND hDlg);
BOOL dlgNewVolWizard_ValidateAll(HWND hDlg);
void _dlgNewVolWizard_PopulateComboboxes(HWND hDlg);

BOOL _dlgNewVolWizard_QuerySiblings(HWND hDlg);
int _dlgNewVolWizard_GetCurrPageIdx(HWND hDlg);
int _dlgNewVolWizard_GetPageIdxOfPage(HWND hDlg);


// =========================================================================
void DisplayDlgNewVolWizard(HWND hWnd)
{
    PROPSHEETHEADER propHeader;
    PROPSHEETPAGE propPage[NEWVOLWIZARD_STEPS];
    int i;

    DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("DisplayDlgNewVolWizard\n")));

    for (
         i = 0;
         i < (sizeof(G_dlgNewVolWizard_PageCompleted) / sizeof(G_dlgNewVolWizard_PageCompleted[0]));
         i++
        )
        {
        G_dlgNewVolWizard_PageCompleted[i] = FALSE;
        }

    memset(
           &G_dlgNewVolWizard_NewVolParams, 
           0,
           sizeof(G_dlgNewVolWizard_NewVolParams)
          );

    // 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  = dlgNewVolWizard_PropSheetPageProc;

    // Filename step...
    propPage[PAGE_IDX_FILENAME].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_FILENAME].lParam      = PAGE_IDX_FILENAME;
    propPage[PAGE_IDX_FILENAME].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_FILENAME].pszTitle    = TEXT("Filename");
    propPage[PAGE_IDX_FILENAME].hInstance   = G_hInstance;
    propPage[PAGE_IDX_FILENAME].pszTemplate = MAKEINTRESOURCE(IDD_FILENAME);
    propPage[PAGE_IDX_FILENAME].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Offset step...
    propPage[PAGE_IDX_OFFSET].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_OFFSET].lParam      = PAGE_IDX_OFFSET;
    propPage[PAGE_IDX_OFFSET].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_OFFSET].pszTitle    = TEXT("Offset");
    propPage[PAGE_IDX_OFFSET].hInstance   = G_hInstance;
    propPage[PAGE_IDX_OFFSET].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_OFFSET);
    propPage[PAGE_IDX_OFFSET].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Size step...
    propPage[PAGE_IDX_SIZE].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_SIZE].lParam      = PAGE_IDX_SIZE;
    propPage[PAGE_IDX_SIZE].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_SIZE].pszTitle    = TEXT("Size");
    propPage[PAGE_IDX_SIZE].hInstance   = G_hInstance;
    propPage[PAGE_IDX_SIZE].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SIZE);
    propPage[PAGE_IDX_SIZE].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Hash/cypher/IV step...
    propPage[PAGE_IDX_HASHCYPHERIV].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_HASHCYPHERIV].lParam      = PAGE_IDX_HASHCYPHERIV;
    propPage[PAGE_IDX_HASHCYPHERIV].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_HASHCYPHERIV].pszTitle    = TEXT("Hash/cypher/IV");
    propPage[PAGE_IDX_HASHCYPHERIV].hInstance   = G_hInstance;
    propPage[PAGE_IDX_HASHCYPHERIV].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_HASHCYPHERIV);
    propPage[PAGE_IDX_HASHCYPHERIV].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Master key length step...
    propPage[PAGE_IDX_MASTERKEYLEN].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_MASTERKEYLEN].lParam      = PAGE_IDX_MASTERKEYLEN;
    propPage[PAGE_IDX_MASTERKEYLEN].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_MASTERKEYLEN].pszTitle    = TEXT("Master key length");
    propPage[PAGE_IDX_MASTERKEYLEN].hInstance   = G_hInstance;
    propPage[PAGE_IDX_MASTERKEYLEN].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_MASTERKEYLEN);
    propPage[PAGE_IDX_MASTERKEYLEN].pfnDlgProc  = dlgNewVolWizard_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  = dlgNewVolWizard_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  = dlgNewVolWizard_PropSheetPageProc;

    // Password step...
    propPage[PAGE_IDX_PASSWORD].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_PASSWORD].lParam      = PAGE_IDX_PASSWORD;
    propPage[PAGE_IDX_PASSWORD].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_PASSWORD].pszTitle    = TEXT("Password");
    propPage[PAGE_IDX_PASSWORD].hInstance   = G_hInstance;
    propPage[PAGE_IDX_PASSWORD].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_PASSWORD);
    propPage[PAGE_IDX_PASSWORD].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Salt step...
    propPage[PAGE_IDX_SALT].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_SALT].lParam      = PAGE_IDX_SALT;
    propPage[PAGE_IDX_SALT].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_SALT].pszTitle    = TEXT("Salt");
    propPage[PAGE_IDX_SALT].hInstance   = G_hInstance;
    propPage[PAGE_IDX_SALT].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SALT);
    propPage[PAGE_IDX_SALT].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // CDB location step...
    propPage[PAGE_IDX_CDBLOCATION].dwSize      = sizeof(propPage[0]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_CDBLOCATION].lParam      = PAGE_IDX_CDBLOCATION;
    propPage[PAGE_IDX_CDBLOCATION].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_CDBLOCATION].pszTitle    = TEXT("CDB location");
    propPage[PAGE_IDX_CDBLOCATION].hInstance   = G_hInstance;
    propPage[PAGE_IDX_CDBLOCATION].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_CDBLOCATION);
    propPage[PAGE_IDX_CDBLOCATION].pfnDlgProc  = dlgNewVolWizard_PropSheetPageProc;

    // Summary step...
    propPage[PAGE_IDX_SUMMARY].dwSize      = sizeof(propPage[1]);
    // Create when property sheet created, and tab caption (title)
    propPage[PAGE_IDX_SUMMARY].lParam      = PAGE_IDX_SUMMARY;
    propPage[PAGE_IDX_SUMMARY].dwFlags     = (PSP_PREMATURE | PSP_USETITLE);
    propPage[PAGE_IDX_SUMMARY].pszTitle    = TEXT("Summary");
    propPage[PAGE_IDX_SUMMARY].hInstance   = G_hInstance;
    propPage[PAGE_IDX_SUMMARY].pszTemplate = MAKEINTRESOURCE(IDD_NEWVOLWIZARD_SUMMARY);
    propPage[PAGE_IDX_SUMMARY].pfnDlgProc  = dlgNewVolWizard_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("New volume");
    propHeader.hwndParent  = hWnd;
    propHeader.hInstance   = G_hInstance;
    propHeader.nPages      = NEWVOLWIZARD_STEPS;
    propHeader.nStartPage  = 0;
    propHeader.ppsp        = propPage;
    propHeader.pfnCallback = dlgNewVolWizard_PropSheetProc; // Needed to get WinCE 
                                                            // look & feel control
       
    // Returns +ve value on success
    PropertySheet(&propHeader);

    DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("DisplayDlgNewVolWizard\n")));
}                


// =========================================================================
// Returns 0 based index of current page specified
// Pass this the HWND for the *main* dialog
int _dlgNewVolWizard_GetCurrPageIdx(HWND hDlg)
{
    return _dlgNewVolWizard_GetPageIdxOfPage(PropSheet_GetCurrentPageHwnd(hDlg));
}


// =========================================================================
// Returns 0 based index of current page specified
int _dlgNewVolWizard_GetPageIdxOfPage(HWND hDlg)
{
    int retval;

    retval = GetWindowLong(hDlg, GWL_USERDATA);

    return retval;
}


// =========================================================================
// Returns 0 based index of the last page
int _dlgNewVolWizard_GetPageIdxOfLastPage()
{
    int retval;

    retval = PAGE_IDX_SUMMARY;

    return retval;
}


// =========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -