diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index 03598f008c1..204c67b6834 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -460,7 +460,10 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, ExFreePool( FCB->RemoteAddress ); if( FCB->Connection.Object ) + { + TdiDisassociateAddressFile(FCB->Connection.Object); ObDereferenceObject(FCB->Connection.Object); + } if( FCB->AddressFile.Object ) ObDereferenceObject(FCB->AddressFile.Object); diff --git a/reactos/drivers/network/afd/afd/tdi.c b/reactos/drivers/network/afd/afd/tdi.c index b6821b06c90..10ad6660cbf 100644 --- a/reactos/drivers/network/afd/afd/tdi.c +++ b/reactos/drivers/network/afd/afd/tdi.c @@ -420,6 +420,55 @@ NTSTATUS TdiAssociateAddressFile( return Status; } +NTSTATUS TdiDisassociateAddressFile( + PFILE_OBJECT ConnectionObject) +/* + * FUNCTION: Disassociates a connection endpoint from an address file object + * ARGUMENTS: + * ConnectionObject = Connection endpoint file object + * RETURNS: + * Status of operation + */ +{ + PDEVICE_OBJECT DeviceObject; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + KEVENT Event; + PIRP Irp; + + AFD_DbgPrint(MAX_TRACE, ("Called. ConnectionObject (0x%X)\n", ConnectionObject)); + + if (!ConnectionObject) { + AFD_DbgPrint(MIN_TRACE, ("Bad connection object.\n")); + return STATUS_INVALID_PARAMETER; + } + + DeviceObject = IoGetRelatedDeviceObject(ConnectionObject); + if (!DeviceObject) { + AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n")); + return STATUS_INVALID_PARAMETER; + } + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + Irp = TdiBuildInternalDeviceControlIrp(TDI_DISASSOCIATE_ADDRESS, /* Sub function */ + DeviceObject, /* Device object */ + ConnectionObject, /* File object */ + &Event, /* Event */ + &Iosb); /* Status */ + if (!Irp) + return STATUS_INSUFFICIENT_RESOURCES; + + TdiBuildDisassociateAddress(Irp, + DeviceObject, + ConnectionObject, + NULL, + NULL); + + Status = TdiCall(Irp, DeviceObject, &Event, &Iosb); + + return Status; +} NTSTATUS TdiListen ( PIRP *Irp, @@ -1229,7 +1278,7 @@ NTSTATUS TdiDisconnect( } Irp = TdiBuildInternalDeviceControlIrp - ( TDI_SEND_DATAGRAM, /* Sub function */ + ( TDI_DISCONNECT, /* Sub function */ DeviceObject, /* Device object */ TransportObject, /* File object */ &Event, /* Event */ diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index 2a6412a6d1e..5eb882d2908 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -360,6 +360,9 @@ NTSTATUS TdiAssociateAddressFile( HANDLE AddressHandle, PFILE_OBJECT ConnectionObject); +NTSTATUS TdiDisassociateAddressFile( + PFILE_OBJECT ConnectionObject); + NTSTATUS TdiListen ( PIRP *Irp, PFILE_OBJECT ConnectionObject,