-/* $Id: util.c,v 1.12 2002/09/08 10:23:20 chorns Exp $
- *
- * reactos/ntoskrnl/fs/util.c
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/fs/util.c
+ * PURPOSE: Misc Utility Functions for File System Drivers
*
+ * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
*/
-#include <ddk/ntddk.h>
-#include <ddk/ntifs.h>
+/* INCLUDES *****************************************************************/
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlIsTotalDeviceFailure@4
- *
- * DESCRIPTION
- * Check if an NTSTATUS error code represents a
- * disk hardware failure.
- *
- * ARGUMENTS
- * NtStatus
- * NTSTATUS to test.
- *
- * RETURN VALUE
- * FALSE if either (NtStatus >= STATUS_SUCCESS),
- * STATUS_CRC_ERROR, STATUS_DEVICE_DATA_ERROR;
- * TRUE otherwise.
- *
- */
-BOOLEAN
-STDCALL
-FsRtlIsTotalDeviceFailure (
- IN NTSTATUS NtStatus
- )
-{
- return (
- (NT_SUCCESS(NtStatus))
- || (STATUS_CRC_ERROR == NtStatus)
- || (STATUS_DEVICE_DATA_ERROR == NtStatus)
- ? FALSE
- : TRUE
- );
-}
+#include <ntoskrnl.h>
+#include <internal/debug.h>
+#define FSRTL_MAX_RESOURCES 16
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlIsNtstatusExpected/1
- * stack32 = 4
- *
- * DESCRIPTION
- * Check an NTSTATUS value is expected by the FS kernel
- * subsystem.
- *
- * ARGUMENTS
- * NtStatus
- * NTSTATUS to test.
- *
- * RETURN VALUE
- * TRUE if NtStatus is NOT one out of:
- * - STATUS_ACCESS_VIOLATION
- * - STATUS_ILLEGAL_INSTRUCTION
- * - STATUS_DATATYPE_MISALIGNMENT
- * - STATUS_INSTRUCTION_MISALIGNMENT
- * which are the forbidden return stati in the FsRtl
- * subsystem; FALSE otherwise.
- *
- * REVISIONS
- * 2002-01-17 Fixed a bad bug reported by Bo Brantén.
- * Up to version 1.8, this function's semantics was
- * exactly the opposite! Thank you Bo.
- */
-BOOLEAN
-STDCALL
-FsRtlIsNtstatusExpected (
- IN NTSTATUS NtStatus
- )
-{
- return (
- (STATUS_DATATYPE_MISALIGNMENT == NtStatus)
- || (STATUS_ACCESS_VIOLATION == NtStatus)
- || (STATUS_ILLEGAL_INSTRUCTION == NtStatus)
- || (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)
- )
- ? FALSE
- : TRUE;
-}
-
+#define FTTYPE ((ULONG)'f')
+#define FT_BALANCED_READ_MODE \
+ CTL_CODE(FTTYPE, 6, METHOD_NEITHER, FILE_ANY_ACCESS)
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlNormalizeNtstatus@8
- *
- * DESCRIPTION
- * Normalize an NTSTATUS value for using in the FS subsystem.
- *
- * ARGUMENTS
- * NtStatusToNormalize
- * NTSTATUS to normalize.
- * NormalizedNtStatus
- * NTSTATUS to return if the NtStatusToNormalize
- * value is unexpected by the FS kernel subsystem.
- *
- * RETURN VALUE
- * NtStatusToNormalize if it is an expected value,
- * otherwise NormalizedNtStatus.
- */
-NTSTATUS
+/* GLOBALS *******************************************************************/
+
+BOOLEAN STDCALL MmIsFileAPagingFile(PFILE_OBJECT FileObject);
+VOID STDCALL INIT_FUNCTION RtlpInitializeResources(VOID);
+static ULONG FsRtlpAllocatedResources = 0;
+static PERESOURCE FsRtlpResources;
+
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, RtlpInitializeResources)
+#endif
+
+/* PRIVATE FUNCTIONS**********************************************************/
+
+VOID
STDCALL
-FsRtlNormalizeNtstatus (
- IN NTSTATUS NtStatusToNormalize,
- IN NTSTATUS NormalizedNtStatus
- )
+INIT_FUNCTION
+RtlpInitializeResources(VOID)
{
- return
- (TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize))
- ? NtStatusToNormalize
- : NormalizedNtStatus;
-}
+ ULONG i;
+ /* Allocate the Resource Buffer */
+ FsRtlpResources = FsRtlAllocatePool(NonPagedPool,
+ FSRTL_MAX_RESOURCES*sizeof(ERESOURCE));
-/**********************************************************************
- * Miscellanea (they may fit somewhere else)
- *********************************************************************/
+ /* Initialize the Resources */
+ for (i = 0; i < FSRTL_MAX_RESOURCES; i++)
+ {
+ ExInitializeResource(&FsRtlpResources[i]);
+ }
+}
+/* FUNCTIONS *****************************************************************/
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlAllocateResource@0
+/*++
+ * @name FsRtlIsTotalDeviceFailure
+ * @implemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlIsTotalDeviceFailure routine checks if an NTSTATUS error code
+ * represents a disk hardware failure.
*
- * ARGUMENTS
+ * @param NtStatus
+ * The NTSTATUS Code to Test
*
- * RETURN VALUE
- *
- */
-DWORD
+ * @return TRUE in case of Hardware Failure, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+BOOLEAN
STDCALL
-FsRtlAllocateResource (VOID)
+FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus)
{
- return 0;
+ return((NT_SUCCESS(NtStatus)) ||
+ (STATUS_CRC_ERROR == NtStatus) ||
+ (STATUS_DEVICE_DATA_ERROR == NtStatus) ? FALSE : TRUE);
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlBalanceReads@4
+/*++
+ * @name FsRtlIsNtstatusExpected
+ * @implemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlIsNtstatusExpected routine checks if an NTSTATUS error code
+ * is expected by the File System Support Library.
*
- * ARGUMENTS
+ * @param NtStatus
+ * The NTSTATUS Code to Test
*
- * RETURN VALUE
- *
- */
-DWORD
+ * @return TRUE if the Value is Expected, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+BOOLEAN
STDCALL
-FsRtlBalanceReads (
- DWORD Unknown0
- )
+FsRtlIsNtstatusExpected(IN NTSTATUS NtStatus)
{
- return 0;
+ return((STATUS_DATATYPE_MISALIGNMENT == NtStatus) ||
+ (STATUS_ACCESS_VIOLATION == NtStatus) ||
+ (STATUS_ILLEGAL_INSTRUCTION == NtStatus) ||
+ (STATUS_INSTRUCTION_MISALIGNMENT == NtStatus)) ? FALSE : TRUE;
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlCopyRead@32
+/*++
+ * @name FsRtlIsPagingFile
+ * @implemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlIsPagingFile routine checks if the FileObject is a Paging File.
*
- * ARGUMENTS
+ * @param FileObject
+ * A pointer to the File Object to be tested.
*
- * RETURN VALUE
+ * @return TRUE if the File is a Paging File, FALSE otherwise.
*
- * NOTE
- * From Bo Branten's ntifs.h v12.
- *
- */
+ * @remarks None.
+ *
+ *--*/
BOOLEAN
STDCALL
-FsRtlCopyRead (
- 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
- )
+FsRtlIsPagingFile(IN PFILE_OBJECT FileObject)
{
- return FALSE;
+ return MmIsFileAPagingFile(FileObject);
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlCopyWrite@32
+/*++
+ * @name FsRtlNormalizeNtstatus
+ * @implemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlNormalizeNtstatus routine normalizes an NTSTATUS error code.
*
- * ARGUMENTS
+ * @param NtStatusToNormalize
+ * The NTSTATUS error code to Normalize.
*
- * RETURN VALUE
- *
- * NOTE
- * From Bo Branten's ntifs.h v12.
- */
-BOOLEAN
+ * @param NormalizedNtStatus
+ * The NTSTATUS error code to return if the NtStatusToNormalize is not
+ * a proper expected error code by the File System Library.
+ *
+ * @return NtStatusToNormalize if it is an expected value, otherwise
+ * NormalizedNtStatus.
+ *
+ * @remarks None.
+ *
+ *--*/
+NTSTATUS
STDCALL
-FsRtlCopyWrite (
- IN PFILE_OBJECT FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN BOOLEAN Wait,
- IN ULONG LockKey,
- IN PVOID Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN PDEVICE_OBJECT DeviceObject
- )
+FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,
+ IN NTSTATUS NormalizedNtStatus)
{
- return FALSE;
+ return(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize)) ?
+ NtStatusToNormalize : NormalizedNtStatus;
}
+/*++
+ * @name FsRtlAllocateResource
+ * @implemented NT 4.0
+ *
+ * The FsRtlAllocateResource routine returns a pre-initialized ERESOURCE
+ * for use by a File System Driver.
+ *
+ * @return A Pointer to a pre-initialized ERESOURCE.
+ *
+ * @remarks The File System Library only provides up to 16 Resources.
+ *
+ *--*/
+PERESOURCE
+STDCALL
+FsRtlAllocateResource(VOID)
+{
+ /* Return a pre-allocated ERESOURCE */
+ return &FsRtlpResources[FsRtlpAllocatedResources++ & FSRTL_MAX_RESOURCES];
+}
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlGetFileSize@8
+/*++
+ * @name FsRtlBalanceReads
+ * @implemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlBalanceReads routine sends an IRP to an FTDISK Driver
+ * requesting the driver to balance read requests across a mirror set.
*
- * ARGUMENTS
+ * @param TargetDevice
+ * A pointer to an FTDISK Device Object.
*
- * RETURN VALUE
- *
- */
+ * @return The NTSTATUS error code returned by the FTDISK Driver.
+ *
+ * @remarks FTDISK is a Software RAID Implementation.
+ *
+ *--*/
NTSTATUS
STDCALL
-FsRtlGetFileSize (
- IN PFILE_OBJECT FileObject,
- IN OUT PLARGE_INTEGER FileSize
- )
+FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)
{
- return STATUS_NOT_IMPLEMENTED;
-}
+ PIRP Irp;
+ KEVENT Event;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+
+ /* Initialize the Local Event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ /* Build the special IOCTL */
+ Irp = IoBuildDeviceIoControlRequest(FT_BALANCED_READ_MODE,
+ TargetDevice,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ FALSE,
+ &Event,
+ &IoStatusBlock);
+
+ /* Send it */
+ Status = IoCallDriver(TargetDevice, Irp);
+ /* Wait if needed */
+ if (Status == STATUS_PENDING)
+ {
+ Status = KeWaitForSingleObject(&Event,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ /* Return Status */
+ Status = IoStatusBlock.Status;
+ }
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlPostPagingFileStackOverflow@12
+ return Status;
+}
+
+/*++
+ * @name FsRtlPostPagingFileStackOverflow
+ * @unimplemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlPostPagingFileStackOverflow routine
*
- * ARGUMENTS
+ * @param Context
*
- * RETURN VALUE
- *
- */
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
VOID
STDCALL
-FsRtlPostPagingFileStackOverflow (
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2
- )
+FsRtlPostPagingFileStackOverflow(IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
{
+ UNIMPLEMENTED;
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlPostStackOverflow@12
+/*++
+ * @name FsRtlPostStackOverflow
+ * @unimplemented NT 4.0
*
- * DESCRIPTION
+ * The FsRtlPostStackOverflow routine
*
- * ARGUMENTS
+ * @param Context
*
- * RETURN VALUE
- *
- */
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
VOID
STDCALL
-FsRtlPostStackOverflow (
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2
- )
+FsRtlPostStackOverflow(IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
{
+ UNIMPLEMENTED;
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlSyncVolumes@12
+/*++
+ * @name FsRtlSyncVolumes
+ * @implemented NT 4.0
*
- * DESCRIPTION
- * Obsolete function.
+ * The FsRtlSyncVolumes routine is deprecated.
*
- * ARGUMENTS
+ * @return Always returns STATUS_SUCCESS.
*
- * RETURN VALUE
- * It always returns STATUS_SUCCESS.
- */
+ * @remarks Deprecated.
+ *
+ *--*/
NTSTATUS
STDCALL
-FsRtlSyncVolumes (
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2
- )
+FsRtlSyncVolumes(DWORD Unknown0,
+ DWORD Unknown1,
+ DWORD Unknown2)
{
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
-
/* EOF */
-