[AFD] Introduce and use pool tags. Thanks go to Arty for assisting me with this....
[reactos.git] / drivers / network / afd / afd / connect.c
index e11a553..1562f5f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id$
+/*
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS kernel
  * FILE:             drivers/net/afd/afd/connect.c
@@ -7,16 +7,20 @@
  * UPDATE HISTORY:
  * 20040708 Created
  */
+
 #include "afd.h"
 
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                 PIO_STACK_LOCATION IrpSp)
+                     PIO_STACK_LOCATION IrpSp)
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (FCB->ConnectOptionsSize == 0)
@@ -39,27 +43,32 @@ AfdGetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 NTSTATUS
 NTAPI
 AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                  PIO_STACK_LOCATION IrpSp)
+                     PIO_STACK_LOCATION IrpSp)
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
-    PVOID ConnectOptions = LockRequest(Irp, IrpSp);
+    PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT ConnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
-    
+
     if (!ConnectOptions)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     if (FCB->ConnectOptions)
     {
-        ExFreePool(FCB->ConnectOptions);
+        ExFreePoolWithTag(FCB->ConnectOptions, TAG_AFD_CONNECT_OPTIONS);
         FCB->ConnectOptions = NULL;
         FCB->ConnectOptionsSize = 0;
         FCB->FilledConnectOptions = 0;
     }
 
-    FCB->ConnectOptions = ExAllocatePool(PagedPool, ConnectOptionsSize);
+    FCB->ConnectOptions = ExAllocatePoolWithTag(PagedPool,
+                                                ConnectOptionsSize,
+                                                TAG_AFD_CONNECT_OPTIONS);
+
     if (!FCB->ConnectOptions)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
@@ -75,15 +84,17 @@ AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 NTSTATUS
 NTAPI
 AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                      PIO_STACK_LOCATION IrpSp)
+                         PIO_STACK_LOCATION IrpSp)
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
-    PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp);
+    PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
-    
+
     if (!ConnectOptionsSize)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
@@ -95,12 +106,15 @@ AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->ConnectOptions)
     {
-        ExFreePool(FCB->ConnectOptions);
+        ExFreePoolWithTag(FCB->ConnectOptions, TAG_AFD_CONNECT_OPTIONS);
         FCB->ConnectOptionsSize = 0;
         FCB->FilledConnectOptions = 0;
     }
 
-    FCB->ConnectOptions = ExAllocatePool(PagedPool, *ConnectOptionsSize);
+    FCB->ConnectOptions = ExAllocatePoolWithTag(PagedPool,
+                                                *ConnectOptionsSize,
+                                                TAG_AFD_CONNECT_OPTIONS);
+
     if (!FCB->ConnectOptions) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     FCB->ConnectOptionsSize = *ConnectOptionsSize;
@@ -108,14 +122,17 @@ AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
     return UnlockAndMaybeComplete(FCB, STATUS_SUCCESS, Irp, 0);
 }
 
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 AfdGetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                 PIO_STACK_LOCATION IrpSp)
+                  PIO_STACK_LOCATION IrpSp)
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (FCB->ConnectDataSize == 0)
@@ -142,23 +159,28 @@ AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
-    PVOID ConnectData = LockRequest(Irp, IrpSp);
+    PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT ConnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
-    
+
     if (!ConnectData)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     if (FCB->ConnectData)
     {
-        ExFreePool(FCB->ConnectData);
+        ExFreePoolWithTag(FCB->ConnectData, TAG_AFD_CONNECT_DATA);
         FCB->ConnectData = NULL;
         FCB->ConnectDataSize = 0;
         FCB->FilledConnectData = 0;
     }
 
-    FCB->ConnectData = ExAllocatePool(PagedPool, ConnectDataSize);
+    FCB->ConnectData = ExAllocatePoolWithTag(PagedPool,
+                                             ConnectDataSize,
+                                             TAG_AFD_CONNECT_DATA);
+
     if (!FCB->ConnectData) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     RtlCopyMemory(FCB->ConnectData,
@@ -177,14 +199,16 @@ AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 {
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
-    PUINT ConnectDataSize = LockRequest(Irp, IrpSp);
+    PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL);
     UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
 
+    UNREFERENCED_PARAMETER(DeviceObject);
+
     if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
 
     if (!ConnectDataSize)
         return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
-    
+
     if (BufferSize < sizeof(UINT))
     {
         AFD_DbgPrint(MIN_TRACE,("Buffer too small\n"));
@@ -193,12 +217,15 @@ AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     if (FCB->ConnectData)
     {
-        ExFreePool(FCB->ConnectData);
+        ExFreePoolWithTag(FCB->ConnectData, TAG_AFD_CONNECT_DATA);
         FCB->ConnectDataSize = 0;
         FCB->FilledConnectData = 0;
     }
 
-    FCB->ConnectData = ExAllocatePool(PagedPool, *ConnectDataSize);
+    FCB->ConnectData = ExAllocatePoolWithTag(PagedPool,
+                                             *ConnectDataSize,
+                                             TAG_AFD_CONNECT_DATA);
+
     if (!FCB->ConnectData) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
 
     FCB->ConnectDataSize = *ConnectDataSize;
@@ -207,7 +234,8 @@ AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
 }
 
 
-NTSTATUS WarmSocketForConnection( PAFD_FCB FCB ) {
+NTSTATUS
+WarmSocketForConnection(PAFD_FCB FCB) {
     NTSTATUS Status;
 
     if( !FCB->TdiDeviceName.Length || !FCB->TdiDeviceName.Buffer ) {
@@ -227,7 +255,8 @@ NTSTATUS WarmSocketForConnection( PAFD_FCB FCB ) {
     return Status;
 }
 
-NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
+NTSTATUS
+MakeSocketIntoConnection(PAFD_FCB FCB) {
     NTSTATUS Status;
 
     ASSERT(!FCB->Recv.Window);
@@ -252,26 +281,31 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
     /* Allocate the receive area and start receiving */
     if (!FCB->Recv.Window)
     {
-        FCB->Recv.Window = ExAllocatePool( PagedPool, FCB->Recv.Size );
+        FCB->Recv.Window = ExAllocatePoolWithTag(PagedPool,
+                                                 FCB->Recv.Size,
+                                                 TAG_AFD_DATA_BUFFER);
+
         if( !FCB->Recv.Window ) return STATUS_NO_MEMORY;
     }
 
     if (!FCB->Send.Window)
     {
-        FCB->Send.Window = ExAllocatePool( PagedPool, FCB->Send.Size );
+        FCB->Send.Window = ExAllocatePoolWithTag(PagedPool,
+                                                 FCB->Send.Size,
+                                                 TAG_AFD_DATA_BUFFER);
+
         if( !FCB->Send.Window ) return STATUS_NO_MEMORY;
     }
 
     FCB->State = SOCKET_STATE_CONNECTED;
 
     Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
-                        FCB->Connection.Object,
-                        TDI_RECEIVE_NORMAL,
-                        FCB->Recv.Window,
-                        FCB->Recv.Size,
-                        &FCB->ReceiveIrp.Iosb,
-                        ReceiveComplete,
-                        FCB );
+                         FCB->Connection.Object,
+                         TDI_RECEIVE_NORMAL,
+                         FCB->Recv.Window,
+                         FCB->Recv.Size,
+                         ReceiveComplete,
+                         FCB );
 
    if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
 
@@ -283,17 +317,19 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
    return Status;
 }
 
-static NTSTATUS NTAPI StreamSocketConnectComplete
-( PDEVICE_OBJECT DeviceObject,
-  PIRP Irp,
-  PVOID Context ) {
+static IO_COMPLETION_ROUTINE StreamSocketConnectComplete;
+static
+NTSTATUS
+NTAPI
+StreamSocketConnectComplete(PDEVICE_OBJECT DeviceObject, PIRP Irp,
+                            PVOID Context) {
     NTSTATUS Status = Irp->IoStatus.Status;
     PAFD_FCB FCB = (PAFD_FCB)Context;
     PLIST_ENTRY NextIrpEntry;
     PIRP NextIrp;
 
-    AFD_DbgPrint(MID_TRACE,("Called: FCB %x, FO %x\n",
-                           Context, FCB->FileObject));
+    AFD_DbgPrint(MID_TRACE,("Called: FCB %p, FO %p\n",
+                            Context, FCB->FileObject));
 
     /* I was wrong about this before as we can have pending writes to a not
      * yet connected socket */
@@ -301,7 +337,7 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
         return STATUS_FILE_CLOSED;
 
     AFD_DbgPrint(MID_TRACE,("Irp->IoStatus.Status = %x\n",
-                           Irp->IoStatus.Status));
+                            Irp->IoStatus.Status));
 
     ASSERT(FCB->ConnectIrp.InFlightRequest == Irp);
     FCB->ConnectIrp.InFlightRequest = NULL;
@@ -309,45 +345,45 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
     if( FCB->State == SOCKET_STATE_CLOSED ) {
         /* Cleanup our IRP queue because the FCB is being destroyed */
         while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
-              NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
-              NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
-              NextIrp->IoStatus.Status = STATUS_FILE_CLOSED;
-              NextIrp->IoStatus.Information = 0;
-              if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
+               NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
+               NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
+               NextIrp->IoStatus.Status = STATUS_FILE_CLOSED;
+               NextIrp->IoStatus.Information = 0;
+               if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
                (void)IoSetCancelRoutine(NextIrp, NULL);
-              IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
+               IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
         }
-       SocketStateUnlock( FCB );
-       return STATUS_FILE_CLOSED;
+        SocketStateUnlock( FCB );
+        return STATUS_FILE_CLOSED;
     }
 
     if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
-       FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
+        FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
         FCB->PollStatus[FD_CONNECT_BIT] = Irp->IoStatus.Status;
-       AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
-       FCB->State = SOCKET_STATE_BOUND;
+        AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
+        FCB->State = SOCKET_STATE_BOUND;
         PollReeval( FCB->DeviceExt, FCB->FileObject );
     }
 
     /* Succeed pending irps on the FUNCTION_CONNECT list */
     while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_CONNECT] ) ) {
-       NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
-       NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
-       AFD_DbgPrint(MID_TRACE,("Completing connect %x\n", NextIrp));
-       NextIrp->IoStatus.Status = Status;
-       NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? ((ULONG_PTR)FCB->Connection.Handle) : 0;
-       if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
+        NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_CONNECT]);
+        NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
+        AFD_DbgPrint(MID_TRACE,("Completing connect %p\n", NextIrp));
+        NextIrp->IoStatus.Status = Status;
+        NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? ((ULONG_PTR)FCB->Connection.Handle) : 0;
+        if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
         (void)IoSetCancelRoutine(NextIrp, NULL);
-       IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
+        IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
     }
 
     if( NT_SUCCESS(Status) ) {
-       Status = MakeSocketIntoConnection( FCB );
+        Status = MakeSocketIntoConnection( FCB );
 
-       if( !NT_SUCCESS(Status) ) {
-           SocketStateUnlock( FCB );
-           return Status;
-       }
+        if( !NT_SUCCESS(Status) ) {
+            SocketStateUnlock( FCB );
+            return Status;
+        }
 
         FCB->FilledConnectData = MIN(FCB->ConnectReturnInfo->UserDataLength, FCB->ConnectDataSize);
         if (FCB->FilledConnectData)
@@ -365,20 +401,20 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
                           FCB->FilledConnectOptions);
         }
 
-       if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
-           NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
-           NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP,
-                                       Tail.Overlay.ListEntry);
-           AFD_DbgPrint(MID_TRACE,("Launching send request %x\n", NextIrp));
-           Status = AfdConnectedSocketWriteData
-               ( DeviceObject,
-                 NextIrp,
-                 IoGetCurrentIrpStackLocation( NextIrp ),
-                 FALSE );
-       }
-
-       if( Status == STATUS_PENDING )
-           Status = STATUS_SUCCESS;
+        if( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_SEND] ) ) {
+            NextIrpEntry = RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]);
+            NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP,
+                                        Tail.Overlay.ListEntry);
+            AFD_DbgPrint(MID_TRACE,("Launching send request %p\n", NextIrp));
+            Status = AfdConnectedSocketWriteData
+                ( DeviceObject,
+                  NextIrp,
+                  IoGetCurrentIrpStackLocation( NextIrp ),
+                  FALSE );
+        }
+
+        if( Status == STATUS_PENDING )
+            Status = STATUS_SUCCESS;
     }
 
     SocketStateUnlock( FCB );
@@ -390,105 +426,128 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
 
 /* Return the socket object for ths request only if it is a connected or
    stream type. */
-NTSTATUS NTAPI
+NTSTATUS
+NTAPI
 AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
-                      PIO_STACK_LOCATION IrpSp) {
+                       PIO_STACK_LOCATION IrpSp) {
     NTSTATUS Status = STATUS_INVALID_PARAMETER;
     PFILE_OBJECT FileObject = IrpSp->FileObject;
     PAFD_FCB FCB = FileObject->FsContext;
     PAFD_CONNECT_INFO ConnectReq;
-    AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
+    AFD_DbgPrint(MID_TRACE,("Called on %p\n", FCB));
+
+    UNREFERENCED_PARAMETER(DeviceObject);
 
     if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
-    if( !(ConnectReq = LockRequest( Irp, IrpSp )) )
-       return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
-                                      0 );
+    if( !(ConnectReq = LockRequest( Irp, IrpSp, FALSE, NULL )) )
+        return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
+                                       0 );
 
     AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
 #if 0
     OskitDumpBuffer
-       ( (PCHAR)ConnectReq,
-         IrpSp->Parameters.DeviceIoControl.InputBufferLength );
+        ( (PCHAR)ConnectReq,
+          IrpSp->Parameters.DeviceIoControl.InputBufferLength );
 #endif
 
    if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
    {
-       if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
-       FCB->RemoteAddress =
-           TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+        if (FCB->RemoteAddress)
+        {
+            ExFreePoolWithTag(FCB->RemoteAddress, TAG_AFD_TRANSPORT_ADDRESS);
+        }
 
-       if( !FCB->RemoteAddress )
-           Status = STATUS_NO_MEMORY;
-       else
-           Status = STATUS_SUCCESS;
+        FCB->RemoteAddress =
+            TaCopyTransportAddress( &ConnectReq->RemoteAddress );
 
-       return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
+        if( !FCB->RemoteAddress )
+            Status = STATUS_NO_MEMORY;
+        else
+            Status = STATUS_SUCCESS;
+
+        return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
    }
 
     switch( FCB->State ) {
     case SOCKET_STATE_CONNECTED:
-       Status = STATUS_SUCCESS;
-       break;
+        Status = STATUS_SUCCESS;
+        break;
 
     case SOCKET_STATE_CONNECTING:
-       return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
+        return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
 
     case SOCKET_STATE_CREATED:
-       if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
-       FCB->LocalAddress =
-           TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
-
-       if( FCB->LocalAddress ) {
-           Status = WarmSocketForBind( FCB );
-
-           if( NT_SUCCESS(Status) )
-               FCB->State = SOCKET_STATE_BOUND;
-           else
-               return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
-       } else
-           return UnlockAndMaybeComplete
-               ( FCB, STATUS_NO_MEMORY, Irp, 0 );
-    
+        if (FCB->LocalAddress)
+        {
+            ExFreePoolWithTag(FCB->LocalAddress, TAG_AFD_TRANSPORT_ADDRESS);
+        }
+
+        FCB->LocalAddress =
+            TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
+
+        if( FCB->LocalAddress ) {
+            Status = WarmSocketForBind( FCB, AFD_SHARE_WILDCARD );
+
+            if( NT_SUCCESS(Status) )
+                FCB->State = SOCKET_STATE_BOUND;
+            else
+                return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
+        } else
+            return UnlockAndMaybeComplete
+                ( FCB, STATUS_NO_MEMORY, Irp, 0 );
+
     /* Drop through to SOCKET_STATE_BOUND */
 
     case SOCKET_STATE_BOUND:
-       if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
-       FCB->RemoteAddress =
-           TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+        if (FCB->RemoteAddress)
+        {
+            ExFreePoolWithTag(FCB->RemoteAddress, TAG_AFD_TRANSPORT_ADDRESS);
+        }
 
-       if( !FCB->RemoteAddress ) {
-           Status = STATUS_NO_MEMORY;
-           break;
-       }
+        FCB->RemoteAddress =
+            TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+
+        if( !FCB->RemoteAddress ) {
+            Status = STATUS_NO_MEMORY;
+            break;
+        }
 
-       Status = WarmSocketForConnection( FCB );
+        Status = WarmSocketForConnection( FCB );
 
-       if( !NT_SUCCESS(Status) )
-           break;
+        if( !NT_SUCCESS(Status) )
+            break;
+
+        if (FCB->ConnectReturnInfo)
+        {
+            ExFreePoolWithTag(FCB->ConnectReturnInfo, TAG_AFD_TDI_CONNECTION_INFORMATION);
+        }
 
-    if (FCB->ConnectReturnInfo) ExFreePool(FCB->ConnectReturnInfo);
-       Status = TdiBuildConnectionInfo
-           ( &FCB->ConnectReturnInfo,
-             &ConnectReq->RemoteAddress );
+        Status = TdiBuildConnectionInfo
+            ( &FCB->ConnectReturnInfo,
+              &ConnectReq->RemoteAddress );
 
         if( NT_SUCCESS(Status) )
         {
-            if (FCB->ConnectCallInfo) ExFreePool(FCB->ConnectCallInfo);
+            if (FCB->ConnectCallInfo)
+            {
+                ExFreePoolWithTag(FCB->ConnectCallInfo, TAG_AFD_TDI_CONNECTION_INFORMATION);
+            }
+
             Status = TdiBuildConnectionInfo(&FCB->ConnectCallInfo,
-                                           &ConnectReq->RemoteAddress);
+                                              &ConnectReq->RemoteAddress);
         }
         else break;
 
 
-       if( NT_SUCCESS(Status) ) {
+        if( NT_SUCCESS(Status) ) {
             FCB->ConnectCallInfo->UserData = FCB->ConnectData;
             FCB->ConnectCallInfo->UserDataLength = FCB->ConnectDataSize;
             FCB->ConnectCallInfo->Options = FCB->ConnectOptions;
             FCB->ConnectCallInfo->OptionsLength = FCB->ConnectOptionsSize;
-        
+
         FCB->State = SOCKET_STATE_CONNECTING;
-        
-        AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
+
+        AFD_DbgPrint(MID_TRACE,("Queueing IRP %p\n", Irp));
         Status = QueueUserModeIrp( FCB, Irp, FUNCTION_CONNECT );
         if (Status == STATUS_PENDING)
         {
@@ -496,24 +555,23 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
                                 FCB->Connection.Object,
                                 FCB->ConnectCallInfo,
                                 FCB->ConnectReturnInfo,
-                                &FCB->ConnectIrp.Iosb,
                                 StreamSocketConnectComplete,
                                 FCB );
         }
-        
+
         if (Status != STATUS_PENDING)
             FCB->State = SOCKET_STATE_BOUND;
-        
+
         SocketStateUnlock(FCB);
 
-           return Status;
-       }
-       break;
+            return Status;
+        }
+        break;
 
     default:
-       AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %d for connect\n",
-                               FCB->State));
-       break;
+        AFD_DbgPrint(MIN_TRACE,("Inappropriate socket state %u for connect\n",
+                                FCB->State));
+        break;
     }
 
     return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );