/* * COPYRIGHT: GNU GENERAL PUBLIC LICENSE VERSION 2 * PROJECT: ReiserFs file system driver for Windows NT/2000/XP/Vista. * FILE: fastio.c * PURPOSE: * PROGRAMMER: Mark Piper, Matt Wu, Bo Brantén. * HOMEPAGE: * UPDATE HISTORY: */ /* INCLUDES *****************************************************************/ #include "rfsd.h" /* GLOBALS ***************************************************************/ extern PRFSD_GLOBAL RfsdGlobal; /* DEFINITIONS *************************************************************/ #ifdef ALLOC_PRAGMA #if DBG #pragma alloc_text(PAGE, RfsdFastIoRead) #if !RFSD_READ_ONLY #pragma alloc_text(PAGE, RfsdFastIoWrite) #endif // !RFSD_READ_ONLY #endif // DBG #pragma alloc_text(PAGE, RfsdFastIoCheckIfPossible) #pragma alloc_text(PAGE, RfsdFastIoQueryBasicInfo) #pragma alloc_text(PAGE, RfsdFastIoQueryStandardInfo) #pragma alloc_text(PAGE, RfsdFastIoQueryNetworkOpenInfo) #pragma alloc_text(PAGE, RfsdFastIoLock) #pragma alloc_text(PAGE, RfsdFastIoUnlockSingle) #pragma alloc_text(PAGE, RfsdFastIoUnlockAll) #pragma alloc_text(PAGE, RfsdFastIoUnlockAllByKey) #endif BOOLEAN NTAPI RfsdFastIoCheckIfPossible ( 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; PRFSD_FCB Fcb; LARGE_INTEGER lLength; PAGED_CODE(); lLength.QuadPart = Length; _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); if (IsDirectory(Fcb)) { _SEH2_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 = FastIoIsNotPossible; } else { bPossible = FsRtlFastCheckLockForWrite( &Fcb->FileLockAnchor, FileOffset, &lLength, LockKey, FileObject, PsGetCurrentProcess()); } } RfsdPrint((DBG_INFO, "RfsdFastIoCheckIfPossible: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_CHECK_IF_POSSIBLE", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoCheckIfPossible: Offset: %I64xg Length: %xh Key: %u %s %s\n", FileOffset->QuadPart, Length, LockKey, (CheckForReadOperation ? "CheckForReadOperation:" : "CheckForWriteOperation:"), (bPossible ? "Succeeded" : "Failed"))); } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { bPossible = FastIoIsNotPossible; } _SEH2_END; } _SEH2_FINALLY { FsRtlExitFileSystem(); } _SEH2_END; return bPossible; } #if DBG BOOLEAN NTAPI RfsdFastIoRead (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) { BOOLEAN Status; PRFSD_FCB Fcb; PAGED_CODE(); Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); RfsdPrint((DBG_INFO, "RfsdFastIoRead: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_READ", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoRead: Offset: %I64xh Length: %xh Key: %u\n", FileOffset->QuadPart, Length, LockKey )); Status = FsRtlCopyRead ( FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); return Status; } #if !RFSD_READ_ONLY NTAPI BOOLEAN RfsdFastIoWrite ( 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) { BOOLEAN bRet; PRFSD_FCB Fcb; PAGED_CODE(); Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); RfsdPrint((DBG_INFO, "RfsdFastIoWrite: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_WRITE", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoWrite: Offset: %I64xh Length: %xh Key: %xh\n", FileOffset->QuadPart, Length, LockKey )); if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY)) { DbgBreak(); return FALSE; } bRet = FsRtlCopyWrite ( FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); return bRet; } #endif // !RFSD_READ_ONLY #endif /* DBG */ BOOLEAN NTAPI RfsdFastIoQueryBasicInfo (IN PFILE_OBJECT FileObject, IN BOOLEAN Wait, OUT PFILE_BASIC_INFORMATION Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject) { BOOLEAN Status = FALSE; PRFSD_FCB Fcb = 0; BOOLEAN FcbMainResourceAcquired = FALSE; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); RfsdPrint((DBG_INFO, "RfsdFastIoQueryBasicInfo: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_BASIC_INFO", Fcb->AnsiFileName.Buffer )); if (!ExAcquireResourceSharedLite( &Fcb->MainResource, Wait)) { Status = FALSE; _SEH2_LEAVE; } FcbMainResourceAcquired = TRUE; RtlZeroMemory(Buffer, sizeof(FILE_BASIC_INFORMATION)); /* typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; LARGE_INTEGER LastWriteTime; LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; */ Buffer->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime); Buffer->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime); Buffer->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime); Buffer->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime); Buffer->FileAttributes = Fcb->RfsdMcb->FileAttr; IoStatus->Information = sizeof(FILE_BASIC_INFORMATION); IoStatus->Status = STATUS_SUCCESS; Status = TRUE; } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { if (FcbMainResourceAcquired) { ExReleaseResourceForThreadLite( &Fcb->MainResource, ExGetCurrentResourceThread() ); } FsRtlExitFileSystem(); } _SEH2_END; if (Status == FALSE) { RfsdPrint((DBG_ERROR, "RfsdFastIoQueryBasicInfo: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_BASIC_INFO" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_ERROR, "RfsdFastIoQueryBasicInfo: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_BASIC_INFO", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } return Status; } BOOLEAN NTAPI RfsdFastIoQueryStandardInfo ( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait, OUT PFILE_STANDARD_INFORMATION Buffer, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN Status = FALSE; PRFSD_VCB Vcb; PRFSD_FCB Fcb = 0; BOOLEAN FcbMainResourceAcquired = FALSE; LONGLONG FileSize; LONGLONG AllocationSize; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); RfsdPrint((DBG_INFO, "RfsdFastIoQueryStandardInfo: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_STANDARD_INFO", Fcb->AnsiFileName.Buffer )); Vcb = Fcb->Vcb; if (!ExAcquireResourceSharedLite( &Fcb->MainResource, Wait )) { Status = FALSE; _SEH2_LEAVE; } FcbMainResourceAcquired = TRUE; RtlZeroMemory(Buffer, sizeof(FILE_STANDARD_INFORMATION)); /* typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; LARGE_INTEGER EndOfFile; ULONG NumberOfLinks; BOOLEAN DeletePending; BOOLEAN Directory; } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; */ FileSize = (LONGLONG) Fcb->Inode->i_size; #if DISABLED if (S_ISREG(Fcb->Inode->i_mode)) FileSize |= ((LONGLONG)(Fcb->Inode->i_size_high) << 32); #endif AllocationSize = CEILING_ALIGNED(FileSize, (ULONGLONG)Vcb->BlockSize); // TODO: This is incorrect for file tails... Buffer->AllocationSize.QuadPart = AllocationSize; Buffer->EndOfFile.QuadPart = FileSize; Buffer->NumberOfLinks = Fcb->Inode->i_links_count; if (IsFlagOn(Fcb->Vcb->Flags, VCB_READ_ONLY)) { Buffer->DeletePending = FALSE; } else { Buffer->DeletePending = IsFlagOn(Fcb->Flags, FCB_DELETE_PENDING); } if (FlagOn(Fcb->RfsdMcb->FileAttr, FILE_ATTRIBUTE_DIRECTORY)) { Buffer->Directory = TRUE; } else { Buffer->Directory = FALSE; } IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION); IoStatus->Status = STATUS_SUCCESS; Status = TRUE; } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { if (FcbMainResourceAcquired) { ExReleaseResourceForThreadLite( &Fcb->MainResource, ExGetCurrentResourceThread() ); } FsRtlExitFileSystem(); } _SEH2_END; #if DBG if (Status == FALSE) { RfsdPrint((DBG_INFO, "RfsdFastIoQueryStandardInfo: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_STANDARD_INFO" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_INFO, "RfsdFastIoQueryStandardInfo: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_STANDARD_INFO", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } #endif return Status; } BOOLEAN NTAPI RfsdFastIoLock ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, IN PEPROCESS Process, IN ULONG Key, IN BOOLEAN FailImmediately, IN BOOLEAN ExclusiveLock, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN Status = FALSE; PRFSD_FCB Fcb; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); if (IsDirectory(Fcb)) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } RfsdPrint((DBG_INFO, "RfsdFastIoLock: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_LOCK", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoLock: Offset: %I64xh Length: %I64xh Key: %u %s%s\n", FileOffset->QuadPart, Length->QuadPart, Key, (FailImmediately ? "FailImmediately " : ""), (ExclusiveLock ? "ExclusiveLock " : "") )); if (Fcb->Header.IsFastIoPossible != FastIoIsQuestionable) { RfsdPrint((DBG_INFO, "RfsdFastIoLock: %s %s %s\n", RfsdGetCurrentProcessName(), "FastIoIsQuestionable", Fcb->AnsiFileName.Buffer )); Fcb->Header.IsFastIoPossible = FastIoIsQuestionable; } #ifdef _MSC_VER #pragma prefast( suppress: 28159, "bug in prefast" ) #endif Status = FsRtlFastLock( &Fcb->FileLockAnchor, FileObject, FileOffset, Length, Process, Key, FailImmediately, ExclusiveLock, IoStatus, NULL, FALSE); } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { FsRtlExitFileSystem(); } _SEH2_END; #if DBG if (Status == FALSE) { RfsdPrint((DBG_ERROR, "RfsdFastIoLock: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_LOCK" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_ERROR, "RfsdFastIoLock: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_LOCK", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } #endif return Status; } BOOLEAN NTAPI RfsdFastIoUnlockSingle ( IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN PLARGE_INTEGER Length, IN PEPROCESS Process, IN ULONG Key, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN Status = FALSE; PRFSD_FCB Fcb; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); if (IsDirectory(Fcb)) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } RfsdPrint((DBG_INFO, "RfsdFastIoUnlockSingle: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_SINGLE", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoUnlockSingle: Offset: %I64xh Length: %I64xh Key: %u\n", FileOffset->QuadPart, Length->QuadPart, Key )); IoStatus->Status = FsRtlFastUnlockSingle( &Fcb->FileLockAnchor, FileObject, FileOffset, Length, Process, Key, NULL, FALSE); IoStatus->Information = 0; Status = TRUE; } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { FsRtlExitFileSystem(); } _SEH2_END; #if DBG if (Status == FALSE) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockSingle: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_SINGLE" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockSingle: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_SINGLE", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } #endif return Status; } BOOLEAN NTAPI RfsdFastIoUnlockAll ( IN PFILE_OBJECT FileObject, IN PEPROCESS Process, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject) { BOOLEAN Status = FALSE; PRFSD_FCB Fcb; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); if (IsDirectory(Fcb)) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } RfsdPrint((DBG_INFO, "RfsdFastIoUnlockAll: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL", Fcb->AnsiFileName.Buffer )); IoStatus->Status = FsRtlFastUnlockAll( &Fcb->FileLockAnchor, FileObject, Process, NULL ); IoStatus->Information = 0; Status = TRUE; } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { FsRtlExitFileSystem(); } _SEH2_END; #if DBG if (Status == FALSE) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockAll: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockAll: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } #endif return Status; } BOOLEAN NTAPI RfsdFastIoUnlockAllByKey ( IN PFILE_OBJECT FileObject, #ifdef __REACTOS__ IN PVOID Process, #else IN PEPROCESS Process, #endif IN ULONG Key, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN Status = FALSE; PRFSD_FCB Fcb; PAGED_CODE(); _SEH2_TRY { _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; Status = TRUE; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); if (IsDirectory(Fcb)) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; Status = TRUE; _SEH2_LEAVE; } RfsdPrint((DBG_INFO, "RfsdFastIoUnlockAllByKey: %s %s %s\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL_BY_KEY", Fcb->AnsiFileName.Buffer )); RfsdPrint((DBG_INFO, "RfsdFastIoUnlockAllByKey: Key: %u\n", Key )); IoStatus->Status = FsRtlFastUnlockAllByKey( &Fcb->FileLockAnchor, FileObject, Process, Key, NULL ); IoStatus->Information = 0; Status = TRUE; } _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) { IoStatus->Status = _SEH2_GetExceptionCode(); Status = TRUE; } _SEH2_END; } _SEH2_FINALLY { FsRtlExitFileSystem(); } _SEH2_END; #if DBG if (Status == FALSE) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockAllByKey: %s %s *** Status: FALSE ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL_BY_KEY" )); } else if (IoStatus->Status != STATUS_SUCCESS) { RfsdPrint((DBG_ERROR, "RfsdFastIoUnlockAllByKey: %s %s *** Status: %s (%#x) ***\n", RfsdGetCurrentProcessName(), "FASTIO_UNLOCK_ALL_BY_KEY", RfsdNtStatusToString(IoStatus->Status), IoStatus->Status )); } #endif return Status; } BOOLEAN NTAPI RfsdFastIoQueryNetworkOpenInfo ( IN PFILE_OBJECT FileObject, IN BOOLEAN Wait, IN OUT PFILE_NETWORK_OPEN_INFORMATION PFNOI, OUT PIO_STATUS_BLOCK IoStatus, IN PDEVICE_OBJECT DeviceObject ) { BOOLEAN bResult = FALSE; PRFSD_FCB Fcb = NULL; BOOLEAN FcbResourceAcquired = FALSE; PAGED_CODE(); _SEH2_TRY { FsRtlEnterFileSystem(); if (DeviceObject == RfsdGlobal->DeviceObject) { IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST; _SEH2_LEAVE; } Fcb = (PRFSD_FCB) FileObject->FsContext; ASSERT(Fcb != NULL); if (Fcb->Identifier.Type == RFSDVCB) { DbgBreak(); IoStatus->Status = STATUS_INVALID_PARAMETER; _SEH2_LEAVE; } ASSERT((Fcb->Identifier.Type == RFSDFCB) && (Fcb->Identifier.Size == sizeof(RFSD_FCB))); RfsdPrint((DBG_INFO, "%-16.16s %-31s %s\n", RfsdGetCurrentProcessName(), "FASTIO_QUERY_NETWORK_OPEN_INFO", Fcb->AnsiFileName.Buffer )); if (FileObject->FsContext2) { _SEH2_LEAVE; } if (!FlagOn(Fcb->Flags, FCB_PAGE_FILE)) { if (!ExAcquireResourceSharedLite( &Fcb->MainResource, Wait )) { _SEH2_LEAVE; } FcbResourceAcquired = TRUE; } if (IsDirectory(Fcb)) { PFNOI->AllocationSize.QuadPart = 0; PFNOI->EndOfFile.QuadPart = 0; } else { PFNOI->AllocationSize = Fcb->Header.AllocationSize; PFNOI->EndOfFile = Fcb->Header.FileSize; } PFNOI->FileAttributes = Fcb->RfsdMcb->FileAttr; if (PFNOI->FileAttributes == 0) { PFNOI->FileAttributes = FILE_ATTRIBUTE_NORMAL; } PFNOI->CreationTime = RfsdSysTime(Fcb->Inode->i_ctime); PFNOI->LastAccessTime = RfsdSysTime(Fcb->Inode->i_atime); PFNOI->LastWriteTime = RfsdSysTime(Fcb->Inode->i_mtime); PFNOI->ChangeTime = RfsdSysTime(Fcb->Inode->i_mtime); bResult = TRUE; IoStatus->Status = STATUS_SUCCESS; IoStatus->Information = sizeof(FILE_NETWORK_OPEN_INFORMATION); } _SEH2_FINALLY { if (FcbResourceAcquired) { ExReleaseResourceLite(&Fcb->MainResource); } FsRtlExitFileSystem(); } _SEH2_END; return bResult; }