- Wrap MmProbeAndLockPages invocations into SEH.

See issue #2121 for more details.

svn path=/trunk/; revision=32054
This commit is contained in:
Aleksey Bragin 2008-01-30 13:33:16 +00:00
parent 07c489c7d2
commit fca1165c23

View file

@ -1555,9 +1555,20 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
} }
else if (DeviceObject->Flags & DO_DIRECT_IO) else if (DeviceObject->Flags & DO_DIRECT_IO)
{ {
/* Allocate an MDL */ _SEH_TRY
Mdl = IoAllocateMdl(FileInformation, Length, FALSE, TRUE, Irp); {
MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); /* 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 else
{ {
@ -2119,9 +2130,21 @@ NtReadFile(IN HANDLE FileHandle,
/* Check if we have a buffer length */ /* Check if we have a buffer length */
if (Length) if (Length)
{ {
/* Allocate an MDL */ _SEH_TRY
Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); {
MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); /* 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 */ /* No allocation flags */
@ -2950,6 +2973,7 @@ NtWriteFile(IN HANDLE FileHandle,
/* Allocating failed, clean up */ /* Allocating failed, clean up */
IopCleanupAfterException(FileObject, Irp, Event, NULL); IopCleanupAfterException(FileObject, Irp, Event, NULL);
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
_SEH_YIELD(return Status);
} }
_SEH_END; _SEH_END;
@ -2967,9 +2991,20 @@ NtWriteFile(IN HANDLE FileHandle,
/* Check if we have a buffer length */ /* Check if we have a buffer length */
if (Length) if (Length)
{ {
/* Allocate an MDL */ _SEH_TRY
Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); {
MmProbeAndLockPages(Mdl, PreviousMode, IoReadAccess); /* 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 */ /* No allocation flags */