From fca1165c23a016cd587094763078dae58cbbbf8d Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 30 Jan 2008 13:33:16 +0000 Subject: [PATCH] - Wrap MmProbeAndLockPages invocations into SEH. See issue #2121 for more details. svn path=/trunk/; revision=32054 --- reactos/ntoskrnl/io/iomgr/iofunc.c | 53 +++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/iofunc.c b/reactos/ntoskrnl/io/iomgr/iofunc.c index 6e70c297030..cc81b783068 100644 --- a/reactos/ntoskrnl/io/iomgr/iofunc.c +++ b/reactos/ntoskrnl/io/iomgr/iofunc.c @@ -1555,9 +1555,20 @@ NtQueryDirectoryFile(IN HANDLE FileHandle, } 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 @@ NtReadFile(IN HANDLE FileHandle, /* 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 @@ NtWriteFile(IN HANDLE FileHandle, /* Allocating failed, clean up */ IopCleanupAfterException(FileObject, Irp, Event, NULL); Status = _SEH_GetExceptionCode(); + _SEH_YIELD(return Status); } _SEH_END; @@ -2967,9 +2991,20 @@ NtWriteFile(IN HANDLE FileHandle, /* 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 */