windows-nt/Source/XPSP1/NT/inetsrv/iis/staxinc/isvcinfo.hxx
2020-09-26 16:20:57 +08:00

371 lines
9.8 KiB
C++

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name :
isvcinfo.hxx
Abstract:
This header file declares the INTERNET SERVICES INFO object.
This class serves as a base class for all the functions exported
as part of commnon services DLL for Internet services.
Author:
Murali R. Krishnan ( MuraliK ) 28-July-1995
Environment:
Win32 User Mode
Project:
Internet Services Common DLL
Revision History:
Murali R. Krishnan (MuraliK) 21-Dec-1995 Support for ISRPC component
--*/
# ifndef _ISVC_INFO_HXX_
# define _ISVC_INFO_HXX_
/************************************************************
* Include Headers
************************************************************/
# include "string.hxx"
# include "tsres.hxx"
# include "eventlog.hxx"
extern "C" {
# include "inetcom.h"
# include "inetinfo.h"
# include "tcpsvcs.h"
# include "rpc.h"
# include "svcloc.h"
};
# include "isrpc.hxx"
# include "inetlog.h"
#ifdef CHICAGO
#undef ASSERT
#define ASSERT TCP_ASSERT
#endif
//
// Following constants are used for maintaining state of the log object
//
enum ILOG_STATES {
ILOG_OFF = 0, // logging is shut down.
ILOG_ACTIVE, // logging is active and working fine
ILOG_SUSPENDED // logging is temporarily suspended.
};
/************************************************************
* Type Definitions
************************************************************/
class ISVC_INFO;
// these functions get called back with the pointer to isvcinfo object
// along with supplied context parameter.
typedef BOOL (*TS_PFN_SVC_ENUM)( IN ISVC_INFO * pIsvcInfo,
IN PVOID pContext );
class ISVC_INFO {
public:
dllexp
ISVC_INFO(
IN DWORD dwServiceId,
IN LPCTSTR lpszServiceName,
IN LPCTSTR lpszModuleName,
IN LPCTSTR lpszRegParamKey
);
dllexp
virtual ~ISVC_INFO(VOID);
//
// VIRTUAL methods
//
dllexp virtual BOOL IsValid(VOID) const { return (m_fValid); }
dllexp
virtual BOOL
ReadParamsFromRegistry( IN FIELD_CONTROL fc);
dllexp
virtual BOOL SetConfiguration( IN PVOID pConfig);
dllexp
virtual BOOL GetConfiguration( IN OUT PVOID pConfig);
dllexp
virtual DWORD
QueryCurrentServiceState( VOID) const
// derived object should maintain state
{ return ( SERVICE_STOPPED); }
//
// Parameter access methods. Note that string or non-trivial admin data
// items must have the read lock taken.
//
dllexp LIST_ENTRY & QueryListEntry( VOID)
{ return ( m_listEntry); }
dllexp DWORD QueryServiceId( VOID ) const
{ return ( m_dwServiceId ); }
dllexp LPCTSTR QueryServiceName(VOID) const
{ return (m_strServiceName.QueryStr()); }
dllexp LPCTSTR QueryRegParamKey(VOID) const
{ return m_strParametersKey.QueryStr(); }
dllexp LPCTSTR QueryAdminName(VOID) const
{ ASSERT( m_cReadLocks ); return m_strAdminName.QueryStr(); }
dllexp LPCTSTR QueryAdminEmail(VOID) const
{ ASSERT( m_cReadLocks ); return m_strAdminEmail.QueryStr(); }
dllexp LPCTSTR QueryServerComment(VOID) const
{ ASSERT( m_cReadLocks ); return m_strServerComment.QueryStr(); }
dllexp DWORD QueryMaxConnections( VOID ) const
{ return m_dwMaxConnections; }
dllexp DWORD QueryConnectionTimeout( VOID ) const
{ return m_dwConnectionTimeout; }
dllexp LPCTSTR QueryModuleName( VOID) const
{ return ( m_strModuleName.QueryStr()); }
dllexp EVENT_LOG * QueryEventLog(VOID) { return (&m_EventLog); }
dllexp HMODULE QueryHandleForModule(VOID) const { return (m_hModule); }
//
// IPC related functions
//
dllexp VOID SetTcpsvcsGlobalData( IN PTCPSVCS_GLOBAL_DATA ptgData)
{ m_pTcpsvcsGlobalData = ptgData; }
dllexp PTCPSVCS_GLOBAL_DATA QueryTcpsvcsGlobalData( VOID) const
{ return ( m_pTcpsvcsGlobalData); }
dllexp DWORD InitializeIpc( IN UCHAR * pszProtseq,
IN UCHAR * pszEndpoint,
IN RPC_IF_HANDLE rpcIfHandle)
{ // standby function, till everyone changes the code over....
return ( InitializeIpc( rpcIfHandle));
}
dllexp DWORD InitializeIpc( IN RPC_IF_HANDLE rpcIfHandle);
dllexp DWORD CleanupIpc( IN RPC_IF_HANDLE rpcIfHandle);
dllexp DWORD InitializeDiscovery( IN LPINET_BINDINGS pExtraInetBindings);
dllexp DWORD TerminateDiscovery( VOID);
//
// Data access protection methods
//
dllexp VOID
LockThisForRead( VOID )
{
m_tslock.Lock( TSRES_LOCK_READ );
ASSERT( InterlockedIncrement( &m_cReadLocks ) > 0);
}
dllexp VOID
LockThisForWrite( VOID )
{
m_tslock.Lock( TSRES_LOCK_WRITE );
ASSERT( m_cReadLocks == 0);
}
dllexp VOID
UnlockThis( VOID )
{
#if DBG
if ( m_cReadLocks ) // If non-zero, then this is a read unlock
InterlockedDecrement( &m_cReadLocks );
#endif
m_tslock.Unlock();
}
//
// Miscellaneous methods
//
dllexp BOOL
LoadStr( OUT STR & str, IN DWORD dwResId) const;
//
// Event log related API
//
dllexp VOID
LogEvent(
IN DWORD idMessage, // id for log message
IN WORD cSubStrings, // count of substrings
IN const CHAR * apszSubStrings[], // substrings in the message
IN DWORD errCode = 0 // error code if any
)
{
m_EventLog.LogEvent( idMessage, cSubStrings,
apszSubStrings, errCode);
}
dllexp VOID
LogEvent(
IN DWORD idMessage, // id for log message
IN WORD cSubStrings, // count of substrings
IN WCHAR * apszSubStrings[], // substrings in the message
IN DWORD errCode = 0 // error code if any
)
{
m_EventLog.LogEvent( idMessage, cSubStrings,
apszSubStrings, errCode);
}
//
// Logging related APIs. They call logging apis only if logging is on.
//
INETLOG_HANDLE QueryInetLog(VOID) const { return (m_hInetLog); }
dllexp
DWORD
LogInformation( IN const INETLOG_INFORMATIONA * pInetLogInfo,
OUT LPSTR pszErrorMessage,
IN OUT LPDWORD lpcchErrorMessage);
dllexp
DWORD
LogInformation( IN const INETLOG_INFORMATIONW * pInetLogInfo,
OUT LPWSTR pszErrorMessage,
IN OUT LPDWORD lpcchErrorMessage);
dllexp BOOL
TerminateLogging( VOID);
# if DBG
virtual VOID Print( VOID) const;
# endif // DBG
protected:
LONG m_cReadLocks; // tracks number of outstanding reads
private:
BOOL m_fValid; // indicates if this object is valid
DWORD m_fIpcStarted : 1;
DWORD m_fSvcLocationDone : 1;
BOOL m_fEnableSvcLocation;
ISRPC m_isrpc;
TS_RESOURCE m_tslock; // protects the service specific data
PTCPSVCS_GLOBAL_DATA m_pTcpsvcsGlobalData;
DWORD m_dwMaxConnections;
DWORD m_dwConnectionTimeout;
DWORD m_dwServiceId; // Id for the service
STR m_strServiceName;// string with service name
STR m_strModuleName; // (eg: foo.dll) for loading resources
HMODULE m_hModule; // cached module handle
//
// location in registry where the parameters key containing common
// service specific data may be found.
//
STR m_strParametersKey;
STR m_strAdminName;
STR m_strAdminEmail;
STR m_strServerComment;
EVENT_LOG m_EventLog; // eventlog object for logging events
INETLOG_HANDLE m_hInetLog; // Request Log object
BOOL m_fLoggingOn; // keeps track of status if logging is on
// for use with InterlockedExchange, use following as LONG
LONG m_lLoggingState;
LIST_ENTRY m_listEntry; // to link all ISVC_INFO objects
dllexp RPC_STATUS StartRpcServerListen( VOID) const
{ return m_pTcpsvcsGlobalData->StartRpcServerListen(); }
dllexp RPC_STATUS StopRpcServerListen( VOID) const
{ return m_pTcpsvcsGlobalData->StopRpcServerListen(); }
//
// class STATIC data and member functions definitions
//
// Primarily keeps track of list of active services.
//
public:
static BOOL InitializeServiceInfo(VOID);
static VOID CleanupServiceInfo(VOID);
//
// EnumerateServiceInfo() is used for enumerating active services.
// It calls the function pfnEnum for each running service that matches
// services mask in dwServices.
//
static BOOL
EnumerateServiceInfo( IN TS_PFN_SVC_ENUM pfnEnum,
IN PVOID pContext,
IN DWORD dwServices
);
private:
static LIST_ENTRY sm_ServiceInfoListHead;
static DWORD sm_nServices;
static BOOL sm_fInitialized;
static CRITICAL_SECTION sm_csLock; // lock for list mods.
static BOOL InsertInServiceInfoList(IN ISVC_INFO * pIsvcInfo);
static BOOL RemoveFromServiceInfoList(IN ISVC_INFO * pIsvcInfo);
}; // class ISVC_INFO
typedef ISVC_INFO FAR * PISVC_INFO;
typedef ISVC_INFO FAR * LPISVC_INFO;
# endif // _ISVC_INFO_HXX_
/************************ End of File ***********************/