[NTOSKRNL]
authorPierre Schweitzer <pierre@reactos.org>
Mon, 29 Feb 2016 21:45:44 +0000 (21:45 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Mon, 29 Feb 2016 21:45:44 +0000 (21:45 +0000)
The Ewoks concil said it's fine to dereference null pointers in the kernel, so, partly revert r70819 (by partly, I mean: revert everything excepted the comments that were fixed!).
Also add asserts that exist on Windows to make it obvious we're about to kill the whole kernel

To make it clear: fix the FSD!

svn path=/trunk/; revision=70824

reactos/ntoskrnl/io/iomgr/iofunc.c

index 61ff138..e15ba8b 100644 (file)
@@ -2563,56 +2563,55 @@ NtReadFile(IN HANDLE FileHandle,
         {
             /* Perform fast read */
             FastIoDispatch = DeviceObject->DriverObject->FastIoDispatch;
-            if (FastIoDispatch != NULL && FastIoDispatch->FastIoRead != NULL)
+            ASSERT(FastIoDispatch != NULL && FastIoDispatch->FastIoRead != NULL);
+
+            Success = FastIoDispatch->FastIoRead(FileObject,
+                                                 &CapturedByteOffset,
+                                                 Length,
+                                                 TRUE,
+                                                 CapturedKey,
+                                                 Buffer,
+                                                 &KernelIosb,
+                                                 DeviceObject);
+
+            /* Only accept the result if we got a straightforward status */
+            if (Success &&
+                (KernelIosb.Status == STATUS_SUCCESS ||
+                 KernelIosb.Status == STATUS_BUFFER_OVERFLOW ||
+                 KernelIosb.Status == STATUS_END_OF_FILE))
             {
-                Success = FastIoDispatch->FastIoRead(FileObject,
-                                                     &CapturedByteOffset,
-                                                     Length,
-                                                     TRUE,
-                                                     CapturedKey,
-                                                     Buffer,
-                                                     &KernelIosb,
-                                                     DeviceObject);
-
-                /* Only accept the result if we got a straightforward status */
-                if (Success &&
-                    (KernelIosb.Status == STATUS_SUCCESS ||
-                     KernelIosb.Status == STATUS_BUFFER_OVERFLOW ||
-                     KernelIosb.Status == STATUS_END_OF_FILE))
-                {
-                    /* Fast path -- update transfer & operation counts */
-                    IopUpdateOperationCount(IopReadTransfer);
-                    IopUpdateTransferCount(IopReadTransfer,
-                                           (ULONG)KernelIosb.Information);
-
-                    /* Enter SEH to write the IOSB back */
-                    _SEH2_TRY
-                    {
-                        /* Write it back to the caller */
-                        *IoStatusBlock = KernelIosb;
-                    }
-                    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-                    {
-                        /* The caller's IOSB was invalid, so fail */
-                        if (EventObject) ObDereferenceObject(EventObject);
-                        IopUnlockFileObject(FileObject);
-                        ObDereferenceObject(FileObject);
-                        _SEH2_YIELD(return _SEH2_GetExceptionCode());
-                    }
-                    _SEH2_END;
+                /* Fast path -- update transfer & operation counts */
+                IopUpdateOperationCount(IopReadTransfer);
+                IopUpdateTransferCount(IopReadTransfer,
+                                       (ULONG)KernelIosb.Information);
 
-                    /* Signal the completion event */
-                    if (EventObject)
-                    {
-                        KeSetEvent(EventObject, 0, FALSE);
-                        ObDereferenceObject(EventObject);
-                    }
-
-                    /* Clean up */
+                /* Enter SEH to write the IOSB back */
+                _SEH2_TRY
+                {
+                    /* Write it back to the caller */
+                    *IoStatusBlock = KernelIosb;
+                }
+                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    /* The caller's IOSB was invalid, so fail */
+                    if (EventObject) ObDereferenceObject(EventObject);
                     IopUnlockFileObject(FileObject);
                     ObDereferenceObject(FileObject);
-                    return KernelIosb.Status;
+                    _SEH2_YIELD(return _SEH2_GetExceptionCode());
+                }
+                _SEH2_END;
+
+                /* Signal the completion event */
+                if (EventObject)
+                {
+                    KeSetEvent(EventObject, 0, FALSE);
+                    ObDereferenceObject(EventObject);
                 }
+
+                /* Clean up */
+                IopUnlockFileObject(FileObject);
+                ObDereferenceObject(FileObject);
+                return KernelIosb.Status;
             }
         }
 
@@ -3578,54 +3577,53 @@ NtWriteFile(IN HANDLE FileHandle,
         {
             /* Perform fast write */
             FastIoDispatch = DeviceObject->DriverObject->FastIoDispatch;
-            if (FastIoDispatch != NULL && FastIoDispatch->FastIoWrite != NULL)
+            ASSERT(FastIoDispatch != NULL && FastIoDispatch->FastIoWrite != NULL);
+
+            Success = FastIoDispatch->FastIoWrite(FileObject,
+                                                  &CapturedByteOffset,
+                                                  Length,
+                                                  TRUE,
+                                                  CapturedKey,
+                                                  Buffer,
+                                                  &KernelIosb,
+                                                  DeviceObject);
+
+            /* Only accept the result if it was successful */
+            if (Success &&
+                KernelIosb.Status == STATUS_SUCCESS)
             {
-                Success = FastIoDispatch->FastIoWrite(FileObject,
-                                                      &CapturedByteOffset,
-                                                      Length,
-                                                      TRUE,
-                                                      CapturedKey,
-                                                      Buffer,
-                                                      &KernelIosb,
-                                                      DeviceObject);
-
-                /* Only accept the result if it was successful */
-                if (Success &&
-                    KernelIosb.Status == STATUS_SUCCESS)
-                {
-                    /* Fast path -- update transfer & operation counts */
-                    IopUpdateOperationCount(IopWriteTransfer);
-                    IopUpdateTransferCount(IopWriteTransfer,
-                                           (ULONG)KernelIosb.Information);
-
-                    /* Enter SEH to write the IOSB back */
-                    _SEH2_TRY
-                    {
-                        /* Write it back to the caller */
-                        *IoStatusBlock = KernelIosb;
-                    }
-                    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-                    {
-                        /* The caller's IOSB was invalid, so fail */
-                        if (EventObject) ObDereferenceObject(EventObject);
-                        IopUnlockFileObject(FileObject);
-                        ObDereferenceObject(FileObject);
-                        _SEH2_YIELD(return _SEH2_GetExceptionCode());
-                    }
-                    _SEH2_END;
+                /* Fast path -- update transfer & operation counts */
+                IopUpdateOperationCount(IopWriteTransfer);
+                IopUpdateTransferCount(IopWriteTransfer,
+                                       (ULONG)KernelIosb.Information);
 
-                    /* Signal the completion event */
-                    if (EventObject)
-                    {
-                        KeSetEvent(EventObject, 0, FALSE);
-                        ObDereferenceObject(EventObject);
-                    }
-
-                    /* Clean up */
+                /* Enter SEH to write the IOSB back */
+                _SEH2_TRY
+                {
+                    /* Write it back to the caller */
+                    *IoStatusBlock = KernelIosb;
+                }
+                _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+                {
+                    /* The caller's IOSB was invalid, so fail */
+                    if (EventObject) ObDereferenceObject(EventObject);
                     IopUnlockFileObject(FileObject);
                     ObDereferenceObject(FileObject);
-                    return KernelIosb.Status;
+                    _SEH2_YIELD(return _SEH2_GetExceptionCode());
+                }
+                _SEH2_END;
+
+                /* Signal the completion event */
+                if (EventObject)
+                {
+                    KeSetEvent(EventObject, 0, FALSE);
+                    ObDereferenceObject(EventObject);
                 }
+
+                /* Clean up */
+                IopUnlockFileObject(FileObject);
+                ObDereferenceObject(FileObject);
+                return KernelIosb.Status;
             }
         }