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 + -
显示快捷键?