-/* $Id: util.c,v 1.1 1999/08/20 16:29:22 ea 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 <ntos.h>
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#include <internal/debug.h>
+
+#define FSRTL_MAX_RESOURCES 16
+
+#define FTTYPE ((ULONG)'f')
+#define FT_BALANCED_READ_MODE \
+ CTL_CODE(FTTYPE, 6, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/* 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
+INIT_FUNCTION
+RtlpInitializeResources(VOID)
+{
+ ULONG i;
+
+ /* Allocate the Resource Buffer */
+ FsRtlpResources = FsRtlAllocatePool(NonPagedPool,
+ FSRTL_MAX_RESOURCES*sizeof(ERESOURCE));
+
+ /* Initialize the Resources */
+ for (i = 0; i < FSRTL_MAX_RESOURCES; i++)
+ {
+ ExInitializeResource(&FsRtlpResources[i]);
+ }
+}
+
+/* FUNCTIONS *****************************************************************/
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlIsTotalDeviceFailure@4
+/*++
+ * @name FsRtlIsTotalDeviceFailure
+ * @implemented NT 4.0
*
- * DESCRIPTION
- * Check if an NTSTATUS error code represents a
- * disk hardware failure.
- *
- * ARGUMENTS
- * NtStatus
- * NTSTATUS to test.
+ * The FsRtlIsTotalDeviceFailure routine checks if an NTSTATUS error code
+ * represents a disk hardware failure.
*
- * RETURN VALUE
- * FALSE if either (NtStatus >= STATUS_SUCCESS),
- * STATUS_CRC_ERROR, 0xC000009C; TRUE otherwise.
+ * @param NtStatus
+ * The NTSTATUS Code to Test
*
- * NOTES
- * By calling the function with all possible values,
- * one unknown NTSTATUS value makes the function
- * return TRUE (0xC000009C).
- */
+ * @return TRUE in case of Hardware Failure, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
BOOLEAN
STDCALL
-FsRtlIsTotalDeviceFailure (
- NTSTATUS NtStatus
- )
+FsRtlIsTotalDeviceFailure(IN NTSTATUS NtStatus)
{
- return (
- (NT_SUCCESS(NtStatus))
- || (STATUS_CRC_ERROR == NtStatus)
- || (STATUS_UNKNOWN_C000009C == NtStatus) /* FIXME */
- ? FALSE
- : TRUE
- );
+ return((NT_SUCCESS(NtStatus)) ||
+ (STATUS_CRC_ERROR == NtStatus) ||
+ (STATUS_DEVICE_DATA_ERROR == NtStatus) ? FALSE : TRUE);
}
+/*++
+ * @name FsRtlIsNtstatusExpected
+ * @implemented NT 4.0
+ *
+ * The FsRtlIsNtstatusExpected routine checks if an NTSTATUS error code
+ * is expected by the File System Support Library.
+ *
+ * @param NtStatus
+ * The NTSTATUS Code to Test
+ *
+ * @return TRUE if the Value is Expected, FALSE otherwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+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;
+}
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlIsNtstatusExpected@4
+/*++
+ * @name FsRtlIsPagingFile
+ * @implemented NT 4.0
*
- * DESCRIPTION
- * Check an NTSTATUS value is expected by the FS kernel
- * subsystem.
+ * The FsRtlIsPagingFile routine checks if the FileObject is a Paging File.
*
- * ARGUMENTS
- * NtStatus
- * NTSTATUS to test.
+ * @param FileObject
+ * A pointer to the File Object to be tested.
*
- * RETURN VALUE
- * TRUE if NtStatus is either STATUS_ACCESS_VIOLATION,
- * STATUS_ILLEGAL_INSTRUCTION, 0x80000002, 0xC00000AA;
- * FALSE otherwise.
+ * @return TRUE if the File is a Paging File, FALSE otherwise.
*
- * NOTES
- * By calling the function with all possible values,
- * two unknown NTSTATUS values make the function
- * return 0x00 (0x80000002, 0xC00000AA).
- */
+ * @remarks None.
+ *
+ *--*/
BOOLEAN
STDCALL
-FsRtlIsNtstatusExpected (
- NTSTATUS NtStatus
- )
+FsRtlIsPagingFile(IN PFILE_OBJECT FileObject)
{
- return (
- (STATUS_UNKNOWN_80000002 == NtStatus) /* FIXME */
- || (STATUS_ACCESS_VIOLATION == NtStatus)
- || (STATUS_ILLEGAL_INSTRUCTION == NtStatus)
- || (STATUS_UNKNOWN_C00000AA == NtStatus) /* FIXME */
- )
- ? TRUE
- : FALSE;
+ return MmIsFileAPagingFile(FileObject);
}
-
-/**********************************************************************
- * NAME EXPORTED
- * FsRtlNormalizeNtstatus@8
+/*++
+ * @name FsRtlNormalizeNtstatus
+ * @implemented NT 4.0
*
- * DESCRIPTION
- * Normalize an NTSTATUS value for using in the FS subsystem.
+ * The FsRtlNormalizeNtstatus routine normalizes an NTSTATUS error code.
*
- * ARGUMENTS
- * NtStatusToNormalize
- * NTSTATUS to normalize.
- * NormalizedNtStatus
- * NTSTATUS to return if the NtStatusToNormalize
- * value is unexpected by the FS kernel subsystem.
+ * @param NtStatusToNormalize
+ * The NTSTATUS error code to Normalize.
*
- * RETURN VALUE
- * NtStatusToNormalize if it is an expected value,
- * otherwise NormalizedNtStatus.
- */
+ * @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
-FsRtlNormalizeNtstatus (
- NTSTATUS NtStatusToNormalize,
- NTSTATUS NormalizedNtStatus
- )
+FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,
+ IN NTSTATUS NormalizedNtStatus)
{
- return
- (TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize))
- ? NtStatusToNormalize
- : NormalizedNtStatus;
+ 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];
+}
-/* EOF */
+/*++
+ * @name FsRtlBalanceReads
+ * @implemented NT 4.0
+ *
+ * The FsRtlBalanceReads routine sends an IRP to an FTDISK Driver
+ * requesting the driver to balance read requests across a mirror set.
+ *
+ * @param TargetDevice
+ * A pointer to an FTDISK Device Object.
+ *
+ * @return The NTSTATUS error code returned by the FTDISK Driver.
+ *
+ * @remarks FTDISK is a Software RAID Implementation.
+ *
+ *--*/
+NTSTATUS
+STDCALL
+FsRtlBalanceReads(PDEVICE_OBJECT TargetDevice)
+{
+ 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;
+ }
+
+ return Status;
+}
+
+/*++
+ * @name FsRtlPostPagingFileStackOverflow
+ * @unimplemented NT 4.0
+ *
+ * The FsRtlPostPagingFileStackOverflow routine
+ *
+ * @param Context
+ *
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+STDCALL
+FsRtlPostPagingFileStackOverflow(IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
+{
+ UNIMPLEMENTED;
+}
+/*++
+ * @name FsRtlPostStackOverflow
+ * @unimplemented NT 4.0
+ *
+ * The FsRtlPostStackOverflow routine
+ *
+ * @param Context
+ *
+ * @param Event
+ *
+ * @param StackOverflowRoutine
+ *
+ * @return
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+STDCALL
+FsRtlPostStackOverflow(IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine)
+{
+ UNIMPLEMENTED;
+}
+
+/*++
+ * @name FsRtlSyncVolumes
+ * @implemented NT 4.0
+ *
+ * The FsRtlSyncVolumes routine is deprecated.
+ *
+ * @return Always returns STATUS_SUCCESS.
+ *
+ * @remarks Deprecated.
+ *
+ *--*/
+NTSTATUS
+STDCALL
+FsRtlSyncVolumes(DWORD Unknown0,
+ DWORD Unknown1,
+ DWORD Unknown2)
+{
+ return STATUS_SUCCESS;
+}
+
+/* EOF */