- 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

@ -1554,11 +1554,22 @@ NtQueryDirectoryFile(IN HANDLE FileHandle,
IRP_INPUT_OPERATION); IRP_INPUT_OPERATION);
} }
else if (DeviceObject->Flags & DO_DIRECT_IO) else if (DeviceObject->Flags & DO_DIRECT_IO)
{
_SEH_TRY
{ {
/* Allocate an MDL */ /* Allocate an MDL */
Mdl = IoAllocateMdl(FileInformation, Length, FALSE, TRUE, Irp); Mdl = IoAllocateMdl(FileInformation, Length, FALSE, TRUE, Irp);
MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); 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
{ {
/* No allocation flags, and use the buffer directly */ /* No allocation flags, and use the buffer directly */
@ -2118,11 +2129,23 @@ NtReadFile(IN HANDLE FileHandle,
{ {
/* Check if we have a buffer length */ /* Check if we have a buffer length */
if (Length) if (Length)
{
_SEH_TRY
{ {
/* Allocate an MDL */ /* Allocate an MDL */
Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); 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 */
Irp->Flags = 0; Irp->Flags = 0;
@ -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;
@ -2966,11 +2990,22 @@ NtWriteFile(IN HANDLE FileHandle,
{ {
/* Check if we have a buffer length */ /* Check if we have a buffer length */
if (Length) if (Length)
{
_SEH_TRY
{ {
/* Allocate an MDL */ /* Allocate an MDL */
Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp);
MmProbeAndLockPages(Mdl, PreviousMode, IoReadAccess); 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 */
Irp->Flags = 0; Irp->Flags = 0;