NTSTATUS Status = STATUS_SUCCESS;
PAFD_FCB FCB = (PAFD_FCB)Context;
PAFD_TDI_OBJECT_QELT Qelt;
- PLIST_ENTRY NextIrpEntry, QeltEntry;
+ PLIST_ENTRY NextIrpEntry;
PIRP NextIrp;
if( !SocketAcquireStateLock( FCB ) )
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
}
- /* Free all pending connections */
- while( !IsListEmpty( &FCB->PendingConnections ) ) {
- QeltEntry = RemoveHeadList(&FCB->PendingConnections);
- Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry);
- ExFreePool(Qelt);
- }
-
/* Free ConnectionReturnInfo and ConnectionCallInfo */
if (FCB->ListenIrp.ConnectionReturnInfo)
{
PAFD_FCB FCB = FileObject->FsContext;
UINT i;
PAFD_IN_FLIGHT_REQUEST InFlightRequest[IN_FLIGHT_REQUESTS];
+ PAFD_TDI_OBJECT_QELT Qelt;
+ PLIST_ENTRY QeltEntry;
+
AFD_DbgPrint(MID_TRACE,
("AfdClose(DeviceObject %p Irp %p)\n", DeviceObject, Irp));
KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
+ ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_CONNECT]));
+ ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_SEND]));
+ ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_RECV]));
+ ASSERT(IsListEmpty(&FCB->PendingIrpList[FUNCTION_PREACCEPT]));
+
+ while (!IsListEmpty(&FCB->PendingConnections))
+ {
+ QeltEntry = RemoveHeadList(&FCB->PendingConnections);
+ Qelt = CONTAINING_RECORD(QeltEntry, AFD_TDI_OBJECT_QELT, ListEntry);
+
+ /* We have to close all pending connections or the listen won't get closed */
+ TdiDisassociateAddressFile(Qelt->Object.Object);
+ ObDereferenceObject(Qelt->Object.Object);
+ ZwClose(Qelt->Object.Handle);
+
+ ExFreePool(Qelt);
+ }
+
SocketStateUnlock( FCB );
if( FCB->EventSelect )