From eb834cf62f9a0f79c4bf5d19edf9843d706dbf54 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 15 Sep 2015 09:40:30 +0000 Subject: [PATCH] [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 svn path=/trunk/; revision=69236 --- reactos/drivers/filesystems/msfs/msfs.h | 2 +- reactos/drivers/filesystems/msfs/rw.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/filesystems/msfs/msfs.h b/reactos/drivers/filesystems/msfs/msfs.h index 772b80a204d..ecc0b7afe75 100644 --- a/reactos/drivers/filesystems/msfs/msfs.h +++ b/reactos/drivers/filesystems/msfs/msfs.h @@ -54,7 +54,7 @@ typedef struct _MSFS_MESSAGE #define KeLockMutex(x) KeWaitForSingleObject(x, \ - UserRequest, \ + Executive, \ KernelMode, \ FALSE, \ NULL); diff --git a/reactos/drivers/filesystems/msfs/rw.c b/reactos/drivers/filesystems/msfs/rw.c index 5abfa4a4ae2..c194fb2ef4c 100644 --- a/reactos/drivers/filesystems/msfs/rw.c +++ b/reactos/drivers/filesystems/msfs/rw.c @@ -29,6 +29,7 @@ MsfsRead(PDEVICE_OBJECT DeviceObject, ULONG LengthRead = 0; PVOID Buffer; NTSTATUS Status; + PLARGE_INTEGER Timeout; DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject, Irp); @@ -52,16 +53,21 @@ MsfsRead(PDEVICE_OBJECT DeviceObject, 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 @@ MsfsRead(PDEVICE_OBJECT DeviceObject, KeClearEvent(&Fcb->MessageEvent); } } - else if (Fcb->TimeOut.QuadPart != 0LL) + else { /* No message found after waiting */ Status = STATUS_IO_TIMEOUT; @@ -135,7 +141,7 @@ MsfsWrite(PDEVICE_OBJECT DeviceObject, Length = IoStack->Parameters.Write.Length; if (Irp->MdlAddress) - Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress); + Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); else Buffer = Irp->UserBuffer;