I'm not convinced on the user->kernel changes Thomas.

Best regards,
Alex Ionescu

On Tue, Sep 15, 2015 at 5:40 AM, <tfaber@svn.reactos.org> wrote:
Author: tfaber
Date: Tue Sep 15 09:40:30 2015
New Revision: 69236

URL: http://svn.reactos.org/svn/reactos?rev=69236&view=rev
Log:
[MSFS]
- Use a NULL timeout for infinite waits instead of waiting for 100 ns. CORE-10188 #resolve
- Wait for available read data in user mode to handle thread termination
- Return STATUS_IO_TIMEOUT also for a zero-length timeout. Fixes Wine tests
- Avoid MmGetSystemAddressForMdl
- Acquiring a mutex is not a UserRequest

Modified:
    trunk/reactos/drivers/filesystems/msfs/msfs.h
    trunk/reactos/drivers/filesystems/msfs/rw.c

Modified: trunk/reactos/drivers/filesystems/msfs/msfs.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/msfs/msfs.h?rev=69236&r1=69235&r2=69236&view=diff
==============================================================================
--- trunk/reactos/drivers/filesystems/msfs/msfs.h       [iso-8859-1] (original)
+++ trunk/reactos/drivers/filesystems/msfs/msfs.h       [iso-8859-1] Tue Sep 15 09:40:30 2015
@@ -54,7 +54,7 @@


 #define KeLockMutex(x) KeWaitForSingleObject(x, \
-                                             UserRequest, \
+                                             Executive, \
                                              KernelMode, \
                                              FALSE, \
                                              NULL);

Modified: trunk/reactos/drivers/filesystems/msfs/rw.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/filesystems/msfs/rw.c?rev=69236&r1=69235&r2=69236&view=diff
==============================================================================
--- 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
@@ -29,6 +29,7 @@
     ULONG LengthRead = 0;
     PVOID Buffer;
     NTSTATUS Status;
+    PLARGE_INTEGER Timeout;

     DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject, Irp);

@@ -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)
         {
@@ -84,7 +90,7 @@
                 KeClearEvent(&Fcb->MessageEvent);
             }
         }
-        else if (Fcb->TimeOut.QuadPart != 0LL)
+        else
         {
             /* No message found after waiting */
             Status = STATUS_IO_TIMEOUT;
@@ -135,7 +141,7 @@

     Length = IoStack->Parameters.Write.Length;
     if (Irp->MdlAddress)
-        Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
+        Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
     else
         Buffer = Irp->UserBuffer;