From 5c108dbe7d83d24adbb07dc764add7adc55d5664 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Tue, 22 Jul 2008 12:53:25 +0000 Subject: [PATCH] Patch by Cameron Gutman (aicommander gmail 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 --- reactos/drivers/network/tcpip/tcpip/dispatch.c | 16 ++-------------- reactos/drivers/network/tcpip/tcpip/irp.c | 10 ++++++++++ reactos/drivers/network/tcpip/tcpip/main.c | 16 ++++++++++++---- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index 9668a7aaeb7..bee2e63c181 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -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; diff --git a/reactos/drivers/network/tcpip/tcpip/irp.c b/reactos/drivers/network/tcpip/tcpip/irp.c index 30e3ebd7454..0ba3bfb5ab5 100644 --- a/reactos/drivers/network/tcpip/tcpip/irp.c +++ b/reactos/drivers/network/tcpip/tcpip/irp.c @@ -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; diff --git a/reactos/drivers/network/tcpip/tcpip/main.c b/reactos/drivers/network/tcpip/tcpip/main.c index 84a53d120ec..9e795c15c2b 100644 --- a/reactos/drivers/network/tcpip/tcpip/main.c +++ b/reactos/drivers/network/tcpip/tcpip/main.c @@ -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; }