亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产福利精品导航| 一片黄亚洲嫩模| 精品一区二区三区久久| 精品99一区二区三区| 国产一区二区三区观看| 26uuu亚洲| 成人av中文字幕| 亚洲精品中文字幕在线观看| 欧美无乱码久久久免费午夜一区 | 国产欧美日韩麻豆91| 国产xxx精品视频大全| 亚洲欧美日韩精品久久久久| 欧美日韩一区三区四区| 免费成人在线播放| 亚洲欧美在线视频观看| 欧美日韩视频一区二区| 经典三级视频一区| 国产精品久久久久久久久免费樱桃| 99国产精品久久久久久久久久久| 香蕉影视欧美成人| 久久午夜老司机| 欧美性xxxxx极品少妇| 九一久久久久久| 亚洲欧美一区二区不卡| 91精品国产色综合久久久蜜香臀| 国产乱淫av一区二区三区| 亚洲一区在线看| 久久久精品中文字幕麻豆发布| 91香蕉视频在线| 日本中文字幕一区二区视频| 日本一区二区三区视频视频| 欧美在线免费观看亚洲| 国产乱子轮精品视频| 一区二区在线观看免费| 久久亚洲一级片| 欧美性生交片4| 国产成人啪免费观看软件| 亚洲成人自拍一区| 国产精品嫩草99a| 日韩欧美视频在线| 欧美在线观看视频一区二区 | 亚洲欧美在线高清| 精品免费99久久| 在线视频一区二区三区| 国产成人免费在线观看| 美美哒免费高清在线观看视频一区二区 | 激情综合亚洲精品| 亚洲国产一区在线观看| 国产精品你懂的在线欣赏| 欧美mv日韩mv亚洲| 在线观看www91| 不卡的看片网站| 国产精品亚洲第一区在线暖暖韩国 | 色婷婷激情一区二区三区| 国产高清亚洲一区| 精品一区二区综合| 日本大胆欧美人术艺术动态| 一区二区三区在线视频观看58| 日本一区二区不卡视频| 精品对白一区国产伦| 91精品国产高清一区二区三区蜜臀| 色综合久久久久| 成人激情小说网站| 国产不卡免费视频| 国产精品一区二区在线看| 久久精品免费观看| 麻豆精品在线播放| 日本亚洲一区二区| 裸体一区二区三区| 裸体一区二区三区| 老司机午夜精品| 捆绑调教一区二区三区| 日韩av在线发布| 久久国产人妖系列| 久久福利视频一区二区| 久久99精品视频| 国产在线国偷精品产拍免费yy| 久久精品二区亚洲w码| 激情成人综合网| 国内精品免费**视频| 国产精品1区二区.| 成人av午夜电影| 91小视频免费观看| 欧美亚洲日本国产| 欧美日韩国产区一| 日韩欧美第一区| 久久久久久久久蜜桃| 国产欧美日韩视频在线观看| 亚洲欧洲日韩女同| 亚洲一区二区三区视频在线播放| 亚洲一区二三区| 青青国产91久久久久久| 国产一区二区精品在线观看| 国产.欧美.日韩| 91麻豆福利精品推荐| 欧美三级中文字幕在线观看| 欧美人体做爰大胆视频| 精品国产3级a| 亚洲色图视频免费播放| 国产性做久久久久久| 2020日本不卡一区二区视频| 中文字幕第一区| 亚洲乱码一区二区三区在线观看| 亚洲在线中文字幕| 精品一区二区三区香蕉蜜桃| 福利一区福利二区| 欧美三级日韩三级国产三级| 日韩精品一区二区三区视频在线观看 | 欧美体内she精视频| 欧美一区二区视频免费观看| 欧美videossexotv100| 国产精品久久久久久亚洲伦| 亚洲午夜视频在线观看| 久久精品国产999大香线蕉| 成人激情黄色小说| 91精品国产色综合久久ai换脸| 久久九九久久九九| 亚洲国产一区二区a毛片| 韩国精品在线观看| 欧美日韩一级大片网址| 久久尤物电影视频在线观看| 亚洲综合男人的天堂| 久久激情五月激情| 欧洲av一区二区嗯嗯嗯啊| 久久综合99re88久久爱| 亚洲成人av在线电影| 国产精品一区久久久久| 制服丝袜一区二区三区| 国产精品女上位| 韩国视频一区二区| 欧美日本乱大交xxxxx| 国产精品成人免费| 国产呦精品一区二区三区网站| 欧美在线色视频| 亚洲欧洲在线观看av| 国产一区 二区 三区一级| 欧美日韩精品专区| 亚洲乱码国产乱码精品精可以看 | 在线观看国产精品网站| 欧美精品一区二区在线观看| 亚洲一区二区三区爽爽爽爽爽 | 美国三级日本三级久久99| 色8久久人人97超碰香蕉987| 国产欧美久久久精品影院| 天天综合天天综合色| 在线免费一区三区| 国产精品情趣视频| 国产成人鲁色资源国产91色综| 日韩午夜激情av| 天堂精品中文字幕在线| 91久久精品一区二区三区| 国产精品热久久久久夜色精品三区| 精品在线一区二区三区| 欧美日韩aaaaa| 天堂在线亚洲视频| 欧美性猛交一区二区三区精品| 一区在线中文字幕| 成人污视频在线观看| 国产网站一区二区三区| 国产麻豆视频精品| 久久久久国色av免费看影院| 看电视剧不卡顿的网站| 精品国产一区二区三区久久影院| 日韩电影在线看| 91精品国产一区二区三区香蕉| 日韩国产欧美在线视频| 欧美性生活久久| 日韩黄色在线观看| 欧美精品第一页| 奇米影视一区二区三区小说| 日韩欧美成人激情| 久久9热精品视频| www激情久久| 国产一区二区三区黄视频 | 国产一区二区三区精品欧美日韩一区二区三区 | eeuss鲁片一区二区三区在线看| 国产色产综合色产在线视频| 国产91在线观看丝袜| 中文在线免费一区三区高中清不卡| 国产不卡在线一区| 亚洲欧美日韩久久精品| 欧美网站一区二区| 首页欧美精品中文字幕| 日韩精品自拍偷拍| 高清不卡一二三区| 一区二区成人在线| 91精品国产综合久久香蕉麻豆| 青青国产91久久久久久| 国产日韩视频一区二区三区| 国产成人亚洲精品狼色在线| 亚洲人亚洲人成电影网站色| 欧美在线视频不卡| 久久不见久久见免费视频7| 久久久久久亚洲综合影院红桃| 成人高清av在线| 亚洲成人先锋电影| 久久看人人爽人人| 在线日韩国产精品| 国产在线日韩欧美| 亚洲精品视频观看|