|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
globals.cxx
Abstract:
This module contains global variable definitions shared by the various W3 Service components.
Author: KeithMo 07-Mar-1993 Created.
--*/
#include "w3p.hxx"
#include <time.h>
#include <timer.h>
//
// Locks
//
CRITICAL_SECTION csGlobalLock;
//
// User database related data.
//
DWORD cConnectedUsers = 0; // Current connections.
//
// Connection information related data.
//
LIST_ENTRY listConnections;
//
// Miscellaneous data.
//
LARGE_INTEGER AllocationGranularity; // Page allocation granularity.
HANDLE g_hSysAccToken = NULL; TCHAR * g_pszW3TempDirName = NULL; // Name of temporary directory.
static BOOL l_bTempDirAlloced = FALSE;
//
// Server type string
//
CHAR g_szServerType[ sizeof(MSW3_VERSION_STR_MAX)]; DWORD g_cbServerType = 0;
CHAR szServerVersion[sizeof(MAKE_VERSION_STRING(MSW3_VERSION_STR_MAX))]; DWORD cbServerVersionString = 0;
STR* g_pstrMovedMessage;
//
// Whether or not to send HTTP 1.1
//
DWORD g_ReplyWith11;
//
// Whether or not to use TransmitFileAndRecv
//
DWORD g_fUseAndRecv;
//
// PUT/DELETE event timeout.
//
DWORD g_dwPutEventTimeout; CHAR g_szPutTimeoutString[17]; DWORD g_dwPutTimeoutStrlen;
//
// Platform type
//
PLATFORM_TYPE W3PlatformType = PtNtServer; BOOL g_fIsWindows95 = FALSE;
//
// Statistics.
// used to write statistics counter values to when instance is unknown
//
LPW3_SERVER_STATISTICS g_pW3Stats;
extern BOOL fAnySecureFilters;
//
// Generate the string storage space
//
# include "strconst.h"
# define CStrM( FriendlyName, ActualString) \
const char PSZ_ ## FriendlyName[] = ActualString;
ConstantStringsForThisModule()
# undef CStrM
//
// Header Date time cache
//
PW3_DATETIME_CACHE g_pDateTimeCache = NULL; //
// Downlevel Client Support (no HOST header support)
//
BOOL g_fDLCSupport; TCHAR* g_pszDLCMenu; DWORD g_cbDLCMenu; TCHAR* g_pszDLCHostName; DWORD g_cbDLCHostName; TCHAR* g_pszDLCCookieMenuDocument; DWORD g_cbDLCCookieMenuDocument; TCHAR* g_pszDLCMungeMenuDocument; DWORD g_cbDLCMungeMenuDocument; TCHAR* g_pszDLCCookieName; DWORD g_cbDLCCookieName;
//
// Notification object used to watch for changes in CAPI stores
//
STORE_CHANGE_NOTIFIER *g_pStoreChangeNotifier;
//
// CPU accounting/limits globals
//
DWORD g_dwNumProcessors = 1;
//
// Maximum client request buffer size
//
DWORD g_cbMaxClientRequestBuffer = W3_DEFAULT_MAX_CLIENT_REQUEST_BUFFER;
//
// Should we get stack back traces when appropriate?
//
BOOL g_fGetBackTraces = FALSE;
//
// WAM Event Log
//
EVENT_LOG *g_pWamEventLog = NULL;
//
// Public functions.
//
APIERR InitializeGlobals( VOID )
/*++
Routine Description:
Initializes global shared variables. Some values are initialized with constants, others are read from the configuration registry.
Arguments:
None.
Return Value:
Win32
--*/ { DWORD err; HKEY hkey;
//
// Initialize the server version string based on the platform type
//
W3PlatformType = IISGetPlatformType();
switch ( W3PlatformType ) {
case PtNtWorkstation: strcpy(szServerVersion,MAKE_VERSION_STRING(MSW3_VERSION_STR_NTW)); strcpy(g_szServerType, MSW3_VERSION_STR_NTW); break;
case PtWindows95: case PtWindows9x: strcpy(szServerVersion,MAKE_VERSION_STRING(MSW3_VERSION_STR_W95)); strcpy(g_szServerType, MSW3_VERSION_STR_W95); g_fIsWindows95 = TRUE; break;
default:
//
// Either server or unhandled platform type!
//
DBG_ASSERT(InetIsNtServer(W3PlatformType)); strcpy(szServerVersion,MAKE_VERSION_STRING(MSW3_VERSION_STR_IIS)); strcpy(g_szServerType, MSW3_VERSION_STR_IIS); }
g_cbServerType = strlen( g_szServerType); cbServerVersionString = strlen(szServerVersion);
//
// Create global locks.
//
INITIALIZE_CRITICAL_SECTION( &csGlobalLock );
//
// Initialize the connection list
//
InitializeListHead( &listConnections );
err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, W3_PARAMETERS_KEY, 0, KEY_READ, &hkey );
if ( !err ) {
BOOL Success = ReadRegString( hkey, &g_pszW3TempDirName, W3_TEMP_DIR_NAME, "" );
if ( !Success || !g_pszW3TempDirName || !*g_pszW3TempDirName ) { DWORD dwTempDirNameLength;
if ( l_bTempDirAlloced && g_pszW3TempDirName ) { TCP_FREE( g_pszW3TempDirName ); g_pszW3TempDirName = NULL; }
l_bTempDirAlloced = FALSE;
dwTempDirNameLength = GetTempPath( 0, NULL ); if ( dwTempDirNameLength == 0) { g_pszW3TempDirName = ".\\"; } else { DWORD dwTemp = dwTempDirNameLength + 1;
g_pszW3TempDirName = (TCHAR *) TCP_ALLOC(dwTemp * sizeof(TCHAR));
if (g_pszW3TempDirName == NULL) { g_pszW3TempDirName = ".\\"; } else { l_bTempDirAlloced = TRUE; dwTempDirNameLength = GetTempPath( dwTemp, g_pszW3TempDirName ); if ( dwTempDirNameLength == 0 || dwTempDirNameLength > dwTemp) { TCP_FREE( g_pszW3TempDirName ); g_pszW3TempDirName = ".\\"; l_bTempDirAlloced = FALSE; } } } }
#ifdef _NO_TRACING_
#if DBG
DWORD Debug = ReadRegistryDword( hkey, W3_DEBUG_FLAGS, DEFAULT_DEBUG_FLAGS ); SET_DEBUG_FLAGS (Debug); #endif // DBG
#endif
g_ReplyWith11 = ReadRegistryDword(hkey, W3_VERSION_11, DEFAULT_SEND_11 );
g_dwPutEventTimeout = ReadRegistryDword(hkey, W3_PUT_TIMEOUT, DEFAULT_PUT_TIMEOUT );
_itoa(g_dwPutEventTimeout, g_szPutTimeoutString, 10);
g_dwPutTimeoutStrlen = strlen(g_szPutTimeoutString);
//
// See if we should use TransmitFileAndRecv
//
g_fUseAndRecv = ReadRegistryDword(hkey, W3_USE_ANDRECV, DEFAULT_USE_ANDRECV );
//
// Read globals for down level client support
//
g_fDLCSupport = !!ReadRegistryDword( hkey, W3_DLC_SUPPORT, 0 );
if ( !ReadRegString( hkey, &g_pszDLCMenu, W3_DLC_MENU_STRING, "" ) ) { return GetLastError(); } g_cbDLCMenu = strlen( g_pszDLCMenu );
if ( !ReadRegString( hkey, &g_pszDLCHostName, W3_DLC_HOSTNAME_STRING, "" ) ) { return GetLastError(); } g_cbDLCHostName = strlen( g_pszDLCHostName );
if ( !ReadRegString( hkey, &g_pszDLCCookieMenuDocument, W3_DLC_COOKIE_MENU_DOCUMENT_STRING, "" ) ) { return GetLastError(); } g_cbDLCCookieMenuDocument = strlen( g_pszDLCCookieMenuDocument );
if ( !ReadRegString( hkey, &g_pszDLCMungeMenuDocument, W3_DLC_MUNGE_MENU_DOCUMENT_STRING, "" ) ) { return GetLastError(); } g_cbDLCMungeMenuDocument = strlen( g_pszDLCMungeMenuDocument );
if ( !ReadRegString( hkey, &g_pszDLCCookieName, W3_DLC_COOKIE_NAME_STRING, DLC_DEFAULT_COOKIE_NAME ) ) { return GetLastError(); } g_cbDLCCookieName = strlen( g_pszDLCCookieName );
g_cbMaxClientRequestBuffer = ReadRegistryDword( hkey, W3_MAX_CLIENT_REQUEST_BUFFER_STRING, W3_DEFAULT_MAX_CLIENT_REQUEST_BUFFER );
g_fGetBackTraces = ReadRegistryDword( hkey, W3_GET_BACKTRACES, g_fGetBackTraces );
TCP_REQUIRE( !RegCloseKey( hkey )); }
g_pstrMovedMessage = NULL;
//
// Create statistics object
//
g_pW3Stats = new W3_SERVER_STATISTICS();
if ( g_pW3Stats == NULL ) { SetLastError( ERROR_NOT_ENOUGH_MEMORY ); return( ERROR_NOT_ENOUGH_MEMORY ); }
//
// Get access token for system account
//
if ( !OpenProcessToken ( GetCurrentProcess(), TOKEN_ALL_ACCESS, &g_hSysAccToken ) ) { g_hSysAccToken = NULL; }
//
// Initialize the datetime cache
//
g_pDateTimeCache = new W3_DATETIME_CACHE;
if ( g_pDateTimeCache == NULL ) { SetLastError( ERROR_NOT_ENOUGH_MEMORY ); return( ERROR_NOT_ENOUGH_MEMORY ); }
//
// Create the CAPI store notification object
//
g_pStoreChangeNotifier = new STORE_CHANGE_NOTIFIER();
if ( g_pStoreChangeNotifier == NULL ) { SetLastError( ERROR_NOT_ENOUGH_MEMORY ); return( ERROR_NOT_ENOUGH_MEMORY ); }
//
// Get the CPU Accounting/Limits information
//
SYSTEM_INFO siInfo;
GetSystemInfo(&siInfo);
//
// GetSystemInfo does not return any value, have to assume it succeeded.
//
g_dwNumProcessors = siInfo.dwNumberOfProcessors;
//
// Success!
//
return NO_ERROR;
} // InitializeGlobals
VOID TerminateGlobals( VOID )
/*++
Routine Description:
Terminates global shared variables.
Arguments:
None.
Return Value:
None.
--*/ { if ( g_pDateTimeCache != NULL ) { delete g_pDateTimeCache; g_pDateTimeCache = NULL; }
if( g_pW3Stats != NULL ) { delete g_pW3Stats; g_pW3Stats = NULL; }
if ( g_hSysAccToken ) { CloseHandle( g_hSysAccToken ); g_hSysAccToken = NULL; }
if ( g_pszDLCMenu != NULL ) { TCP_FREE( g_pszDLCMenu ); g_pszDLCMenu = NULL; }
if ( g_pszDLCHostName != NULL ) { TCP_FREE( g_pszDLCHostName ); g_pszDLCHostName = NULL; }
if ( g_pszDLCCookieMenuDocument != NULL ) { TCP_FREE( g_pszDLCCookieMenuDocument ); g_pszDLCCookieMenuDocument = NULL; }
if ( g_pszDLCMungeMenuDocument != NULL ) { TCP_FREE( g_pszDLCMungeMenuDocument ); g_pszDLCMungeMenuDocument = NULL; }
if ( g_pszDLCCookieName != NULL ) { TCP_FREE( g_pszDLCCookieName ); g_pszDLCCookieName = NULL; }
if ( g_pStoreChangeNotifier ) { delete g_pStoreChangeNotifier; g_pStoreChangeNotifier = NULL; }
if ( l_bTempDirAlloced && g_pszW3TempDirName ) { TCP_FREE( g_pszW3TempDirName ); g_pszW3TempDirName = NULL; l_bTempDirAlloced = FALSE; }
TerminateFilters();
W3_LIMIT_JOB_THREAD::TerminateLimitJobThread();
W3_JOB_QUEUE::TerminateJobQueue();
//
// Dump heap residue.
//
TCP_DUMP_RESIDUE( );
if( g_pWamEventLog ) { delete g_pWamEventLog; g_pWamEventLog = NULL; }
//
// Delete global locks.
//
DeleteCriticalSection( &csGlobalLock );
} // TerminateGlobals
|