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

📄 scwfwiz.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*____________________________________________________________________________
	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 + -