Patch by Cameron Gutman (aicommander <at> gmail <dot> com)

- Fix a few issues in the cancel routine
- Don't wait on an event we haven't set
- Don't mark the IRP pending when in DispPrepareIrpForCancel

svn path=/trunk/; revision=34682
This commit is contained in:
Art Yerkes 2008-07-22 12:53:25 +00:00
parent b10a7debe3
commit 5c108dbe7d
3 changed files with 24 additions and 18 deletions

View file

@ -33,7 +33,6 @@ NTSTATUS DispPrepareIrpForCancel(
IoAcquireCancelSpinLock(&OldIrql);
if (!Irp->Cancel) {
IoMarkIrpPending(Irp);
(void)IoSetCancelRoutine(Irp, CancelRoutine);
IoReleaseCancelSpinLock(OldIrql);
@ -187,7 +186,8 @@ VOID NTAPI DispCancelRequest(
TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X) MinorFunction (0x%X) IrpSp (0x%X).\n", Irp, MinorFunction, IrpSp));
Irp->IoStatus.Status = STATUS_PENDING;
Irp->IoStatus.Status = STATUS_CANCELLED;
Irp->IoStatus.Information = 0;
#ifdef DBG
if (!Irp->Cancel)
@ -212,7 +212,6 @@ VOID NTAPI DispCancelRequest(
break;
case TDI_SEND_DATAGRAM:
Irp->IoStatus.Status = STATUS_CANCELLED;
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n"));
break;
@ -222,7 +221,6 @@ VOID NTAPI DispCancelRequest(
break;
case TDI_RECEIVE_DATAGRAM:
Irp->IoStatus.Status = STATUS_CANCELLED;
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n"));
break;
@ -236,9 +234,6 @@ VOID NTAPI DispCancelRequest(
break;
}
if( Irp->IoStatus.Status == STATUS_PENDING )
IoMarkIrpPending(Irp);
IoReleaseCancelSpinLock(Irp->CancelIrql);
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
@ -1453,7 +1448,6 @@ NTSTATUS DispTdiSetInformationEx(
PTCP_REQUEST_SET_INFORMATION_EX Info;
TDI_REQUEST Request;
TDI_STATUS Status;
KIRQL OldIrql;
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
@ -1489,12 +1483,6 @@ NTSTATUS DispTdiSetInformationEx(
Status = InfoTdiSetInformationEx(&Request, &Info->ID,
&Info->Buffer, Info->BufferSize);
if (Status != STATUS_PENDING) {
IoAcquireCancelSpinLock(&OldIrql);
(void)IoSetCancelRoutine(Irp, NULL);
IoReleaseCancelSpinLock(OldIrql);
}
}
return Status;

View file

@ -18,6 +18,9 @@ VOID IRPRemember( PIRP Irp, PCHAR File, UINT Line ) {
}
NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
KIRQL Irql;
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp);
//DbgPrint("Called: Irp %x, Status %x Event %x\n", Irp, Status, Irp->UserEvent);
#ifdef MEMTRACK
@ -30,7 +33,14 @@ NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ) {
IoMarkIrpPending( Irp );
else {
Irp->IoStatus.Status = Status;
Irql = KeGetCurrentIrql();
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
if (KeGetCurrentIrql() != Irql) {
DbgPrint("WARNING: IO COMPLETION RETURNED AT WRONG IRQL:\n");
DbgPrint("WARNING: IRP TYPE WAS %d\n", IrpSp->MajorFunction);
}
ASSERT(KeGetCurrentIrql() == Irql);
}
return Status;

View file

@ -345,14 +345,22 @@ NTSTATUS TiCleanupFileObject(
Context->CancelIrps = FALSE;
IoReleaseCancelSpinLock(OldIrql);
return STATUS_INVALID_PARAMETER;
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
return Irp->IoStatus.Status;
}
if (Status != STATUS_PENDING)
TiCleanupFileObjectComplete(Irp, Status);
{
IoAcquireCancelSpinLock(&OldIrql);
KeSetEvent(&Context->CleanupEvent, 0, FALSE);
IoReleaseCancelSpinLock(OldIrql);
KeWaitForSingleObject(&Context->CleanupEvent,
UserRequest, KernelMode, FALSE, NULL);
KeWaitForSingleObject(&Context->CleanupEvent,
UserRequest, KernelMode, FALSE, NULL);
}
Irp->IoStatus.Status = Status;
return Irp->IoStatus.Status;
}