📄 scwfwiz.c
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
CLgenwiz.c - handle wizard for creating new keys
$Id: SCwfWiz.c,v 1.19 2002/11/16 08:55:23 wjb Exp $
____________________________________________________________________________*/
// project header files
#include "precomp.h"
// constant definitions
#define WIPEWIZ_INTRO 0
#define WIPEWIZ_INFO 1
#define WIPEWIZ_STATUS 2
#define WIPEWIZ_DONE 3
#define NUM_WIZ_PAGES 4
#define PROGRESSTIMERID 999
#define PROGRESSTIMERINTERVAL 250
// ____________________________________
//
// set font of heading text
static HFONT
sLoadHeadingFont (
BOOL bInterior)
{
LOGFONT lf;
memset (&lf, 0, sizeof(lf));
if (bInterior)
{
LoadString (g_hinst, IDS_INTERIORWIZFONT,
lf.lfFaceName, sizeof(lf.lfFaceName));
lf.lfHeight = 8;
lf.lfWeight = FW_BOLD;
}
else
{
LoadString (g_hinst, IDS_INTROWIZFONT,
lf.lfFaceName, sizeof(lf.lfFaceName));
lf.lfWeight = FW_BOLD;
}
return (CreateFontIndirect (&lf));
}
// ______________________________________________
//
// Dialog procedure for "Finish" dialog
static LRESULT WINAPI
sWipeWizardDoneDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
VOLINFO *vi;
BOOL bReturnCode = FALSE;
switch (uMsg) {
case WM_INITDIALOG:
{
PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;
vi = (VOLINFO *) ppspMsgRec->lParam;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)vi);
SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
(WPARAM)vi->hfontIntro, (LPARAM)FALSE);
break;
}
case WM_PAINT :
vi = (VOLINFO *)GetWindowLong (hwnd, GWL_USERDATA);
if (vi->hpaletteDone)
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint (hwnd, &ps);
SelectPalette (hDC, vi->hpaletteDone, FALSE);
RealizePalette (hDC);
EndPaint (hwnd, &ps);
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
switch (pnmh->code) {
case PSN_SETACTIVE:
vi = (VOLINFO *)GetWindowLong (hwnd, GWL_USERDATA);
PostMessage (GetParent (hwnd),
PSM_SETWIZBUTTONS, 0, PSWIZB_BACK|PSWIZB_FINISH);
SendDlgItemMessage (hwnd, IDC_WIZBITMAP, STM_SETIMAGE,
IMAGE_BITMAP, (LPARAM) vi->hbitmapDone);
SetWindowLong (hwnd, DWL_MSGRESULT, 0L);
bReturnCode = TRUE;
break;
case PSN_WIZFINISH:
{
PGPPrefRef prefRef;
PGPError err;
vi = (VOLINFO *)GetWindowLong (hwnd, GWL_USERDATA);
err=PGPclPeekClientLibPrefRefs(&prefRef,NULL);
if(IsntPGPError(err))
{
PGPSetPrefNumber ( prefRef,
kPGPPrefDiskWipePasses,
vi->passes);
PGPclFlushClientLibPrefs (prefRef, NULL);
}
vi->bFinishSelected = TRUE;
SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
bReturnCode = TRUE;
break;
}
}
break;
}
}
return bReturnCode;
}
BOOL EnableWipeNTFSInteral(HWND hwnd)
{
char szRoot[20];
char szFSName[100];
BOOL bEnable;
bEnable=FALSE;
GetWindowText(GetDlgItem(hwnd, IDC_DRIVECOMBO),
szRoot, 20);
if(GetVolumeInformation(szRoot,
NULL,0,
NULL,
NULL,
NULL,
szFSName,100))
{
if(!strcmp(szFSName,"NTFS"))
{
char szSystem[100];
GetSystemDirectory(szSystem,100);
if(strnicmp(szSystem,szRoot,strlen(szRoot)))
{
bEnable=TRUE;
}
}
}
EnableWindow(GetDlgItem(hwnd, IDC_WIPENTFSINTERNAL),bEnable);
EnableWindow(GetDlgItem(hwnd, IDC_WIPENTFSSTATIC),bEnable);
if(!bEnable)
CheckDlgButton(hwnd, IDC_WIPENTFSINTERNAL, BST_UNCHECKED);
return TRUE;
}
// ______________________________________________
//
// Dialog procedure for getting name and email address
// from user
static LRESULT WINAPI
sWipeWizardInfoDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
VOLINFO *vi;
BOOL bReturnCode = FALSE;
switch (uMsg) {
case WM_INITDIALOG:
{
char buf[512];
HWND drivelist,numpasses;
int len;
char *drive;
PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;
vi = (VOLINFO *) ppspMsgRec->lParam;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)vi);
SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
(WPARAM)vi->hfontInterior, (LPARAM)FALSE);
// initialize drive list and passes
SendMessage(GetDlgItem(hwnd, IDC_SPIN1),
UDM_SETRANGE,
0,
MAKELPARAM(32, 1));
drivelist = GetDlgItem(hwnd, IDC_DRIVECOMBO);
numpasses = GetDlgItem(hwnd, IDC_NUMPASSES);
len = GetLogicalDriveStrings(sizeof(buf), buf);
drive = buf;
while(*drive)
{
*drive=(char)toupper((int)*drive);
SendMessage(drivelist,
CB_ADDSTRING,
0,
(LPARAM)drive);
drive += strlen(drive) + 1;
}
SendMessage(drivelist,
CB_SETCURSEL,
0,
0);
if(vi->drive!=NULL)
{
SendMessage(drivelist,
CB_SELECTSTRING ,
(WPARAM)(-1),
(LPARAM)vi->drive);
}
SendMessage(numpasses,
EM_SETLIMITTEXT,
2,
0);
wsprintf(buf, "%d", vi->passes);
SetWindowText(numpasses, buf);
EnableWipeNTFSInteral(hwnd);
break;
}
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDC_DRIVECOMBO:
{
EnableWipeNTFSInteral(hwnd);
break;
}
}
break;
}
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
switch(pnmh->code) {
case PSN_SETACTIVE:
PostMessage(GetParent(hwnd),
PSM_SETWIZBUTTONS, 0, PSWIZB_BACK|PSWIZB_NEXT);
SetWindowLong(hwnd, DWL_MSGRESULT, 0L);
bReturnCode = TRUE;
break;
case PSN_WIZNEXT:
{
char buf[512];
int passes;
HWND numpasses;
vi = (VOLINFO *)GetWindowLong (hwnd, GWL_USERDATA);
vi->bNTFSInternal=
(IsDlgButtonChecked(hwnd, IDC_WIPENTFSINTERNAL) == BST_CHECKED);
numpasses=GetDlgItem(hwnd, IDC_NUMPASSES);
// Save user data for this page
GetWindowText(GetDlgItem(hwnd, IDC_DRIVECOMBO),
vi->drive, sizeof(vi->drive));
GetWindowText(numpasses, buf, sizeof(buf));
passes = atoi(buf);
vi->passes = passes;
if((passes<1)||(passes>32))
{
char Caption[100];
char Message[500];
LoadString (g_hinst, IDS_PGPERROR, Caption, sizeof(Caption));
LoadString (g_hinst, IDS_PASSESOUTOFRANGE, Message, sizeof(Message));
MessageBox(hwnd,Message,Caption,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
if(passes<1)
SetWindowText(numpasses, "1");
if(passes>32)
SetWindowText(numpasses, "32");
SetWindowLong(hwnd,DWL_MSGRESULT,(LPARAM)-1); // Don't go on...
return TRUE;
}
break;
}
}
}
}
return bReturnCode;
}
void WipeThread(void* pvoid)
{
VOLINFO *vi;
long err;
char buf[512];
PGPError error = kPGPError_NoErr;
PGPError entropyErr = kPGPError_NoErr;
PGPDiskWipeRef wipeRef = NULL;
PGPInt32 pattern[256];
char StrRes[500];
int passes;
vi=(VOLINFO *)pvoid;
passes=vi->passes;
SetTimer(vi->hwnd,PROGRESSTIMERID,PROGRESSTIMERINTERVAL,NULL);
EnableWindow(GetDlgItem(vi->hwnd, IDC_BEGIN), FALSE);
EnableWindow(GetDlgItem(vi->hwnd, IDC_SCHEDULE), FALSE);
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
0);
vi->bWiping = TRUE;
do{
error = PGPCreateDiskWiper(vi->context, &wipeRef, passes);
if(error == kPGPError_OutOfEntropy)
{
if(vi->bCmdLine)
break;
entropyErr = PGPclRandom(vi->context, vi->hwnd, 300);
}
}while( error == kPGPError_OutOfEntropy &&
entropyErr != kPGPError_UserAbort);
err = WFE_NOERROR;
if( IsntPGPError(error) )
{
int count = 0;
do
{
WipeProgress(vi,0);
PassProgress(vi,vi->passes - passes, vi->passes);
if(err != WFE_DISKMODIFIED)
{
PGPGetDiskWipeBuffer(wipeRef, pattern);
}
err = WipeFree( vi,
vi->drive,
pattern,
TRUE);
if(err == WFE_DISKMODIFIED)
{
vi->restarts=vi->restarts+1;
if(vi->restarts>10)
break;
else
{
SetWindowText(GetDlgItem(vi->hwnd,IDC_RESTARTINGTEXT),
"Write detected! Restarting pass.");
vi->RestartDelay=1;
}
}
else if(err==WFE_NOERROR)
{
SetWindowText(GetDlgItem(vi->hwnd,IDC_RESTARTINGTEXT),
"");
passes--;
}
}while(((err==WFE_NOERROR) || (err==WFE_DISKMODIFIED)) && (passes!=0) );
vi->restarts=0;
SetWindowText(GetDlgItem(vi->hwnd,IDC_RESTARTINGTEXT),
"");
error = PGPDestroyDiskWiper(wipeRef);
}
else
{
err = error;
}
vi->bWiping = FALSE;
KillTimer(vi->hwnd,PROGRESSTIMERID);
switch(err)
{
case kPGPError_OutOfEntropy:
{
LoadString (g_hinst, IDS_NOENTROPY, StrRes, sizeof(StrRes));
wsprintf(buf, StrRes, vi->drive);
// Success.. Enable finish button
if(!vi->bCmdLine)
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
PSWIZB_BACK | PSWIZB_NEXT);
break;
}
case WFE_NOERROR:
{
LoadString (g_hinst, IDS_WIPECONGRATS, StrRes, sizeof(StrRes));
wsprintf(buf, StrRes, vi->drive);
// Success.. Enable finish button
if(!vi->bCmdLine)
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
PSWIZB_BACK | PSWIZB_NEXT);
break;
}
case WFE_USERCANCEL:
{
LoadString (g_hinst, IDS_WIPECANCEL, StrRes, sizeof(StrRes));
wsprintf(buf, StrRes);
if(!vi->bCmdLine)
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
PSWIZB_BACK);
break;
}
case WFE_ACCESSDENIED:
{
char msg[256];
LoadString (g_hinst, IDS_NEEDADMINTOWIPE, msg, sizeof(msg));
LoadString (g_hinst, IDS_WIPENOTSUCCESSFUL, StrRes, sizeof(StrRes));
wsprintf(buf, StrRes, msg);
if(!vi->bCmdLine)
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
PSWIZB_BACK);
break;
}
default:
{
char msg[256];
if(IsPGPError(error))
{
PGPclErrorToString (error, msg, sizeof(msg),NULL);
}
else
{
LoadString( g_hinst,
err -1 + IDS_FSNOTSUPPORTED,
msg,
sizeof(msg));
}
LoadString (g_hinst, IDS_WIPENOTSUCCESSFUL, StrRes, sizeof(StrRes));
wsprintf(buf, StrRes, msg);
if(!vi->bCmdLine)
SendMessage(GetParent(vi->hwnd),
PSM_SETWIZBUTTONS,
0,
PSWIZB_BACK);
break;
}
}
StatusMessage(vi,buf, TRUE);
WipeProgress(vi,0);
PassProgress(vi,vi->passes - passes, vi->passes);
// Command line. Set the return value and close everything down
if(vi->bCmdLine)
{
if((err==WFE_NOERROR)||(err==WFE_USERCANCEL))
vi->bFinishSelected=TRUE;
// Wait 5 seconds to show user error
Sleep(5000);
SendMessage(GetParent(vi->hwnd),WM_CLOSE,0,0);
return;
}
// Not command line.. proceed to finish and reset everything
EnableWindow(GetDlgItem(vi->hwnd, IDC_BEGIN), TRUE);
EnableWindow(GetDlgItem(vi->hwnd, IDC_SCHEDULE), TRUE);
}
static LRESULT WINAPI
sWipeWizardStatusDlgProc (
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
VOLINFO *vi;
BOOL bReturnCode = FALSE;
switch (uMsg) {
case WM_INITDIALOG:
{
PROPSHEETPAGE *ppspMsgRec = (PROPSHEETPAGE *) lParam;
vi = (VOLINFO *) ppspMsgRec->lParam;
SetWindowLong (hwnd, GWL_USERDATA, (LPARAM)vi);
SendDlgItemMessage (hwnd, IDC_HEADING, WM_SETFONT,
(WPARAM)vi->hfontInterior, (LPARAM)FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -