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
|
|||
|
|
|||
|
|