- Dont call KeWaitForSingleObject with WaitMode of KernelMode, as threads cannot be terminated if request was made from user mode. Use Ipr->RequestorMode instead.

svn path=/trunk/; revision=38662
This commit is contained in:
Michael Martin 2009-01-09 11:04:11 +00:00
parent d7523459e7
commit 8b8bf0f32a
2 changed files with 30 additions and 4 deletions

View file

@ -169,7 +169,7 @@ NpfsConnectPipe(PIRP Irp,
{ {
KeWaitForSingleObject(&Ccb->ConnectEvent, KeWaitForSingleObject(&Ccb->ConnectEvent,
UserRequest, UserRequest,
KernelMode, Irp->RequestorMode,
FALSE, FALSE,
NULL); NULL);
} }

View file

@ -357,9 +357,15 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
ExReleaseFastMutex(&Ccb->DataListLock); ExReleaseFastMutex(&Ccb->DataListLock);
Status = KeWaitForSingleObject(&Event, Status = KeWaitForSingleObject(&Event,
Executive, Executive,
KernelMode, Irp->RequestorMode,
FALSE, FALSE,
NULL); NULL);
if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC))
{
Status = STATUS_CANCELLED;
goto done;
}
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ASSERT(FALSE); ASSERT(FALSE);
@ -439,17 +445,28 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
DPRINT("Waiting for readable data (%wZ)\n", &Ccb->Fcb->PipeName); DPRINT("Waiting for readable data (%wZ)\n", &Ccb->Fcb->PipeName);
Status = KeWaitForSingleObject(&Ccb->ReadEvent, Status = KeWaitForSingleObject(&Ccb->ReadEvent,
UserRequest, UserRequest,
KernelMode, Irp->RequestorMode,
FALSE, FALSE,
NULL); NULL);
DPRINT("Finished waiting (%wZ)! Status: %x\n", &Ccb->Fcb->PipeName, Status); DPRINT("Finished waiting (%wZ)! Status: %x\n", &Ccb->Fcb->PipeName, Status);
ExAcquireFastMutex(&Ccb->DataListLock); ExAcquireFastMutex(&Ccb->DataListLock);
if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC))
{
Status = STATUS_CANCELLED;
break;
}
if (!NT_SUCCESS(Status))
{
ASSERT(FALSE);
}
} }
else else
{ {
Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext; Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
Context->WaitEvent = &Ccb->ReadEvent; Context->WaitEvent = &Ccb->ReadEvent;
Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp); Status = NpfsAddWaitingReadWriteRequest(DeviceObject, Irp);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
@ -735,11 +752,20 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
DPRINT("Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer); DPRINT("Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer);
Status = KeWaitForSingleObject(&Ccb->WriteEvent, Status = KeWaitForSingleObject(&Ccb->WriteEvent,
UserRequest, UserRequest,
KernelMode, Irp->RequestorMode,
FALSE, FALSE,
NULL); NULL);
DPRINT("Finished waiting (%S)! Status: %x\n", Fcb->PipeName.Buffer, Status); DPRINT("Finished waiting (%S)! Status: %x\n", Fcb->PipeName.Buffer, Status);
if ((Status == STATUS_USER_APC) || (Status == STATUS_KERNEL_APC))
{
Status = STATUS_CANCELLED;
break;
}
if (!NT_SUCCESS(Status))
{
ASSERT(FALSE);
}
/* /*
* It's possible that the event was signaled because the * It's possible that the event was signaled because the
* other side of pipe was closed. * other side of pipe was closed.