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;