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.
742 lines
14 KiB
742 lines
14 KiB
/*++
|
|
|
|
Copyright (c) 1999-2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
w3server.h
|
|
|
|
Abstract:
|
|
|
|
Type definition for worker process implementation of IIS.
|
|
|
|
Author:
|
|
|
|
Taylor Weiss (TaylorW) 16-Dec-1999
|
|
|
|
Revision History:
|
|
|
|
At this point - the following features of the IIS5 code base are
|
|
considered obsolete (ie never to be part of IIS+):
|
|
|
|
1. Service control manager goo
|
|
2. RPC administration support
|
|
3. Down-level admin support
|
|
4. Socket/Endpoint goo
|
|
5. Direct handling of site - start/stop/pause/etc
|
|
6. Password change support (ie. .htr hooks).
|
|
|
|
|
|
--*/
|
|
|
|
#ifndef _W3SERVER_H_
|
|
#define _W3SERVER_H_
|
|
|
|
/************************************************************
|
|
* Include Headers
|
|
************************************************************/
|
|
|
|
#include "mb_notify.h"
|
|
|
|
/************************************************************
|
|
* Type Definitions
|
|
************************************************************/
|
|
|
|
#define W3_SERVER_MB_PATH L"/LM/W3SVC/"
|
|
#define W3_SERVER_MB_PATH_CCH 10
|
|
|
|
enum RESTRICTION_LIST_TYPE
|
|
{
|
|
IsapiRestrictionList,
|
|
CgiRestrictionList
|
|
};
|
|
|
|
class W3_SITE;
|
|
|
|
/*++
|
|
|
|
class W3_SERVER
|
|
|
|
Encapsulates global settings for an HTTP server run in
|
|
a duct-tape worker process.
|
|
|
|
Condenses the relevant functionality exposed in IIS
|
|
through the IIS_SERVICE and W3_IIS_SERVICE.
|
|
|
|
--*/
|
|
|
|
#define W3_SERVER_SIGNATURE 'VRSW'
|
|
#define W3_SERVER_FREE_SIGNATURE 'fRSW'
|
|
|
|
/*++
|
|
|
|
A simple referenced record to hold an image name
|
|
|
|
--*/
|
|
|
|
class W3_IMAGE_RECORD
|
|
{
|
|
public:
|
|
|
|
W3_IMAGE_RECORD()
|
|
: _cRefs( 1 )
|
|
{
|
|
}
|
|
|
|
HRESULT
|
|
Create(
|
|
LPCWSTR pName,
|
|
BOOL fIsAllowed
|
|
)
|
|
{
|
|
_fIsAllowed = fIsAllowed;
|
|
return strName.Copy( pName );
|
|
}
|
|
|
|
LPWSTR
|
|
QueryName(
|
|
VOID
|
|
) const
|
|
{
|
|
return (LPWSTR)strName.QueryStr();
|
|
}
|
|
|
|
BOOL
|
|
QueryIsAllowed(
|
|
VOID
|
|
) const
|
|
{
|
|
return _fIsAllowed;
|
|
}
|
|
|
|
VOID
|
|
ReferenceImageRecord(
|
|
VOID
|
|
)
|
|
{
|
|
InterlockedIncrement( &_cRefs );
|
|
}
|
|
|
|
VOID
|
|
DereferenceImageRecord(
|
|
VOID
|
|
)
|
|
{
|
|
DBG_ASSERT( _cRefs != 0 );
|
|
|
|
if ( InterlockedDecrement( &_cRefs ) == 0 )
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
VOID
|
|
SetAllowedFlag(
|
|
BOOL fIsAllowed
|
|
)
|
|
{
|
|
_fIsAllowed = fIsAllowed;
|
|
}
|
|
|
|
private:
|
|
|
|
~W3_IMAGE_RECORD()
|
|
{
|
|
}
|
|
|
|
LONG _cRefs;
|
|
STRU strName;
|
|
BOOL _fIsAllowed;
|
|
};
|
|
|
|
/*++
|
|
|
|
class W3_SITE_LIST
|
|
|
|
The list of sites serviced by a W3_SERVER.
|
|
|
|
--*/
|
|
|
|
class W3_SITE_LIST :
|
|
public CTypedHashTable<W3_SITE_LIST, W3_SITE, DWORD>
|
|
{
|
|
|
|
public:
|
|
|
|
W3_SITE_LIST() :
|
|
CTypedHashTable<W3_SITE_LIST, W3_SITE, DWORD>("W3_SITE_LIST")
|
|
{}
|
|
|
|
static DWORD
|
|
ExtractKey(const W3_SITE *site);
|
|
|
|
static DWORD
|
|
CalcKeyHash(const DWORD key)
|
|
{
|
|
return key;
|
|
}
|
|
|
|
static bool
|
|
EqualKeys(DWORD key1, DWORD key2)
|
|
{
|
|
return key1 == key2;
|
|
}
|
|
|
|
static VOID
|
|
AddRefRecord(W3_SITE *site, int nIncr);
|
|
|
|
private:
|
|
|
|
W3_SITE_LIST(const W3_SITE_LIST &);
|
|
void operator=(const W3_SITE_LIST &);
|
|
};
|
|
|
|
class W3_RESTRICTION_LIST :
|
|
public CTypedHashTable<W3_RESTRICTION_LIST, W3_IMAGE_RECORD, LPCWSTR>
|
|
{
|
|
|
|
public:
|
|
|
|
W3_RESTRICTION_LIST() :
|
|
CTypedHashTable<W3_RESTRICTION_LIST, W3_IMAGE_RECORD, LPCWSTR>("W3_RESTRICTION_LIST")
|
|
{
|
|
_cRefs = 1;
|
|
_fInitialized = FALSE;
|
|
}
|
|
|
|
static LPCWSTR
|
|
ExtractKey(const W3_IMAGE_RECORD *pEntry)
|
|
{
|
|
return pEntry->QueryName();
|
|
}
|
|
|
|
static DWORD
|
|
CalcKeyHash(LPCWSTR pszKey)
|
|
{
|
|
DWORD cchKey = (DWORD)wcslen(pszKey);
|
|
|
|
return HashStringNoCase(pszKey, cchKey);
|
|
}
|
|
|
|
static bool
|
|
EqualKeys(LPCWSTR pszKey1, LPCWSTR pszKey2)
|
|
{
|
|
return _wcsicmp( pszKey1, pszKey2 ) == 0;
|
|
}
|
|
|
|
static void
|
|
AddRefRecord(W3_IMAGE_RECORD *pEntry, int nIncr)
|
|
{
|
|
if ( nIncr == +1 )
|
|
{
|
|
pEntry->ReferenceImageRecord();
|
|
}
|
|
else if ( nIncr == - 1)
|
|
{
|
|
pEntry->DereferenceImageRecord();
|
|
}
|
|
}
|
|
|
|
HRESULT
|
|
Create(MULTISZ * pmszList, RESTRICTION_LIST_TYPE ListType);
|
|
|
|
VOID
|
|
ReferenceRestrictionList()
|
|
{
|
|
DBG_ASSERT( _cRefs != 0 );
|
|
|
|
InterlockedIncrement( &_cRefs );
|
|
}
|
|
|
|
VOID
|
|
DereferenceRestrictionList()
|
|
{
|
|
DBG_ASSERT( _cRefs > 0 );
|
|
|
|
if ( InterlockedDecrement( &_cRefs ) == 0 )
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
IsImageEnabled(LPCWSTR szImage);
|
|
|
|
private:
|
|
|
|
BOOL _fInitialized;
|
|
BOOL _fAllowUnknown;
|
|
LONG _cRefs;
|
|
|
|
W3_RESTRICTION_LIST(const W3_RESTRICTION_LIST &);
|
|
void operator=(const W3_RESTRICTION_LIST &);
|
|
|
|
~W3_RESTRICTION_LIST()
|
|
{}
|
|
};
|
|
|
|
class W3_METADATA_CACHE;
|
|
class W3_URL_INFO_CACHE;
|
|
class UL_RESPONSE_CACHE;
|
|
class DIGEST_CONTEXT_CACHE;
|
|
|
|
class W3_SERVER
|
|
{
|
|
//
|
|
// CODEWORK
|
|
// Using friends to keep the public interface of this
|
|
// class as clean as possible. It's pretty sleazy so
|
|
// we definitely should undo if it isn't valuable.
|
|
//
|
|
friend class MB_LISTENER;
|
|
|
|
public:
|
|
|
|
W3_SERVER( BOOL fCompatibilityMode );
|
|
|
|
~W3_SERVER();
|
|
|
|
HRESULT
|
|
Initialize(
|
|
INT argc,
|
|
LPWSTR argv[]
|
|
);
|
|
|
|
VOID
|
|
Terminate(
|
|
HRESULT hrReason
|
|
);
|
|
|
|
HRESULT
|
|
StartListen(
|
|
VOID
|
|
);
|
|
|
|
IMSAdminBase *
|
|
QueryMDObject(
|
|
VOID
|
|
) const
|
|
{
|
|
// This is only valid if all are threads are CoInited
|
|
// in the MTA
|
|
return m_pMetaBase;
|
|
}
|
|
|
|
LPCWSTR
|
|
QueryMDPath(
|
|
VOID
|
|
) const
|
|
{
|
|
return W3_SERVER_MB_PATH;
|
|
}
|
|
|
|
TOKEN_CACHE *
|
|
QueryTokenCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pTokenCache;
|
|
}
|
|
|
|
DIGEST_CONTEXT_CACHE *
|
|
QueryDigestContextCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pDigestContextCache;
|
|
}
|
|
|
|
W3_FILE_INFO_CACHE *
|
|
QueryFileCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pFileCache;
|
|
}
|
|
|
|
W3_URL_INFO_CACHE *
|
|
QueryUrlInfoCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pUrlInfoCache;
|
|
}
|
|
|
|
W3_METADATA_CACHE *
|
|
QueryMetaCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pMetaCache;
|
|
}
|
|
|
|
UL_RESPONSE_CACHE *
|
|
QueryUlCache(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_pUlCache;
|
|
}
|
|
|
|
DWORD
|
|
QuerySystemChangeNumber(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_dwSystemChangeNumber;
|
|
}
|
|
|
|
W3_SITE *
|
|
FindSite(
|
|
IN DWORD dwInstance
|
|
);
|
|
|
|
BOOL
|
|
AddSite(
|
|
IN W3_SITE * pInstance,
|
|
IN bool fOverWrite = false
|
|
);
|
|
|
|
BOOL
|
|
RemoveSite(
|
|
IN W3_SITE * pInstance
|
|
);
|
|
|
|
VOID
|
|
DestroyAllSites(
|
|
VOID
|
|
);
|
|
|
|
VOID WriteLockSiteList()
|
|
{
|
|
m_pSiteList->WriteLock();
|
|
}
|
|
|
|
VOID WriteUnlockSiteList()
|
|
{
|
|
m_pSiteList->WriteUnlock();
|
|
}
|
|
|
|
|
|
|
|
HRESULT CollectCounters(
|
|
PBYTE * ppCounterData,
|
|
DWORD * pdwCounterData
|
|
);
|
|
|
|
HRESULT
|
|
LoadString(
|
|
DWORD dwStringID,
|
|
CHAR * pszString,
|
|
DWORD * pcbString
|
|
);
|
|
|
|
VOID
|
|
GetCacheStatistics(
|
|
IISWPGlobalCounters * pCacheCtrs
|
|
);
|
|
|
|
BOOL
|
|
QueryInBackwardCompatibilityMode(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fInBackwardCompatibilityMode;
|
|
}
|
|
|
|
HRESULT
|
|
ReadUseDigestSSP(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
QueryUseDigestSSP(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fUseDigestSSP;
|
|
}
|
|
|
|
BOOL
|
|
QueryDoCentralBinaryLogging(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fDoCentralBinaryLogging;
|
|
}
|
|
|
|
CHAR *
|
|
QueryComputerName(
|
|
VOID
|
|
)
|
|
{
|
|
return m_pszComputerName;
|
|
}
|
|
|
|
USHORT
|
|
QueryComputerNameLength(
|
|
VOID
|
|
)
|
|
{
|
|
return m_cchComputerName;
|
|
}
|
|
|
|
BOOL
|
|
QueryIsCommandLineLaunch(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fIsCommandLineLaunch;
|
|
}
|
|
|
|
BOOL
|
|
QueryIsDavEnabled(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_fDavEnabled;
|
|
}
|
|
|
|
BOOL
|
|
QueryIsTraceEnabled(
|
|
VOID
|
|
) const
|
|
{
|
|
return m_fTraceEnabled;
|
|
}
|
|
|
|
void LogEvent(IN DWORD idMessage,
|
|
IN WORD cSubStrings,
|
|
IN const WCHAR *apszSubStrings[],
|
|
IN DWORD errCode = 0)
|
|
{
|
|
m_EventLog.LogEvent(idMessage,
|
|
cSubStrings,
|
|
apszSubStrings,
|
|
errCode);
|
|
}
|
|
|
|
static
|
|
VOID
|
|
OnShutdown(
|
|
BOOL fDoImmediate
|
|
);
|
|
|
|
static
|
|
VOID
|
|
FlushUlResponses(
|
|
MULTISZ * pmszUrls
|
|
);
|
|
|
|
BOOL
|
|
QueryIsIsapiImageEnabled(
|
|
LPCWSTR szImage
|
|
);
|
|
|
|
BOOL
|
|
QueryIsCgiImageEnabled(
|
|
LPCWSTR szImage
|
|
);
|
|
|
|
private:
|
|
|
|
//
|
|
// Metabase change handlers
|
|
//
|
|
|
|
HRESULT
|
|
MetabaseChangeNotification(
|
|
DWORD dwMDNumElements,
|
|
MD_CHANGE_OBJECT pcoChangeList[]
|
|
);
|
|
|
|
HRESULT
|
|
HandleMetabaseChange(
|
|
const MD_CHANGE_OBJECT & ChangeObject
|
|
);
|
|
|
|
HRESULT
|
|
InitializeRestrictionList(
|
|
RESTRICTION_LIST_TYPE ListType
|
|
);
|
|
|
|
|
|
W3_RESTRICTION_LIST *
|
|
CreateRestrictionList(
|
|
MULTISZ * pmszImageList,
|
|
RESTRICTION_LIST_TYPE ListType
|
|
);
|
|
|
|
HRESULT
|
|
InitializeCaches(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateCaches(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Internal Types
|
|
//
|
|
|
|
enum INIT_STATUS {
|
|
INIT_NONE,
|
|
INIT_SHUTDOWN_EVENT,
|
|
INIT_IISUTIL,
|
|
INIT_WINSOCK,
|
|
INIT_METABASE,
|
|
INIT_MB_LISTENER,
|
|
INIT_W3_SITE,
|
|
INIT_ULATQ,
|
|
INIT_SITE_LIST,
|
|
INIT_FILTERS,
|
|
INIT_CACHES,
|
|
INIT_W3_CONNECTION,
|
|
INIT_W3_CONTEXT,
|
|
INIT_W3_REQUEST,
|
|
INIT_W3_RESPONSE,
|
|
INIT_SERVER_VARIABLES,
|
|
INIT_MIME_MAP,
|
|
INIT_LOGGING,
|
|
INIT_RAW_CONNECTION,
|
|
INIT_CERTIFICATE_CONTEXT,
|
|
INIT_HTTP_COMPRESSION,
|
|
INIT_ISAPI_RESTRICTION_LIST,
|
|
INIT_CGI_RESTRICTION_LIST,
|
|
INIT_SERVER
|
|
};
|
|
|
|
DWORD m_Signature;
|
|
|
|
//
|
|
// How far have we initialized?
|
|
//
|
|
|
|
INIT_STATUS m_InitStatus;
|
|
|
|
//
|
|
// All important pointer to ABO
|
|
//
|
|
|
|
IMSAdminBase * m_pMetaBase;
|
|
|
|
//
|
|
// Site list
|
|
//
|
|
|
|
W3_SITE_LIST * m_pSiteList;
|
|
|
|
//
|
|
// Site info used for optimization when only one site is on the list
|
|
// Issue 08/28/2001 jaroslad: one site optimization should eventually be
|
|
// integrated with LKR hash that could optimize for empty tables
|
|
// and tables with one item
|
|
//
|
|
|
|
W3_SITE * m_pOneSite;
|
|
|
|
//
|
|
// Synchronize access to m_pOneSite (refcounted object)
|
|
//
|
|
|
|
CReaderWriterLock2 m_OneSiteLock;
|
|
|
|
//
|
|
// Metabase change nofication object
|
|
//
|
|
|
|
MB_LISTENER * m_pMetabaseListener;
|
|
|
|
//
|
|
// event log
|
|
//
|
|
EVENT_LOG m_EventLog;
|
|
|
|
//
|
|
// Are we in backward compatibility mode?
|
|
//
|
|
BOOL m_fInBackwardCompatibilityMode;
|
|
|
|
//
|
|
// Do we use new Digest SSP?
|
|
//
|
|
BOOL m_fUseDigestSSP;
|
|
|
|
//
|
|
// Do we log into the central binary log?
|
|
//
|
|
BOOL m_fDoCentralBinaryLogging;
|
|
|
|
//
|
|
// Number of current sites
|
|
//
|
|
DWORD m_cSites;
|
|
|
|
//
|
|
// Handle to the resource DLL containing response strings
|
|
//
|
|
HMODULE m_hResourceDll;
|
|
|
|
//
|
|
// The buffer used to put in all the site and global counters in to
|
|
// pass to WAS
|
|
//
|
|
PBYTE m_pCounterDataBuffer;
|
|
DWORD m_dwCounterDataBuffer;
|
|
|
|
//
|
|
// The server's name
|
|
//
|
|
CHAR m_pszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
|
USHORT m_cchComputerName;
|
|
|
|
//
|
|
// All our caches
|
|
//
|
|
|
|
TOKEN_CACHE * m_pTokenCache;
|
|
DIGEST_CONTEXT_CACHE * m_pDigestContextCache;
|
|
W3_FILE_INFO_CACHE * m_pFileCache;
|
|
W3_METADATA_CACHE * m_pMetaCache;
|
|
W3_URL_INFO_CACHE * m_pUrlInfoCache;
|
|
UL_RESPONSE_CACHE * m_pUlCache;
|
|
|
|
//
|
|
// :-( System change number. Tie it to sink for perf reasons
|
|
//
|
|
|
|
DWORD m_dwSystemChangeNumber;
|
|
|
|
//
|
|
// Secure server - image enabled lists
|
|
//
|
|
|
|
W3_RESTRICTION_LIST * m_pIsapiRestrictionList;
|
|
W3_RESTRICTION_LIST * m_pCgiRestrictionList;
|
|
CReaderWriterLock3 m_IsapiRestrictionLock;
|
|
CReaderWriterLock3 m_CgiRestrictionLock;
|
|
|
|
//
|
|
// Remember if DAV is enabled or not
|
|
//
|
|
|
|
BOOL m_fDavEnabled;
|
|
|
|
//
|
|
// Were we command line launched?
|
|
//
|
|
|
|
BOOL m_fIsCommandLineLaunch;
|
|
|
|
//
|
|
// Is TRACE enabled?
|
|
//
|
|
|
|
BOOL m_fTraceEnabled;
|
|
};
|
|
|
|
extern W3_SERVER * g_pW3Server;
|
|
|
|
#endif // _W3SERVER_H_
|