AFD_DbgPrint(MID_TRACE,("Called: FCB %x, FO %x\n",
Context, FCB->FileObject));
- DbgPrint("[StreamSocketConnectComplete] Called: FCB %x, FO %x\n",
+ DbgPrint("[AFD, StreamSocketConnectComplete] Called: FCB 0x%x, FO 0x%x\n",
Context, FCB->FileObject);
/* I was wrong about this before as we can have pending writes to a not
NextIrp = CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
AFD_DbgPrint(MID_TRACE,("Completing connect %x\n", NextIrp));
- DbgPrint("[StreamSocketConnectComplete] Completing connect %x\n", NextIrp);
+ DbgPrint("[AFD, StreamSocketConnectComplete] Completing connect 0x%x\n", NextIrp);
NextIrp->IoStatus.Status = Status;
NextIrp->IoStatus.Information = NT_SUCCESS(Status) ? ((ULONG_PTR)FCB->Connection.Handle) : 0;
0 );
AFD_DbgPrint(MID_TRACE,("Connect request:\n"));
- DbgPrint("[AfdStreamSocketConnect] Connect request:\n");
+ DbgPrint("[AFD, AfdStreamSocketConnect] Connect request:\n");
#if 0
OskitDumpBuffer
( (PCHAR)ConnectReq,
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
{
if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
- FCB->RemoteAddress =
- TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+ FCB->RemoteAddress = TaCopyTransportAddress( &ConnectReq->RemoteAddress );
if( !FCB->RemoteAddress )
Status = STATUS_NO_MEMORY;
case SOCKET_STATE_CONNECTING:
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_CONNECT );
- case SOCKET_STATE_CREATED:
- if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
- FCB->LocalAddress =
- TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType );
+ case SOCKET_STATE_CREATED:
+ if( FCB->LocalAddress ) ExFreePool( FCB->LocalAddress );
+ FCB->LocalAddress = TaBuildNullTransportAddress(
+ ConnectReq->RemoteAddress.Address[0].AddressType);
if( FCB->LocalAddress )
{
/* Drop through to SOCKET_STATE_BOUND */
case SOCKET_STATE_BOUND:
- if( FCB->RemoteAddress ) ExFreePool( FCB->RemoteAddress );
- FCB->RemoteAddress =
- TaCopyTransportAddress( &ConnectReq->RemoteAddress );
+ if( FCB->RemoteAddress )
+ ExFreePool( FCB->RemoteAddress );
+
+ FCB->RemoteAddress = TaCopyTransportAddress( &ConnectReq->RemoteAddress );
if( !FCB->RemoteAddress )
{
if( !NT_SUCCESS(Status) )
break;
- Status = TdiBuildConnectionInfo
- ( &FCB->ConnectInfo,
- &ConnectReq->RemoteAddress );
+ Status = TdiBuildConnectionInfo(&FCB->ConnectInfo, &ConnectReq->RemoteAddress);
if( NT_SUCCESS(Status) )
- Status = TdiBuildConnectionInfo(&TargetAddress,
- &ConnectReq->RemoteAddress);
+ Status = TdiBuildConnectionInfo(&TargetAddress, &ConnectReq->RemoteAddress);
else break;
if( NT_SUCCESS(Status) )
ExFreePool(TargetAddress);
AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
- DbgPrint("[AfdStreamSocketConnect] Queueing IRP %x\n", Irp);
+ DbgPrint("[AFD, AfdStreamSocketConnect] Queueing IRP %x\n", Irp);
if( Status == STATUS_PENDING )
{
default:
AFD_DbgPrint(MID_TRACE,("Inappropriate socket state %d for connect\n",
FCB->State));
- DbgPrint("[AfdStreamSocketConnect] Inappropriate socket state %d for connect\n",
+ DbgPrint("[AFD, AfdStreamSocketConnect] Inappropriate socket state %d for connect\n",
FCB->State);
break;
}
DbgPrint("[IP, TCPAcceptEventHandler] Trying to unlock Bucket->AssociatedEndpoint\n");
UnlockObject(Bucket->AssociatedEndpoint, OldIrql);
+
+ /* free socket context created in FileOpenConnection, as we're using a new
+ one; we free it asynchornously because otherwise we create a dedlock */
+ ChewCreate(SocketContextCloseWorker, OldSocketContext);
}
DereferenceObject(Bucket->AssociatedEndpoint);
}
DereferenceObject(Connection);
-
- /* free socket context created in FileOpenConnection, as we're using a new
- one; we free it asynchornously because otherwise we create a dedlock */
- ChewCreate(SocketContextCloseWorker, OldSocketContext);
}
VOID
LockObject(Connection, &OldIrql);
- if (Flags & TDI_DISCONNECT_RELEASE)
+ if (Connection->SocketContext)
{
- Status = LibTCPShutdown(Connection->SocketContext, 0, 1);
- }
+ if (Flags & TDI_DISCONNECT_RELEASE)
+ {
+ Status = TCPTranslateError(LibTCPShutdown(Connection->SocketContext, 0, 1));
+ }
- if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
+ if ((Flags & TDI_DISCONNECT_ABORT) || !Flags)
+ {
+ Status = TCPTranslateError(LibTCPShutdown(Connection->SocketContext, 1, 1));
+ }
+ }
+ else
{
- Status = LibTCPShutdown(Connection->SocketContext, 1, 1);
+ /* We already got closed by the other side so just return success */
+ DbgPrint("[IP, TCPDisconnect] Socket was alraedy clsoed on the other side\n");
+ Status = STATUS_SUCCESS;
}
DbgPrint("LibTCPShutdown: %x\n", Status);