cldiskwiz.c
来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 1,374 行 · 第 1/3 页
C
1,374 行
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
CLgenwiz.c - handle wizard for creating new keys
$Id: CLdiskwiz.c,v 1.20 2002/11/22 03:12:09 pbj Exp $
____________________________________________________________________________*/
#include "pgpPFLConfig.h"
// project header files
#include "PGPclx.h"
#include "SpaceEdit.h"
#include "UTF8Edit.h"
// pgp header files
#include "pgpRandomPool.h"
#include "pgpUserInterface.h"
#include "pgpReconstruct.h"
#include <commdlg.h>
#include <tchar.h>
// pgp disk files
#define PGPDISK_DYNLINK
#include "pgpDiskEngine.h"
#include "pgpDiskUI.h"
#define kDiskFat12FileSys 0
#define kDiskFat16FileSys 1
#define kDiskFat12Or16FileSys 2
#define kDiskFat32FileSys 3
#define kDiskNTFSFileSys 4
#define kDiskUnknownFileSys 5
#define kDiskInvalidAlgorithm 0
#define kDiskCopyDataAlgorithm 1
#define kDiskOldCAST5Algorithm 2
#define kDiskCAST5Algorithm 3
#define kDiskTwoFishAlgorithm 4
#define kDiskAESAlgorithm 5
#include <stdio.h>
// system header files
#include <process.h>
#include <lmaccess.h>
#include <lmerr.h>
#define PROGRESS_TIMER 2345L
#define PROGRESSTIMERPERIOD 150L
#define NUM_WIZ_PAGES 5
#define MAX_TASKS 2
#define TASK_DISKGEN 0
#define TASK_DISKFORMAT 1
#define IDS_DISKGEN 0
#define IDS_DISKFORMAT 1
#define IDS_DISKTITLE 2
#define IDS_DISKCONFIRMCANCEL 3
#define ICON_NONE 0
#define ICON_ARROW 1
#define ICON_CHECK 2
#define ICON_ERROR 3
#define KGWIZ_CORPDISKINTRO 0
#define KGWIZ_CORPDISKOPTS 1
#define KGWIZ_ENTROPY 2
#define KGWIZ_CORPDISKCREATION 3
#define KGWIZ_CORPDISK_DONE 4
// external globals
extern HINSTANCE g_hInst;
extern PGPContextRef g_context;
extern HIMAGELIST g_hilClientLib;
// typedefs
typedef struct _DISKINFO
{
PGPContextRef context;
HWND hwndWiz;
HWND hwndParent;
PGPKeyDBRef keydbMain;
HBITMAP hbitmapIntro;
HBITMAP hbitmapDone;
HPALETTE hpaletteIntro;
HPALETTE hpaletteDone;
HFONT hfontIntro;
HFONT hfontInterior;
HICON hiconAlert;
HICON hiconDoing;
HICON hiconDone;
HICON hiconNotDone;
PGPKeyDBObjRef keyADK;
PGPKeyDBObjRef keyCorp;
BOOL bEnforceADK;
BOOL bMetaCorpKey;
LONG lRandomBitsNeeded;
LONG lOriginalEntropy;
PGPKeyDBObjRef keyNew;
PGPBoolean bTaskComplete;
BOOL bCancelPending;
PGPError err;
PGPBoolean areFormatting;
PGPUInt32 percent;
PGPBoolean oldAreFormatting;
PGPBoolean oldTaskComplete;
PGPUInt32 oldPercent;
HANDLE hThread;
PGPUInt32 diskAlgorithm;
PGPUInt32 diskSize;
PGPUInt32 diskFS;
char diskName[MAX_PATH];
PGPKeyDBObjRef diskADK;
PGPdiskContextRef diskContext;
} DISKINFO, *PDISKINFO;
static HWND s_hwndCollectEntropy = NULL;
PGPBoolean NewDiskStatus(PGPBoolean areFormatting,PGPUInt32 percent, void *userVal)
{
PDISKINFO pkgi;
pkgi=(PDISKINFO)userVal;
pkgi->areFormatting=areFormatting;
pkgi->percent=percent;
if(pkgi->bCancelPending)
return FALSE;
return TRUE;
}
static char kRegistryMappedDrive98Section[] = "Network\\Persistent";
static char kRegistryMappedDriveNTSection[] = "Network";
PGPBoolean IsDriveNetworkMapped(char drive)
{
PGPclWindowsGenus genus;
char *regPathToMapped;
char szReg[200];
HKEY hkey;
PGPclGetWindowsVersion (NULL, &genus, NULL);
if (genus == kPGPclWindowsGenus95)
regPathToMapped = kRegistryMappedDrive98Section;
else
regPathToMapped = kRegistryMappedDriveNTSection;
sprintf(szReg,"%s\\%c",regPathToMapped,drive+'a');
if(RegOpenKeyEx (HKEY_CURRENT_USER, szReg, 0, KEY_READ, &hkey)==ERROR_SUCCESS)
{
RegCloseKey(hkey);
return TRUE;
}
return FALSE;
}
DWORD WINAPI sDiskGenerationThread(LPVOID lpvParam)
{
PDISKINFO pkgi;
PGPdiskDiskSetRef diskSet;
PGPdiskDiskRef diskDisk;
PGPError err;
char volName[MAX_PATH];
PGPUInt32 drives;
char i;
pkgi = (PDISKINFO) lpvParam;
drives = GetLogicalDrives();
for (i = 2; i < 26; i++)
{
if (!(drives & (1 << i)))
{
sprintf(volName,"%c:\\",i+'a');
if (!IsDriveNetworkMapped(i))
break;
}
}
err=PGPdiskNewDiskSet(pkgi->diskContext, &diskSet);
if(IsntPGPError(err))
{
err=PGPdiskDiskSetCreateDiskWithPub(
diskSet,
pkgi->diskName,
pkgi->diskSize,
pkgi->diskAlgorithm,
pkgi->keyNew,
volName,
NewDiskStatus,
pkgi,
&diskDisk);
if(IsntPGPError(err))
{
err=PGPdiskFormatNewDisk(pkgi->diskContext,
volName,"PGPdisk",
pkgi->diskFS, NewDiskStatus, pkgi);
}
PGPdiskFreeDiskSet(diskSet);
}
pkgi->err=err;
pkgi->bTaskComplete=TRUE;
return 0;
}
// ______________________________________________
//
// setup the current task text
static VOID
sSetCurrentTaskInfo (
PDISKINFO pkgi,
UINT uIcon,
UINT taskicon)
{
HICON hicon = NULL;
switch (uIcon)
{
case ICON_ARROW :
hicon = pkgi->hiconDoing;
break;
case ICON_CHECK :
hicon = pkgi->hiconDone;
break;
case ICON_ERROR :
hicon = pkgi->hiconNotDone;
break;
default:
break;
}
SendDlgItemMessage (pkgi->hwndWiz, taskicon,
STM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hicon);
}
// ______________________________________________
//
// Dialog procedure for "Finish" dialog
static LRESULT WINAPI
sKeyWizardDoneDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PDISKINFO pkgi;
BOOL bReturnCode = FALSE;
switch (uMsg) {
case WM_INITDIALOG:
{
PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;
pkgi = (PDISKINFO) ppspMsgRec->lParam;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)pkgi);
SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
(WPARAM)pkgi->hfontIntro, (LPARAM)FALSE);
return TRUE;
}
case WM_PAINT :
pkgi = (PDISKINFO)GetWindowLong (hwnd, GWL_USERDATA);
if (pkgi->hpaletteDone)
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint (hwnd, &ps);
SelectPalette (hDC, pkgi->hpaletteDone, FALSE);
RealizePalette (hDC);
EndPaint (hwnd, &ps);
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
switch (pnmh->code) {
case PSN_SETACTIVE:
pkgi = (PDISKINFO)GetWindowLong (hwnd, GWL_USERDATA);
PostMessage (GetParent (hwnd),
PSM_SETWIZBUTTONS, 0, PSWIZB_BACK|PSWIZB_FINISH);
SendDlgItemMessage (hwnd, IDC_WIZBITMAP, STM_SETIMAGE,
IMAGE_BITMAP, (LPARAM) pkgi->hbitmapDone);
SetWindowLong (hwnd, DWL_MSGRESULT, 0L);
bReturnCode = TRUE;
break;
case PSN_WIZFINISH:
pkgi = (PDISKINFO)GetWindowLong (hwnd, GWL_USERDATA);
SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
bReturnCode = TRUE;
break;
}
break;
}
}
return bReturnCode;
}
// ______________________________________________
//
// Dialog procedure for actually generating the key(s)
static LRESULT WINAPI
sKeyWizardProgressDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
PDISKINFO pkgi;
BOOL bReturnCode = FALSE;
DWORD dwThreadId;
switch (uMsg)
{
case WM_INITDIALOG:
{
PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;
pkgi = (PDISKINFO) ppspMsgRec->lParam;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)pkgi);
SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
(WPARAM)pkgi->hfontInterior, (LPARAM)FALSE);
pkgi->hwndWiz = hwnd;
// initialize Intel RNG icon and text
if (!PGPGlobalRandomPoolHasIntelRNG ())
{
ShowWindow (GetDlgItem (hwnd, IDC_INTELICON), SW_HIDE);
ShowWindow (GetDlgItem (hwnd, IDC_INTELTEXT), SW_HIDE);
}
// Kick off generation thread here
pkgi->hThread=CreateThread(NULL, 0, sDiskGenerationThread, (void *) pkgi, 0, &dwThreadId);
return TRUE;
}
case WM_TIMER :
{
if (wParam == PROGRESS_TIMER)
{
char szText[100];
pkgi = (PDISKINFO)GetWindowLong (hwnd, GWL_USERDATA);
if((pkgi->percent!=pkgi->oldPercent)||
(pkgi->areFormatting!=pkgi->oldAreFormatting))
{
pkgi->oldPercent=pkgi->percent;
pkgi->oldAreFormatting=pkgi->areFormatting;
SendMessage(GetDlgItem(hwnd,IDC_CURTASK_BAR),
PBM_SETPOS,(WPARAM)(pkgi->percent),0);
if (pkgi->areFormatting)
{
sSetCurrentTaskInfo (pkgi,ICON_CHECK,IDC_TASKICON1);
sSetCurrentTaskInfo (pkgi,ICON_ARROW,IDC_TASKICON2);
strcpy(szText,"Formatting PGPdisk");
SendMessage(GetDlgItem(hwnd,IDC_ALLTASK_BAR),
PBM_SETPOS,(WPARAM)(50+(pkgi->percent/2)),0);
}
else
{
sSetCurrentTaskInfo (pkgi,ICON_ARROW,IDC_TASKICON1);
strcpy(szText,"Encrypting PGPdisk");
SendMessage(GetDlgItem(hwnd,IDC_ALLTASK_BAR),
PBM_SETPOS,(WPARAM)(pkgi->percent/2),0);
}
SetWindowText(GetDlgItem(hwnd,IDC_CURTASK_TEXT),
szText);
}
if(pkgi->bTaskComplete!=pkgi->oldTaskComplete)
{
pkgi->oldTaskComplete=pkgi->bTaskComplete;
if(pkgi->err==kPGPError_UserAbort)
{
strcpy(szText,"PGPdisk creation aborted");
sSetCurrentTaskInfo (pkgi,ICON_ERROR,
pkgi->areFormatting?IDC_TASKICON2:IDC_TASKICON1);
}
else if(IsPGPError(pkgi->err))
{
char szError[1024];
DWORD dwDebug;
PGPclErrorToString(pkgi->err, szError, 1023, &dwDebug);
SetWindowText(GetDlgItem(hwnd,IDC_CORPDISKERROR),
szError);
strcpy(szText,"PGPdisk creation failed");
sSetCurrentTaskInfo (pkgi,ICON_ERROR,
pkgi->areFormatting?IDC_TASKICON2:IDC_TASKICON1);
}
else
{
strcpy(szText,"PGPdisk creation finished");
sSetCurrentTaskInfo (pkgi,ICON_CHECK,IDC_TASKICON2);
SendMessage (GetParent(hwnd),
PSM_SETWIZBUTTONS, 0, PSWIZB_NEXT);
}
SetWindowText(GetDlgItem(hwnd,IDC_CURTASK_TEXT),
szText);
}
}
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?