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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? write.c

?? FSD file system driver
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
/* 
 * FFS File System Driver for Windows
 *
 * write.c
 *
 * 2004.5.6 ~
 *
 * Lee Jae-Hong, http://www.pyrasis.com
 *
 * See License.txt
 *
 */

#include "ntifs.h"
#include "ffsdrv.h"

/* Globals */

extern PFFS_GLOBAL FFSGlobal;


/* Definitions */

typedef struct _FFS_FLPFLUSH_CONTEXT {

	PFFS_VCB     Vcb;
	PFFS_FCB     Fcb;
	PFILE_OBJECT FileObject;

	KDPC         Dpc;
	KTIMER       Timer;
	WORK_QUEUE_ITEM Item;

} FFS_FLPFLUSH_CONTEXT, *PFFS_FLPFLUSH_CONTEXT;

VOID
FFSFloppyFlush(
	IN PVOID Parameter);

VOID
FFSFloppyFlushDpc(
	IN PKDPC Dpc,
	IN PVOID DeferredContext,
	IN PVOID SystemArgument1,
	IN PVOID SystemArgument2);



NTSTATUS
FFSWriteComplete(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSWriteFile(
	IN PFFS_IRP_CONTEXT IrpContext);

NTSTATUS
FFSWriteVolume(
	IN PFFS_IRP_CONTEXT IrpContext);

VOID
FFSDeferWrite(
	IN   PFFS_IRP_CONTEXT,
	PIRP Irp);

#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FFSFloppyFlush)
#pragma alloc_text(PAGE, FFSStartFloppyFlushDpc)
#pragma alloc_text(PAGE, FFSZeroHoles)
#pragma alloc_text(PAGE, FFSWrite)
#pragma alloc_text(PAGE, FFSWriteVolume)
#pragma alloc_text(PAGE, FFSv1WriteInode)
#pragma alloc_text(PAGE, FFSWriteFile)
#pragma alloc_text(PAGE, FFSWriteComplete)
#endif


VOID
FFSFloppyFlush(
	IN PVOID Parameter)
{
	PFFS_FLPFLUSH_CONTEXT Context;
	PFILE_OBJECT          FileObject;
	PFFS_FCB              Fcb;
	PFFS_VCB              Vcb;

	Context = (PFFS_FLPFLUSH_CONTEXT) Parameter;
	FileObject = Context->FileObject;
	Fcb = Context->Fcb;
	Vcb = Context->Vcb;

	FFSPrint((DBG_USER, "FFSFloppyFlushing ...\n"));

	IoSetTopLevelIrp((PIRP)FSRTL_FSP_TOP_LEVEL_IRP);

	if (Vcb)
	{
		ExAcquireSharedStarveExclusive(&Vcb->PagingIoResource, TRUE);
		ExReleaseResource(&Vcb->PagingIoResource);

		CcFlushCache(&(Vcb->SectionObject), NULL, 0, NULL);
	}

	if (FileObject)
	{
		ASSERT(Fcb == (PFFS_FCB)FileObject->FsContext);

		ExAcquireSharedStarveExclusive(&Fcb->PagingIoResource, TRUE);
		ExReleaseResource(&Fcb->PagingIoResource);

		CcFlushCache(&(Fcb->SectionObject), NULL, 0, NULL);

		ObDereferenceObject(FileObject);
	}

	IoSetTopLevelIrp(NULL);

	ExFreePool(Parameter);
}


VOID
FFSFloppyFlushDpc(
	IN PKDPC Dpc,
	IN PVOID DeferredContext,
	IN PVOID SystemArgument1,
	IN PVOID SystemArgument2)
{
	PFFS_FLPFLUSH_CONTEXT Context;

	Context = (PFFS_FLPFLUSH_CONTEXT)DeferredContext;

	FFSPrint((DBG_USER, "FFSFloppyFlushDpc is to be started...\n"));

	ExInitializeWorkItem(&Context->Item,
			FFSFloppyFlush,
			Context);

	ExQueueWorkItem(&Context->Item, CriticalWorkQueue);
}


VOID
FFSStartFloppyFlushDpc(
	PFFS_VCB     Vcb,
	PFFS_FCB     Fcb,
	PFILE_OBJECT FileObject)
{
	LARGE_INTEGER          OneSecond;
	PFFS_FLPFLUSH_CONTEXT Context;

	ASSERT(IsFlagOn(Vcb->Flags, VCB_FLOPPY_DISK));

	Context = ExAllocatePool(NonPagedPool, sizeof(PFFS_FLPFLUSH_CONTEXT));

	if (!Context)
	{
		FFSBreakPoint();
		return;
	}

	KeInitializeTimer(&Context->Timer);

	KeInitializeDpc(&Context->Dpc,
			FFSFloppyFlushDpc,
			Context);

	Context->Vcb = Vcb;
	Context->Fcb = Fcb;
	Context->FileObject = FileObject;

	if (FileObject)
	{
		ObReferenceObject(FileObject);
	}

	OneSecond.QuadPart = (LONGLONG) - 1 * 1000 * 1000 * 10;
	KeSetTimer(&Context->Timer,
			OneSecond,
			&Context->Dpc);
}


BOOLEAN
FFSZeroHoles(
	IN PFFS_IRP_CONTEXT IrpContext,
	IN PFFS_VCB         Vcb,
	IN PFILE_OBJECT     FileObject,
	IN LONGLONG         Offset,
	IN LONGLONG         Count)
{
	LARGE_INTEGER StartAddr = {0, 0};
	LARGE_INTEGER EndAddr = {0, 0};

	StartAddr.QuadPart = (Offset + (SECTOR_SIZE - 1)) &
		~((LONGLONG)SECTOR_SIZE - 1);

	EndAddr.QuadPart = (Offset + Count + (SECTOR_SIZE - 1)) &
		~((LONGLONG)SECTOR_SIZE - 1);

	if (StartAddr.QuadPart < EndAddr.QuadPart)
	{
		return CcZeroData(FileObject,
				&StartAddr,
				&EndAddr,
				IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT));
	}

	return TRUE;
}


VOID
FFSDeferWrite(
	IN PFFS_IRP_CONTEXT IrpContext,
	PIRP Irp)
{
	ASSERT(IrpContext->Irp == Irp);

	FFSQueueRequest(IrpContext);
}


NTSTATUS
FFSWriteVolume(
	IN PFFS_IRP_CONTEXT IrpContext)
{
	NTSTATUS            Status = STATUS_UNSUCCESSFUL;

	PFFS_VCB            Vcb;
	PFFS_CCB            Ccb;
	PFFS_FCBVCB         FcbOrVcb;
	PFILE_OBJECT        FileObject;

	PDEVICE_OBJECT      DeviceObject;

	PIRP                Irp;
	PIO_STACK_LOCATION  IoStackLocation;

	ULONG               Length;
	LARGE_INTEGER       ByteOffset;

	BOOLEAN             PagingIo;
	BOOLEAN             Nocache;
	BOOLEAN             SynchronousIo;
	BOOLEAN             MainResourceAcquired = FALSE;
	BOOLEAN             PagingIoResourceAcquired = FALSE;

	BOOLEAN             bDeferred = FALSE;

	PUCHAR              Buffer;

	__try
	{
		ASSERT(IrpContext);

		ASSERT((IrpContext->Identifier.Type == FFSICX) &&
				(IrpContext->Identifier.Size == sizeof(FFS_IRP_CONTEXT)));

		DeviceObject = IrpContext->DeviceObject;

		Vcb = (PFFS_VCB)DeviceObject->DeviceExtension;

		ASSERT(Vcb != NULL);

		ASSERT((Vcb->Identifier.Type == FFSVCB) &&
				(Vcb->Identifier.Size == sizeof(FFS_VCB)));

		FileObject = IrpContext->FileObject;

		FcbOrVcb = (PFFS_FCBVCB)FileObject->FsContext;

		ASSERT(FcbOrVcb);

		if (!(FcbOrVcb->Identifier.Type == FFSVCB && (PVOID)FcbOrVcb == (PVOID)Vcb))
		{
			Status = STATUS_INVALID_DEVICE_REQUEST;
			__leave;
		}

		Ccb = (PFFS_CCB)FileObject->FsContext2;

		Irp = IrpContext->Irp;

		IoStackLocation = IoGetCurrentIrpStackLocation(Irp);

		Length = IoStackLocation->Parameters.Write.Length;
		ByteOffset = IoStackLocation->Parameters.Write.ByteOffset;

		PagingIo = (Irp->Flags & IRP_PAGING_IO ? TRUE : FALSE);
		Nocache = (Irp->Flags & IRP_NOCACHE ? TRUE : FALSE);
		SynchronousIo = (FileObject->Flags & FO_SYNCHRONOUS_IO ? TRUE : FALSE);

		FFSPrint((DBG_INFO, "FFSWriteVolume: Off=%I64xh Len=%xh Paging=%xh Nocache=%xh\n",
					ByteOffset.QuadPart, Length, PagingIo, Nocache));

		if (Length == 0)
		{
			Irp->IoStatus.Information = 0;
			Status = STATUS_SUCCESS;
			__leave;
		}

		// For the case of "Direct Access Storage Device", we
		// need flush/purge the cache

		if (Ccb != NULL)
		{
			ExAcquireResourceExclusive(&Vcb->MainResource, TRUE);
			MainResourceAcquired = TRUE;

			Status = FFSPurgeVolume(Vcb, TRUE);

			ExReleaseResource(&Vcb->MainResource);
			MainResourceAcquired = FALSE;

			if(!IsFlagOn(Ccb->Flags, CCB_ALLOW_EXTENDED_DASD_IO))
			{
				if (ByteOffset.QuadPart + Length > Vcb->Header.FileSize.QuadPart)
				{
					Length = (ULONG)(Vcb->Header.FileSize.QuadPart - ByteOffset.QuadPart);
				}
			}

			{
				FFS_BDL BlockArray;

				if ((ByteOffset.LowPart & (SECTOR_SIZE - 1)) ||
						(Length & (SECTOR_SIZE - 1)))
				{
					Status = STATUS_INVALID_PARAMETER;
					__leave;
				}

				Status = FFSLockUserBuffer(
							IrpContext->Irp,
							Length,
							IoReadAccess);

				if (!NT_SUCCESS(Status))
				{
					__leave;
				}

				BlockArray.Irp = NULL;
				BlockArray.Lba = ByteOffset.QuadPart;;
				BlockArray.Offset = 0;
				BlockArray.Length = Length;

				Status = FFSReadWriteBlocks(IrpContext,
							Vcb,
							&BlockArray,
							Length,
							1,
							FALSE);
				Irp = IrpContext->Irp;

				__leave;
			}
		}                    

		if (Nocache &&
				(ByteOffset.LowPart & (SECTOR_SIZE - 1) ||
				 Length & (SECTOR_SIZE - 1)))
		{
			Status = STATUS_INVALID_PARAMETER;
			__leave;
		}

		if (FlagOn(IrpContext->MinorFunction, IRP_MN_DPC))
		{
			ClearFlag(IrpContext->MinorFunction, IRP_MN_DPC);
			Status = STATUS_PENDING;
			__leave;
		}

		if (ByteOffset.QuadPart >=
				Vcb->PartitionInformation.PartitionLength.QuadPart)
		{
			Irp->IoStatus.Information = 0;
			Status = STATUS_END_OF_FILE;
			__leave;
		}

#if FALSE

		if (!Nocache)
		{
			BOOLEAN bAgain = IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_DEFERRED);
			BOOLEAN bWait  = IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT);
			BOOLEAN bQueue = IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_REQUEUED);

			if (!CcCanIWrite(
						FileObject,
						Length,
						(bWait && bQueue),
						bAgain))
			{
				SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_DEFERRED);

				CcDeferWrite(FileObject,
						(PCC_POST_DEFERRED_WRITE)FFSDeferWrite,
						IrpContext,
						Irp,
						Length,
						bAgain);

				bDeferred = TRUE;

				FFSBreakPoint();

				Status = STATUS_PENDING;

				__leave;
			}
		}

#endif

		if (Nocache && !PagingIo && (Vcb->SectionObject.DataSectionObject != NULL)) 
		{
			ExAcquireResourceExclusive(&Vcb->MainResource, TRUE);
			MainResourceAcquired = TRUE;

			ExAcquireSharedStarveExclusive(&Vcb->PagingIoResource, TRUE);
			ExReleaseResource(&Vcb->PagingIoResource);

			CcFlushCache(&(Vcb->SectionObject),
					&ByteOffset,
					Length,
					&(Irp->IoStatus));

			if (!NT_SUCCESS(Irp->IoStatus.Status)) 
			{
				Status = Irp->IoStatus.Status;
				__leave;
			}

			ExAcquireSharedStarveExclusive(&Vcb->PagingIoResource, TRUE);
			ExReleaseResource(&Vcb->PagingIoResource);

			CcPurgeCacheSection(&(Vcb->SectionObject),
					(PLARGE_INTEGER)&(ByteOffset),
					Length,
					FALSE);

			ExReleaseResource(&Vcb->MainResource);
			MainResourceAcquired = FALSE;
		}

		if (!PagingIo)
		{
			if (!ExAcquireResourceExclusiveLite(
						&Vcb->MainResource,
						IrpContext->IsSynchronous))
			{
				Status = STATUS_PENDING;
				__leave;
			}

			MainResourceAcquired = TRUE;
		}
		else
		{
			/*
			ULONG ResShCnt, ResExCnt; 
			ResShCnt = ExIsResourceAcquiredSharedLite(&Vcb->PagingIoResource);
			ResExCnt = ExIsResourceAcquiredExclusiveLite(&Vcb->PagingIoResource);

			FFSPrint((DBG_USER, "PagingIoRes: %xh:%xh Synchronous=%xh\n", ResShCnt, ResExCnt, IrpContext->IsSynchronous));
			*/

			if (Ccb)
			{
				if (!ExAcquireResourceSharedLite(
							&Vcb->PagingIoResource,
							IrpContext->IsSynchronous))
				{
					Status = STATUS_PENDING;
					__leave;
				}

				PagingIoResourceAcquired = TRUE;
			}
		}

		if (!Nocache)
		{
			if ((ByteOffset.QuadPart + Length) >
					Vcb->PartitionInformation.PartitionLength.QuadPart
			)
			{
				Length = (ULONG) (
						Vcb->PartitionInformation.PartitionLength.QuadPart -
						ByteOffset.QuadPart);

				Length &= ~((ULONG)SECTOR_SIZE - 1);
			}

			if (FlagOn(IrpContext->MinorFunction, IRP_MN_MDL))
			{

				CcPrepareMdlWrite(
						Vcb->StreamObj,
						&ByteOffset,
						Length,
						&Irp->MdlAddress,
						&Irp->IoStatus);

				Status = Irp->IoStatus.Status;
			}
			else
			{
				Buffer = FFSGetUserBuffer(Irp);

				if (Buffer == NULL)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美你懂的| 国产成人福利片| 在线综合+亚洲+欧美中文字幕| 亚洲精品国产a| 欧美日韩五月天| 日韩电影在线观看一区| 亚洲综合久久久| 麻豆精品久久精品色综合| 欧美一区二区三区四区五区| 麻豆国产精品官网| 国产清纯白嫩初高生在线观看91| 粉嫩在线一区二区三区视频| 中文字幕在线视频一区| 99久久精品免费看国产| 亚洲综合999| 欧美一级日韩一级| 国产一区二区三区综合| 中文一区二区在线观看| 一本色道久久综合亚洲精品按摩| 日韩极品在线观看| 亚洲国产精华液网站w| 色狠狠桃花综合| 另类小说综合欧美亚洲| 国产精品亲子伦对白| 色综合天天做天天爱| 亚洲不卡一区二区三区| 久久九九99视频| 欧美在线免费观看亚洲| 经典三级视频一区| 亚洲视频在线观看三级| 91精品国产综合久久精品性色| 国产suv精品一区二区6| 天天综合色天天综合| 欧美极品另类videosde| 欧美精品乱码久久久久久| 成人免费黄色在线| 人人狠狠综合久久亚洲| 亚洲青青青在线视频| 精品少妇一区二区三区免费观看 | 亚洲影院久久精品| 久久综合久色欧美综合狠狠| 欧美在线观看禁18| 高清久久久久久| 日韩精品一级中文字幕精品视频免费观看| 久久久国产精品不卡| 717成人午夜免费福利电影| 99在线精品免费| 国产精品自拍毛片| 理论电影国产精品| 无码av免费一区二区三区试看| 国产精品乱码一区二三区小蝌蚪| 51精品秘密在线观看| 99久久精品国产导航| 国产69精品久久久久777| 青青草97国产精品免费观看无弹窗版| 亚洲蜜臀av乱码久久精品蜜桃| 国产亚洲成aⅴ人片在线观看| 欧美日本免费一区二区三区| 91香蕉国产在线观看软件| 国产69精品一区二区亚洲孕妇| 久久se精品一区二区| 日本vs亚洲vs韩国一区三区二区| 亚洲精品日产精品乱码不卡| 国产精品理论在线观看| 国产三级欧美三级| 久久久蜜桃精品| 久久众筹精品私拍模特| 日韩欧美在线123| 666欧美在线视频| 在线不卡中文字幕| 国产精品久久久久久久久免费桃花| 国产三级精品视频| 欧美变态tickling挠脚心| 日韩精品中文字幕在线一区| 欧美人牲a欧美精品| 欧美亚洲国产一区二区三区| 91麻豆精品在线观看| 成人看片黄a免费看在线| 大白屁股一区二区视频| 白白色 亚洲乱淫| 成人avav在线| 99久久久久久| 欧美影视一区二区三区| 欧美日韩亚洲丝袜制服| 91精品国产一区二区三区蜜臀| 欧美一级片在线观看| 日韩欧美自拍偷拍| 久久九九久精品国产免费直播| 国产亚洲精品aa| 国产精品国产三级国产专播品爱网 | 91免费版在线| 在线免费精品视频| 7777精品伊人久久久大香线蕉完整版 | 日韩**一区毛片| 国产一区二区按摩在线观看| 国产91丝袜在线播放九色| a4yy欧美一区二区三区| 色网站国产精品| 亚洲国产一区在线观看| 香蕉成人啪国产精品视频综合网 | 中文字幕中文字幕一区二区| 国产精品国产三级国产a| 一区二区三区在线视频观看58 | 国产精品色一区二区三区| 亚洲乱码国产乱码精品精小说| 一区二区三国产精华液| 五月天精品一区二区三区| 美女视频黄 久久| 高清国产午夜精品久久久久久| 91天堂素人约啪| 日韩欧美亚洲国产另类 | 日韩毛片精品高清免费| 日精品一区二区三区| 国产精品一级片在线观看| 色综合久久久久久久久久久| 3d动漫精品啪啪一区二区竹菊 | 日本欧美韩国一区三区| 国产高清一区日本| 欧美日韩一区二区电影| 国产亚洲欧洲997久久综合| 一区二区三区av电影| 国产精品自在在线| 欧美美女视频在线观看| 日本一区二区视频在线| 日韩精品1区2区3区| 不卡视频一二三四| 日韩欧美国产系列| 一区二区三区在线观看网站| 国产一区二区在线观看免费| 在线精品视频小说1| 欧美国产日本韩| 久久国产免费看| 欧美三级在线视频| 日韩一区日韩二区| 国产v日产∨综合v精品视频| 欧美电影在线免费观看| 亚洲人吸女人奶水| 亚洲三级在线看| 丝袜诱惑亚洲看片| 色哦色哦哦色天天综合| 国产人妖乱国产精品人妖| 日本强好片久久久久久aaa| 91香蕉视频污在线| 国产欧美日本一区视频| 激情亚洲综合在线| 7777精品伊人久久久大香线蕉完整版 | av网站免费线看精品| 精品毛片乱码1区2区3区| 午夜电影网一区| 欧美性xxxxxxxx| 综合中文字幕亚洲| 成人免费毛片高清视频| 久久尤物电影视频在线观看| 免费观看一级特黄欧美大片| 精品视频资源站| 一区二区三区高清| 91免费在线播放| 成人免费在线视频观看| 国产夫妻精品视频| 国产夜色精品一区二区av| 国产在线麻豆精品观看| 精品日韩欧美在线| 精品一区二区三区在线视频| 国产欧美日本一区视频| 日本韩国精品一区二区在线观看| 国产丝袜美腿一区二区三区| 国产精品一二二区| 欧美经典三级视频一区二区三区| 国产98色在线|日韩| 国产精品久久久久影视| 成人a免费在线看| 日韩久久一区二区| 91女神在线视频| 一区二区三区**美女毛片| 欧美三片在线视频观看 | 日韩视频在线永久播放| 日韩精品视频网站| 精品剧情v国产在线观看在线| 国产一区二区三区蝌蚪| 国产欧美一区视频| 91碰在线视频| 亚洲成人免费在线| 欧美一级理论片| 国产成人精品aa毛片| 自拍偷拍亚洲激情| 欧美日韩成人高清| 国内成人精品2018免费看| 国产精品水嫩水嫩| 在线一区二区视频| 天堂av在线一区| 久久久久国产精品麻豆| 99re在线精品| 日韩成人一区二区三区在线观看| 2023国产精品自拍| 欧美影院午夜播放| 欧美精品一卡两卡| 国产精品一区二区在线观看网站 | 欧美亚洲综合在线| 美女一区二区在线观看| 国产精品久久久久三级|