diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index b069d4d0e8c..dfb5190d4c7 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -82,6 +82,7 @@ static NTSTATUS NTAPI ListenComplete if ( Irp->Cancel ) { /* FIXME: is this anything else we need to do? */ + FCB->ListenIrp.InFlightRequest = NULL; return STATUS_SUCCESS; } diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 130cb905a9f..b9da3224a99 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -243,7 +243,9 @@ NTSTATUS NTAPI UnlockAndMaybeComplete otherwise it may be completed by StreamSocketConnectComplete() before we return from SocketStateUnlock(). */ IoMarkIrpPending( Irp ); - SocketStateUnlock( FCB ); + SocketStateUnlock( FCB ); + if( ShouldUnlock ) + UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) ); } else { SocketStateUnlock( FCB ); Irp->IoStatus.Status = Status; diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index a4b8bc84352..0279e507eee 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -154,6 +154,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) { FCB->Overread ? STATUS_END_OF_FILE : STATUS_SUCCESS; NextIrp->IoStatus.Information = 0; if( NextIrp == Irp ) RetStatus = Status; + UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) ); IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); FCB->Overread = TRUE; //FCB->PollState |= AFD_EVENT_DISCONNECT; @@ -197,6 +198,7 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) { NextIrp->IoStatus.Status = Status; NextIrp->IoStatus.Information = TotalBytesCopied; if( NextIrp == Irp ) RetStatus = Status; + UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) ); IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); } } @@ -225,6 +227,11 @@ NTSTATUS NTAPI ReceiveComplete ASSERT_IRQL(APC_LEVEL); + if (Irp->Cancel) { + FCB->ReceiveIrp.InFlightRequest = NULL; + return STATUS_SUCCESS; + } + if( !SocketAcquireStateLock( FCB ) ) return Status; FCB->ReceiveIrp.InFlightRequest = NULL; @@ -299,7 +306,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, if( !RecvReq->BufferArray ) { return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, - Irp, 0, NULL, FALSE ); + Irp, 0, NULL, TRUE ); } Irp->IoStatus.Status = STATUS_PENDING; @@ -441,6 +448,11 @@ PacketSocketRecvComplete( AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); + if (Irp->Cancel) { + FCB->ReceiveIrp.InFlightRequest = NULL; + return STATUS_SUCCESS; + } + if( !SocketAcquireStateLock( FCB ) ) return STATUS_UNSUCCESSFUL; FCB->ReceiveIrp.InFlightRequest = NULL; diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index a4743731436..19407d85169 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -40,6 +40,11 @@ static NTSTATUS NTAPI SendComplete ASSERT_IRQL(APC_LEVEL); + if (Irp->Cancel) { + FCB->ReceiveIrp.InFlightRequest = NULL; + return STATUS_SUCCESS; + } + if( !SocketAcquireStateLock( FCB ) ) return Status; FCB->SendIrp.InFlightRequest = NULL; @@ -169,6 +174,11 @@ static NTSTATUS NTAPI PacketSocketSendComplete Irp->IoStatus.Status, Irp->IoStatus.Information)); + if (Irp->Cancel) { + FCB->ReceiveIrp.InFlightRequest = NULL; + return STATUS_SUCCESS; + } + /* It's ok if the FCB already died */ if( !SocketAcquireStateLock( FCB ) ) return STATUS_SUCCESS;