826 lines
22 KiB
C++
826 lines
22 KiB
C++
/*++
|
||
Copyright (c) 1996 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
iisw3.cxx
|
||
|
||
Abstract:
|
||
|
||
This module defines the W3_IIS_SERVICE class
|
||
|
||
Author:
|
||
|
||
Johnson Apacible (JohnsonA) June-04-1996
|
||
|
||
--*/
|
||
|
||
#include "w3p.hxx"
|
||
#include <issched.hxx>
|
||
#include "wamexec.hxx"
|
||
#include "httpxpc.h"
|
||
|
||
#define ADJUST_FOR_MINMAX(a,b,c) ((a)<(b) ? (b) : ((a)>(c) ? (c) : (a)))
|
||
|
||
VOID WINAPI
|
||
NotifyCert11Touched(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Notification function called when any Cert11 mapper modified in metabase
|
||
|
||
Arguments:
|
||
|
||
None
|
||
|
||
Returns:
|
||
|
||
TRUE on success, FALSE on failure
|
||
|
||
--*/
|
||
{
|
||
//
|
||
// If someone has asked to be notified for SSL events, forward notification
|
||
//
|
||
|
||
if ( g_pSslKeysNotify )
|
||
{
|
||
(g_pSslKeysNotify)( SF_NOTIFY_MAPPER_CERT11_TOUCHED, NULL );
|
||
}
|
||
}
|
||
|
||
|
||
BOOL
|
||
W3_IIS_SERVICE::AddInstanceInfo(
|
||
IN DWORD dwInstance,
|
||
IN BOOL fMigrateRoots
|
||
)
|
||
{
|
||
PW3_SERVER_INSTANCE pInstance;
|
||
|
||
IF_DEBUG(INSTANCE) {
|
||
DBGPRINTF(( DBG_CONTEXT,
|
||
"AddInstanceInfo: instance %d reg %s\n", dwInstance, QueryRegParamKey() ));
|
||
}
|
||
|
||
//
|
||
// Create the new instance
|
||
//
|
||
|
||
pInstance = new W3_SERVER_INSTANCE(
|
||
this,
|
||
dwInstance,
|
||
IPPORT_W3,
|
||
QueryRegParamKey(),
|
||
W3_ANONYMOUS_SECRET_W,
|
||
W3_ROOT_SECRET_W,
|
||
fMigrateRoots
|
||
);
|
||
|
||
return AddInstanceInfoHelper( pInstance );
|
||
|
||
} // W3_IIS_SERVICE::AddInstanceInfo
|
||
|
||
DWORD
|
||
W3_IIS_SERVICE::DisconnectUsersByInstance(
|
||
IN IIS_SERVER_INSTANCE * pInstance
|
||
)
|
||
/*++
|
||
|
||
Virtual callback invoked by IIS_SERVER_INSTANCE::StopInstance() to
|
||
disconnect all users associated with the given instance.
|
||
|
||
Arguments:
|
||
|
||
pInstance - All users associated with this instance will be
|
||
forcibly disconnected.
|
||
|
||
--*/
|
||
{
|
||
|
||
CLIENT_CONN::DisconnectAllUsers( pInstance );
|
||
return NO_ERROR;
|
||
|
||
} // W3_IIS_SERVICE::DisconnectUsersByInstance
|
||
|
||
VOID
|
||
W3_IIS_SERVICE::StopInstanceProcs(
|
||
IN IIS_SERVER_INSTANCE * pInstance
|
||
)
|
||
{
|
||
KillCGIInstanceProcs( (W3_SERVER_INSTANCE *)pInstance );
|
||
DBG_ASSERT(g_pWamDictator != NULL);
|
||
|
||
if (!g_pWamDictator)
|
||
{
|
||
return;
|
||
}
|
||
|
||
DWORD dwScheduledId;
|
||
|
||
dwScheduledId = ScheduleWorkItem
|
||
(
|
||
WAM_DICTATOR::StopApplicationsByInstance,
|
||
(PVOID) pInstance,
|
||
0,
|
||
FALSE
|
||
);
|
||
|
||
DBG_ASSERT(dwScheduledId != NULL);
|
||
}
|
||
|
||
|
||
|
||
DWORD
|
||
W3_IIS_SERVICE::GetServiceConfigInfoSize(
|
||
IN DWORD dwLevel
|
||
)
|
||
{
|
||
switch (dwLevel) {
|
||
case 1:
|
||
return sizeof(W3_CONFIG_INFO);
|
||
}
|
||
|
||
return 0;
|
||
|
||
} // W3_IIS_SERVICE::GetServerConfigInfoSize
|
||
|
||
|
||
W3_IIS_SERVICE::W3_IIS_SERVICE(
|
||
IN LPCSTR pszServiceName,
|
||
IN LPCSTR pszModuleName,
|
||
IN LPCSTR pszRegParamKey,
|
||
IN DWORD dwServiceId,
|
||
IN ULONGLONG SvcLocId,
|
||
IN BOOL MultipleInstanceSupport,
|
||
IN DWORD cbAcceptExRecvBuffer,
|
||
IN ATQ_CONNECT_CALLBACK pfnConnect,
|
||
IN ATQ_COMPLETION pfnConnectEx,
|
||
IN ATQ_COMPLETION pfnIoCompletion
|
||
) : IIS_SERVICE( pszServiceName,
|
||
pszModuleName,
|
||
pszRegParamKey,
|
||
dwServiceId,
|
||
SvcLocId,
|
||
MultipleInstanceSupport,
|
||
cbAcceptExRecvBuffer,
|
||
pfnConnect,
|
||
pfnConnectEx,
|
||
pfnIoCompletion
|
||
),
|
||
m_pGlobalFilterList( NULL ),
|
||
m_cInProcISAPI ( 0 ),
|
||
m_astrInProcISAPI ( NULL ),
|
||
m_afISAPIDllName (NULL),
|
||
m_hinstDav (NULL),
|
||
m_cReferences( 1 )
|
||
{
|
||
DWORD err;
|
||
|
||
m_pGlobalFilterList = InitializeFilters( &fAnySecureFilters, this );
|
||
|
||
//
|
||
// Set the notification function in NSEP for mapping ( NSEPM )
|
||
//
|
||
|
||
if ( QueryMDNseObject() != NULL ) {
|
||
|
||
MB mbx( (IMDCOM*)QueryMDNseObject() );
|
||
|
||
if ( mbx.Open( "", METADATA_PERMISSION_WRITE ) )
|
||
{
|
||
|
||
PVOID CallbackAddress = ::NotifyCert11Touched;
|
||
|
||
mbx.SetData(
|
||
"",
|
||
MD_NOTIFY_CERT11_TOUCHED,
|
||
IIS_MD_UT_SERVER,
|
||
BINARY_METADATA,
|
||
(PVOID) &CallbackAddress,
|
||
sizeof(PVOID)
|
||
);
|
||
|
||
mbx.Close();
|
||
}
|
||
}
|
||
|
||
MB mb( (IMDCOM*)QueryMDObject() );
|
||
DWORD dw;
|
||
|
||
#if defined(CAL_ENABLED)
|
||
m_CalVcPerLicense = DEFAULT_W3_CAL_VC_PER_CONNECT;
|
||
m_CalW3Error = DEFAULT_W3_CAL_W3_ERROR;
|
||
m_CalAuthReserveTimeout = DEFAULT_W3_CAL_AUTH_RESERVE_TIMEOUT;
|
||
m_CalSslReserveTimeout = DEFAULT_W3_CAL_SSL_RESERVE_TIMEOUT;
|
||
m_CalMode = DEFAULT_W3_CAL_MODE;
|
||
|
||
if ( mb.Open( QueryMDPath(), METADATA_PERMISSION_READ ) )
|
||
{
|
||
if ( mb.GetDword( "",
|
||
MD_CAL_VC_PER_CONNECT,
|
||
IIS_MD_UT_SERVER,
|
||
&dw ) &&
|
||
dw >= MIN_W3_CAL_VC_PER_CONNECT &&
|
||
dw <= MAX_W3_CAL_VC_PER_CONNECT )
|
||
{
|
||
m_CalVcPerLicense = dw;
|
||
}
|
||
|
||
if ( mb.GetDword( "",
|
||
MD_CAL_W3_ERROR,
|
||
IIS_MD_UT_SERVER,
|
||
&dw ) )
|
||
{
|
||
m_CalW3Error = dw;
|
||
}
|
||
|
||
if ( mb.GetDword( "",
|
||
MD_CAL_AUTH_RESERVE_TIMEOUT,
|
||
IIS_MD_UT_SERVER,
|
||
&dw ) )
|
||
{
|
||
m_CalAuthReserveTimeout = ADJUST_FOR_MINMAX( dw,
|
||
MIN_CAL_RESERVE_TIMEOUT,
|
||
MAX_CAL_RESERVE_TIMEOUT);
|
||
}
|
||
|
||
if ( mb.GetDword( "",
|
||
MD_CAL_SSL_RESERVE_TIMEOUT,
|
||
IIS_MD_UT_SERVER,
|
||
&dw ) )
|
||
{
|
||
m_CalSslReserveTimeout = ADJUST_FOR_MINMAX( dw,
|
||
MIN_CAL_RESERVE_TIMEOUT,
|
||
MAX_CAL_RESERVE_TIMEOUT);
|
||
}
|
||
|
||
mb.Close();
|
||
}
|
||
#endif
|
||
|
||
ReadInProcISAPIList();
|
||
|
||
GetDavDll();
|
||
|
||
//
|
||
// Iinit Dav performance data
|
||
//
|
||
W3OpenDavPerformanceData();
|
||
|
||
} // W3_IIS_SERVICE::W3_IIS_SERVICE
|
||
|
||
W3_IIS_SERVICE::~W3_IIS_SERVICE()
|
||
{
|
||
//
|
||
// Deinit Dav performance data
|
||
//
|
||
W3CloseDavPerformanceData();
|
||
|
||
if ( m_pGlobalFilterList )
|
||
{
|
||
FILTER_LIST::Dereference( m_pGlobalFilterList );
|
||
}
|
||
|
||
//
|
||
// Reset the notification function in NSEP for mapping ( NSEPM )
|
||
//
|
||
|
||
if ( QueryMDNseObject() != NULL ) {
|
||
|
||
MB mbx( (IMDCOM*)QueryMDNseObject() );
|
||
|
||
if ( mbx.Open( "", METADATA_PERMISSION_WRITE ) )
|
||
{
|
||
PVOID CallbackAddress = NULL;
|
||
|
||
mbx.SetData(
|
||
"",
|
||
MD_NOTIFY_CERT11_TOUCHED,
|
||
IIS_MD_UT_SERVER,
|
||
BINARY_METADATA,
|
||
(PVOID) &CallbackAddress,
|
||
sizeof(PVOID)
|
||
);
|
||
|
||
mbx.Close();
|
||
}
|
||
}
|
||
|
||
//
|
||
// Free the in-process ISAPI Applications data
|
||
//
|
||
|
||
delete [] m_astrInProcISAPI;
|
||
delete [] m_afISAPIDllName;
|
||
|
||
if (m_hinstDav != NULL)
|
||
{
|
||
FreeLibrary(m_hinstDav);
|
||
m_hinstDav = NULL;
|
||
}
|
||
}
|
||
|
||
|
||
VOID
|
||
W3_IIS_SERVICE::MDChangeNotify(
|
||
MD_CHANGE_OBJECT * pcoChangeList
|
||
)
|
||
/*++
|
||
|
||
This method handles the metabase change notification for this service
|
||
|
||
Arguments:
|
||
|
||
pcoChangeList - path and id that has changed
|
||
|
||
--*/
|
||
{
|
||
DWORD i;
|
||
BOOL fSslModified = FALSE;
|
||
|
||
if ( g_pInetSvc == NULL )
|
||
{
|
||
return;
|
||
}
|
||
|
||
AcquireServiceLock();
|
||
|
||
IIS_SERVICE::MDChangeNotify( pcoChangeList );
|
||
|
||
|
||
for ( i = 0; i < pcoChangeList->dwMDNumDataIDs; i++ )
|
||
{
|
||
switch ( pcoChangeList->pdwMDDataIDs[i] )
|
||
{
|
||
#if 0 // Unused in IIS 5
|
||
case MD_SSL_PUBLIC_KEY:
|
||
case MD_SSL_PRIVATE_KEY:
|
||
case MD_SSL_KEY_PASSWORD:
|
||
#endif
|
||
//
|
||
// Server cert properties
|
||
//
|
||
case MD_SSL_CERT_HASH:
|
||
case MD_SSL_CERT_CONTAINER:
|
||
case MD_SSL_CERT_PROVIDER:
|
||
case MD_SSL_CERT_OPEN_FLAGS:
|
||
case MD_SSL_CERT_STORE_NAME:
|
||
|
||
//
|
||
// Fortezza-specific properties
|
||
//
|
||
case MD_SSL_CERT_IS_FORTEZZA:
|
||
case MD_SSL_CERT_FORTEZZA_PIN:
|
||
case MD_SSL_CERT_FORTEZZA_SERIAL_NUMBER:
|
||
case MD_SSL_CERT_FORTEZZA_PERSONALITY:
|
||
case MD_SSL_CERT_FORTEZZA_PROG_PIN:
|
||
|
||
//
|
||
// Server CTL properties
|
||
//
|
||
case MD_SSL_CTL_IDENTIFIER:
|
||
case MD_SSL_CTL_CONTAINER:
|
||
case MD_SSL_CTL_PROVIDER:
|
||
case MD_SSL_CTL_PROVIDER_TYPE:
|
||
case MD_SSL_CTL_OPEN_FLAGS:
|
||
case MD_SSL_CTL_STORE_NAME:
|
||
case MD_SSL_CTL_SIGNER_HASH:
|
||
case MD_SSL_USE_DS_MAPPER:
|
||
|
||
fSslModified = TRUE;
|
||
break;
|
||
|
||
case MD_IN_PROCESS_ISAPI_APPS:
|
||
ReadInProcISAPIList();
|
||
break;
|
||
|
||
case MD_CPU_APP_ENABLED:
|
||
case MD_CPU_LOGGING_MASK:
|
||
case MD_CPU_LIMITS_ENABLED:
|
||
|
||
DWORD dwPathBufferLen;
|
||
VOID *pvPath;
|
||
dwPathBufferLen = strlen((LPSTR)pcoChangeList->pszMDPath) + 1;
|
||
pvPath = new BYTE[dwPathBufferLen];
|
||
if (pvPath != NULL)
|
||
{
|
||
memcpy(pvPath, pcoChangeList->pszMDPath, dwPathBufferLen);
|
||
|
||
if (W3_JOB_QUEUE::QueueWorkItem( JQA_RESTART_ALL_APPS,
|
||
NULL,
|
||
pvPath ) != ERROR_SUCCESS)
|
||
{
|
||
|
||
delete pvPath;
|
||
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
ReleaseServiceLock();
|
||
|
||
if ( fSslModified && g_pSslKeysNotify )
|
||
{
|
||
(g_pSslKeysNotify)( SF_NOTIFY_MAPPER_SSLKEYS_CHANGED, this );
|
||
}
|
||
}
|
||
|
||
BOOL
|
||
W3_IIS_SERVICE::GetGlobalStatistics(
|
||
IN DWORD dwLevel,
|
||
OUT PCHAR *pBuffer
|
||
)
|
||
{
|
||
APIERR err = NO_ERROR;
|
||
|
||
switch( dwLevel )
|
||
{
|
||
case 0 :
|
||
{
|
||
LPW3_STATISTICS_1 pstats1;
|
||
|
||
pstats1 = (W3_STATISTICS_1 *) MIDL_user_allocate( sizeof(W3_STATISTICS_1) );
|
||
if( pstats1 == NULL )
|
||
{
|
||
err = ERROR_NOT_ENOUGH_MEMORY;
|
||
}
|
||
else
|
||
{
|
||
g_pW3Stats->CopyToStatsBuffer( pstats1 );
|
||
*pBuffer = (PCHAR)pstats1;
|
||
}
|
||
}
|
||
break;
|
||
|
||
default :
|
||
err = ERROR_INVALID_LEVEL;
|
||
break;
|
||
}
|
||
|
||
SetLastError(err);
|
||
return(err == NO_ERROR);
|
||
} // IIS_SERVICE::GetGlobalStatistics
|
||
BOOL
|
||
W3_IIS_SERVICE::AggregateStatistics(
|
||
IN PCHAR pDestination,
|
||
IN PCHAR pSource
|
||
)
|
||
{
|
||
LPW3_STATISTICS_1 pStatDest = (LPW3_STATISTICS_1) pDestination;
|
||
LPW3_STATISTICS_1 pStatSrc = (LPW3_STATISTICS_1) pSource;
|
||
|
||
if ((NULL == pDestination) || (NULL == pSource))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
pStatDest->TotalBytesSent.QuadPart += pStatSrc->TotalBytesSent.QuadPart;
|
||
pStatDest->TotalBytesReceived.QuadPart += pStatSrc->TotalBytesReceived.QuadPart;
|
||
|
||
pStatDest->TotalFilesSent += pStatSrc->TotalFilesSent;
|
||
pStatDest->TotalFilesReceived += pStatSrc->TotalFilesReceived;
|
||
|
||
pStatDest->CurrentAnonymousUsers += pStatSrc->CurrentAnonymousUsers;
|
||
pStatDest->CurrentNonAnonymousUsers += pStatSrc->CurrentNonAnonymousUsers;
|
||
pStatDest->TotalAnonymousUsers += pStatSrc->TotalAnonymousUsers;
|
||
pStatDest->TotalNonAnonymousUsers += pStatSrc->TotalNonAnonymousUsers;
|
||
pStatDest->MaxAnonymousUsers += pStatSrc->MaxAnonymousUsers;
|
||
pStatDest->MaxNonAnonymousUsers += pStatSrc->MaxNonAnonymousUsers;
|
||
|
||
//
|
||
// Global values. do not add
|
||
//
|
||
|
||
pStatDest->CurrentConnections = pStatSrc->CurrentConnections;
|
||
pStatDest->MaxConnections = pStatSrc->MaxConnections;
|
||
pStatDest->ConnectionAttempts = pStatSrc->ConnectionAttempts;
|
||
|
||
pStatDest->LogonAttempts += pStatSrc->LogonAttempts;
|
||
|
||
pStatDest->TotalOptions += pStatSrc->TotalOptions;
|
||
pStatDest->TotalGets += pStatSrc->TotalGets;
|
||
pStatDest->TotalPosts += pStatSrc->TotalPosts;
|
||
pStatDest->TotalHeads += pStatSrc->TotalHeads;
|
||
pStatDest->TotalPuts += pStatSrc->TotalPuts;
|
||
pStatDest->TotalDeletes += pStatSrc->TotalDeletes;
|
||
pStatDest->TotalTraces += pStatSrc->TotalTraces;
|
||
pStatDest->TotalMove += pStatSrc->TotalMove;
|
||
pStatDest->TotalCopy += pStatSrc->TotalCopy;
|
||
pStatDest->TotalMkcol += pStatSrc->TotalMkcol;
|
||
pStatDest->TotalPropfind += pStatSrc->TotalPropfind;
|
||
pStatDest->TotalProppatch += pStatSrc->TotalProppatch;
|
||
pStatDest->TotalSearch += pStatSrc->TotalSearch;
|
||
pStatDest->TotalLock += pStatSrc->TotalLock;
|
||
pStatDest->TotalUnlock += pStatSrc->TotalUnlock;
|
||
pStatDest->TotalOthers += pStatSrc->TotalOthers;
|
||
|
||
pStatDest->TotalCGIRequests += pStatSrc->TotalCGIRequests;
|
||
pStatDest->TotalBGIRequests += pStatSrc->TotalBGIRequests;
|
||
pStatDest->TotalNotFoundErrors += pStatSrc->TotalNotFoundErrors;
|
||
|
||
#if defined(CAL_ENABLED)
|
||
|
||
pStatDest->CurrentCalAuth += pStatSrc->CurrentCalAuth;
|
||
pStatDest->MaxCalAuth += pStatSrc->MaxCalAuth;
|
||
pStatDest->TotalFailedCalAuth += pStatSrc->TotalFailedCalAuth;
|
||
pStatDest->CurrentCalSsl += pStatSrc->CurrentCalSsl;
|
||
pStatDest->MaxCalSsl += pStatSrc->MaxCalSsl;
|
||
pStatDest->TotalFailedCalSsl += pStatSrc->TotalFailedCalSsl;
|
||
|
||
#endif
|
||
|
||
pStatDest->CurrentCGIRequests += pStatSrc->CurrentCGIRequests;
|
||
pStatDest->CurrentBGIRequests += pStatSrc->CurrentBGIRequests;
|
||
pStatDest->MaxCGIRequests += pStatSrc->MaxCGIRequests;
|
||
pStatDest->MaxBGIRequests += pStatSrc->MaxBGIRequests;
|
||
|
||
// bandwidth throttling info
|
||
|
||
pStatDest->CurrentBlockedRequests += pStatSrc->CurrentBlockedRequests;
|
||
pStatDest->TotalBlockedRequests += pStatSrc->TotalBlockedRequests;
|
||
pStatDest->TotalAllowedRequests += pStatSrc->TotalAllowedRequests;
|
||
pStatDest->TotalRejectedRequests += pStatSrc->TotalRejectedRequests;
|
||
pStatDest->MeasuredBw += pStatSrc->MeasuredBw;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
inline BOOL
|
||
IsISAPIRelativePath( LPCSTR pszPath)
|
||
/*++
|
||
Description:
|
||
This function checks to see if the path specified contains
|
||
no path-separators. If there are no path separators, then
|
||
the given string refers to relative path.
|
||
|
||
Arguments:
|
||
pszPath - pointer to string containing the path for check
|
||
|
||
Returns:
|
||
TRUE - if this is a relative path
|
||
FALSE - if the specified path is an absolute path
|
||
--*/
|
||
{
|
||
LPCSTR pszPathSeparator;
|
||
|
||
DBG_ASSERT( NULL != pszPath);
|
||
|
||
pszPathSeparator = strchr( pszPath, '\\');
|
||
|
||
//
|
||
// if there is no path-separator => pszPathSeparator == NULL
|
||
// ==> return TRUE
|
||
// if there is a path-separator => pszPathSeparator != NULL
|
||
// ==> return FALSE
|
||
//
|
||
return ( pszPathSeparator == NULL);
|
||
|
||
} // IsISAPIRelativePath()
|
||
|
||
|
||
static
|
||
VOID
|
||
AddFiltersToMultiSz(
|
||
IN const MB & mb,
|
||
IN const char * szFilterPath,
|
||
IN OUT MULTISZ * pmsz
|
||
)
|
||
/*++
|
||
|
||
Description:
|
||
Add the ISAPI filters at the specified metabase path to pmsz.
|
||
|
||
Called by AddAllFiltersToMultiSz.
|
||
|
||
Arguments:
|
||
mb metabase key open to /LM/W3SVC
|
||
szFilterPath path of /Filters key relative to /LM/W3SVC
|
||
pmsz multisz containing the in proc dlls
|
||
|
||
Return:
|
||
Nothing - failure cases ignored.
|
||
|
||
--*/
|
||
{
|
||
CHAR szKeyName[MAX_PATH + 1];
|
||
STR strFilterPath;
|
||
STR strFullKeyName( szFilterPath );
|
||
INT pchFilterPath = ::strlen( szFilterPath );
|
||
|
||
DWORD i = 0;
|
||
|
||
if( strFullKeyName.Append( "/", 1 ) )
|
||
{
|
||
while ( const_cast<MB &>(mb).EnumObjects( szFilterPath,
|
||
szKeyName,
|
||
i++ ) )
|
||
{
|
||
|
||
if( strFullKeyName.Append( szKeyName ) )
|
||
{
|
||
if( const_cast<MB &>(mb).GetStr( strFullKeyName.QueryStr(),
|
||
MD_FILTER_IMAGE_PATH,
|
||
IIS_MD_UT_SERVER,
|
||
&strFilterPath ) )
|
||
{
|
||
pmsz->Append( strFilterPath );
|
||
}
|
||
}
|
||
strFullKeyName.SetLen( pchFilterPath + 1 );
|
||
}
|
||
}
|
||
}
|
||
|
||
static
|
||
VOID
|
||
AddAllFiltersToMultiSz(
|
||
IN const MB & mb,
|
||
IN OUT MULTISZ * pmsz
|
||
)
|
||
/*++
|
||
|
||
Description:
|
||
|
||
This is designed to prevent ISAPI extension/filter
|
||
combination dlls from running out of process.
|
||
|
||
Add the base set of filters defined for the service to pmsz.
|
||
Iterate through the sites and add the filters defined for
|
||
each site.
|
||
|
||
Arguments:
|
||
|
||
mb metabase key open to /LM/W3SVC
|
||
pmsz multisz containing the in proc dlls
|
||
|
||
Return:
|
||
Nothing - failure cases ignored.
|
||
|
||
--*/
|
||
{
|
||
CHAR szKeyName[MAX_PATH + 1];
|
||
STR strFullKeyName("/");
|
||
DWORD i = 0;
|
||
DWORD dwInstanceId = 0;
|
||
|
||
AddFiltersToMultiSz( mb, IIS_MD_ISAPI_FILTERS, pmsz );
|
||
|
||
while ( const_cast<MB &>(mb).EnumObjects( "",
|
||
szKeyName,
|
||
i++ ) )
|
||
{
|
||
dwInstanceId = ::atoi( szKeyName );
|
||
if( 0 != dwInstanceId )
|
||
{
|
||
// This is a site.
|
||
if( strFullKeyName.Append( szKeyName ) &&
|
||
strFullKeyName.Append( IIS_MD_ISAPI_FILTERS ) )
|
||
{
|
||
AddFiltersToMultiSz( mb, strFullKeyName.QueryStr(), pmsz );
|
||
}
|
||
|
||
strFullKeyName.SetLen( 1 );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
BOOL
|
||
W3_IIS_SERVICE::ReadInProcISAPIList(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
This method reads the list of ISAPI dlls that must be run in process
|
||
|
||
Arguments:
|
||
|
||
--*/
|
||
{
|
||
MB mb( (IMDCOM*)QueryMDObject() );
|
||
MULTISZ msz;
|
||
BOOL fReturn = TRUE;
|
||
|
||
if ( mb.Open( QueryMDPath(), METADATA_PERMISSION_READ ) &&
|
||
mb.GetMultisz( "",
|
||
MD_IN_PROCESS_ISAPI_APPS,
|
||
IIS_MD_UT_SERVER,
|
||
&msz ))
|
||
{
|
||
m_InProcLock.Lock( TSRES_LOCK_WRITE );
|
||
|
||
//
|
||
// Free the existing list
|
||
//
|
||
|
||
delete [] m_astrInProcISAPI;
|
||
delete [] m_afISAPIDllName;
|
||
|
||
|
||
m_InProcISAPItable.Clear();
|
||
m_astrInProcISAPI = NULL;
|
||
m_afISAPIDllName = NULL;
|
||
|
||
m_cInProcISAPI = 0;
|
||
|
||
//
|
||
// Merge all the ISAPI filters into the in-proc list.
|
||
//
|
||
AddAllFiltersToMultiSz( mb, &msz );
|
||
|
||
if ( msz.QueryStringCount() )
|
||
{
|
||
DWORD i;
|
||
const CHAR * psz;
|
||
const DWORD cIsapis = msz.QueryStringCount();
|
||
|
||
m_astrInProcISAPI = new STR[cIsapis];
|
||
m_afISAPIDllName = new BOOL[cIsapis];
|
||
|
||
//
|
||
// Initialize the relative paths
|
||
//
|
||
if (m_astrInProcISAPI != NULL && m_afISAPIDllName != NULL)
|
||
{
|
||
for ( i = 0, psz = msz.First();
|
||
psz != NULL;
|
||
i++, psz = msz.Next( psz ) )
|
||
{
|
||
if ( !m_astrInProcISAPI[i].Copy( psz ))
|
||
{
|
||
fReturn = FALSE;
|
||
break;
|
||
}
|
||
|
||
m_afISAPIDllName[i] = ( IsISAPIRelativePath( psz));
|
||
m_InProcISAPItable.InsertRecord(&m_astrInProcISAPI[i]);
|
||
m_cInProcISAPI++;
|
||
}
|
||
} else {
|
||
fReturn = FALSE;
|
||
}
|
||
|
||
DBG_ASSERT(m_cInProcISAPI == cIsapis);
|
||
|
||
}
|
||
|
||
m_InProcLock.Unlock();
|
||
}
|
||
|
||
return fReturn;
|
||
}
|
||
|
||
|
||
|
||
VOID
|
||
W3_IIS_SERVICE::GetDavDll()
|
||
{
|
||
LONG lReg = 0;
|
||
HKEY hKey = NULL;
|
||
HRESULT hr = NOERROR;
|
||
|
||
DBG_ASSERT(m_hinstDav == NULL);
|
||
|
||
lReg = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
|
||
"Software\\Microsoft\\InetStp",
|
||
0,
|
||
KEY_READ,
|
||
&hKey);
|
||
|
||
if (lReg == ERROR_SUCCESS)
|
||
{
|
||
DWORD dwType;
|
||
CHAR szDavDllPath[255];
|
||
DWORD cbName = sizeof(szDavDllPath);
|
||
|
||
lReg = RegQueryValueExA(hKey,
|
||
"InstallPath",
|
||
0,
|
||
&dwType,
|
||
(LPBYTE) szDavDllPath,
|
||
&cbName);
|
||
|
||
if (lReg == ERROR_SUCCESS && dwType == REG_SZ)
|
||
{
|
||
m_strDav.Copy(szDavDllPath);
|
||
m_strDav.Append("\\httpext.dll");
|
||
|
||
m_hinstDav = LoadLibrary(m_strDav.QueryStr());
|
||
if (m_hinstDav == NULL)
|
||
m_strDav.Reset();
|
||
}
|
||
|
||
RegCloseKey(hKey);
|
||
}
|
||
}
|
||
|