Index: fastio.c =================================================================== --- drivers/filesystems/fastfat/fastio.c (revision 68127) +++ drivers/filesystems/fastfat/fastio.c (working copy) @@ -27,79 +27,50 @@ 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; -} + Fcb = FileObject->FsContext; + ASSERT(Fcb != NULL); + if (Fcb == NULL) + { + return FALSE; + } -static FAST_IO_READ VfatFastIoRead; + if (*Fcb->Attributes & FILE_ATTRIBUTE_DIRECTORY) + { + 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"); - - 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 @@ -433,100 +404,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 @@ -785,8 +662,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; @@ -798,10 +675,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;