Index: fastio.c =================================================================== --- drivers/filesystems/fastfat/fastio.c (revision 74432) +++ drivers/filesystems/fastfat/fastio.c (working copy) @@ -31,79 +31,59 @@ OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject) { + PVFATFCB Fcb; + LARGE_INTEGER LargeLength; + /* Prevent all Fast I/O requests */ DPRINT("VfatFastIoCheckIfPossible(): returning FALSE.\n"); - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(Length); UNREFERENCED_PARAMETER(Wait); - UNREFERENCED_PARAMETER(LockKey); - UNREFERENCED_PARAMETER(CheckForReadOperation); UNREFERENCED_PARAMETER(IoStatus); UNREFERENCED_PARAMETER(DeviceObject); - return FALSE; -} + if (DeviceObject == VfatGlobalData->DeviceObject) + { + /* Not sure if this is possible */ + ASSERT(DeviceObject != VfatGlobalData->DeviceObject); + return FALSE; + } -static FAST_IO_READ VfatFastIoRead; + Fcb = FileObject->FsContext; + if (Fcb == NULL) + { + /* this happens for a volume open, right */ + ASSERT(Fcb != NULL); + return FALSE; + } -static -BOOLEAN -NTAPI -VfatFastIoRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatFastIoRead()\n"); + if (vfatFCBIsDirectory(Fcb)) + { + ASSERT(!vfatFCBIsDirectory(Fcb)); + return FALSE; + } - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(Length); - UNREFERENCED_PARAMETER(Wait); - UNREFERENCED_PARAMETER(LockKey); - UNREFERENCED_PARAMETER(Buffer); - UNREFERENCED_PARAMETER(IoStatus); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; + LargeLength.QuadPart = Length; + if (CheckForReadOperation) + { + return FsRtlFastCheckLockForRead(&Fcb->FileLock, + FileOffset, + &LargeLength, + LockKey, + FileObject, + PsGetCurrentProcess()); + } + else + { + //if (write protected) return FALSE; + return FsRtlFastCheckLockForWrite(&Fcb->FileLock, + FileOffset, + &LargeLength, + LockKey, + FileObject, + PsGetCurrentProcess()); + } } -static FAST_IO_WRITE VfatFastIoWrite; - -static -BOOLEAN -NTAPI -VfatFastIoWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatFastIoWrite()\n"); - - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(Length); - UNREFERENCED_PARAMETER(Wait); - UNREFERENCED_PARAMETER(LockKey); - UNREFERENCED_PARAMETER(Buffer); - UNREFERENCED_PARAMETER(IoStatus); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; -} - static FAST_IO_QUERY_BASIC_INFO VfatFastIoQueryBasicInfo; static @@ -437,100 +417,6 @@ return STATUS_INVALID_DEVICE_REQUEST; } -static FAST_IO_MDL_READ VfatMdlRead; - -static -BOOLEAN -NTAPI -VfatMdlRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL* MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatMdlRead\n"); - - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(Length); - UNREFERENCED_PARAMETER(LockKey); - UNREFERENCED_PARAMETER(MdlChain); - UNREFERENCED_PARAMETER(IoStatus); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; -} - -static FAST_IO_MDL_READ_COMPLETE VfatMdlReadComplete; - -static -BOOLEAN -NTAPI -VfatMdlReadComplete( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatMdlReadComplete\n"); - - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(MdlChain); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; -} - -static FAST_IO_PREPARE_MDL_WRITE VfatPrepareMdlWrite; - -static -BOOLEAN -NTAPI -VfatPrepareMdlWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL* MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatPrepareMdlWrite\n"); - - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(Length); - UNREFERENCED_PARAMETER(LockKey); - UNREFERENCED_PARAMETER(MdlChain); - UNREFERENCED_PARAMETER(IoStatus); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; -} - -static FAST_IO_MDL_WRITE_COMPLETE VfatMdlWriteComplete; - -static -BOOLEAN -NTAPI -VfatMdlWriteComplete( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject) -{ - DPRINT("VfatMdlWriteComplete\n"); - - UNREFERENCED_PARAMETER(FileObject); - UNREFERENCED_PARAMETER(FileOffset); - UNREFERENCED_PARAMETER(MdlChain); - UNREFERENCED_PARAMETER(DeviceObject); - - return FALSE; -} - static FAST_IO_READ_COMPRESSED VfatFastIoReadCompressed; static @@ -790,8 +676,8 @@ { FastIoDispatch->SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH); FastIoDispatch->FastIoCheckIfPossible = VfatFastIoCheckIfPossible; - FastIoDispatch->FastIoRead = VfatFastIoRead; - FastIoDispatch->FastIoWrite = VfatFastIoWrite; + FastIoDispatch->FastIoRead = FsRtlCopyRead; + FastIoDispatch->FastIoWrite = FsRtlCopyWrite; FastIoDispatch->FastIoQueryBasicInfo = VfatFastIoQueryBasicInfo; FastIoDispatch->FastIoQueryStandardInfo = VfatFastIoQueryStandardInfo; FastIoDispatch->FastIoLock = VfatFastIoLock; @@ -803,10 +689,10 @@ FastIoDispatch->ReleaseFileForNtCreateSection = VfatReleaseFileForNtCreateSection; FastIoDispatch->FastIoDetachDevice = VfatFastIoDetachDevice; FastIoDispatch->FastIoQueryNetworkOpenInfo = VfatFastIoQueryNetworkOpenInfo; - FastIoDispatch->MdlRead = VfatMdlRead; - FastIoDispatch->MdlReadComplete = VfatMdlReadComplete; - FastIoDispatch->PrepareMdlWrite = VfatPrepareMdlWrite; - FastIoDispatch->MdlWriteComplete = VfatMdlWriteComplete; + FastIoDispatch->MdlRead = FsRtlMdlReadDev; + FastIoDispatch->MdlReadComplete = FsRtlMdlReadCompleteDev; + FastIoDispatch->PrepareMdlWrite = FsRtlPrepareMdlWriteDev; + FastIoDispatch->MdlWriteComplete = FsRtlMdlWriteCompleteDev; FastIoDispatch->FastIoReadCompressed = VfatFastIoReadCompressed; FastIoDispatch->FastIoWriteCompressed = VfatFastIoWriteCompressed; FastIoDispatch->MdlReadCompleteCompressed = VfatMdlReadCompleteCompressed; Index: fcb.c =================================================================== --- drivers/filesystems/fastfat/fcb.c (revision 74432) +++ drivers/filesystems/fastfat/fcb.c (working copy) @@ -149,7 +149,7 @@ ExInitializeFastMutex(&rcFCB->LastMutex); rcFCB->RFCB.PagingIoResource = &rcFCB->PagingIoResource; rcFCB->RFCB.Resource = &rcFCB->MainResource; - rcFCB->RFCB.IsFastIoPossible = FastIoIsNotPossible; + rcFCB->RFCB.IsFastIoPossible = FastIoIsQuestionable; InitializeListHead(&rcFCB->ParentListHead); return rcFCB; @@ -671,7 +671,7 @@ FCB->RFCB.FileSize.QuadPart = Size; FCB->RFCB.ValidDataLength.QuadPart = Size; FCB->RFCB.AllocationSize.QuadPart = Size; - FCB->RFCB.IsFastIoPossible = FastIoIsNotPossible; + FCB->RFCB.IsFastIoPossible = FastIoIsQuestionable; vfatFCBInitializeCacheFromVolume(pVCB, FCB); vfatAddFCBToTable(pVCB, FCB);