- Disassociate the connection from the address file before closing them

svn path=/trunk/; revision=52083
This commit is contained in:
Cameron Gutman 2011-06-04 20:31:05 +00:00
parent e4c98f4e8e
commit 588db734b0
3 changed files with 56 additions and 1 deletions

View file

@ -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);

View file

@ -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 */

View file

@ -360,6 +360,9 @@ NTSTATUS TdiAssociateAddressFile(
HANDLE AddressHandle,
PFILE_OBJECT ConnectionObject);
NTSTATUS TdiDisassociateAddressFile(
PFILE_OBJECT ConnectionObject);
NTSTATUS TdiListen
( PIRP *Irp,
PFILE_OBJECT ConnectionObject,