cinterfaceimp.cpp

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

CPP
458
字号
/*____________________________________________________________________________
		Copyright (C) 2002 PGP Corporation
        All rights reserved.

        $Id: CInterfaceImp.cpp,v 1.10 2002/08/06 20:09:34 dallen Exp $
____________________________________________________________________________*/

#include "pgpClassesConfig.h"

#include "UDebug.h"
#include "UConstantNames.h"

#include "CDriverSubsystems.h"
#include "CInterfaceImp.h"
#include "CMemoryLocker.h"
#include "CPGPdiskHandler.h"
#include "CVolume.h"
#include "SMappedMemory.h"

_USING_PGP

// Macros

#define DISPATCH_COMMAND(type, data, func)						\
	{															\
		type	*pObject	= reinterpret_cast<type *>(data);	\
																\
		SMappedMemory<type>	lmObject(pObject);					\
		error = lmObject.Status();								\
																\
		if (error.IsntError())									\
			error = func(lmObject.MappedAddress());				\
	}


// Class CInterfaceImp member functions

void 
CInterfaceImp::ProcessPacket(DriverAPI::CCommandHeader *pPacket) const
{
	pgpAssertAddrValid(pPacket, DriverAPI::CCommandHeader);

	CComboError	error;

	UDebug::DebugOut("Received a %s driver command.", 
		UConstantNames::NameDriverCommand(pPacket->Command()));

	switch (pPacket->Command())
	{
	case DriverAPI::kNoOpCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandNoOp, pPacket, 
			ProcessNoOp);
		break;

	case DriverAPI::kQueryVersionCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandQueryVersion, pPacket, 
			ProcessQueryVersion);
		break;

	case DriverAPI::kQueryMountedCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandQueryMounted, pPacket, 
			ProcessQueryMounted);
		break;

	case DriverAPI::kQueryAllMountedCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandQueryAllMounted, pPacket, 
			ProcessQueryAllMounted);
		break;

	case DriverAPI::kNotifyUserLogoffCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandNotifyUserLogoff, pPacket, 
			ProcessNotifyUserLogoff);
		break;
	
	case DriverAPI::kSetTimeoutCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandSetTimeout, pPacket, 
			ProcessSetTimeout);
		break;

	case DriverAPI::kAreDisksTimedOutCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandAreDisksTimedOut, pPacket, 
			ProcessAreDisksTimedOut);
		break;
	
	case DriverAPI::kResetTimedOutCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandResetTimedOut, pPacket, 
			ProcessResetTimedOut);
		break;

	case DriverAPI::kMountCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandMount, pPacket, 
			ProcessMount);
		break;

	case DriverAPI::kUnmountCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandUnmount, pPacket, 
			ProcessUnmount);
		break;

	case DriverAPI::kLockVolumeCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandLockVolume, pPacket, 
			ProcessLockVolume);
		break;

	case DriverAPI::kUnlockVolumeCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandUnlockVolume, pPacket, 
			ProcessUnlockVolume);
		break;

	case DriverAPI::kIOVolumeCmdId:
		DISPATCH_COMMAND(DriverAPI::CCommandIOVolume, pPacket, 
			ProcessIOVolume);
		break;

	default:
		error.pgpErr = kPGPError_BadParams;
		break;
	}

	pPacket->DriverError() = error;
}

// ProcessRawPacket returns TRUE if the given memory represents a valid
// packet and was processed, FALSE otherwise.

PGPBoolean 
CInterfaceImp::ProcessRawPacket(void *pMem, PGPUInt32 sizeMem) const
{
	PGPBoolean	isInvalidPacket	= FALSE;

	DriverAPI::CCommandHeader	*pPacket	= 
		static_cast<DriverAPI::CCommandHeader *>(pMem);

	// Is it of at least the correct size?
	if (sizeMem < sizeof(DriverAPI::CCommandHeader))
		isInvalidPacket = TRUE;

	// If so, make sure at least the header portion is valid memory by
	// locking and unlocking it.

	if (!isInvalidPacket)
	{
		SMappedMemory<DriverAPI::CCommandHeader>	smPacket(pPacket);

		// Was the locking successful?
		if (smPacket.Status().IsError())
			isInvalidPacket = TRUE;
	}

	if (!isInvalidPacket)
	{
		// Is the magic field valid?
		if (pPacket->VerifyMagic().IsError())
			isInvalidPacket = TRUE;

		// We have a valid packet header, process it.
		if (!isInvalidPacket)
			ProcessPacket(pPacket);
	}

	return !isInvalidPacket;
}

CComboError 
CInterfaceImp::ProcessNoOp(DriverAPI::CCommandNoOp *pNoOp) const
{
	pgpAssertAddrValid(pNoOp, DriverAPI::CCommandNoOp);

	CComboError	error;

	return error;
}

CComboError 
CInterfaceImp::ProcessQueryVersion(DriverAPI::CCommandQueryVersion *pQV) const
{
	pgpAssertAddrValid(pQV, DriverAPI::CCommandQueryVersion);

	CComboError	error;
	pQV->DriverApiVersion() = DriverAPI::kVersion;

	return error;
}

CComboError 
CInterfaceImp::ProcessQueryMounted(DriverAPI::CCommandQueryMounted *pQM) const
{
	pgpAssertAddrValid(pQM, DriverAPI::CCommandQueryMounted);

	CComboError	error;

	if (pQM->TrueIfPath())
	{
		pQM->IsMountedPGPdisk() = CDriverSubsystems::PGPdiskHandler().
			IsFileAMountedPGPdisk(pQM->PathOrRoot());
	}
	else
	{
		pQM->IsMountedPGPdisk() = CDriverSubsystems::PGPdiskHandler().
			IsRootAMountedPGPdisk(pQM->PathOrRoot());
	}

	return error;
}

CComboError 
CInterfaceImp::ProcessQueryAllMounted(
	DriverAPI::CCommandQueryAllMounted	*pQAM) const
{
	pgpAssertAddrValid(pQAM, DriverAPI::CCommandQueryAllMounted);

	CComboError	error;

	PGPUInt32	numPGPdisks	= CDriverSubsystems::PGPdiskHandler().
		NumPGPdisks();

	// Create temporary info array.
	PGPdiskInfo	*pInfoArray	= new PGPdiskInfo[numPGPdisks];

	if (IsNull(pInfoArray))
		error.pgpErr = kPGPError_OutOfMemory;

	if (error.IsntError())
	{
		// Retrieve info about all PGPdisks.
		error = CDriverSubsystems::PGPdiskHandler().ExportPGPdiskInfo(
			pInfoArray, numPGPdisks, pQAM->ElemsFilled());

		if (error.IsntError())
		{
			// Store this info in the output array.
			for (PGPUInt32 i = 0; i < numPGPdisks; i++)
			{
				strcpy(pQAM->GetElem(i).path, pInfoArray[i].path);
				strcpy(pQAM->GetElem(i).root, pInfoArray[i].root);
				strcpy(pQAM->GetElem(i).deviceName, pInfoArray[i].deviceName);

				pQAM->GetElem(i).isReadOnly = pInfoArray[i].isReadOnly;
				pQAM->GetElem(i).hasTimedOut = pInfoArray[i].hasTimedOut;
			}
		}

		delete[] pInfoArray;
	}

	return error;
}

CComboError 
CInterfaceImp::ProcessNotifyUserLogoff(
	DriverAPI::CCommandNotifyUserLogoff	*pNUL) const
{
	pgpAssertAddrValid(pNUL, DriverAPI::CCommandNotifyUserLogoff);

	CComboError	error;

	// Keep trying to unmount all PGPdisks till we succeed.
	CDriverSubsystems::PGPdiskHandler().TurnOnUnmountAllMode();

	return error;
}

CComboError 
CInterfaceImp::ProcessSetTimeout(DriverAPI::CCommandSetTimeout *pST) const
{
	pgpAssertAddrValid(pST, DriverAPI::CCommandSetTimeout);

	CComboError	error;

	error = CDriverSubsystems::PGPdiskHandler().SetInactivityTimeout(
		pST->Root(), pST->Seconds());

	return error;
}

CComboError 
CInterfaceImp::ProcessAreDisksTimedOut(
	DriverAPI::CCommandAreDisksTimedOut	*pADTO) const
{
	pgpAssertAddrValid(pADTO, DriverAPI::CCommandAreDisksTimedOut);

	CComboError	error;

	pADTO->AreDisksTimedOut() = CDriverSubsystems::PGPdiskHandler().
		AreDisksTimedOut();

	return error;
}

CComboError 
CInterfaceImp::ProcessResetTimedOut(
	DriverAPI::CCommandResetTimedOut	*pRT) const
{
	pgpAssertAddrValid(pRT, DriverAPI::CCommandResetTimedOut);

	CComboError	error;
	CDriverSubsystems::PGPdiskHandler().ResetTimedOutDisk(pRT->Root());

	return error;
}

CComboError 
CInterfaceImp::ProcessMount(DriverAPI::CCommandMount *pM) const
{
	pgpAssertAddrValid(pM, DriverAPI::CCommandMount);

	CComboError	error;

	// Lock down the exported context memory.
	SMappedMemory<PGPUInt8>	smExportedContext(
		static_cast<const PGPUInt8 *>(pM->ExportedContext()), 
		pM->SizeContext());

	error = smExportedContext.Status();

	if (error.IsntError())
	{
		// Mount the PGPdisk.
		error = CDriverSubsystems::PGPdiskHandler().MountPGPdisk(pM->Path(), 
			pM->Root(), pM->Algorithm(), smExportedContext.MappedAddress(), 
			pM->SizeContext(), pM->FirstDataBlock(), pM->NumDataBlocks(), 
			pM->DeviceName(), pM->IsReadOnly());
	}

	return error;
}

CComboError 
CInterfaceImp::ProcessUnmount(DriverAPI::CCommandUnmount *pU) const
{
	pgpAssertAddrValid(pU, DriverAPI::CCommandUnmount);

	CComboError	error;

	// Unmount the PGPdisk.
	error = CDriverSubsystems::PGPdiskHandler().UnmountPGPdisk(pU->Root(), 
		pU->IsForced());

	return error;
}

CComboError 
CInterfaceImp::ProcessLockVolume(DriverAPI::CCommandLockVolume *pLV) const
{
	pgpAssertAddrValid(pLV, DriverAPI::CCommandLockVolume);

	CComboError	error;
	CVolume		*pVolume	= new CVolume;

	if (IsNull(pVolume))
		error.pgpErr = kPGPError_OutOfMemory;

	if (error.IsntError())
	{
		// Must be a PGPdisk.
		if (!CDriverSubsystems::PGPdiskHandler().IsRootAMountedPGPdisk(
			pLV->Root()))
		{
			error.pgpErr = kPGPError_BadParams;
		}
	}

	if (error.IsntError())
	{
		// Attach volume and lock it.
		error = pVolume->AttachVolume(pLV->Root(), 
			CDriverSubsystems::PGPdiskHandler().GetDiskDevNameByRoot(
				pLV->Root()));

		if (error.IsntError())
		{
			if (pLV->ForFormat())
				error = pVolume->LockForFormat();
			else
				error = pVolume->LockForIO();
		}

		// Volume object itself is handle.
		pLV->Handle() = reinterpret_cast<PGPUInt32>(pVolume);

		if (error.IsError())
			delete pVolume;
	}

	return error;
}

CComboError 
CInterfaceImp::ProcessUnlockVolume(
	DriverAPI::CCommandUnlockVolume	*pULV) const
{
	pgpAssertAddrValid(pULV, DriverAPI::CCommandUnlockVolume);

	CComboError	error;
	CVolume		*pVolume	= reinterpret_cast<CVolume *>(pULV->Handle());

	// Make sure memory is valid by locking and unlocking it.
	{
		SMappedMemory<CVolume>	smVolume(pVolume);

		if (smVolume.Status().IsError())
			error.pgpErr = kPGPError_BadParams;
	}

	if (error.IsntError())
	{
		pVolume->Unlock();
		delete pVolume;
	}

	return error;
}

CComboError 
CInterfaceImp::ProcessIOVolume(DriverAPI::CCommandIOVolume *pIOV) const
{
	pgpAssertAddrValid(pIOV, DriverAPI::CCommandIOVolume);

	CComboError	error;
	CVolume		*pVolume	= reinterpret_cast<CVolume *>(pIOV->Handle());

	// Make sure memory is valid by locking and unlocking it.
	{
		SMappedMemory<CVolume>	smVolume(pVolume);

		if (smVolume.Status().IsError())
			error.pgpErr = kPGPError_BadParams;
	}

	if (error.IsntError())
	{
		// Lock down buffer.
		SMappedMemory<PGPUInt8>	smBuffer(
			static_cast<PGPUInt8 *>(pIOV->Buffer()), 
			pIOV->BlocksLength() * kPGPdiskBlockSize);

		if (smBuffer.Status().IsError())
			error.pgpErr = kPGPError_BadParams;

		// Perform the read/write.
		if (error.IsntError())
		{
			if (pIOV->TrueIfRead())
			{
				error = pVolume->Read(smBuffer.MappedAddress(), 
					pIOV->BlockPos(), pIOV->BlocksLength());
			}
			else
			{
				error = pVolume->Write(smBuffer.MappedAddress(), 
					pIOV->BlockPos(), pIOV->BlocksLength());
			}
		}
	}

	return error;
}

⌨️ 快捷键说明

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