You mean KernelMode->UserMode in the KeWaitForSingleObject call?
The only purpose of this wait is to fulfill a user request (namely a
read operation). If the thread performing the read is terminated,
there's no reason to stick around in msfs until data is available in the
mailslot. The wait should instead be aborted and the thread allowed
to terminate, which is exactly what this change will achieve.
On 2015-09-16 02:27, Alex Ionescu wrote:
I'm not convinced on the user->kernel changes
Thomas.
Best regards,
Alex Ionescu
On Tue, Sep 15, 2015 at 5:40 AM, <tfaber(a)svn.reactos.org> wrote:
> --- trunk/reactos/drivers/filesystems/msfs/rw.c [iso-8859-1] (original)
> +++ trunk/reactos/drivers/filesystems/msfs/rw.c [iso-8859-1] Tue Sep 15
> 09:40:30 2015
> @@ -52,16 +53,21 @@
>
> Length = IoStack->Parameters.Read.Length;
> if (Irp->MdlAddress)
> - Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
> + Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,
> NormalPagePriority);
> else
> Buffer = Irp->UserBuffer;
>
> + if (Fcb->TimeOut.QuadPart == -1LL)
> + Timeout = NULL;
> + else
> + Timeout = &Fcb->TimeOut;
> +
> Status = KeWaitForSingleObject(&Fcb->MessageEvent,
> UserRequest,
> - KernelMode,
> + UserMode,
> FALSE,
> - &Fcb->TimeOut);
> - if (NT_SUCCESS(Status))
> + Timeout);
> + if (Status != STATUS_USER_APC)
> {
> if (Fcb->MessageCount > 0)
> {