diff --git a/reactos/lib/drivers/ip/transport/tcp/accept.c b/reactos/lib/drivers/ip/transport/tcp/accept.c index 7fcddda3229..ab47b9da101 100644 --- a/reactos/lib/drivers/ip/transport/tcp/accept.c +++ b/reactos/lib/drivers/ip/transport/tcp/accept.c @@ -12,6 +12,8 @@ #include "rosip.h" +extern NPAGED_LOOKASIDE_LIST TdiBucketLookasideList; + NTSTATUS TCPCheckPeerForAccept(PVOID Context, PTDI_REQUEST_KERNEL Request) { @@ -118,7 +120,7 @@ BOOLEAN TCPAbortListenForSocket { DereferenceObject(Bucket->AssociatedEndpoint); RemoveEntryList( &Bucket->Entry ); - ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG ); + ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket); Found = TRUE; break; } @@ -143,9 +145,7 @@ NTSTATUS TCPAccept ( PTDI_REQUEST Request, LockObject(Listener, &OldIrql); - Bucket = (PTDI_BUCKET)ExAllocatePoolWithTag(NonPagedPool, - sizeof(*Bucket), - TDI_BUCKET_TAG ); + Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList); if (Bucket) { diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 40cfafd9561..ad0e00bfd7a 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -30,6 +30,8 @@ static const char * const tcp_state_str[] = { "TIME_WAIT" }; +extern NPAGED_LOOKASIDE_LIST TdiBucketLookasideList; + static VOID BucketCompletionWorker(PVOID Context) @@ -43,7 +45,7 @@ BucketCompletionWorker(PVOID Context) DereferenceObject(Bucket->AssociatedEndpoint); - ExFreePoolWithTag(Bucket, TDI_BUCKET_TAG); + ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket); } VOID diff --git a/reactos/lib/drivers/ip/transport/tcp/tcp.c b/reactos/lib/drivers/ip/transport/tcp/tcp.c index aa48a165a9b..dc8afbf5af6 100644 --- a/reactos/lib/drivers/ip/transport/tcp/tcp.c +++ b/reactos/lib/drivers/ip/transport/tcp/tcp.c @@ -23,6 +23,8 @@ PORT_SET TCPPorts; #include "rosip.h" +NPAGED_LOOKASIDE_LIST TdiBucketLookasideList; + VOID NTAPI DisconnectTimeoutDpc(PKDPC Dpc, PVOID DeferredContext, @@ -85,8 +87,8 @@ VOID ConnectionFree(PVOID Object) PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) { PCONNECTION_ENDPOINT Connection = (PCONNECTION_ENDPOINT) - ExAllocatePoolWithTag(NonPagedPool, sizeof(CONNECTION_ENDPOINT), - CONN_ENDPT_TAG); + ExAllocatePoolWithTag(NonPagedPool, sizeof(CONNECTION_ENDPOINT), CONN_ENDPT_TAG); + if (!Connection) return Connection; @@ -196,6 +198,14 @@ NTSTATUS TCPStartup(VOID) { return Status; } + + ExInitializeNPagedLookasideList(&TdiBucketLookasideList, + NULL, + NULL, + 0, + sizeof(TDI_BUCKET), + TDI_BUCKET_TAG, + 0); /* Initialize our IP library */ LibIPInitialize(); @@ -218,6 +228,8 @@ NTSTATUS TCPShutdown(VOID) { if (!TCPInitialized) return STATUS_SUCCESS; + + ExDeleteNPagedLookasideList(&TdiBucketLookasideList); LibIPShutdown(); @@ -348,7 +360,7 @@ NTSTATUS TCPConnect { connaddr.addr = RemoteAddress.Address.IPv4Address; - Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG ); + Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList); if (!Bucket) { UnlockObject(Connection, OldIrql); @@ -418,13 +430,13 @@ NTSTATUS TCPDisconnect } /* We couldn't complete the request now because we need to wait for outstanding I/O */ - Bucket = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG); + Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList); if (!Bucket) { UnlockObject(Connection, OldIrql); return STATUS_NO_MEMORY; } - + Bucket->Request.RequestNotifyObject = (PVOID)Complete; Bucket->Request.RequestContext = Context; @@ -485,7 +497,7 @@ NTSTATUS TCPReceiveData if (Status == STATUS_PENDING) { - Bucket = ExAllocatePoolWithTag(NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG); + Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList); if (!Bucket) { TI_DbgPrint(DEBUG_TCP,("[IP, TCPReceiveData] Failed to allocate bucket\n")); @@ -544,7 +556,7 @@ NTSTATUS TCPSendData if (Status == STATUS_PENDING) { /* Freed in TCPSocketState */ - Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), TDI_BUCKET_TAG ); + Bucket = ExAllocateFromNPagedLookasideList(&TdiBucketLookasideList); if (!Bucket) { UnlockObject(Connection, OldIrql); @@ -659,7 +671,7 @@ BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) if( Bucket->Request.RequestContext == Irp ) { RemoveEntryList( &Bucket->Entry ); - ExFreePoolWithTag( Bucket, TDI_BUCKET_TAG ); + ExFreeToNPagedLookasideList(&TdiBucketLookasideList, Bucket); Found = TRUE; break; }