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.
 
 
 
 
 
 

544 lines
13 KiB

/*++
Copyright (c) 1999-2000 Microsoft Corporation
Module Name:
w3site.h
Abstract:
Type definition for worker process implementation of IIS.
Author:
Taylor Weiss (TaylorW) 16-Dec-1999
Revision History:
--*/
#ifndef _W3SITE_H_
#define _W3SITE_H_
/************************************************************
* Include Headers
************************************************************/
/************************************************************
* Type Definitions
************************************************************/
/*++
class W3_SITE
Encapsulates site level settings for an HTTP server run in
a duct-tape worker process.
Condenses the relevant functionality exposed in IIS
through the IIS_SERVER_INSTANCE and W3_SERVER_INSTANCE.
--*/
#define W3_SITE_SIGNATURE (DWORD)' ISW'
#define W3_SITE_SIGNATURE_FREE (DWORD)'fISW'
#define MAX_SITEID_LENGTH 10
class FILTER_LIST;
class W3_SITE
{
public:
//
// Construction and Initialization
//
W3_SITE(DWORD SiteId);
// global initialization and cleanup
static HRESULT W3SiteInitialize()
{
INITIALIZE_CRITICAL_SECTION( &sm_csIISCertMapLock );
return S_OK;
}
static VOID W3SiteTerminate()
{
DeleteCriticalSection( &sm_csIISCertMapLock );
}
// global lock & unlock for iis certmap
VOID GlobalLockIISCertMap()
{
EnterCriticalSection( &sm_csIISCertMapLock );
}
VOID GlobalUnlockIISCertMap()
{
LeaveCriticalSection( &sm_csIISCertMapLock );
}
HRESULT Initialize(LOGGING *pLogging = NULL,
FILTER_LIST *pFilterList = NULL);
DWORD QueryId() const
{
return m_SiteId;
}
BOOL QueryUseDSMapper() const
{
return m_fUseDSMapper;
}
void ReferenceSite()
{
InterlockedIncrement( &m_cRefs );
}
void DereferenceSite()
{
DBG_ASSERT( m_cRefs > 0 );
if ( InterlockedDecrement( &m_cRefs ) == 0 )
{
delete this;
}
}
FILTER_LIST *QueryFilterList() const
{
return m_pInstanceFilterList;
}
STRA *QueryName()
{
return &m_SiteName;
}
STRU *QueryMBRoot()
{
return &m_SiteMBRoot;
}
STRU *QueryMBPath()
{
return &m_SiteMBPath;
}
HRESULT
HandleMetabaseChange(
const MD_CHANGE_OBJECT &ChangeObject,
IN W3_SITE_LIST *pTempSiteList = NULL);
BOOL QueryDoUlLogging() const
{
return m_pLogging->QueryDoUlLogging();
}
BOOL QueryDoCustomLogging() const
{
return m_pLogging->QueryDoCustomLogging();
}
BOOL IsRequiredExtraLoggingFields() const
{
return m_pLogging->IsRequiredExtraLoggingFields();
}
const MULTISZA *QueryExtraLoggingFields() const
{
return m_pLogging->QueryExtraLoggingFields();
}
void LogInformation(LOG_CONTEXT *pLogData)
{
m_pLogging->LogInformation(pLogData);
}
BOOL QueryAllowPathInfoForScriptMappings() const
{
return m_fAllowPathInfoForScriptMappings;
}
VOID GetStatistics(IISWPSiteCounters *pCounterData)
{
PBYTE pSrc = (PBYTE)&m_PerfCounters;
PBYTE pDest = (PBYTE)pCounterData;
//
// Set the site id for the counters we
// are sending.
//
pCounterData->SiteID = m_SiteId;
for (DWORD i=0; i< WPSiteCtrsMaximum; i++)
{
// I am assuming all WP site counters are DWORDs and will
// remain so, if not this code needs changing at that point
DBG_ASSERT(aIISWPSiteDescription[i].Size == sizeof(DWORD));
if (aIISWPSiteDescription[i].WPZeros)
{
//
// For the total counters, we pass on the increment since
// the last collection, so we need to zero them
//
*(DWORD *)(pDest + aIISWPSiteDescription[i].Offset) =
InterlockedExchange(
(LPLONG)(pSrc + aIISWPSiteDescription[i].Offset),
0);
}
else
{
*(DWORD *)(pDest + aIISWPSiteDescription[i].Offset) =
*(DWORD *)(pSrc + aIISWPSiteDescription[i].Offset);
}
}
}
VOID IncFilesSent()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesSent);
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesTransferred);
}
VOID IncFilesRecvd()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesReceived);
InterlockedIncrement((LPLONG)&m_PerfCounters.FilesTransferred);
}
VOID IncAnonUsers()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.AnonUsers);
DWORD currAnons = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentAnonUsers);
DWORD currMaxAnons;
while ((currMaxAnons = m_PerfCounters.MaxAnonUsers) <
currAnons)
{
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxAnonUsers,
currAnons,
currMaxAnons);
}
}
VOID DecAnonUsers()
{
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentAnonUsers);
}
VOID IncNonAnonUsers()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.NonAnonUsers);
DWORD currNonAnons = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentNonAnonUsers);
DWORD currMaxNonAnons;
while ((currMaxNonAnons = m_PerfCounters.MaxNonAnonUsers) <
currNonAnons)
{
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxNonAnonUsers,
currNonAnons,
currMaxNonAnons);
}
}
VOID DecNonAnonUsers()
{
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentNonAnonUsers);
}
VOID IncLogonAttempts()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.LogonAttempts);
}
VOID IncReqType(HTTP_VERB VerbType)
{
switch (VerbType)
{
case HttpVerbOPTIONS:
InterlockedIncrement((LPLONG)&m_PerfCounters.OptionsReqs);
return;
case HttpVerbGET:
InterlockedIncrement((LPLONG)&m_PerfCounters.GetReqs);
return;
case HttpVerbHEAD:
InterlockedIncrement((LPLONG)&m_PerfCounters.HeadReqs);
return;
case HttpVerbPOST:
InterlockedIncrement((LPLONG)&m_PerfCounters.PostReqs);
return;
case HttpVerbPUT:
InterlockedIncrement((LPLONG)&m_PerfCounters.PutReqs);
IncFilesRecvd();
return;
case HttpVerbDELETE:
InterlockedIncrement((LPLONG)&m_PerfCounters.DeleteReqs);
return;
case HttpVerbTRACE:
InterlockedIncrement((LPLONG)&m_PerfCounters.TraceReqs);
return;
case HttpVerbMOVE:
InterlockedIncrement((LPLONG)&m_PerfCounters.MoveReqs);
return;
case HttpVerbCOPY:
InterlockedIncrement((LPLONG)&m_PerfCounters.CopyReqs);
return;
case HttpVerbPROPFIND:
InterlockedIncrement((LPLONG)&m_PerfCounters.PropfindReqs);
return;
case HttpVerbPROPPATCH:
InterlockedIncrement((LPLONG)&m_PerfCounters.ProppatchReqs);
return;
case HttpVerbMKCOL:
InterlockedIncrement((LPLONG)&m_PerfCounters.MkcolReqs);
return;
case HttpVerbLOCK:
InterlockedIncrement((LPLONG)&m_PerfCounters.LockReqs);
return;
case HttpVerbUNLOCK:
InterlockedIncrement((LPLONG)&m_PerfCounters.UnlockReqs);
return;
case HttpVerbSEARCH:
InterlockedIncrement((LPLONG)&m_PerfCounters.SearchReqs);
return;
default:
InterlockedIncrement((LPLONG)&m_PerfCounters.OtherReqs);
return;
}
}
VOID IncCgiReqs()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.CgiReqs);
DWORD currCgis = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentCgiReqs);
DWORD currMaxCgis;
while ((currMaxCgis = m_PerfCounters.MaxCgiReqs) <
currCgis)
{
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxCgiReqs,
currCgis,
currMaxCgis);
}
}
VOID DecCgiReqs()
{
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentCgiReqs);
}
VOID IncIsapiExtReqs()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.IsapiExtReqs);
DWORD currIsapiExts = InterlockedIncrement((LPLONG)&m_PerfCounters.CurrentIsapiExtReqs);
DWORD currMaxIsapiExts;
while ((currMaxIsapiExts = m_PerfCounters.MaxIsapiExtReqs) <
currIsapiExts)
{
InterlockedCompareExchange((LPLONG)&m_PerfCounters.MaxIsapiExtReqs,
currIsapiExts,
currMaxIsapiExts);
}
}
VOID DecIsapiExtReqs()
{
InterlockedDecrement((LPLONG)&m_PerfCounters.CurrentIsapiExtReqs);
}
VOID IncNotFound()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.NotFoundErrors);
}
VOID IncLockedError()
{
InterlockedIncrement((LPLONG)&m_PerfCounters.LockedErrors);
}
BOOL
IsAuthPwdChangeEnabled(
VOID
)
{
return !( m_dwAuthChangeFlags & MD_AUTH_CHANGE_DISABLE );
}
BOOL
IsAuthPwdChangeNotificationEnabled(
VOID
)
{
return !( m_dwAuthChangeFlags & MD_AUTH_ADVNOTIFY_DISABLE );
}
STRU *
QueryAuthChangeUrl(
VOID
)
{
return &m_strAuthChangeUrl;
}
STRU *
QueryAuthExpiredUrl(
VOID
)
{
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_DISABLE )
{
return NULL;
}
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_UNSECURE )
{
return &m_strAuthExpiredUnsecureUrl;
}
else
{
return &m_strAuthExpiredUrl;
}
}
STRU *
QueryAdvNotPwdExpUrl(
VOID
)
{
if ( m_dwAuthChangeFlags & MD_AUTH_ADVNOTIFY_DISABLE )
{
return NULL;
}
if ( m_dwAuthChangeFlags & MD_AUTH_CHANGE_UNSECURE )
{
return &m_strAdvNotPwdExpUnsecureUrl;
}
else
{
return &m_strAdvNotPwdExpUrl;
}
}
DWORD
QueryAdvNotPwdExpInDays(
VOID
)
{
return m_dwAdvNotPwdExpInDays;
}
DWORD
QueryAdvCacheTTL(
VOID
)
{
return m_dwAdvCacheTTL;
}
BOOL
QuerySSLSupported(
VOID
)
{
return m_fSSLSupported;
}
HRESULT
GetIISCertificateMapping(
IIS_CERTIFICATE_MAPPING ** ppIISCertificateMapping
);
HRESULT
GetDataSetCache(
DATA_SET_CACHE ** ppDataSetCache
);
VOID
RemoveDataSetCache(
VOID
);
private:
~W3_SITE();
HRESULT ReadPrivateProperties();
DWORD m_Signature;
LONG m_cRefs;
DWORD m_SiteId;
STRA m_SiteName;
STRU m_SiteMBPath;
STRU m_SiteMBRoot;
FILTER_LIST *m_pInstanceFilterList;
LOGGING *m_pLogging;
BOOL m_fAllowPathInfoForScriptMappings;
BOOL m_fUseDSMapper;
IISWPSiteCounters m_PerfCounters;
//
// OWA related variables
//
STRU m_strAuthChangeUrl;
STRU m_strAuthExpiredUrl;
STRU m_strAdvNotPwdExpUrl;
STRU m_strAuthExpiredUnsecureUrl;
STRU m_strAdvNotPwdExpUnsecureUrl;
DWORD m_dwAdvNotPwdExpInDays;
DWORD m_dwAuthChangeFlags;
DWORD m_dwAdvCacheTTL;
//
// Data set cache management
//
CReaderWriterLock3 m_DataSetCacheLock;
DATA_SET_CACHE * m_pDataSetCache;
//
// Does this site support SSL
//
BOOL m_fSSLSupported;
//
// IIS certificate mapping
// It is loaded on demand on first request to content
// that enable IIS cert mapping
//
IIS_CERTIFICATE_MAPPING * m_pIISCertMap;
BOOL m_fAlreadyAttemptedToLoadIISCertMap;
static CRITICAL_SECTION sm_csIISCertMapLock;
}; // W3_SITE
#endif // _W3SITE_H_