443 lines
7.6 KiB
C
443 lines
7.6 KiB
C
|
/*++
|
||
|
|
||
|
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
|
||
|
|
||
|
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'
|
||
|
|
||
|
/*++
|
||
|
|
||
|
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);
|
||
|
};
|
||
|
|
||
|
class W3_METADATA_CACHE;
|
||
|
class W3_URL_INFO_CACHE;
|
||
|
class UL_RESPONSE_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;
|
||
|
}
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
CHAR *
|
||
|
QueryComputerName()
|
||
|
{
|
||
|
return m_pszComputerName;
|
||
|
}
|
||
|
|
||
|
USHORT
|
||
|
QueryComputerNameLength()
|
||
|
{
|
||
|
return m_cchComputerName;
|
||
|
}
|
||
|
|
||
|
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
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Metabase change handlers
|
||
|
//
|
||
|
|
||
|
HRESULT
|
||
|
MetabaseChangeNotification(
|
||
|
DWORD dwMDNumElements,
|
||
|
MD_CHANGE_OBJECT pcoChangeList[]
|
||
|
);
|
||
|
|
||
|
HRESULT
|
||
|
HandleMetabaseChange(
|
||
|
const MD_CHANGE_OBJECT & ChangeObject
|
||
|
);
|
||
|
|
||
|
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_FILTERS,
|
||
|
INIT_W3_SITE,
|
||
|
INIT_SITE_LIST,
|
||
|
INIT_ULATQ,
|
||
|
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_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;
|
||
|
|
||
|
//
|
||
|
// 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;
|
||
|
|
||
|
//
|
||
|
// Number of current sites
|
||
|
//
|
||
|
DWORD m_cSites;
|
||
|
|
||
|
//
|
||
|
// 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;
|
||
|
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;
|
||
|
};
|
||
|
|
||
|
extern W3_SERVER * g_pW3Server;
|
||
|
|
||
|
#endif // _W3SERVER_H_
|