- 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
This commit is contained in:
Thomas Faber 2015-09-15 09:40:30 +00:00
parent 6f03428919
commit eb834cf62f
2 changed files with 13 additions and 7 deletions

View file

@ -54,7 +54,7 @@ typedef struct _MSFS_MESSAGE
#define KeLockMutex(x) KeWaitForSingleObject(x, \ #define KeLockMutex(x) KeWaitForSingleObject(x, \
UserRequest, \ Executive, \
KernelMode, \ KernelMode, \
FALSE, \ FALSE, \
NULL); NULL);

View file

@ -29,6 +29,7 @@ MsfsRead(PDEVICE_OBJECT DeviceObject,
ULONG LengthRead = 0; ULONG LengthRead = 0;
PVOID Buffer; PVOID Buffer;
NTSTATUS Status; NTSTATUS Status;
PLARGE_INTEGER Timeout;
DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject, Irp); DPRINT("MsfsRead(DeviceObject %p Irp %p)\n", DeviceObject, Irp);
@ -52,16 +53,21 @@ MsfsRead(PDEVICE_OBJECT DeviceObject,
Length = IoStack->Parameters.Read.Length; Length = IoStack->Parameters.Read.Length;
if (Irp->MdlAddress) if (Irp->MdlAddress)
Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress); Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
else else
Buffer = Irp->UserBuffer; Buffer = Irp->UserBuffer;
if (Fcb->TimeOut.QuadPart == -1LL)
Timeout = NULL;
else
Timeout = &Fcb->TimeOut;
Status = KeWaitForSingleObject(&Fcb->MessageEvent, Status = KeWaitForSingleObject(&Fcb->MessageEvent,
UserRequest, UserRequest,
KernelMode, UserMode,
FALSE, FALSE,
&Fcb->TimeOut); Timeout);
if (NT_SUCCESS(Status)) if (Status != STATUS_USER_APC)
{ {
if (Fcb->MessageCount > 0) if (Fcb->MessageCount > 0)
{ {
@ -84,7 +90,7 @@ MsfsRead(PDEVICE_OBJECT DeviceObject,
KeClearEvent(&Fcb->MessageEvent); KeClearEvent(&Fcb->MessageEvent);
} }
} }
else if (Fcb->TimeOut.QuadPart != 0LL) else
{ {
/* No message found after waiting */ /* No message found after waiting */
Status = STATUS_IO_TIMEOUT; Status = STATUS_IO_TIMEOUT;
@ -135,7 +141,7 @@ MsfsWrite(PDEVICE_OBJECT DeviceObject,
Length = IoStack->Parameters.Write.Length; Length = IoStack->Parameters.Write.Length;
if (Irp->MdlAddress) if (Irp->MdlAddress)
Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress); Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
else else
Buffer = Irp->UserBuffer; Buffer = Irp->UserBuffer;