|
|
/*++
Copyright (c) 1998-2001 Microsoft Corporation
Module Name:
data.cxx
Abstract:
This module contains global data for UL.
Author:
Keith Moore (keithmo) 10-Jun-1998
Revision History:
--*/
#include "precomp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text( INIT, UlInitializeData )
#pragma alloc_text( PAGE, UlTerminateData )
#endif // ALLOC_PRAGMA
//
// The number of processors in the system.
//
CLONG g_UlNumberOfProcessors = 1; ULONGLONG g_UlThreadAffinityMask = 1;
//
// The largest cache line size the system
//
ULONG g_UlCacheLineSize = 0; ULONG g_UlCacheLineBits = 0; // see init.cxx
//
// Our nonpaged data.
//
PUL_NONPAGED_DATA g_pUlNonpagedData = NULL;
//
// A pointer to the system process.
//
PKPROCESS g_pUlSystemProcess = NULL;
//
// Our device objects and their container.
//
HANDLE g_UlDirectoryObject = NULL;
PDEVICE_OBJECT g_pUlControlDeviceObject = NULL; PDEVICE_OBJECT g_pUlFilterDeviceObject = NULL; PDEVICE_OBJECT g_pUlAppPoolDeviceObject = NULL;
//
// Cached Date header string.
//
LARGE_INTEGER g_UlSystemTime; UCHAR g_UlDateString[DATE_HDR_LENGTH+1]; ULONG g_UlDateStringLength;
//
// Various pieces of configuration information, with default values.
//
CCHAR g_UlPriorityBoost = DEFAULT_PRIORITY_BOOST; CCHAR g_UlIrpStackSize = DEFAULT_IRP_STACK_SIZE; USHORT g_UlMinIdleConnections = DEFAULT_MIN_IDLE_CONNECTIONS; USHORT g_UlMaxIdleConnections = DEFAULT_MAX_IDLE_CONNECTIONS; ULONG g_UlReceiveBufferSize = DEFAULT_RCV_BUFFER_SIZE; ULONG g_UlMaxRequestBytes = DEFAULT_MAX_REQUEST_BYTES; BOOLEAN g_UlEnableConnectionReuse = DEFAULT_ENABLE_CONNECTION_REUSE; BOOLEAN g_UlEnableNagling = DEFAULT_ENABLE_NAGLING; BOOLEAN g_UlEnableThreadAffinity = DEFAULT_ENABLE_THREAD_AFFINITY; ULONG g_UlMaxUrlLength = DEFAULT_MAX_URL_LENGTH; ULONG g_UlMaxFieldLength = DEFAULT_MAX_FIELD_LENGTH; USHORT g_UlDebugLogTimerCycle = DEFAULT_DEBUG_LOGTIMER_CYCLE; USHORT g_UlDebugLogBufferPeriod = DEFAULT_DEBUG_LOG_BUFFER_PERIOD; ULONG g_UlLogBufferSize = DEFAULT_LOG_BUFFER_SIZE; BOOLEAN g_UlEnableNonUTF8 = DEFAULT_ENABLE_NON_UTF8_URL; BOOLEAN g_UlEnableDBCS = DEFAULT_ENABLE_DBCS_URL; BOOLEAN g_UlFavorDBCS = DEFAULT_FAVOR_DBCS_URL; USHORT g_UlMaxInternalUrlLength = DEFAULT_MAX_INTERNAL_URL_LENGTH; ULONG g_UlResponseBufferSize = DEFAULT_RESP_BUFFER_SIZE; ULONG g_UlMaxBufferedBytes = DEFAULT_MAX_BUFFERED_BYTES; ULONG g_UlMaxCopyThreshold = DEFAULT_MAX_COPY_THRESHOLD; ULONG g_UlMaxSendBufferedBytes = DEFAULT_MAX_SEND_BUFFERED_BYTES; ULONG g_UlMaxWorkQueueDepth = DEFAULT_MAX_WORK_QUEUE_DEPTH; ULONG g_UlMinWorkDequeueDepth = DEFAULT_MIN_WORK_DEQUEUE_DEPTH; ULONG g_UlOpaqueIdTableSize = DEFAULT_OPAQUE_ID_TABLE_SIZE;
//
// The following are generated during initialization.
//
ULONG g_UlMaxVariableHeaderSize = 0; ULONG g_UlMaxFixedHeaderSize = 0; ULONG g_UlFixedHeadersMdlLength = 0; ULONG g_UlVariableHeadersMdlLength = 0; ULONG g_UlContentMdlLength = 0; ULONG g_UlChunkTrackerSize = 0; ULONG g_UlFullTrackerSize = 0;
//
// Make life easier for the debugger extension.
//
#if DBG
ULONG g_UlCheckedBuild = TRUE; #else
ULONG g_UlCheckedBuild = FALSE; #endif
//
// Debug stuff.
//
#if DBG
ULONG g_UlDebug = DEFAULT_DEBUG_FLAGS; ULONG g_UlBreakOnError = DEFAULT_BREAK_ON_ERROR; ULONG g_UlVerboseErrors = DEFAULT_VERBOSE_ERRORS; UL_DEBUG_STATISTICS_INFO g_UlDebugStats = { 0 }; #endif // DBG
#if REFERENCE_DEBUG
PTRACE_LOG g_pMondoGlobalTraceLog = NULL; PTRACE_LOG g_pTdiTraceLog = NULL; PTRACE_LOG g_pHttpRequestTraceLog = NULL; PTRACE_LOG g_pHttpConnectionTraceLog = NULL; PTRACE_LOG g_pHttpResponseTraceLog = NULL; PTRACE_LOG g_pAppPoolTraceLog = NULL; PTRACE_LOG g_pConfigGroupTraceLog = NULL; PTRACE_LOG g_pThreadTraceLog = NULL; PTRACE_LOG g_pFilterTraceLog = NULL; PTRACE_LOG g_pIrpTraceLog = NULL; PTRACE_LOG g_pTimeTraceLog = NULL; PTRACE_LOG g_pReplenishTraceLog = NULL; PTRACE_LOG g_pFilterQueueTraceLog = NULL; PTRACE_LOG g_pMdlTraceLog = NULL; PTRACE_LOG g_pSiteCounterTraceLog = NULL; PTRACE_LOG g_pConnectionCountTraceLog = NULL; PTRACE_LOG g_pConfigGroupInfoTraceLog = NULL; PTRACE_LOG g_pChunkTrackerTraceLog = NULL; PTRACE_LOG g_pWorkItemTraceLog = NULL;
#endif // REFERENCE_DEBUG
//
// Public functions.
//
/***************************************************************************++
Routine Description:
Performs global data initialization.
Return Value:
NTSTATUS - Completion status.
--***************************************************************************/ NTSTATUS UlInitializeData( PUL_CONFIG pConfig ) { //
// Sanity check.
//
PAGED_CODE();
//
// Initialize the nonpaged data.
//
g_pUlNonpagedData = UL_ALLOCATE_STRUCT( NonPagedPool, UL_NONPAGED_DATA, UL_NONPAGED_DATA_POOL_TAG );
if (g_pUlNonpagedData == NULL ) { return STATUS_INSUFFICIENT_RESOURCES; }
RtlZeroMemory(g_pUlNonpagedData, sizeof(*g_pUlNonpagedData));
#if DBG
//
// Initialize any debug-specific data.
//
UlDbgInitializeDebugData( ); #endif // DBG
//
// Initialize the maximum variable header size.
//
g_UlMaxVariableHeaderSize = UlComputeMaxVariableHeaderSize(); g_UlMaxVariableHeaderSize = ALIGN_UP(g_UlMaxVariableHeaderSize, PVOID);
g_UlMaxFixedHeaderSize = DEFAULT_MAX_FIXED_HEADER_SIZE;
//
// Initialize the maximum cache Mdl length.
//
ASSERT( g_UlMaxFixedHeaderSize <= MAX_BYTES_BUFFERED ); ASSERT( g_UlMaxVariableHeaderSize <= MAX_BYTES_BUFFERED ); ASSERT( g_UlMaxCopyThreshold <= MAX_BYTES_BUFFERED );
//
// MDL Length for FixedHeaders or UserBuffer.
//
g_UlFixedHeadersMdlLength = (ULONG) MmSizeOfMdl( (PVOID)(PAGE_SIZE - 1), MAX_BYTES_BUFFERED );
g_UlFixedHeadersMdlLength = ALIGN_UP(g_UlFixedHeadersMdlLength, PVOID);
//
// MDL Length for VariableHeaders or FixedHeaders + VariablesHeaders +
// CopiedBuffer.
//
g_UlVariableHeadersMdlLength = (ULONG) MmSizeOfMdl( (PVOID)(PAGE_SIZE - 1), g_UlMaxFixedHeaderSize + g_UlMaxVariableHeaderSize + g_UlMaxCopyThreshold );
g_UlVariableHeadersMdlLength = ALIGN_UP(g_UlVariableHeadersMdlLength, PVOID);
//
// MDL Length for Content.
//
g_UlContentMdlLength = (ULONG) MmSizeOfMdl( (PVOID)(PAGE_SIZE - 1), pConfig->UriConfig.MaxUriBytes );
g_UlContentMdlLength = ALIGN_UP(g_UlContentMdlLength, PVOID);
//
// Initialize chunk and cache tracker size.
//
g_UlChunkTrackerSize = ALIGN_UP(sizeof(UL_CHUNK_TRACKER), PVOID) + 2 * ALIGN_UP(IoSizeOfIrp(DEFAULT_MAX_IRP_STACK_SIZE), PVOID) + g_UlMaxVariableHeaderSize;
g_UlFullTrackerSize = ALIGN_UP(sizeof(UL_FULL_TRACKER), PVOID) + ALIGN_UP(IoSizeOfIrp(DEFAULT_MAX_IRP_STACK_SIZE), PVOID) + g_UlMaxFixedHeaderSize + g_UlMaxVariableHeaderSize + g_UlMaxCopyThreshold + g_UlFixedHeadersMdlLength + g_UlVariableHeadersMdlLength + g_UlContentMdlLength;
g_UlFullTrackerSize = ALIGN_UP(g_UlFullTrackerSize, PVOID);
//
// Initialize the lookaside lists.
//
g_pUlNonpagedData->IrpContextLookaside = PplCreatePool( &UlAllocateIrpContextPool, // Allocate
&UlFreeIrpContextPool, // Free
0, // Flags
sizeof(UL_IRP_CONTEXT), // Size
UL_IRP_CONTEXT_POOL_TAG, // Tag
pConfig->IrpContextLookasideDepth // Depth
);
if (!g_pUlNonpagedData->IrpContextLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->ReceiveBufferLookaside = PplCreatePool( &UlAllocateReceiveBufferPool, // Allocate
&UlFreeReceiveBufferPool, // Free
0, // Flags
sizeof(UL_RECEIVE_BUFFER), // Size
UL_RCV_BUFFER_POOL_TAG, // Tag
pConfig->ReceiveBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->ReceiveBufferLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->ResponseBufferLookaside = PplCreatePool( &UlAllocateResponseBufferPool, // Allocate
&UlFreeResponseBufferPool, // Free
0, // Flags
g_UlResponseBufferSize, // Size
UL_INTERNAL_RESPONSE_POOL_TAG, // Tag
pConfig->ResponseBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->ResponseBufferLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->ResourceLookaside = PplCreatePool( &UlResourceAllocatePool, // Allocate
&UlResourceFreePool, // Free
0, // Flags
sizeof(UL_NONPAGED_RESOURCE), // Size
UL_NONPAGED_RESOURCE_POOL_TAG, // Tag
pConfig->ResourceLookasideDepth // Depth
);
if (!g_pUlNonpagedData->ResourceLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->RequestBufferLookaside = PplCreatePool( &UlAllocateRequestBufferPool, // Allocate
&UlFreeRequestBufferPool, // Free
0, // Flags
DEFAULT_MAX_REQUEST_BUFFER_SIZE, // Size
UL_REQUEST_BUFFER_POOL_TAG, // Tag
pConfig->RequestBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->RequestBufferLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->InternalRequestLookaside = PplCreatePool( &UlAllocateInternalRequestPool, // Allocate
&UlFreeInternalRequestPool, // Free
0, // Flags
sizeof(UL_INTERNAL_REQUEST), // Size
UL_INTERNAL_REQUEST_POOL_TAG, // Tag
pConfig->InternalRequestLookasideDepth // Depth
);
if (!g_pUlNonpagedData->InternalRequestLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->ChunkTrackerLookaside = PplCreatePool( &UlAllocateChunkTrackerPool, // Allocate
&UlFreeChunkTrackerPool, // Free
0, // Flags
g_UlChunkTrackerSize, // Size
UL_CHUNK_TRACKER_POOL_TAG, // Tag
pConfig->SendTrackerLookasideDepth // Depth
);
if (!g_pUlNonpagedData->ChunkTrackerLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->FullTrackerLookaside = PplCreatePool( &UlAllocateFullTrackerPool, // Allocate
&UlFreeFullTrackerPool, // Free
0, // Flags
g_UlFullTrackerSize, // Size
UL_FULL_TRACKER_POOL_TAG, // Tag
pConfig->SendTrackerLookasideDepth // Depth
);
if (!g_pUlNonpagedData->FullTrackerLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
g_pUlNonpagedData->LogBufferLookaside = PplCreatePool( &UlAllocateLogBufferPool, // Allocate
&UlFreeLogBufferPool, // Free
0, // Flags
sizeof(UL_LOG_FILE_BUFFER), // Size
UL_LOG_FILE_BUFFER_POOL_TAG, // Tag
pConfig->LogBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->LogBufferLookaside) { return STATUS_INSUFFICIENT_RESOURCES; }
return STATUS_SUCCESS;
} // UlInitializeData
/***************************************************************************++
Routine Description:
Performs global data termination.
--***************************************************************************/ VOID UlTerminateData( VOID ) { //
// Sanity check.
//
PAGED_CODE();
if (g_pUlNonpagedData != NULL) { //
// Kill the lookaside lists.
//
if (g_pUlNonpagedData->IrpContextLookaside) { PplDestroyPool( g_pUlNonpagedData->IrpContextLookaside ); }
if (g_pUlNonpagedData->ReceiveBufferLookaside) { PplDestroyPool( g_pUlNonpagedData->ReceiveBufferLookaside ); }
if (g_pUlNonpagedData->ResourceLookaside) { PplDestroyPool( g_pUlNonpagedData->ResourceLookaside ); }
if (g_pUlNonpagedData->RequestBufferLookaside) { PplDestroyPool( g_pUlNonpagedData->RequestBufferLookaside ); }
if (g_pUlNonpagedData->InternalRequestLookaside) { PplDestroyPool( g_pUlNonpagedData->InternalRequestLookaside ); }
if (g_pUlNonpagedData->ChunkTrackerLookaside) { PplDestroyPool( g_pUlNonpagedData->ChunkTrackerLookaside ); }
if (g_pUlNonpagedData->FullTrackerLookaside) { PplDestroyPool( g_pUlNonpagedData->FullTrackerLookaside ); }
if (g_pUlNonpagedData->ResponseBufferLookaside) { PplDestroyPool( g_pUlNonpagedData->ResponseBufferLookaside ); }
if (g_pUlNonpagedData->LogBufferLookaside) { PplDestroyPool( g_pUlNonpagedData->LogBufferLookaside ); }
//
// Free the nonpaged data.
//
UL_FREE_POOL( g_pUlNonpagedData, UL_NONPAGED_DATA_POOL_TAG ); }
} // UlTerminateData
|