亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? volume.cpp

?? vc環境下的pgp源碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//////////////////////////////////////////////////////////////////////////////
// Volume.cpp
//
// Implementation of class Volume.
//////////////////////////////////////////////////////////////////////////////

// $Id: Volume.cpp,v 1.5 1998/12/14 18:58:55 nryan Exp $

// Copyright (C) 1998 by Network Associates, Inc.
// All rights reserved.

#include "StdAfx.h"
#include <Dbt.h>
#include <Shlobj.h>

#include "Required.h"
#include "DriverComm.h"
#include "UtilityFunctions.h"
#include "WindowsVersion.h"

#include "Globals.h"
#include "Volume.h"


////////////
// Constants
////////////

const PGPUInt32	kSHNotifySleepDelayMs = 500;
const PGPUInt64	kMaxBlocksDiskWeFormat = 
	(2047*kBytesPerMeg)/kDefaultBlockSize;

static LPCSTR	kVWin32DriverString	= "\\\\.\\VWIN32";
static LPCSTR	kVolumeOpenString	= "\\\\.\\%c:";

const PGPUInt32	kMaxBlocksPerWrite = 2000;
const PGPUInt32	kMinBlocksPerWrite = 10;

const PGPUInt32	kIdealNumWritesPerData = 10;


///////////////////////////////////////
// Class Volume public member functions
///////////////////////////////////////

// The Class Volume constructor.

Volume::Volume(PGPUInt8 drive)
{
	if (drive != kInvalidDrive)
		mMountState = kVol_Mounted;
	else
		mMountState = kVol_Unmounted;

	mLockState = kLock_None;
	mDrive = drive;

	mAttachedToLocalVol	= FALSE;

	mBlockSize = 0;
}

// The Volume destructor unmounted the volume if was mounted by us.

Volume::~Volume()
{
	DualErr derr;

	if (Mounted())
	{
		if (AttachedToLocalVolume())
			DetachLocalVolume();
	}
}

// GetDrive returns the drive number the volume is mounted on.

PGPUInt8 
Volume::GetDrive()
{
	return mDrive;
}

// GetBlockSize returns the block size of the mounted volume.

PGPUInt16 
Volume::GetBlockSize()
{
	pgpAssert(Mounted());

	return mBlockSize;
}

// GetTotalBlocks returns the total number of blocks on the volume.

PGPUInt64 
Volume::GetTotalBlocks()
{
	pgpAssert(Mounted());

	return mTotalBlocks;
}

// Mounted returns TRUE if the Volume is mounted.

PGPBoolean 
Volume::Mounted()
{
	return (mMountState == kVol_Mounted);
}

// Unmounted returns TRUE if the Volume is unmounted.

PGPBoolean 
Volume::Unmounted()
{
	return (mMountState == kVol_Unmounted);
}

// AttachedToLocalVolume returns TRUE if the Volume object is attached to a
// local volume, FALSE if not.

PGPBoolean 
Volume::AttachedToLocalVolume()
{
	return mAttachedToLocalVol;
}

// HasOpenFiles returns TRUE if the volume has open files, FALSE otherwise.

PGPBoolean
Volume::HasOpenFiles()
{
	DualErr		derr;
	PGPBoolean	hasOpenFiles;

	pgpAssert(Mounted());

	derr = AreFilesOpenOnDrive(mDrive, &hasOpenFiles);

	if (derr.IsntError())
		return hasOpenFiles;
	else
		return TRUE;
}

// LockedForReadWrite returns TRUE if the volume is mounted and locked for
// read/write access, FALSE otherwise.

PGPBoolean 
Volume::LockedForReadWrite()
{
	return (Mounted() && (mLockState == kLock_ReadWrite));
}

// LockedForReadWrite returns TRUE if the volume is mounted and locked for
// format access, FALSE otherwise.

PGPBoolean 
Volume::LockedForFormat()
{
	return (Mounted() && (mLockState == kLock_Format));
}

// BrowseToVolume opens a view to the volume in an explorer window.

void 
Volume::BrowseToVolume()
{
	CString root;

	pgpAssert(Mounted());

	if (MakeRoot(mDrive, &root).IsntError())
	{
		ShellExecute(NULL, "explore", root, NULL, NULL, SW_SHOWNORMAL);
	}
}

// GetVolumeLabel retrieves the volume label associated with a mounted volume.

DualErr 
Volume::GetVolumeLabel(LPSTR label, PGPUInt32 size)
{
	DualErr	derr;
	CString root;

	pgpAssertAddrValid(label, LPSTR);
	pgpAssert(Mounted());

	derr = MakeRoot(mDrive, &root);

	if (derr.IsntError())
	{
		if (GetVolumeInformation(root, label, size, NULL, NULL, NULL, NULL, 
			0))
		{
			derr = DualErr(kPGDMinorError_GetVolumeInfoFailed, 
				GetLastError());
		}
	}

	return derr;
}

// SetVolumeLabel sets the 11-character label of the mounted volume.

DualErr 
Volume::SetVolumeLabel(LPCSTR label)
{
	DualErr	derr;
	CString	volName, root;

	pgpAssertStrValid(label);
	pgpAssert(Mounted());

	derr = CanonicalizeVolumeName(label, &volName);

	if (derr.IsntError())
	{
		derr = MakeRoot(mDrive, &root);
	}

	if (derr.IsntError())
	{
		if (!::SetVolumeLabel(root, volName))
		{
			derr = DualErr(kPGDMinorError_SetVolumeLabelFailed, 
				GetLastError());
		}
	}

	return derr;
}

// AttachLocalVolume initializes this Volume object for access to an already
// mounted volume on the local computer.

DualErr 
Volume::AttachLocalVolume(PGPUInt8 drive)
{
	DualErr derr;

	pgpAssert(IsLegalDriveNumber(drive));
	pgpAssert(!Mounted());
	pgpAssert(!AttachedToLocalVolume());

	if (!App->IsVolumeValid(drive))
		derr = DualErr(kPGDMinorError_InvalidParameter);

	if (derr.IsntError())
	{
		mMountState	= kVol_Mounted;
		mLockState	= kLock_None;
		mDrive		= drive;

		mAttachedToLocalVol = TRUE;

		if (FillInVolInfo().IsError())
		{
			mBlockSize = kDefaultBlockSize;
			mTotalBlocks = 0;
		}
	}

	return derr;
}

// DetachLocalVolume marks this Volume object as no longer being associated
// with a local volume.

void 
Volume::DetachLocalVolume()
{
	pgpAssert(Mounted());
	pgpAssert(AttachedToLocalVolume());

	mMountState	= kVol_Unmounted;
	mLockState	= kLock_None;
	mDrive		= kInvalidDrive;

	mAttachedToLocalVol = FALSE;
}

// LockVolumeForReadWrite locks the mounted volume for direct read/write
// access.

DualErr 
Volume::LockVolumeForReadWrite()
{
	DualErr derr;
	
	pgpAssert(Mounted());
	pgpAssert(!LockedForReadWrite() && !LockedForFormat());

	derr = LockUnlockVolume(mDrive, kLO_LockReadWrite);

	if (derr.IsntError())
	{
		mLockState = kLock_ReadWrite;
	}

	return derr;
}

// LockVolumeForFormat locks the mounted volume for formatting.

DualErr 
Volume::LockVolumeForFormat()
{
	DualErr derr;
	
	pgpAssert(Mounted());
	pgpAssert(!LockedForReadWrite() && !LockedForFormat());

	derr = LockUnlockVolume(mDrive, kLO_LockFormat);

	if (derr.IsntError())
	{
		mLockState = kLock_Format;
	}

	return derr;
}

// UnlockVolume removes any outstanding locks on the volume;

DualErr 
Volume::UnlockVolume()
{
	DualErr derr;

	pgpAssert(Mounted());
	pgpAssert(LockedForReadWrite() || LockedForFormat());

	derr = LockUnlockVolume(mDrive, (LockedForReadWrite() ? 
		kLO_UnlockReadWrite : kLO_UnlockFormat));

	if (derr.IsntError())
	{
		mLockState = kLock_None;
	}

	return derr;
}

// Read reads blocks from the locked mounted volume.

DualErr 
Volume::Read(PGPUInt8 *buf, PGPUInt64 pos, PGPUInt32 nBlocks)
{
	DualErr derr;

	pgpAssertAddrValid(buf, PGPUInt8);
	pgpAssert(Mounted());
	pgpAssert(LockedForReadWrite() || LockedForFormat());

	derr = DirectDiskRead(mDrive, buf, nBlocks * GetBlockSize(), pos, 
		nBlocks);

	return derr;
}

// Write writes blocks to the locked mounted volume.

DualErr 
Volume::Write(PGPUInt8 *buf, PGPUInt64 pos, PGPUInt32 nBlocks)
{
	DualErr derr;

	pgpAssertAddrValid(buf, PGPUInt8);
	pgpAssert(Mounted());
	pgpAssert(LockedForReadWrite() || LockedForFormat());

	derr = DirectDiskWrite(mDrive, buf, nBlocks * GetBlockSize(), pos, 
		nBlocks);

	return derr;
}

// Format formats the mounted volume using our own algorithms.

DualErr 
Volume::Format()
{
	DualErr		derr;
	FatData		fat;
	PGPBoolean	allocedBlockBuf, lockedForFormat;
	PGPUInt8	*blockBuf;
	PGPUInt64	megsDisk;

	pgpAssert(Mounted());
	pgpAssert(!LockedForReadWrite() || !LockedForFormat());

	allocedBlockBuf = lockedForFormat = FALSE;
	megsDisk = (GetTotalBlocks() * kDefaultBlockSize) / kBytesPerMeg;

	// Can only format drives with standard block sizes.
	if (GetBlockSize() != kDefaultBlockSize)
		derr = DualErr(kPGDMinorError_CantFormatDrive);

	// Too big for format?
	if (derr.IsntError())
	{
		if (GetBlockSize() > kMaxBlocksDiskWeFormat)
			derr = DualErr(kPGDMinorError_DiskTooBigToFormat);
	}

	// Get block buffer.
	if (derr.IsntError())
	{
		derr = GetByteBuffer(kDefaultBlockSize, &blockBuf);
		allocedBlockBuf = derr.IsntError();
	}

	// Lock the volume for format.
	if (derr.IsntError())
	{
		derr = LockVolumeForFormat();
		lockedForFormat = derr.IsntError();
	}

	if (derr.IsntError())
	{
		// Initialize FAT data.
		fat.fdFsId = kFS_FAT16;

		if (megsDisk < 2)
		{
			fat.fdFsId = kFS_FAT12;
		}
		else if ((megsDisk >= kMinFat32Megs) && 
			IsWin95OSR2CompatibleMachine())
		{
			fat.fdFsId = kFS_FAT32;
		}

		InitFatData(&fat, GetBlockSize());

		derr = ClearBlocks(0, fat.fdFirstSecData);
	}

	// Write out the FAT data structures.
	if (derr.IsntError())
	{
		BigFatBootFSInfo	bfInfo;
		BootSector12		bb12;
		BootSector16		bb16;
		BootSector32		bb32;
		PGPUInt32			fat16Sig;
		PGPUInt64			pos;

		pgpAssert(sizeof(bb12) == kDefaultBlockSize);
		pgpAssert(sizeof(bb16) == kDefaultBlockSize);
		pgpAssert(sizeof(bb32) == kDefaultBlockSize);

		pgpClearMemory(blockBuf, kDefaultBlockSize);

		pos = 0;

		switch (fat.fdFsId)
		{

		case kFS_FAT12:
			// Init the boot block.
			InitFAT12BootBlock(GetBlockSize(), &fat, &bb12);

			// Write the boot block.
			derr = Write((PGPUInt8 *) &bb12, pos, 1);

			// Write the first FAT.
			if (derr.IsntError())
			{
				pgpCopyMemory((PGPUInt8 *) &kFat12Sig, blockBuf, 
					sizeof(kFat12Sig));

				pos += fat.fdReservedSecs;
				derr = Write(blockBuf, pos, 1);
			}

			// Write the second FAT.
			if (derr.IsntError())
			{
				pos += fat.fdFatSize;
				derr = Write(blockBuf, pos, 1);
			}
			break;

		case kFS_FAT16:
			// Init the boot block.
			InitFAT16BootBlock(GetBlockSize(), &fat, &bb16);

			// Decide on a FAT signature.
			fat16Sig = (megsDisk < 16 ? kUnder16MbFat16Sig : 
				kOver16MbFat16Sig);

			// Write the boot block.
			derr = Write((PGPUInt8 *) &bb16, pos, 1);

			// Write the first FAT.
			if (derr.IsntError())
			{
				pgpCopyMemory((PGPUInt8 *) &fat16Sig, blockBuf, 
					sizeof(fat16Sig));

				pos += fat.fdReservedSecs;
				derr = Write(blockBuf, pos, 1);
			}

			// Write the second FAT.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类在线一区| 欧美一区二区三区四区在线观看 | 国产乱一区二区| 成人免费视频播放| 欧美午夜视频网站| 久久久精品人体av艺术| 亚洲午夜精品在线| 成人性生交大片免费看中文网站| 欧美人与禽zozo性伦| 国产精品你懂的在线| 蜜臀av亚洲一区中文字幕| 色综合一区二区三区| 久久只精品国产| 天堂精品中文字幕在线| 91亚洲永久精品| 欧美经典一区二区| 日韩一区精品字幕| 欧美亚洲国产怡红院影院| 中文字幕在线免费不卡| 国产精品资源在线观看| 欧美www视频| 日韩精品一区第一页| 欧美性xxxxxx少妇| 亚洲人成网站精品片在线观看| 国产最新精品免费| 久久久久国产精品免费免费搜索| 青娱乐精品视频| 91 com成人网| 婷婷久久综合九色综合伊人色| 色久综合一二码| 亚洲精品免费视频| 一本大道久久a久久综合| 最近日韩中文字幕| 色综合婷婷久久| 亚洲欧美视频一区| 91黄视频在线| 亚洲高清久久久| 精品视频免费在线| 亚洲mv在线观看| 欧美日韩国产三级| 日韩精品欧美精品| 日韩欧美视频在线| 国产另类ts人妖一区二区| 国产香蕉久久精品综合网| 国产综合成人久久大片91| 精品国偷自产国产一区| 国产一区二区三区四区五区美女| 久久综合狠狠综合久久激情 | 在线成人免费观看| 日韩黄色在线观看| 欧美va亚洲va香蕉在线| 韩国女主播一区| 国产网红主播福利一区二区| 成人永久免费视频| 一区二区三国产精华液| 欧美人xxxx| 另类小说色综合网站| 欧美精品一区二区三区四区| 粉嫩av亚洲一区二区图片| 1区2区3区精品视频| 精品视频全国免费看| 日韩国产高清在线| 国产清纯在线一区二区www| av男人天堂一区| 五月天视频一区| 精品国产自在久精品国产| 成人av小说网| 天天射综合影视| 久久综合色鬼综合色| 91免费视频观看| 日韩av电影免费观看高清完整版 | 人妖欧美一区二区| 国产日韩精品一区二区三区| 色综合天天综合网天天看片| 日本一道高清亚洲日美韩| 亚洲国产高清在线观看视频| 欧美最猛黑人xxxxx猛交| 精品在线播放午夜| 一区二区在线电影| 精品国产91久久久久久久妲己 | 激情五月激情综合网| 亚洲色图视频网站| 精品国产第一区二区三区观看体验| av一区二区久久| 激情综合色丁香一区二区| 一区二区三区电影在线播| 精品国产凹凸成av人导航| 色狠狠综合天天综合综合| 国产.欧美.日韩| 日日摸夜夜添夜夜添精品视频| 亚洲欧洲国产专区| 久久久久久99久久久精品网站| 欧美人与禽zozo性伦| 色婷婷久久久综合中文字幕| 韩国欧美国产一区| 美女在线一区二区| 丝袜美腿成人在线| 亚洲与欧洲av电影| 亚洲欧洲日韩在线| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美人与z0zoxxxx视频| 在线日韩av片| 成人黄色一级视频| 国产精品99久久久久久有的能看| 图片区小说区国产精品视频| 一区二区三区精品| 亚洲最快最全在线视频| 亚洲人妖av一区二区| 国产日韩欧美激情| 久久久美女艺术照精彩视频福利播放| 欧美肥妇bbw| 欧美高清视频在线高清观看mv色露露十八| 99久久国产综合精品色伊| 岛国精品在线播放| 成人性视频免费网站| 成人午夜在线免费| 成人免费高清视频| av不卡免费在线观看| 成年人国产精品| 99re视频这里只有精品| 成人av在线网| 色综合久久中文综合久久牛| 92国产精品观看| 波多野结衣中文字幕一区二区三区 | 91精品1区2区| 在线免费一区三区| 欧美日韩精品专区| 欧美丰满一区二区免费视频| 5858s免费视频成人| 日韩欧美电影在线| 国产三级一区二区三区| 国产精品系列在线| 亚洲精品国产精品乱码不99| 一区二区三区日韩| 日韩av一区二区三区| 久久99国产精品久久99| 国产成人午夜视频| 色综合天天综合在线视频| 欧美少妇一区二区| 日韩免费电影网站| 国产午夜精品一区二区三区嫩草| 国产精品三级电影| 亚洲国产精品精华液网站| 日韩av电影免费观看高清完整版 | 欧美精品丝袜中出| 精品久久国产字幕高潮| 国产精品你懂的| 亚洲h在线观看| 激情偷乱视频一区二区三区| 国产99久久久久| 在线一区二区三区四区| 日韩一区二区在线观看视频| 久久美女高清视频| 亚洲午夜激情av| 国产精品1024| 欧美亚洲一区二区在线| 久久精品亚洲精品国产欧美| 亚洲乱码一区二区三区在线观看| 日韩精品免费专区| caoporm超碰国产精品| 精品视频一区二区不卡| 欧美国产成人精品| 午夜精品影院在线观看| 粉嫩一区二区三区性色av| 3d动漫精品啪啪| 中文字幕不卡的av| 日韩成人免费看| 色爱区综合激月婷婷| 久久嫩草精品久久久精品一| 亚洲自拍偷拍图区| 成人午夜免费电影| 日韩亚洲欧美成人一区| 一区二区三区在线观看国产| 国产一区二区日韩精品| 欧美日韩国产不卡| 亚洲天堂免费看| 国产精一区二区三区| 欧美一区二区免费观在线| 亚洲欧美电影院| 懂色av一区二区在线播放| 欧美一区二区三区四区五区 | 久久午夜国产精品| 日韩av一区二区三区| 91豆麻精品91久久久久久| 国产精品欧美精品| 国产酒店精品激情| 日韩欧美一级在线播放| 亚洲一区二区三区精品在线| bt7086福利一区国产| 国产亚洲福利社区一区| 国产一区中文字幕| 精品伦理精品一区| 免费观看91视频大全| 欧美午夜精品久久久久久孕妇| 欧美国产综合色视频| 国产成人啪免费观看软件| 亚洲精品在线电影| 国产在线一区二区综合免费视频| 日韩视频在线永久播放| 日本vs亚洲vs韩国一区三区二区|