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/ms... ============================================================================== --- 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... ============================================================================== --- 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;