386 lines
8.4 KiB
C++
386 lines
8.4 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name :
|
||
|
||
tsinit.cxx
|
||
|
||
Abstract:
|
||
This module contains the tsunami initialization code.
|
||
|
||
Author:
|
||
Murali R. Krishnan ( MuraliK ) 16-Jan-1995
|
||
|
||
--*/
|
||
|
||
#include "TsunamiP.Hxx"
|
||
|
||
#include <dbgutil.h>
|
||
#include <inetsvcs.h>
|
||
#pragma hdrstop
|
||
|
||
#include <iistypes.hxx>
|
||
#include <iisver.h>
|
||
#include <iiscnfg.h>
|
||
#include <imd.h>
|
||
#include <mb.hxx>
|
||
|
||
HANDLE g_hQuit = NULL;
|
||
HANDLE g_hNewItem = NULL;
|
||
BOOL g_fW3OnlyNoAuth = FALSE;
|
||
|
||
extern LONG g_nTsunamiThreads;
|
||
|
||
//
|
||
// Disables Tsunami Caching
|
||
//
|
||
|
||
BOOL DisableTsunamiCaching = FALSE;
|
||
|
||
//
|
||
// DisableSPUD
|
||
//
|
||
|
||
BOOL DisableSPUD = FALSE;
|
||
|
||
//
|
||
// Allows us to mask the invalid flags
|
||
//
|
||
|
||
DWORD TsValidCreateFileOptions = TS_IIS_VALID_FLAGS;
|
||
|
||
//
|
||
// flags to set on CreateFile
|
||
//
|
||
|
||
DWORD TsCreateFileShareMode = (FILE_SHARE_READ |
|
||
FILE_SHARE_WRITE |
|
||
FILE_SHARE_DELETE);
|
||
|
||
BOOL TsNoDirOpenSupport = FALSE;
|
||
DWORD TsCreateFileFlags = (FILE_FLAG_SEQUENTIAL_SCAN |
|
||
FILE_FLAG_OVERLAPPED |
|
||
FILE_FLAG_BACKUP_SEMANTICS );
|
||
|
||
|
||
BOOL
|
||
Tsunami_Initialize(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Description:
|
||
|
||
Initializes the tsunami package
|
||
|
||
Note: This routine assumes the caller is handling multiple initializers
|
||
and will only call this routine once in a thread safe manner
|
||
|
||
--*/
|
||
{
|
||
|
||
HKEY hKey;
|
||
DWORD dwType;
|
||
DWORD nBytes;
|
||
DWORD dwValue;
|
||
DWORD dwMaxFile;
|
||
DWORD err;
|
||
|
||
#if TSUNAMI_REF_DEBUG
|
||
RefTraceLog = CreateRefTraceLog(
|
||
256, // LogSize
|
||
0 // ExtraBytesInHeader
|
||
);
|
||
#endif // TSUNAMI_REF_DEBUG
|
||
|
||
//
|
||
// Initialize global events
|
||
//
|
||
|
||
g_hQuit = IIS_CREATE_EVENT(
|
||
"g_hQuit",
|
||
&g_hQuit,
|
||
TRUE,
|
||
FALSE
|
||
);
|
||
|
||
g_hNewItem = IIS_CREATE_EVENT(
|
||
"g_hNewItem",
|
||
&g_hNewItem,
|
||
FALSE,
|
||
FALSE
|
||
);
|
||
|
||
if ( (g_hQuit == NULL) || (g_hNewItem == NULL) ) {
|
||
goto Failure;
|
||
}
|
||
|
||
//
|
||
// Set defaults
|
||
//
|
||
|
||
MEMORYSTATUS ms;
|
||
ms.dwLength = sizeof(MEMORYSTATUS);
|
||
GlobalMemoryStatus( &ms );
|
||
|
||
//
|
||
// default is 1K files per 32MB of physical memory after the 1st 8MB,
|
||
// minimum INETA_MIN_DEF_FILE_HANDLE
|
||
//
|
||
|
||
if ( ms.dwTotalPhys > 8 * 1024 * 1024 )
|
||
{
|
||
dwMaxFile = (ms.dwTotalPhys - 8 * 1024 * 1024) / ( 32 * 1024 );
|
||
if ( dwMaxFile < INETA_MIN_DEF_FILE_HANDLE )
|
||
{
|
||
dwMaxFile = INETA_MIN_DEF_FILE_HANDLE;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dwMaxFile = INETA_MIN_DEF_FILE_HANDLE;
|
||
}
|
||
|
||
//
|
||
// If this is not a NTS, disable tsunami caching by default
|
||
//
|
||
|
||
DisableSPUD = !AtqSpudInitialized();
|
||
|
||
|
||
if ( !TsIsNtServer() ) {
|
||
DisableTsunamiCaching = TRUE;
|
||
DisableSPUD = TRUE;
|
||
}
|
||
|
||
DisableSPUD = TRUE;
|
||
|
||
if ( DisableSPUD ) {
|
||
DbgPrint("DisableCacheOplocks set to TRUE by default.\n");
|
||
} else {
|
||
DbgPrint("DisableCacheOplocks set to FALSE by default.\n");
|
||
}
|
||
//
|
||
// no overlapped i/o in win95.
|
||
//
|
||
|
||
if ( TsIsWindows95() ) {
|
||
TsCreateFileFlags = FILE_FLAG_SEQUENTIAL_SCAN;
|
||
TsCreateFileShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
|
||
TsNoDirOpenSupport = TRUE;
|
||
// |FILE_FLAG_BACKUP_SEMANTICS;
|
||
}
|
||
|
||
//
|
||
// Read the registry key to see whether tsunami caching is enabled
|
||
//
|
||
|
||
err = RegOpenKeyEx(
|
||
HKEY_LOCAL_MACHINE,
|
||
INETA_PARAMETERS_KEY,
|
||
0,
|
||
KEY_READ,
|
||
&hKey
|
||
);
|
||
|
||
if ( err == ERROR_SUCCESS ) {
|
||
|
||
//
|
||
// This cannot be overridded in win95
|
||
//
|
||
|
||
if ( !TsIsWindows95() ) {
|
||
nBytes = sizeof(dwValue);
|
||
err = RegQueryValueEx(
|
||
hKey,
|
||
INETA_DISABLE_TSUNAMI_CACHING,
|
||
NULL,
|
||
&dwType,
|
||
(LPBYTE)&dwValue,
|
||
&nBytes
|
||
);
|
||
|
||
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
|
||
DisableTsunamiCaching = (BOOL)dwValue;
|
||
}
|
||
|
||
nBytes = sizeof(dwValue);
|
||
err = RegQueryValueEx(
|
||
hKey,
|
||
INETA_DISABLE_TSUNAMI_SPUD,
|
||
NULL,
|
||
&dwType,
|
||
(LPBYTE)&dwValue,
|
||
&nBytes
|
||
);
|
||
|
||
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
|
||
DisableSPUD = (BOOL)dwValue;
|
||
if ( DisableSPUD ) {
|
||
DbgPrint("DisableCacheOplocks set to TRUE in Registry.\n");
|
||
} else {
|
||
DbgPrint("DisableCacheOplocks set to FALSE in Registry.\n");
|
||
}
|
||
DbgPrint("The Registry Setting will override the default.\n");
|
||
}
|
||
}
|
||
|
||
if ( g_fW3OnlyNoAuth )
|
||
{
|
||
//
|
||
// TODO: investigate is security descriptor caching
|
||
// can be used in the non-SYSTEM account case.
|
||
//
|
||
|
||
g_fCacheSecDesc = FALSE;
|
||
}
|
||
else
|
||
{
|
||
//
|
||
// read the enable cache sec desc flag
|
||
//
|
||
|
||
nBytes = sizeof(dwValue);
|
||
err = RegQueryValueEx(
|
||
hKey,
|
||
INETA_CACHE_USE_ACCESS_CHECK,
|
||
NULL,
|
||
&dwType,
|
||
(LPBYTE)&dwValue,
|
||
&nBytes
|
||
);
|
||
|
||
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
|
||
g_fCacheSecDesc = !!dwValue;
|
||
}
|
||
else {
|
||
g_fCacheSecDesc = INETA_DEF_CACHE_USE_ACCESS_CHECK;
|
||
}
|
||
}
|
||
|
||
//
|
||
// Read the maximum # of files in cache
|
||
//
|
||
|
||
nBytes = sizeof(dwValue);
|
||
if ( RegQueryValueEx(
|
||
hKey,
|
||
INETA_MAX_OPEN_FILE,
|
||
NULL,
|
||
&dwType,
|
||
(LPBYTE) &dwValue,
|
||
&nBytes
|
||
) == ERROR_SUCCESS && dwType == REG_DWORD )
|
||
{
|
||
dwMaxFile = dwValue;
|
||
}
|
||
|
||
RegCloseKey( hKey );
|
||
|
||
}
|
||
|
||
//
|
||
// if tsunami caching is disabled, set the flags accordingly
|
||
//
|
||
|
||
if ( DisableTsunamiCaching ) {
|
||
g_fDisableCaching = TRUE;
|
||
TsValidCreateFileOptions = TS_PWS_VALID_FLAGS;
|
||
g_fCacheSecDesc = FALSE;
|
||
}
|
||
|
||
//
|
||
// Initialize the directory change manager
|
||
//
|
||
|
||
if ( !DcmInitialize( ) ) {
|
||
goto Failure;
|
||
}
|
||
|
||
//
|
||
// Initialize the tsunami cache manager
|
||
//
|
||
|
||
if ( !Cache_Initialize( dwMaxFile )) {
|
||
goto Failure;
|
||
}
|
||
|
||
if ( !MetaCache_Initialize() ) {
|
||
goto Failure;
|
||
}
|
||
return( TRUE );
|
||
|
||
Failure:
|
||
|
||
IIS_PRINTF( ( buff, "Tsunami_Initialize() Failed. Error = %d\n",
|
||
GetLastError()));
|
||
|
||
if ( g_hQuit )
|
||
{
|
||
CloseHandle( g_hQuit );
|
||
g_hQuit = NULL;
|
||
}
|
||
|
||
if ( g_hNewItem )
|
||
{
|
||
CloseHandle( g_hNewItem );
|
||
g_hNewItem = NULL;
|
||
}
|
||
|
||
return FALSE;
|
||
} // Tsunami_Initialize
|
||
|
||
VOID
|
||
Tsunami_Terminate(
|
||
VOID
|
||
)
|
||
/*++
|
||
Description:
|
||
|
||
Cleans up the Tsunami package
|
||
|
||
--*/
|
||
{
|
||
DWORD dwResult;
|
||
|
||
if ( !SetEvent( g_hQuit ) ) {
|
||
IIS_PRINTF((buff,
|
||
"No Quit event posted for Tsunami. No Cleanup\n"));
|
||
return;
|
||
}
|
||
|
||
//
|
||
// Flush all items from the cache
|
||
//
|
||
|
||
TsCacheFlush( 0 );
|
||
|
||
//
|
||
// Synchronize with our thread so we don't leave here before the
|
||
// thread has finished cleaning up
|
||
//
|
||
|
||
if ( g_hChangeWaitThread != NULL ) {
|
||
DBG_REQUIRE( WaitForSingleObject( g_hChangeWaitThread, 20000 ) == WAIT_OBJECT_0 );
|
||
CloseHandle( g_hChangeWaitThread);
|
||
}
|
||
|
||
CloseHandle( g_hQuit );
|
||
CloseHandle( g_hNewItem );
|
||
|
||
DeleteCriticalSection( &csVirtualRoots );
|
||
|
||
MetaCache_Terminate();
|
||
|
||
#if TSUNAMI_REF_DEBUG
|
||
if( RefTraceLog != NULL ) {
|
||
DestroyRefTraceLog( RefTraceLog );
|
||
RefTraceLog = NULL;
|
||
}
|
||
#endif // TSUNAMI_REF_DEBUG
|
||
|
||
} // Tsunami_Terminate
|
||
|
||
|