BOOLEAN Ext2FastIoCheckIfPossible ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN BOOLEAN CheckForReadOperation, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN bPossible = FastIoIsNotPossible; PEXT2_FCB Fcb; PEXT2_CCB Ccb; LARGE_INTEGER lLength; lLength.QuadPart = Length; __try { FsRtlEnterFileSystem(); __try { if (IsExt2FsDevice(DeviceObject)) { __leave; } Fcb = (PEXT2_FCB) FileObject->FsContext; if (Fcb == NULL || Fcb->Identifier.Type == EXT2VCB) { __leave; } ASSERT((Fcb->Identifier.Type == EXT2FCB) && (Fcb->Identifier.Size == sizeof(EXT2_FCB))); if (IsDirectory(Fcb)) { __leave; } Ccb = (PEXT2_CCB) FileObject->FsContext2; if (Ccb == NULL) { __leave; } if (CheckForReadOperation) { bPossible = FsRtlFastCheckLockForRead( &Fcb->FileLockAnchor, FileOffset, &lLength, LockKey, FileObject, PsGetCurrentProcess()); } else { if (!(IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY) || IsFlagOn(Fcb->Vcb->Flags, VCB_WRITE_PROTECTED))) { bPossible = FsRtlFastCheckLockForWrite( &Fcb->FileLockAnchor, FileOffset, &lLength, LockKey, FileObject, PsGetCurrentProcess()); } } #if EXT2_DEBUG DEBUG(DL_INF, ("Ext2FastIIOCheckPossible: %s %s %wZ\n", Ext2GetCurrentProcessName(), "FASTIO_CHECK_IF_POSSIBLE", &Fcb->Mcb->FullName )); DEBUG(DL_INF, ( "Ext2FastIIOCheckPossible: Offset: %I64xg Length: %xh Key: %u %s %s\n", FileOffset->QuadPart, Length, LockKey, (CheckForReadOperation ? "CheckForReadOperation:" : "CheckForWriteOperation:"), (bPossible ? "Succeeded" : "Failed"))); #endif } __except (EXCEPTION_EXECUTE_HANDLER) { bPossible = FastIoIsNotPossible; } } __finally { FsRtlExitFileSystem(); } return bPossible; }
BOOLEAN NTAPI /* ReactOS Change: GCC Does not support STDCALL by default */ CdFastIoCheckIfPossible ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, IN ULONG LockKey, IN BOOLEAN CheckForReadOperation, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) /*++ Routine Description: This routine checks if fast i/o is possible for a read/write operation Arguments: FileObject - Supplies the file object used in the query FileOffset - Supplies the starting byte offset for the read/write operation Length - Supplies the length, in bytes, of the read/write operation Wait - Indicates if we can wait LockKey - Supplies the lock key CheckForReadOperation - Indicates if this is a check for a read or write operation IoStatus - Receives the status of the operation if our return value is FastIoReturnError Return Value: BOOLEAN - TRUE if fast I/O is possible and FALSE if the caller needs to take the long route. --*/ { PFCB Fcb; TYPE_OF_OPEN TypeOfOpen; LARGE_INTEGER LargeLength; PAGED_CODE(); // // Decode the type of file object we're being asked to process and // make sure that is is only a user file open. // TypeOfOpen = CdFastDecodeFileObject( FileObject, &Fcb ); if ((TypeOfOpen != UserFileOpen) || !CheckForReadOperation) { IoStatus->Status = STATUS_INVALID_PARAMETER; return TRUE; } LargeLength.QuadPart = Length; // // Check whether the file locks will allow for fast io. // if ((Fcb->FileLock == NULL) || FsRtlFastCheckLockForRead( Fcb->FileLock, FileOffset, &LargeLength, LockKey, FileObject, PsGetCurrentProcess() )) { return TRUE; } return FALSE; }