#include "precomp.h"
+/* Listener->Lock MUST be acquired */
NTSTATUS TCPServiceListeningSocket( PCONNECTION_ENDPOINT Listener,
PCONNECTION_ENDPOINT Connection,
PTDI_REQUEST_KERNEL Request ) {
PTA_IP_ADDRESS RequestAddressReturn;
PTDI_CONNECTION_INFORMATION WhoIsConnecting;
- ASSERT_LOCKED(&TCPLock);
-
/* Unpack TDI info -- We need the return connection information
* struct to return the address so it can be filtered if needed
* by WSAAccept -- The returned address will be passed on to
Status = TCPTranslateError
( OskitTCPAccept( Listener->SocketContext,
&Connection->SocketContext,
+ Connection,
&OutAddr,
sizeof(OutAddr),
&OutAddrLen,
NTSTATUS TCPListen( PCONNECTION_ENDPOINT Connection, UINT Backlog ) {
NTSTATUS Status = STATUS_SUCCESS;
SOCKADDR_IN AddressToBind;
-
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ KIRQL OldIrql;
ASSERT(Connection);
- ASSERT_KM_POINTER(Connection->SocketContext);
ASSERT_KM_POINTER(Connection->AddressFile);
+ LockObject(Connection, &OldIrql);
+
TI_DbgPrint(DEBUG_TCP,("TCPListen started\n"));
TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
if (NT_SUCCESS(Status))
Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, Backlog ) );
- TcpipRecursiveMutexLeave( &TCPLock );
+ UnlockObject(Connection, OldIrql);
TI_DbgPrint(DEBUG_TCP,("TCPListen finished %x\n", Status));
return Status;
}
-VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
+BOOLEAN TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
PCONNECTION_ENDPOINT Connection ) {
PLIST_ENTRY ListEntry;
PTDI_BUCKET Bucket;
KIRQL OldIrql;
+ BOOLEAN Found = FALSE;
- KeAcquireSpinLock(&Listener->Lock, &OldIrql);
+ LockObject(Listener, &OldIrql);
ListEntry = Listener->ListenRequest.Flink;
while ( ListEntry != &Listener->ListenRequest ) {
if( Bucket->AssociatedEndpoint == Connection ) {
RemoveEntryList( &Bucket->Entry );
- exFreePool( Bucket );
+ ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG );
+ Found = TRUE;
break;
}
ListEntry = ListEntry->Flink;
}
- KeReleaseSpinLock(&Listener->Lock, OldIrql);
+ UnlockObject(Listener, OldIrql);
+
+ return Found;
}
NTSTATUS TCPAccept ( PTDI_REQUEST Request,
{
NTSTATUS Status;
PTDI_BUCKET Bucket;
+ KIRQL OldIrql;
TI_DbgPrint(DEBUG_TCP,("TCPAccept started\n"));
- TcpipRecursiveMutexEnter( &TCPLock, TRUE );
+ LockObject(Listener, &OldIrql);
Status = TCPServiceListeningSocket( Listener, Connection,
(PTDI_REQUEST_KERNEL)Request );
- TcpipRecursiveMutexLeave( &TCPLock );
-
if( Status == STATUS_PENDING ) {
- Bucket = exAllocatePool( NonPagedPool, sizeof(*Bucket) );
+ Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket),
+ TDI_BUCKET_TAG );
if( Bucket ) {
+ ReferenceObject(Connection);
Bucket->AssociatedEndpoint = Connection;
Bucket->Request.RequestNotifyObject = Complete;
Bucket->Request.RequestContext = Context;
- IoMarkIrpPending((PIRP)Context);
- ExInterlockedInsertTailList( &Listener->ListenRequest, &Bucket->Entry, &Listener->Lock );
+ InsertTailList( &Listener->ListenRequest, &Bucket->Entry );
} else
Status = STATUS_NO_MEMORY;
}
+ UnlockObject(Listener, OldIrql);
+
TI_DbgPrint(DEBUG_TCP,("TCPAccept finished %x\n", Status));
return Status;
}