Index: drivers/filesystems/fastfat/fastio.c =================================================================== --- drivers/filesystems/fastfat/fastio.c (revision 68127) +++ drivers/filesystems/fastfat/fastio.c (working copy) @@ -27,79 +27,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 @@ -433,100 +413,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 +671,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 +684,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: drivers/filesystems/fastfat/fcb.c =================================================================== --- drivers/filesystems/fastfat/fcb.c (revision 68127) +++ drivers/filesystems/fastfat/fcb.c (working copy) @@ -152,7 +152,7 @@ ExInitializeFastMutex(&rcFCB->LastMutex); rcFCB->RFCB.PagingIoResource = &rcFCB->PagingIoResource; rcFCB->RFCB.Resource = &rcFCB->MainResource; - rcFCB->RFCB.IsFastIoPossible = FastIoIsNotPossible; + rcFCB->RFCB.IsFastIoPossible = FastIoIsQuestionable; return rcFCB; } @@ -570,7 +570,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); Index: ntoskrnl/cc/copy.c =================================================================== --- ntoskrnl/cc/copy.c (revision 68127) +++ ntoskrnl/cc/copy.c (working copy) @@ -342,8 +342,9 @@ { CCTRACE(CC_API_DEBUG, "FileObject=%p BytesToWrite=%lu Wait=%d Retrying=%d\n", FileObject, BytesToWrite, Wait, Retrying); - UNIMPLEMENTED; - return FALSE; + + //UNIMPLEMENTED; + return TRUE; } /* @@ -423,6 +424,7 @@ FileObject, PostRoutine, Context1, Context2, BytesToWrite, Retrying); UNIMPLEMENTED; + PostRoutine(Context1, Context2); } /* @@ -438,11 +440,25 @@ OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus) { + LARGE_INTEGER LargeFileOffset; + BOOLEAN Success; + CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%lu Length=%lu PageCount=%lu Buffer=%p\n", FileObject, FileOffset, Length, PageCount, Buffer); - UNIMPLEMENTED; + DBG_UNREFERENCED_PARAMETER(PageCount); + + //UNIMPLEMENTED; + LargeFileOffset.QuadPart = FileOffset; + Success = CcCopyRead(FileObject, + &LargeFileOffset, + Length, + TRUE, + Buffer, + IoStatus); + NT_ASSERT(Success == TRUE); } + /* * @unimplemented */ @@ -454,10 +470,20 @@ IN ULONG Length, IN PVOID Buffer) { + LARGE_INTEGER LargeFileOffset; + BOOLEAN Success; + CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%lu Length=%lu Buffer=%p\n", FileObject, FileOffset, Length, Buffer); - UNIMPLEMENTED; + //UNIMPLEMENTED; + LargeFileOffset.QuadPart = FileOffset; + Success = CcCopyWrite(FileObject, + &LargeFileOffset, + Length, + TRUE, + Buffer); + NT_ASSERT(Success == TRUE); } /*