[ros-diffs] [fireball] 32054: - Wrap MmProbeAndLockPages invocations into SEH. See issue #2121 for more details.

fireball at svn.reactos.org fireball at svn.reactos.org
Wed Jan 30 14:33:17 CET 2008


Author: fireball
Date: Wed Jan 30 16:33:16 2008
New Revision: 32054

URL: http://svn.reactos.org/svn/reactos?rev=32054&view=rev
Log:
- Wrap MmProbeAndLockPages invocations into SEH.
See issue #2121 for more details.

Modified:
    trunk/reactos/ntoskrnl/io/iomgr/iofunc.c

Modified: trunk/reactos/ntoskrnl/io/iomgr/iofunc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/iofunc.c?rev=32054&r1=32053&r2=32054&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/iomgr/iofunc.c (original)
+++ trunk/reactos/ntoskrnl/io/iomgr/iofunc.c Wed Jan 30 16:33:16 2008
@@ -1555,9 +1555,20 @@
     }
     else if (DeviceObject->Flags & DO_DIRECT_IO)
     {
-        /* Allocate an MDL */
-        Mdl = IoAllocateMdl(FileInformation, Length, FALSE, TRUE, Irp);
-        MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess);
+        _SEH_TRY
+        {
+            /* Allocate an MDL */
+            Mdl = IoAllocateMdl(FileInformation, Length, FALSE, TRUE, Irp);
+            MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess);
+        }
+        _SEH_HANDLE
+        {
+            /* Allocating failed, clean up */
+            IopCleanupAfterException(FileObject, Irp, Event, NULL);
+            Status = _SEH_GetExceptionCode();
+            _SEH_YIELD(return Status);
+        }
+        _SEH_END;
     }
     else
     {
@@ -2119,9 +2130,21 @@
         /* Check if we have a buffer length */
         if (Length)
         {
-            /* Allocate an MDL */
-            Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
-            MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess);
+            _SEH_TRY
+            {
+                /* Allocate an MDL */
+                Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
+                MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess);
+            }
+            _SEH_HANDLE
+            {
+                /* Allocating failed, clean up */
+                IopCleanupAfterException(FileObject, Irp, Event, NULL);
+                Status = _SEH_GetExceptionCode();
+                _SEH_YIELD(return Status);
+            }
+            _SEH_END;
+
         }
 
         /* No allocation flags */
@@ -2950,6 +2973,7 @@
                 /* Allocating failed, clean up */
                 IopCleanupAfterException(FileObject, Irp, Event, NULL);
                 Status = _SEH_GetExceptionCode();
+                _SEH_YIELD(return Status);
             }
             _SEH_END;
 
@@ -2967,9 +2991,20 @@
         /* Check if we have a buffer length */
         if (Length)
         {
-            /* Allocate an MDL */
-            Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
-            MmProbeAndLockPages(Mdl, PreviousMode, IoReadAccess);
+            _SEH_TRY
+            {
+                /* Allocate an MDL */
+                Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
+                MmProbeAndLockPages(Mdl, PreviousMode, IoReadAccess);
+            }
+            _SEH_HANDLE
+            {
+                /* Allocating failed, clean up */
+                IopCleanupAfterException(FileObject, Irp, Event, NULL);
+                Status = _SEH_GetExceptionCode();
+                _SEH_YIELD(return Status);
+            }
+            _SEH_END;
         }
 
         /* No allocation flags */




More information about the Ros-diffs mailing list