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

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

?? write.c

?? FSD file system driver
?? C
?? 第 1 頁 / 共 3 頁
字號:
						(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 (IsEndOfFile(ByteOffset))
		{
			bAppendFile = TRUE;
			ByteOffset.QuadPart = Fcb->Header.FileSize.QuadPart;
		}

		if (FlagOn(Fcb->FFSMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY) && !PagingIo)
		{
			Status = STATUS_INVALID_DEVICE_REQUEST;
			__leave;
		}

		//
		//  Do flushing for such cases
		//
		if (Nocache && !PagingIo && (Fcb->SectionObject.DataSectionObject != NULL)) 
		{
			ExAcquireResourceExclusive(&Fcb->MainResource, 
					IsFlagOn(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT));

			MainResourceAcquired = TRUE;

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

			CcFlushCache(&(Fcb->SectionObject),
					&ByteOffset,
					Length,
					&(Irp->IoStatus));
			ClearFlag(Fcb->Flags, FCB_FILE_MODIFIED);

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

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

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

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

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

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

			FFSPrint((DBG_USER, "FFSWriteFile: Inode=%xh %S PagingIo: %xh:%xh Synchronous=%xh\n",
			Fcb->FFSMcb->Inode, Fcb->FFSMcb->ShortName.Buffer, ResShCnt, ResExCnt, IrpContext->IsSynchronous));
			*/
			if (!ExAcquireResourceSharedLite(
						&Fcb->PagingIoResource,
						IrpContext->IsSynchronous))
			{
				Status = STATUS_PENDING;
				__leave;
			}

			PagingIoResourceAcquired = TRUE;
		}

		if (!PagingIo)
		{
			if (!FsRtlCheckLockForWriteAccess(
						&Fcb->FileLockAnchor,
						Irp))
			{
				Status = STATUS_FILE_LOCK_CONFLICT;
				__leave;
			}
		}

		if (Nocache)
		{
			if ((ByteOffset.QuadPart + Length) >
					Fcb->Header.AllocationSize.QuadPart)
			{
				if (ByteOffset.QuadPart >= 
						Fcb->Header.AllocationSize.QuadPart)
				{
					Status = STATUS_SUCCESS;
					Irp->IoStatus.Information = 0;
					__leave;
				}
				else
				{
					if (Length > (ULONG)(Fcb->Header.AllocationSize.QuadPart
								- ByteOffset.QuadPart))
					{
						Length = (ULONG)(Fcb->Header.AllocationSize.QuadPart
								- ByteOffset.QuadPart);
					}
				}
			}
		}

		if (!Nocache)
		{
			if (FlagOn(Fcb->FFSMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY))
			{
				__leave;
			}

			if (FileObject->PrivateCacheMap == NULL)
			{
				CcInitializeCacheMap(
						FileObject,
						(PCC_FILE_SIZES)(&Fcb->Header.AllocationSize),
						FALSE,
						&FFSGlobal->CacheManagerCallbacks,
						Fcb);

				CcSetReadAheadGranularity(
						FileObject,
						READ_AHEAD_GRANULARITY);

				CcSetFileSizes(
						FileObject, 
						(PCC_FILE_SIZES)(&(Fcb->Header.AllocationSize)));
			}

			CacheObject = FileObject;

			//
			//  Need extending the size of inode ?
			//
			if ((bAppendFile) || ((ULONG)(ByteOffset.QuadPart + Length) >
						(ULONG)(Fcb->Header.FileSize.QuadPart)))
			{

				LARGE_INTEGER   ExtendSize;
				LARGE_INTEGER   FileSize;

				bNeedExtending = TRUE;
				FileSize = Fcb->Header.FileSize;
				ExtendSize.QuadPart = (LONGLONG)(ByteOffset.QuadPart + Length);

				if (ExtendSize.QuadPart > Fcb->Header.AllocationSize.QuadPart)
				{
					if (!FFSExpandFile(IrpContext, Vcb, Fcb, &ExtendSize))
					{
						Status = STATUS_INSUFFICIENT_RESOURCES;
						__leave;
					}
				}

				{
					Fcb->Header.FileSize.QuadPart = ExtendSize.QuadPart;
					Fcb->dinode1->di_size = (ULONG)ExtendSize.QuadPart;
				}

				if (FileObject->PrivateCacheMap)
				{
					CcSetFileSizes(FileObject, (PCC_FILE_SIZES)(&(Fcb->Header.AllocationSize)));

					if (ByteOffset.QuadPart > FileSize.QuadPart)
					{
						FFSZeroHoles(IrpContext, Vcb, FileObject, FileSize.QuadPart, 
								ByteOffset.QuadPart - FileSize.QuadPart);
					}

					if (Fcb->Header.AllocationSize.QuadPart > ExtendSize.QuadPart)
					{
						FFSZeroHoles(IrpContext, Vcb, FileObject, ExtendSize.QuadPart, 
								Fcb->Header.AllocationSize.QuadPart - ExtendSize.QuadPart);
					}
				}

				if (FFSv1SaveInode(IrpContext, Vcb, Fcb->FFSMcb->Inode, Fcb->dinode1))
				{
					Status = STATUS_SUCCESS;
				}

				FFSNotifyReportChange(
						IrpContext,
						Vcb,
						Fcb,
						FILE_NOTIFY_CHANGE_SIZE,
						FILE_ACTION_MODIFIED);
			}

			if (FlagOn(IrpContext->MinorFunction, IRP_MN_MDL))
			{
				CcPrepareMdlWrite(
						CacheObject,
						(&ByteOffset),
						Length,
						&Irp->MdlAddress,
						&Irp->IoStatus);

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

				if (Buffer == NULL)
				{
					FFSBreakPoint();
					Status = STATUS_INVALID_USER_BUFFER;
					__leave;
				}

				if (!CcCopyWrite(
							CacheObject,
							(PLARGE_INTEGER)&ByteOffset,
							Length,
							IrpContext->IsSynchronous,
							Buffer))
				{
					Status = STATUS_PENDING;
					__leave;
				}

				Status = Irp->IoStatus.Status;
			}

			if (NT_SUCCESS(Status))
			{
				Irp->IoStatus.Information = Length;

				if (IsFlagOn(Vcb->Flags, VCB_FLOPPY_DISK))
				{
					FFSPrint((DBG_USER, "FFSWriteFile is starting FlushingDpc...\n"));
					FFSStartFloppyFlushDpc(Vcb, Fcb, FileObject);
				}
			}
		}
		else
		{
			ReturnedLength = Length;

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

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

			Irp->IoStatus.Status = STATUS_SUCCESS;
			Irp->IoStatus.Information = Length;

			Status = 
				FFSv1WriteInode(
						IrpContext,
						Vcb,
						Fcb->dinode1,
						(ULONGLONG)(ByteOffset.QuadPart),
						NULL,
						Length,
						TRUE,
						&ReturnedLength);

			Irp = IrpContext->Irp;

		}
	}

	__finally
	{
		if (PagingIoResourceAcquired)
		{
			ExReleaseResourceForThreadLite(
					&Fcb->PagingIoResource,
					ExGetCurrentResourceThread());
		}

		if (MainResourceAcquired)
		{
			ExReleaseResourceForThreadLite(
					&Fcb->MainResource,
					ExGetCurrentResourceThread());
		}

		if (!IrpContext->ExceptionInProgress)
		{
			if (Irp)
			{
				if (Status == STATUS_PENDING)
				{
					if (!bDeferred)
					{
						Status = FFSLockUserBuffer(
									IrpContext->Irp,
									Length,
									IoReadAccess);

						if (NT_SUCCESS(Status))
						{
							Status = FFSQueueRequest(IrpContext);
						}
						else
						{
							FFSCompleteIrpContext(IrpContext, Status);
						}
					}
				}
				else
				{
					if (NT_SUCCESS(Status))
					{
						if (SynchronousIo && !PagingIo)
						{
							FileObject->CurrentByteOffset.QuadPart =
								ByteOffset.QuadPart + Irp->IoStatus.Information;
						}

						if (!PagingIo)
						{
							SetFlag(FileObject->Flags, FO_FILE_MODIFIED);
							SetFlag(Fcb->Flags, FCB_FILE_MODIFIED);
						}
					}

					FFSCompleteIrpContext(IrpContext, Status);
				}
			}
			else
			{
				FFSFreeIrpContext(IrpContext);
			}
		}
	}

	return Status;

}


NTSTATUS
FFSWriteComplete(
	IN PFFS_IRP_CONTEXT IrpContext)
{
	NTSTATUS        Status = STATUS_UNSUCCESSFUL;
	PFILE_OBJECT    FileObject;
	PIRP            Irp;
	PIO_STACK_LOCATION IrpSp;

	__try
	{
		ASSERT(IrpContext);

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

		FileObject = IrpContext->FileObject;

		Irp = IrpContext->Irp;
		IrpSp = IoGetCurrentIrpStackLocation(Irp);

		CcMdlWriteComplete(FileObject, &(IrpSp->Parameters.Write.ByteOffset), Irp->MdlAddress);

		Irp->MdlAddress = NULL;

		Status = STATUS_SUCCESS;
	}

	__finally
	{
		if (!IrpContext->ExceptionInProgress)
		{
			FFSCompleteIrpContext(IrpContext, Status);
		}
	}

	return Status;
}


NTSTATUS
FFSWrite(
	IN PFFS_IRP_CONTEXT IrpContext)
{
	NTSTATUS            Status;
	PFFS_FCBVCB         FcbOrVcb;
	PDEVICE_OBJECT      DeviceObject;
	PFILE_OBJECT        FileObject;
	PFFS_VCB            Vcb;
	BOOLEAN             bCompleteRequest = TRUE;

	ASSERT(IrpContext);

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

	__try
	{
		if (FlagOn(IrpContext->MinorFunction, IRP_MN_COMPLETE))
		{
			Status = FFSWriteComplete(IrpContext);
			bCompleteRequest = FALSE;
		}
		else
		{
			DeviceObject = IrpContext->DeviceObject;

			if (DeviceObject == FFSGlobal->DeviceObject)
			{
				Status = STATUS_INVALID_DEVICE_REQUEST;
				__leave;
			}

			Vcb = (PFFS_VCB)DeviceObject->DeviceExtension;

			if (Vcb->Identifier.Type != FFSVCB ||
					Vcb->Identifier.Size != sizeof(FFS_VCB))
			{
				Status = STATUS_INVALID_PARAMETER;
				__leave;
			}

			ASSERT(IsMounted(Vcb));

			if (IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING))
			{
				Status = STATUS_TOO_LATE;
				__leave;
			}

			if (IsFlagOn(Vcb->Flags, VCB_READ_ONLY))
			{
				Status = STATUS_MEDIA_WRITE_PROTECTED;
				__leave;
			}

			FileObject = IrpContext->FileObject;

			FcbOrVcb = (PFFS_FCBVCB)FileObject->FsContext;

			if (FcbOrVcb->Identifier.Type == FFSVCB)
			{
				Status = FFSWriteVolume(IrpContext);

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

				bCompleteRequest = FALSE;
			}
			else if (FcbOrVcb->Identifier.Type == FFSFCB)
			{
				Status = FFSWriteFile(IrpContext);

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

				bCompleteRequest = FALSE;
			}
			else
			{
				Status = STATUS_INVALID_PARAMETER;
			}
		}
	}

	__finally
	{
		if (bCompleteRequest)
		{
			FFSCompleteIrpContext(IrpContext, Status);
		}
	}

	return Status;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲妇熟xx妇色黄| 成人亚洲精品久久久久软件| 26uuu久久综合| 欧美一区二区三区影视| 国产高清不卡一区| 亚洲免费观看高清完整版在线观看| 欧美日韩小视频| 欧美丝袜自拍制服另类| 欧美丝袜自拍制服另类| 欧美亚洲高清一区二区三区不卡| 日本精品一区二区三区四区的功能| aaa亚洲精品| 99re6这里只有精品视频在线观看| 91小视频免费看| 在线国产电影不卡| 91精品免费观看| 欧美一级在线免费| 精品乱人伦小说| 欧美激情在线一区二区| 亚洲人成精品久久久久久 | 亚洲成在人线在线播放| 亚洲在线中文字幕| 青青国产91久久久久久| 国产精品69毛片高清亚洲| 成人精品国产免费网站| 91美女视频网站| 欧美精品三级在线观看| 精品国产99国产精品| 国产精品久久国产精麻豆99网站| 亚洲综合一区在线| 久久99久久久久| 成人免费视频caoporn| 一本大道av伊人久久综合| 欧美老人xxxx18| 亚洲欧美日韩系列| 成人精品国产免费网站| 成人av网在线| 久久99久久久久| 精品一区二区三区香蕉蜜桃| 国产一区二区三区四区五区入口| 欧美草草影院在线视频| 成人欧美一区二区三区小说| 不卡一区二区中文字幕| 亚洲一区二区三区中文字幕在线| 色网站国产精品| 日本伊人精品一区二区三区观看方式| 日韩欧美一区在线| 久久99深爱久久99精品| 亚洲欧洲成人自拍| 国产成人综合在线观看| 日韩欧美一区二区免费| 日本视频免费一区| 欧美亚洲综合色| 亚洲欧美日韩电影| 一道本成人在线| 欧美国产精品久久| 成人性生交大片免费看中文| 欧美人妖巨大在线| 久久久久88色偷偷免费| 国产精品99久久不卡二区| 色综合久久中文综合久久牛| 欧美精品一区二区三区高清aⅴ | 韩国精品主播一区二区在线观看 | 91精品欧美久久久久久动漫| 国产精品久久综合| 久久不见久久见免费视频7| 99精品久久99久久久久| 精品久久久久一区| 午夜精品福利在线| 9人人澡人人爽人人精品| 精品福利二区三区| 午夜精品免费在线观看| 97久久超碰国产精品电影| 欧美精品一区二区三区蜜桃| 日韩成人av影视| 欧美性色aⅴ视频一区日韩精品| 国产精品视频观看| 国产成人综合网| 日韩一区二区三区在线观看| 亚洲一区二区三区自拍| 91啪九色porn原创视频在线观看| 亚洲综合丝袜美腿| 久久综合色8888| 91精品国产色综合久久| 亚洲图片欧美视频| 国产精品美女久久久久久2018| 久久精品国产亚洲5555| 久久99日本精品| 另类小说欧美激情| 国产一区二区日韩精品| 懂色av一区二区夜夜嗨| 99精品视频在线免费观看| 欧美中文字幕亚洲一区二区va在线| 99久久国产综合精品女不卡| 色久优优欧美色久优优| 欧洲人成人精品| 欧美日韩一区二区欧美激情| 国产麻豆视频一区二区| 亚洲福利一二三区| 国产欧美视频一区二区三区| 色欧美乱欧美15图片| 美女视频黄 久久| 日韩精彩视频在线观看| 久久亚洲综合色一区二区三区| 91麻豆免费观看| 久久66热re国产| 久久综合国产精品| 久久午夜电影网| 久草热8精品视频在线观看| 精品乱码亚洲一区二区不卡| 精品无人码麻豆乱码1区2区 | 久久精品欧美日韩| 国产伦精品一区二区三区在线观看 | 欧美丝袜丝交足nylons图片| 亚洲成av人影院| 日韩一区二区电影在线| 精品一区二区三区免费播放| 国产午夜精品一区二区三区视频| 成人小视频免费观看| 中文字幕一区在线观看| 欧美亚洲免费在线一区| 首页综合国产亚洲丝袜| 精品福利视频一区二区三区| 丁香天五香天堂综合| 日韩伦理电影网| 欧美日韩国产小视频在线观看| 六月婷婷色综合| 欧美激情一区不卡| 91成人免费电影| 轻轻草成人在线| 国产三级欧美三级日产三级99| 成人99免费视频| 亚洲一区二区三区视频在线播放| 91精品国产综合久久福利| 国产精品69毛片高清亚洲| 亚洲男人天堂av| 欧美一区二区播放| 成人免费观看男女羞羞视频| 欧美电影免费观看高清完整版在 | 亚洲一区视频在线| 中文字幕永久在线不卡| 国产欧美综合在线观看第十页| 国产欧美精品在线观看| 亚洲成人免费影院| 激情丁香综合五月| 国产精品美女视频| 国产91精品一区二区麻豆网站| 国产亚洲欧美在线| 国内久久婷婷综合| 久久久精品蜜桃| 波多野结衣精品在线| 亚洲欧美激情视频在线观看一区二区三区 | 91年精品国产| 自拍偷在线精品自拍偷无码专区| 五月天一区二区| 成人午夜av电影| 日韩一区二区三区观看| 亚洲精品欧美二区三区中文字幕| 久久精品999| 色爱区综合激月婷婷| 亚洲国产精品高清| 亚洲国产sm捆绑调教视频| 99精品视频在线观看免费| 2023国产精品自拍| 精品国产一区二区三区av性色 | 丰满亚洲少妇av| 欧美日韩你懂的| 久久精品视频一区二区| 久久精品国产77777蜜臀| 欧美日韩免费一区二区三区| 亚洲成av人片在线观看| 色香色香欲天天天影视综合网| 成人免费在线播放视频| av成人免费在线| 亚洲一区在线观看免费观看电影高清| 99久久综合国产精品| 亚洲人午夜精品天堂一二香蕉| 色综合久久综合| 日韩精品国产欧美| 久久综合久久综合久久综合| 风间由美性色一区二区三区| 欧美一区二区网站| 97se狠狠狠综合亚洲狠狠| 91精品国产综合久久婷婷香蕉| 国产无人区一区二区三区| 成人国产精品免费观看动漫| 亚洲日本va午夜在线影院| 欧美三级日韩三级| 欧美性三三影院| 中文字幕亚洲区| 精品久久国产老人久久综合| 欧美在线观看禁18| 色婷婷久久久久swag精品| 成人爱爱电影网址| 91亚洲大成网污www| 东方欧美亚洲色图在线| 国产一区二区0| 精品一区二区三区蜜桃| 精品在线一区二区三区| 视频一区视频二区中文|