ptdisk.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 500 行

C
500
字号
/*____________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: PTdisk.c,v 1.34 2002/11/22 02:32:15 wjb Exp $
____________________________________________________________________________*/

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <shellapi.h>
#include <stdio.h>

#define WM_WTSSESSION_CHANGE            0x02B1
#define WTS_CONSOLE_CONNECT                0x1
#define WTS_CONSOLE_DISCONNECT             0x2
#define WTS_REMOTE_CONNECT                 0x3
#define WTS_REMOTE_DISCONNECT              0x4
#define WTS_SESSION_LOGON                  0x5
#define WTS_SESSION_LOGOFF                 0x6
#define WTS_SESSION_LOCK                   0x7
#define WTS_SESSION_UNLOCK                 0x8
#define WTS_SESSION_REMOTE_CONTROL         0x9

#define PGPDISK_DYNLINK

#include "pgpMem.h"
#include "pgpPflPriv.h"

#include "PGPclientlib.h"
#include "pgpClientErrors.h"
#include "pgpClientPrefs.h"
#include "PGPdiskEngine.h"
#include "PGPdiskUI.h"

#include "PTdisk.h"

//	________________________
//
// PGPdisk constants

static const char	*kPGPdiskNotAvailText	= 
	"Your PGPdisk installation is not valid. Please re-install PGP and try "
	"again.";
static const char	*kPGPdiskNoSleepOnUnmountFailure = 
	"Computer sleep has been prevented because PGPdisk could not unmount "
	"one or more of its volumes.";

//	________________________
//
// PGPdisk static variables

static PGPBoolean	PGPdiskInitialized=FALSE;
static PGPBoolean	PGPdiskEngineInitialized=FALSE;
static PGPBoolean	PGPdiskUIInitialized=FALSE;

static PGPdiskContextRef	PGPdiskContext	= kInvalidPGPdiskContextRef;

static PGPBoolean	PGPdiskUnmountOnSleep=FALSE;
static PGPBoolean	PGPdiskNoSleepIfUnmountFail=FALSE;
static UINT			uReloadKeyRingMsg=0;

//	_______________
//
//	Report an error

static 
VOID 
sReportError(const char *formatStr, PGPError error, HWND parent)
{
	pgpAssertStrValid(formatStr);

	if ((error != kPGPError_NoErr) && (error != kPGPError_UserAbort))
	{
		static char	pgpStrBuf[512];
		static char	errStrBuf[1024];

		PGPGetClientErrorString(error, 512, pgpStrBuf);
		sprintf(errStrBuf, formatStr, pgpStrBuf);

		MessageBox(parent, errStrBuf, "PGP Tray", MB_ICONERROR | MB_OK);
	}
}

//	________________________
//
//	Check if PGPdisk available

static 
PGPBoolean 
sCheckWarnPGPdiskAvailable(PGPBoolean silently, HWND parent)
{
	if (!PGPdiskInitialized)
	{
		if (!silently)
		{
			MessageBox(parent, kPGPdiskNotAvailText, "PGP Tray", 
				MB_ICONERROR | MB_OK);
		}

		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

//	________________________
//
//	Perform PGPdisk initialization

VOID 
PTDiskStartup()
{
	PGPError	error	= kPGPError_NoErr;

	if (PGPdiskInitialized)
		return;

	uReloadKeyRingMsg = RegisterWindowMessage (kPGPclReloadKeyRingMsg);

	error = PGPdiskEngineInitLibrary(0);

	if (IsntPGPError(error))
	{
		PGPdiskEngineInitialized = TRUE;
		error = PGPdiskUIInitLibrary();
	}

	if (IsntPGPError(error))
	{
		PGPdiskUIInitialized = TRUE;
		error = PGPdiskNewContext(kPGPdiskAPIVersion, &PGPdiskContext);
	}

	if (IsntPGPError(error))
		PGPdiskInitialized = TRUE;
	else
		PTDiskShutdown();
}

//	________________________
//
//	Perform PGPdisk shutdown

VOID
PTDiskShutdown()
{
	if (PGPdiskContextRefIsValid(PGPdiskContext))
	{
		PGPdiskFreeContext(PGPdiskContext);
		PGPdiskContext = kInvalidPGPdiskContextRef;
	}

	if (PGPdiskUIInitialized)
	{
		PGPdiskUICleanupLibrary();
		PGPdiskUIInitialized = FALSE;
	}

	if (PGPdiskEngineInitialized)
	{
		PGPdiskEngineCleanupLibrary();
		PGPdiskEngineInitialized = FALSE;
	}

	PGPdiskInitialized = FALSE;
}

//	________________________
//
//	Mount startup PGPdisks.

VOID
PTDiskMountStartupDisks(HWND parent)
{
	PGPError	error	= kPGPError_NoErr;

	if (!sCheckWarnPGPdiskAvailable(TRUE, parent))
		return;

	error = PGPdiskMountStartupDisks(PGPdiskContext, NULL);

	if (IsPGPError(error))
	{
		sReportError("PGPdisk Mount At Startup failed because: \"%s.\"", 
			error, parent);
	}
}

//	________________________
//
//	Invoke app command line.

static 
VOID 
sInvokePGPdiskApp(const char *command, const char *path, HWND parent)
{
	static char	cmdLine[kPGPdiskMaxPathLength * 2];
	PGPUInt32	result;

	pgpAssertStrValid(command);

	strcpy(cmdLine, command);
	strcat(cmdLine, " ");

	if (IsntNull(path))
	{
		strcat(cmdLine, "\"");
		strcat(cmdLine, path);
		strcat(cmdLine, "\"");
	}

	result	= (PGPUInt32) ShellExecute(NULL, "open", PGPDISK_EXE_NAME, 
		cmdLine, NULL, SW_SHOWNORMAL);

	if (result < 32)
	{
		MessageBox(parent, kPGPdiskNotAvailText, "PGP Tray", 
			MB_ICONERROR | MB_OK);
	}
}

//	________________________
//
//	Create a PGPdisk.

static 
VOID 
sCreatePGPdisk(HWND parent)
{
	if (!sCheckWarnPGPdiskAvailable(FALSE, parent))
		return;

	// go to app for this command, should be in separate process
	sInvokePGPdiskApp("create", NULL, parent);
}

//	________________________
//
//	Edit a PGPdisk

static 
VOID 
sEditPGPdisk(HWND parent)
{
	char		path[kPGPdiskMaxPathLength];
	PGPError	error	= kPGPError_NoErr;

	if (!sCheckWarnPGPdiskAvailable(FALSE, parent))
		return;

	error = PGPdiskAskChooseDisk(PGPdiskContext, NULL, NULL, NULL, path, 
		kPGPdiskMaxPathLength);

	// go to app for this command, should be in separate process
	if (IsntPGPError(error))
		sInvokePGPdiskApp("edit", path, parent);

	if (IsPGPError(error))
		sReportError("PGPdisk Edit failed because: \"%s.\"", error, parent);
}

//	________________________
//
//	Mount a PGPdisk

static 
VOID 
sMountPGPdisk(HWND parent)
{
	char		path[kPGPdiskMaxPathLength];
	PGPError	error	= kPGPError_NoErr;

	if (!sCheckWarnPGPdiskAvailable(FALSE, parent))
		return;

	error = PGPdiskAskChooseDisk(PGPdiskContext, NULL, NULL, NULL, path, 
		kPGPdiskMaxPathLength);

	if (IsntPGPError(error))
		error = PGPdiskAskMountDisk(PGPdiskContext, path, NULL);

	if (IsPGPError(error))
		sReportError("PGPdisk Mount failed because: \"%s.\"", error, parent);
}

//	________________________
//
//	Unmount all PGPdisks

static 
PGPBoolean 
sUnmountAllPGPdisks(PGPBoolean timedOutOnly, PGPBoolean silently, 
					PGPBoolean shutdown, HWND parent)
{
	PGPError	error	= kPGPError_NoErr;
	PGPUInt32	flags	= kPGPdiskNoUnmountFlags;

	if (!sCheckWarnPGPdiskAvailable(silently, parent))
		return FALSE;

	if (silently)
		flags |= kPGPdiskSilentUnmountFlag;

	if (timedOutOnly)
		flags |= kPGPdiskTimedOutUnmountAllFlag;

	if (shutdown)
		flags |= kPGPdiskShutdown;

	error = PGPdiskAskUnmountAllDisks(PGPdiskContext, NULL, flags);

	if (IsPGPError(error) && !silently)
	{
		sReportError("PGPdisk Unmount All failed because: \"%s.\"", error, 
			parent);
	}

	return ((IsntPGPError(error))||(error==kPGPClientError_DiskNotMounted));
}

//	________________________
//
//	Perform user-initiated PGPdisk operation

VOID
PTDiskOperation(
		HWND	hwnd,
		UINT	uOperation)
{
	switch (uOperation) 
	{
		case PGPDISK_NEWDISK:
			sCreatePGPdisk(hwnd);
			break;

		case PGPDISK_EDITDISK:
			sEditPGPdisk(hwnd);
			break;

		case PGPDISK_MOUNTDISK:
			sMountPGPdisk(hwnd);
			break;

		case PGPDISK_UNMOUNTALL:
			sUnmountAllPGPdisks(FALSE, FALSE, FALSE, hwnd);
			break;
	}
}

//	________________________
//
//	prefs may have changed, do anything we need to do 

VOID
PTHandleDiskPrefsChange(
		HWND		hwnd,
		PGPPrefRef	prefref)
{
	if (!sCheckWarnPGPdiskAvailable(TRUE, hwnd))
		return;

	PGPGetPrefBoolean(prefref, kPGPPrefDiskAutoUnmountOnSleep, 
		&PGPdiskUnmountOnSleep);
	PGPGetPrefBoolean(prefref, kPGPPrefDiskNoSleepIfFailAU, 
		&PGPdiskNoSleepIfUnmountFail);

	PGPdiskPrefsChanged(PGPdiskContext, prefref);
}

//	________________________
//
//	Handle WM_POWERBROADCAST

LRESULT 
PTDiskHandlePowerBroadcast(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
	PGPError			error					= kPGPError_NoErr;
	PGPBoolean			denyThisMessage			= FALSE;
	static PGPBoolean	sawASleepRequest		= FALSE;
	static PGPBoolean	failAllSleepRequests	= FALSE;

	if (!sCheckWarnPGPdiskAvailable(TRUE, hwnd))
		return TRUE;

	// Windows will send us multiple sleep requests, but we will only process
	// the first one.

	switch (wParam)
	{
	case PBT_APMQUERYSUSPEND:
		if (sawASleepRequest)
		{
			denyThisMessage = failAllSleepRequests;
		}
		else
		{
			sawASleepRequest = TRUE;

			// Fail the sleep if error and the preference was set.
			if (PGPdiskUnmountOnSleep && 
				!sUnmountAllPGPdisks(FALSE, TRUE, FALSE, hwnd) && 
				PGPdiskNoSleepIfUnmountFail)
			{
				denyThisMessage = TRUE;
				failAllSleepRequests = TRUE;
			}
		}
		break;

	case PBT_APMQUERYSUSPENDFAILED:
		if (failAllSleepRequests)
		{
			MessageBox(hwnd, kPGPdiskNoSleepOnUnmountFailure, "PGP Tray", 
				MB_ICONERROR | MB_OK);
		}

		sawASleepRequest = FALSE;
		failAllSleepRequests = FALSE;
		break;

	case PBT_APMSUSPEND:
		sawASleepRequest = FALSE;
		failAllSleepRequests = FALSE;
		break;
	}

	if (denyThisMessage)
		return BROADCAST_QUERY_DENY;
	else
		return DefWindowProc(hwnd, WM_POWERBROADCAST, wParam, lParam);
}

//	________________________
//
//	Check for inactivity timed-out disks.

VOID 
PTDiskCheckForTimedOutDisks(HWND hwnd)
{
	if (!sCheckWarnPGPdiskAvailable(TRUE, hwnd))
		return;

	if (PGPdiskAreDisksTimedOut())
		sUnmountAllPGPdisks(TRUE, TRUE, FALSE, hwnd);
}

//	________________________
//
//	check incoming message for something pertaining to PGPdisk

VOID 
PTCheckForDiskMsg(
		HWND	hwnd,
		UINT	msg,
		WPARAM	wParam,
		LPARAM	lParam)
{
	if (!sCheckWarnPGPdiskAvailable(TRUE, hwnd))
		return;

	if(msg==uReloadKeyRingMsg)
	{
		// Make sure PGPdisk reloads the new keyring next time
		PGPdiskDirtyPGPKeyDB(PGPdiskContext);
	}

	switch (msg) 
	{
	case WM_ENDSESSION:
		if ((BOOL) wParam)
		{
			// Shutdown flag prevents prefs from being
			// accessed since pref service may have shutdown -wjb
			sUnmountAllPGPdisks(FALSE, TRUE, TRUE, hwnd);
			PGPdiskNotifyUserLogoff();
		}
		break;
	case WM_CLOSE:
		{
			sUnmountAllPGPdisks(FALSE, TRUE, TRUE, hwnd);
		break;
		}
	case WM_WTSSESSION_CHANGE:
		{
			switch(wParam)
			{
				case WTS_CONSOLE_DISCONNECT:
				case WTS_REMOTE_DISCONNECT:
				case WTS_SESSION_LOGOFF:
					sUnmountAllPGPdisks(FALSE, TRUE, TRUE, hwnd);
					break;
			}
			break;
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?