- split logoff and shutdown resources
[reactos.git] / reactos / ntoskrnl / fs / util.c
index d2bccdb..cdde522 100644 (file)
-/* $Id: util.c,v 1.4 2000/01/20 22:14:45 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 *****************************************************************/
 
-/**********************************************************************
- * 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 (
-       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@4
- *
- * DESCRIPTION
- *     Check an NTSTATUS value is expected by the FS kernel
- *     subsystem.
- *
- * ARGUMENTS
- *     NtStatus
- *             NTSTATUS to test.
- *
- * RETURN VALUE
- *     TRUE if NtStatus is either STATUS_ACCESS_VIOLATION,
- *     STATUS_ILLEGAL_INSTRUCTION, STATUS_DATATYPE_MISALIGNMENT,
- *     0xC00000AA; FALSE otherwise.
- *
- * NOTES
- *     By calling the function with all possible values,
- *     one unknown NTSTATUS value makes the function
- *     return 0x00 (0xC00000AA).
- */
-BOOLEAN
-STDCALL
-FsRtlIsNtstatusExpected (
-       NTSTATUS        NtStatus
-       )
-{
-       return (
-               (STATUS_DATATYPE_MISALIGNMENT == NtStatus)
-               || (STATUS_ACCESS_VIOLATION == NtStatus)
-               || (STATUS_ILLEGAL_INSTRUCTION == NtStatus)
-               || (STATUS_UNKNOWN_C00000AA == NtStatus)  /* FIXME */
-               )
-               ? TRUE
-               : FALSE;
-}
-       
+#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 (
-       NTSTATUS        NtStatusToNormalize,
-       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.
+ *
+ * @remarks None.
+ *
+ *--*/
 BOOLEAN
 STDCALL
-FsRtlCopyRead (
-       DWORD   Unknown0,
-       DWORD   Unknown1,
-       DWORD   Unknown2,
-       DWORD   Unknown3,
-       DWORD   Unknown4,
-       DWORD   Unknown5,
-       DWORD   Unknown6,
-       DWORD   Unknown7
-       )
+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
- * 
- */
-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 (
-       DWORD   Unknown0,
-       DWORD   Unknown1,
-       DWORD   Unknown2,
-       DWORD   Unknown3,
-       DWORD   Unknown4,
-       DWORD   Unknown5,
-       DWORD   Unknown6,
-       DWORD   Unknown7
-       )
+FsRtlNormalizeNtstatus(IN NTSTATUS NtStatusToNormalize,
+                       IN NTSTATUS NormalizedNtStatus)
 {
-       return FALSE;
+    return(TRUE == FsRtlIsNtstatusExpected(NtStatusToNormalize)) ?
+           NtStatusToNormalize : NormalizedNtStatus;
 }
 
-
-/**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlGetFileSize@8
+/*++
+ * @name FsRtlAllocateResource
+ * @implemented NT 4.0
  *
- * DESCRIPTION
+ *     The FsRtlAllocateResource routine returns a pre-initialized ERESOURCE
+ *     for use by a File System Driver.
  *
- * ARGUMENTS
+ * @return A Pointer to a pre-initialized ERESOURCE.
  *
- * RETURN VALUE
- * 
- */
-DWORD
+ * @remarks The File System Library only provides up to 16 Resources.
+ *
+ *--*/
+PERESOURCE
 STDCALL
-FsRtlGetFileSize (
-       DWORD   Unknown0,
-       DWORD   Unknown1
-       )
+FsRtlAllocateResource(VOID)
 {
-       return 0;
+    /* Return a pre-allocated ERESOURCE */
+    return &FsRtlpResources[FsRtlpAllocatedResources++ & FSRTL_MAX_RESOURCES];
 }
 
+/*++
+ * @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;
+    }
 
-/**********************************************************************
- * 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 */
-