Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

641 lines
19 KiB

/*++
Copyright (c) 1998-2002 Microsoft Corporation
Module Name:
data.c
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;
BOOLEAN g_HttpClientEnabled; // Will be initialized in init.c
//
// The largest cache line size the system
//
ULONG g_UlCacheLineSize = 0;
ULONG g_UlCacheLineBits = 0; // see init.c
//
// Total memory in the system
//
SIZE_T g_UlTotalPhysicalMemMB = 0;
SIZE_T g_UlTotalNonPagedPoolBytes = 0;
//
// 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;
PDEVICE_OBJECT g_pUcServerDeviceObject = NULL;
//
// This handle references all the client functions. This allows us to quickly
// demand page the client code.
//
PVOID g_ClientImageHandle = NULL;
//
// Cached Date header string.
//
LARGE_INTEGER g_UlSystemTime;
UCHAR g_UlDateString[DATE_HDR_LENGTH+1];
ULONG g_UlDateStringLength;
//
// Security descriptor that has fileAll for Admin & Local System
//
PSECURITY_DESCRIPTOR g_pAdminAllSystemAll;
//
// ComputerName string.
//
WCHAR g_UlComputerName[MAX_COMPUTER_NAME_LEN+1];
//
// Error logging config
//
HTTP_ERROR_LOGGING_CONFIG g_UlErrLoggingConfig;
//
// Various pieces of configuration information, with default values.
//
ULONG g_UlMaxWorkQueueDepth = DEFAULT_MAX_WORK_QUEUE_DEPTH;
ULONG g_UlMinWorkDequeueDepth = DEFAULT_MIN_WORK_DEQUEUE_DEPTH;
USHORT g_UlIdleConnectionsHighMark = DEFAULT_IDLE_CONNECTIONS_HIGH_MARK;
USHORT g_UlIdleConnectionsLowMark = DEFAULT_IDLE_CONNECTIONS_LOW_MARK;
ULONG g_UlIdleListTrimmerPeriod = DEFAULT_IDLE_LIST_TRIMMER_PERIOD;
USHORT g_UlMaxEndpoints = DEFAULT_MAX_ENDPOINTS;
ULONG g_UlReceiveBufferSize = DEFAULT_RCV_BUFFER_SIZE;
ULONG g_UlMaxRequestBytes = DEFAULT_MAX_REQUEST_BYTES;
BOOLEAN g_UlOptForIntrMod = DEFAULT_OPT_FOR_INTR_MOD;
BOOLEAN g_UlEnableNagling = DEFAULT_ENABLE_NAGLING;
BOOLEAN g_UlEnableThreadAffinity = DEFAULT_ENABLE_THREAD_AFFINITY;
ULONG g_UlMaxFieldLength = DEFAULT_MAX_FIELD_LENGTH;
BOOLEAN g_UlDisableLogBuffering = DEFAULT_DISABLE_LOG_BUFFERING;
ULONG g_UlLogBufferSize = DEFAULT_LOG_BUFFER_SIZE;
ULONG g_UlResponseBufferSize = DEFAULT_RESP_BUFFER_SIZE;
URL_C14N_CONFIG g_UrlC14nConfig;
ULONG g_UlMaxInternalUrlLength = DEFAULT_MAX_INTERNAL_URL_LENGTH;
ULONG g_UlMaxBufferedBytes = DEFAULT_MAX_BUFFERED_BYTES;
ULONG g_UlMaxCopyThreshold = DEFAULT_MAX_COPY_THRESHOLD;
ULONG g_UlMaxBufferedSends = DEFAULT_MAX_BUFFERED_SENDS;
ULONG g_UlMaxBytesPerSend = DEFAULT_MAX_BYTES_PER_SEND;
ULONG g_UlMaxBytesPerRead = DEFAULT_MAX_BYTES_PER_READ;
ULONG g_UlMaxPipelinedRequests = DEFAULT_MAX_PIPELINED_REQUESTS;
BOOLEAN g_UlEnableCopySend = DEFAULT_ENABLE_COPY_SEND;
ULONG g_UlOpaqueIdTableSize = DEFAULT_OPAQUE_ID_TABLE_SIZE;
ULONG g_UlMaxZombieHttpConnectionCount = DEFAULT_MAX_ZOMBIE_HTTP_CONN_COUNT;
ULONG g_UlDisableServerHeader = DEFAULT_DISABLE_SERVER_HEADER;
ULONG g_UlConnectionSendLimit = DEFAULT_CONNECTION_SEND_LIMIT;
ULONGLONG g_UlGlobalSendLimit = DEFAULT_GLOBAL_SEND_LIMIT;
//
// 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;
ULONG g_UlMaxRequestsQueued = (ULONG) DEFAULT_MAX_REQUESTS_QUEUED;
//
// Make life easier for the debugger extension.
//
#if DBG
ULONG g_UlCheckedBuild = TRUE;
#else
ULONG g_UlCheckedBuild = FALSE;
#endif
//
// Debug stuff.
//
#if DBG
ULONGLONG g_UlDebug = DEFAULT_DEBUG_FLAGS;
ULONG g_UlBreakOnError = DEFAULT_BREAK_ON_ERROR;
ULONG g_UlVerboseErrors = DEFAULT_VERBOSE_ERRORS;
#endif // DBG
#if REFERENCE_DEBUG
// If you add tracelogs here, please update !ulkd.glob
PTRACE_LOG g_pEndpointUsageTraceLog = NULL;
PTRACE_LOG g_pMondoGlobalTraceLog = NULL;
PTRACE_LOG g_pPoolAllocTraceLog = NULL;
PTRACE_LOG g_pUriTraceLog = 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_pAppPoolProcessTraceLog = NULL;
PTRACE_LOG g_pConfigGroupTraceLog = NULL;
PTRACE_LOG g_pControlChannelTraceLog = NULL;
PTRACE_LOG g_pThreadTraceLog = NULL;
PTRACE_LOG g_pFilterTraceLog = NULL;
PTRACE_LOG g_pIrpTraceLog = NULL;
PTRACE_LOG g_pTimeTraceLog = NULL;
PTRACE_LOG g_pAppPoolTimeTraceLog = NULL;
PTRACE_LOG g_pReplenishTraceLog = 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;
PTRACE_LOG g_pUcTraceLog = NULL;
#endif // REFERENCE_DEBUG
PSTRING_LOG g_pGlobalStringLog = NULL;
//
// Generic access map for url acls
//
GENERIC_MAPPING g_UrlAccessGenericMapping = {
0,
HTTP_ALLOW_DELEGATE_URL,
HTTP_ALLOW_REGISTER_URL,
HTTP_ALLOW_DELEGATE_URL | HTTP_ALLOW_REGISTER_URL
};
//
// 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;
//
// MDL Length for FixedHeaders or UserBuffer.
//
g_UlFixedHeadersMdlLength = (ULONG)
MmSizeOfMdl(
(PVOID)(PAGE_SIZE - 1),
MAX(
g_UlMaxBytesPerSend,
g_UlMaxFixedHeaderSize
)
);
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 the default internal response buffer size.
//
if (DEFAULT_RESP_BUFFER_SIZE == g_UlResponseBufferSize)
{
g_UlResponseBufferSize =
ALIGN_UP(sizeof(UL_INTERNAL_RESPONSE), PVOID) +
UL_LOCAL_CHUNKS * sizeof(UL_INTERNAL_DATA_CHUNK) +
g_UlMaxVariableHeaderSize +
g_UlMaxFixedHeaderSize;
}
//
// Initialize chunk and cache tracker size.
//
g_UlChunkTrackerSize =
ALIGN_UP(sizeof(UL_CHUNK_TRACKER), PVOID) +
ALIGN_UP(IoSizeOfIrp(DEFAULT_MAX_IRP_STACK_SIZE), PVOID);
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);
if (DEFAULT_MAX_COPY_THRESHOLD == g_UlMaxCopyThreshold &&
g_UlFullTrackerSize > UL_PAGE_SIZE &&
(g_UlFullTrackerSize - UL_PAGE_SIZE) < (g_UlMaxFixedHeaderSize / 2))
{
g_UlMaxFixedHeaderSize -= (g_UlFullTrackerSize - UL_PAGE_SIZE);
g_UlFullTrackerSize = UL_PAGE_SIZE;
ASSERT(g_UlMaxFixedHeaderSize >= DEFAULT_MAX_FIXED_HEADER_SIZE / 2);
}
if (DEFAULT_GLOBAL_SEND_LIMIT == g_UlGlobalSendLimit)
{
//
// Set GlobalSendLimit based on the size of NonPagedPool. Our
// rudimentary algorithm says we want to use 1/8 of the total NPP
// memory.
//
g_UlGlobalSendLimit = g_UlTotalNonPagedPoolBytes / 8;
}
//
// 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->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->LogFileBufferLookaside =
PplCreatePool(
&UlAllocateLogFileBufferPool, // Allocate
&UlFreeLogFileBufferPool, // Free
0, // Flags
sizeof(UL_LOG_FILE_BUFFER), // Size
UL_LOG_FILE_BUFFER_POOL_TAG, // Tag
pConfig->LogFileBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->LogFileBufferLookaside)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
g_pUlNonpagedData->BinaryLogDataBufferLookaside =
PplCreatePool(
&UlAllocateLogDataBufferPool, // Allocate
&UlFreeLogDataBufferPool, // Free
0, // Flags
sizeof(UL_LOG_DATA_BUFFER) + UL_BINARY_LOG_LINE_BUFFER_SIZE, // Size
UL_BINARY_LOG_DATA_BUFFER_POOL_TAG, // Tag
pConfig->LogDataBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->BinaryLogDataBufferLookaside)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
g_pUlNonpagedData->AnsiLogDataBufferLookaside =
PplCreatePool(
&UlAllocateLogDataBufferPool, // Allocate
&UlFreeLogDataBufferPool, // Free
0, // Flags
sizeof(UL_LOG_DATA_BUFFER) + UL_ANSI_LOG_LINE_BUFFER_SIZE, // Size
UL_ANSI_LOG_DATA_BUFFER_POOL_TAG, // Tag
pConfig->LogDataBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->AnsiLogDataBufferLookaside)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
g_pUlNonpagedData->ErrorLogBufferLookaside =
PplCreatePool(
&UlAllocateErrorLogBufferPool, // Allocate
&UlFreeErrorLogBufferPool, // Free
0, // Flags
UL_ERROR_LOG_BUFFER_SIZE, // Size
UL_ERROR_LOG_BUFFER_POOL_TAG, // Tag
pConfig->ErrorLogBufferLookasideDepth // Depth
);
if (!g_pUlNonpagedData->ErrorLogBufferLookaside)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
return STATUS_SUCCESS;
} // UlInitializeData
/***************************************************************************++
Routine Description:
Performs global data termination.
--***************************************************************************/
VOID
UlTerminateData(
VOID
)
{
//
// Sanity check.
//
PAGED_CODE();
ASSERT(g_UlTotalSendBytes == 0);
if (g_pUlNonpagedData != NULL)
{
//
// Kill the lookaside lists.
//
if (g_pUlNonpagedData->IrpContextLookaside)
{
PplDestroyPool( g_pUlNonpagedData->IrpContextLookaside, UL_IRP_CONTEXT_POOL_TAG);
}
if (g_pUlNonpagedData->ReceiveBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->ReceiveBufferLookaside, UL_RCV_BUFFER_POOL_TAG );
}
if (g_pUlNonpagedData->RequestBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->RequestBufferLookaside, UL_REQUEST_BUFFER_POOL_TAG );
}
if (g_pUlNonpagedData->InternalRequestLookaside)
{
PplDestroyPool( g_pUlNonpagedData->InternalRequestLookaside, UL_INTERNAL_REQUEST_POOL_TAG );
}
if (g_pUlNonpagedData->ChunkTrackerLookaside)
{
PplDestroyPool( g_pUlNonpagedData->ChunkTrackerLookaside, UL_CHUNK_TRACKER_POOL_TAG );
}
if (g_pUlNonpagedData->FullTrackerLookaside)
{
PplDestroyPool( g_pUlNonpagedData->FullTrackerLookaside, UL_FULL_TRACKER_POOL_TAG );
}
if (g_pUlNonpagedData->ResponseBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->ResponseBufferLookaside, UL_INTERNAL_RESPONSE_POOL_TAG );
}
if (g_pUlNonpagedData->LogFileBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->LogFileBufferLookaside, UL_LOG_FILE_BUFFER_POOL_TAG );
}
if (g_pUlNonpagedData->BinaryLogDataBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->BinaryLogDataBufferLookaside,UL_BINARY_LOG_DATA_BUFFER_POOL_TAG );
}
if (g_pUlNonpagedData->AnsiLogDataBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->AnsiLogDataBufferLookaside,UL_ANSI_LOG_DATA_BUFFER_POOL_TAG );
}
if (g_pUlNonpagedData->ErrorLogBufferLookaside)
{
PplDestroyPool( g_pUlNonpagedData->ErrorLogBufferLookaside,UL_ERROR_LOG_BUFFER_POOL_TAG );
}
//
// Free the nonpaged data.
//
UL_FREE_POOL( g_pUlNonpagedData, UL_NONPAGED_DATA_POOL_TAG );
}
} // UlTerminateData