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

📄 dlgmount.c

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