* COPYRIGHT: GNU GENERAL PUBLIC LICENSE VERSION 2
* PROJECT: ReiserFs file system driver for Windows NT/2000/XP/Vista.
* FILE: fastio.c
- * PURPOSE:
+ * PURPOSE:
* PROGRAMMER: Mark Piper, Matt Wu, Bo Brantén.
- * HOMEPAGE:
- * UPDATE HISTORY:
+ * HOMEPAGE:
+ * UPDATE HISTORY:
*/
/* INCLUDES *****************************************************************/
PAGED_CODE();
lLength.QuadPart = Length;
-
+
_SEH2_TRY {
_SEH2_TRY {
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->AnsiFileName.Buffer
));
- RfsdPrint((DBG_INFO,
+ RfsdPrint((DBG_INFO,
"RfsdFastIoCheckIfPossible: Offset: %I64xg Length: %xh Key: %u %s %s\n",
FileOffset->QuadPart,
Length,
FsRtlExitFileSystem();
} _SEH2_END;
-
+
return bPossible;
}
PAGED_CODE();
Fcb = (PRFSD_FCB) FileObject->FsContext;
-
+
ASSERT(Fcb != NULL);
-
+
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
Status = FsRtlCopyRead (
FileObject, FileOffset, Length, Wait,
LockKey, Buffer, IoStatus, DeviceObject);
-
+
return Status;
}
PAGED_CODE();
Fcb = (PRFSD_FCB) FileObject->FsContext;
-
+
ASSERT(Fcb != NULL);
-
+
ASSERT((Fcb->Identifier.Type == RFSDFCB) &&
(Fcb->Identifier.Size == sizeof(RFSD_FCB)));
bRet = FsRtlCopyWrite (
FileObject, FileOffset, Length, Wait,
LockKey, Buffer, IoStatus, DeviceObject);
-
+
return bRet;
}
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,
+ 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;
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) {
ExGetCurrentResourceThread()
);
}
-
+
FsRtlExitFileSystem();
} _SEH2_END;
-
-
+
+
if (Status == FALSE) {
- RfsdPrint((DBG_ERROR,
+ RfsdPrint((DBG_ERROR,
"RfsdFastIoQueryBasicInfo: %s %s *** Status: FALSE ***\n",
RfsdGetCurrentProcessName(),
"FASTIO_QUERY_BASIC_INFO"
));
} else if (IoStatus->Status != STATUS_SUCCESS) {
- RfsdPrint((DBG_ERROR,
+ RfsdPrint((DBG_ERROR,
"RfsdFastIoQueryBasicInfo: %s %s *** Status: %s (%#x) ***\n",
RfsdGetCurrentProcessName(),
"FASTIO_QUERY_BASIC_INFO",
IoStatus->Status
));
}
-
+
return Status;
}
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)));
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;
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) {
ExGetCurrentResourceThread()
);
}
-
+
FsRtlExitFileSystem();
} _SEH2_END;
IoStatus->Status ));
}
#endif
-
+
return Status;
}
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;
Key,
(FailImmediately ? "FailImmediately " : ""),
(ExclusiveLock ? "ExclusiveLock " : "") ));
-
+
if (Fcb->Header.IsFastIoPossible != FastIoIsQuestionable) {
RfsdPrint((DBG_INFO,
"RfsdFastIoLock: %s %s %s\n",
Fcb->Header.IsFastIoPossible = FastIoIsQuestionable;
}
-
+
#ifdef _MSC_VER
#pragma prefast( suppress: 28159, "bug in prefast" )
#endif
FsRtlExitFileSystem();
} _SEH2_END;
-#if DBG
+#if DBG
if (Status == FALSE) {
- RfsdPrint((DBG_ERROR,
+ RfsdPrint((DBG_ERROR,
"RfsdFastIoLock: %s %s *** Status: FALSE ***\n",
RfsdGetCurrentProcessName(),
"FASTIO_LOCK"
));
}
#endif
-
+
return Status;
}
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();
FileOffset->QuadPart,
Length->QuadPart,
Key ));
-
+
IoStatus->Status = FsRtlFastUnlockSingle(
&Fcb->FileLockAnchor,
FileObject,
Process,
Key,
NULL,
- FALSE);
-
+ FALSE);
+
IoStatus->Information = 0;
-
+
Status = TRUE;
} _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) {
IoStatus->Status = _SEH2_GetExceptionCode();
FsRtlExitFileSystem();
} _SEH2_END;
-#if DBG
+#if DBG
if (Status == FALSE) {
RfsdPrint((DBG_ERROR,
RfsdNtStatusToString(IoStatus->Status),
IoStatus->Status ));
}
-#endif
+#endif
return Status;
}
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;
"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();
FsRtlExitFileSystem();
} _SEH2_END;
-#if DBG
+#if DBG
if (Status == FALSE) {
RfsdPrint((DBG_ERROR,
IoStatus->Status
));
}
-#endif
+#endif
return Status;
}
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();
"RfsdFastIoUnlockAllByKey: Key: %u\n",
Key
));
-
+
IoStatus->Status = FsRtlFastUnlockAllByKey(
&Fcb->FileLockAnchor,
FileObject,
Process,
Key,
NULL
- );
-
+ );
+
IoStatus->Information = 0;
-
+
Status = TRUE;
} _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) {
FsRtlExitFileSystem();
} _SEH2_END;
-#if DBG
+#if DBG
if (Status == FALSE) {
RfsdPrint((DBG_ERROR,
IoStatus->Status
));
}
-#endif
+#endif
return Status;
}
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,
+ RfsdPrint((DBG_INFO,
"%-16.16s %-31s %s\n",
RfsdGetCurrentProcessName(),
"FASTIO_QUERY_NETWORK_OPEN_INFO",
)) {
_SEH2_LEAVE;
}
-
+
FcbResourceAcquired = TRUE;
}
} _SEH2_FINALLY {
if (FcbResourceAcquired) {
- ExReleaseResourceLite(&Fcb->MainResource);
+ ExReleaseResourceLite(&Fcb->MainResource);
}
FsRtlExitFileSystem();