[AFD]
authorCameron Gutman <aicommander@gmail.com>
Sat, 4 Jun 2011 20:31:05 +0000 (20:31 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 4 Jun 2011 20:31:05 +0000 (20:31 +0000)
- Disassociate the connection from the address file before closing them

svn path=/trunk/; revision=52083

reactos/drivers/network/afd/afd/main.c
reactos/drivers/network/afd/afd/tdi.c
reactos/drivers/network/afd/include/afd.h

index 03598f0..204c67b 100644 (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);
index b6821b0..10ad666 100644 (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 */
index 2a6412a..5eb882d 100644 (file)
@@ -360,6 +360,9 @@ NTSTATUS TdiAssociateAddressFile(
   HANDLE AddressHandle,
   PFILE_OBJECT ConnectionObject);
 
+NTSTATUS TdiDisassociateAddressFile(
+  PFILE_OBJECT ConnectionObject);
+
 NTSTATUS TdiListen
 ( PIRP *Irp,
   PFILE_OBJECT ConnectionObject,