diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index be104105323..a1e664f6dab 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -436,6 +436,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, InFlightRequest[1] = &FCB->ReceiveIrp; InFlightRequest[2] = &FCB->SendIrp; InFlightRequest[3] = &FCB->ConnectIrp; + InFlightRequest[4] = &FCB->DisconnectIrp; /* Cancel our pending requests */ for( i = 0; i < IN_FLIGHT_REQUESTS; i++ ) { diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index b66c3a18512..04464ffff26 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -108,7 +108,7 @@ typedef struct IPADDR_ENTRY { #define FUNCTION_CLOSE 6 #define MAX_FUNCTIONS 7 -#define IN_FLIGHT_REQUESTS 4 +#define IN_FLIGHT_REQUESTS 5 #define EXTRA_LOCK_BUFFERS 2 /* Number of extra buffers needed * for ancillary data on packet diff --git a/reactos/drivers/network/tcpip/tcpip/dispatch.c b/reactos/drivers/network/tcpip/tcpip/dispatch.c index e0869aaf400..6bc4cc4db77 100644 --- a/reactos/drivers/network/tcpip/tcpip/dispatch.c +++ b/reactos/drivers/network/tcpip/tcpip/dispatch.c @@ -543,15 +543,22 @@ NTSTATUS DispTdiDisconnect( Status = STATUS_INVALID_PARAMETER; goto done; } + + Status = DispPrepareIrpForCancel + (TranContext->Handle.ConnectionContext, + Irp, + (PDRIVER_CANCEL)DispCancelRequest); - Status = TCPDisconnect( - TranContext->Handle.ConnectionContext, - DisReq->RequestFlags, - DisReq->RequestSpecific, - DisReq->RequestConnectionInformation, - DisReq->ReturnConnectionInformation, - DispDataRequestComplete, - Irp ); + if (NT_SUCCESS(Status)) + { + Status = TCPDisconnect(TranContext->Handle.ConnectionContext, + DisReq->RequestFlags, + DisReq->RequestSpecific, + DisReq->RequestConnectionInformation, + DisReq->ReturnConnectionInformation, + DispDataRequestComplete, + Irp); + } done: if (Status != STATUS_PENDING) {