371 lines
9.8 KiB
C++
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 ***********************/
|