/*++ Copyright (c) 1992-1996 Microsoft Corporation Module Name: iisutil.h Abstract: IIS Resource utility routine DLL Author: Pete Benoit (v-pbenoi) 12-SEP-1996 Revision History: --*/ #ifndef IISUTIL_H #define IISUTIL_H #define UNICODE 1 #if defined(__cplusplus) extern "C" { #endif #include "clusres.h" #include "wtypes.h" #include "iiscnfg.h" #include "iiscnfgp.h" #include "iiscl.h" #if defined(__cplusplus) } // extern "C" #endif #include #include #include extern PLOG_EVENT_ROUTINE g_IISLogEvent; //#define IISLogEvent ClusResLogEvent //#define IISSetResourceStatus ClusResSetResourceStatus #if DBG //#define DBG_CANT_VERIFY //extern BOOL g_fDbgCantVerify; #endif #if 1 #define _DEBUG_SUPPORT extern char debug_buffer[]; extern FILE* debug_file; extern void InitDebug(); #define DEBUG_BUFFER debug_buffer #define DECLARE_DEBUG_BUFFER char debug_buffer[256]; FILE *debug_file=NULL #define INIT_DEBUG InitDebug() #define TERMINATE_DEBUG if ( debug_file ) fclose(debug_file) extern void TimeStamp( FILE* ); #define TR(a) { if ( debug_file ) {TimeStamp(debug_file); wsprintfA a; fputs(debug_buffer,debug_file); fflush(debug_file);} } #else #define DEBUG_BUFFER #define DECLARE_DEBUG_BUFFER #define INIT_DEBUG #define TERMINATE_DEBUG #define TR(a) #endif extern DWORD g_dwTlsCoInit; extern HANDLE g_hEventLog; #define SetCoInit( a ) TlsSetValue( g_dwTlsCoInit, (LPVOID)a ) #define GetCoInit() (BOOL)(!!PtrToUlong(TlsGetValue( g_dwTlsCoInit ))) // Define the Service Identifiers #define IIS_SERVICE_TYPE_W3 0 #define IIS_SERVICE_TYPE_FTP 1 #define IIS_SERVICE_TYPE_SMTP 2 #define IIS_SERVICE_TYPE_NNTP 3 #define MAX_SERVICE IIS_SERVICE_TYPE_NNTP + 1 // Define the default ports for services const USHORT DEFAULT_PORT[MAX_SERVICE] = { 80, // W3 21, // FTP 25, // SMTP 119 // NNTP }; // Define the resource type identifiers #define IIS_RESOURCE_TYPE 0 #define SMTP_RESOURCE_TYPE 1 #define NNTP_RESOURCE_TYPE 2 #define MAX_RESOURCE_TYPE NNTP_RESOURCE_TYPE + 1 // Define the resource type names const WCHAR RESOURCE_TYPE[MAX_RESOURCE_TYPE][MAX_PATH] = { L"IIS Server Instance", L"SMTP Server Instance", L"NNTP Server Instance" }; // Define some max values #define SERVER_START_DELAY 1000 // 1 Second #define MAX_DEFAULT_WSTRING_SIZE 512 // Default string size #define MAX_RETRY 4 // 4 Retries #define MAX_MUTEX_WAIT 10*1000 // 10 seconds #define IP_ADDRESS_RESOURCE_NAME L"IP Address" #define CHECK_IS_ALIVE_CONNECT_TIMEOUT 10 #define CHECK_IS_ALIVE_SEND_TIMEOUT 10 #define CHECK_IS_ALIVE_SEND_TIMEOUT 10 #define IIS_RESOURCE_SIGNATURE 0x75fc983b #define MB_TIMEOUT 5000 #define SERVICE_START_MAX_POLL 30 #define SERVICE_START_POLL_DELAY 1000 #define IISCLUS_ONLINE_TIMEOUT 30 // 30 s #define IISCLUS_OFFLINE_TIMEOUT (60*3) // 3 minutes // Define parameters structure typedef struct _IIS_PARAMS { LPWSTR ServiceName; LPWSTR InstanceId; LPWSTR MDPath; DWORD ServiceType; } IIS_PARAMS, *PIIS_PARAMS; // Define the resource data structure typedef struct _IIS_RESOURCE { DWORD Signature; DWORD dwPort; SOCKADDR saServer; BOOL bAlive; LIST_ENTRY ListEntry; LPWSTR ResourceName; IIS_PARAMS Params; RESOURCE_HANDLE ResourceHandle; HKEY ParametersKey; CLUS_WORKER OnlineThread; CLUS_WORKER OfflineThread; CLUSTER_RESOURCE_STATE State; } IIS_RESOURCE, *LPIIS_RESOURCE; DWORD SetInstanceState( IN PCLUS_WORKER pWorker, IN LPIIS_RESOURCE ResourceEntry, IN RESOURCE_STATUS* presourceStatus, IN CLUSTER_RESOURCE_STATE TargetState, IN LPWSTR TargetStateString, IN DWORD dwMdPropControl, IN DWORD dwMdPropTarget ); DWORD InstanceEnableCluster( LPWSTR pwszServiceName, LPWSTR pwszInstanceId ); DWORD InstanceDisableCluster( LPWSTR pwszServiceName, LPWSTR pwszInstanceId ); VOID DestructIISResource( IN LPIIS_RESOURCE ResourceEntry ); VOID FreeIISResource( IN LPIIS_RESOURCE ResourceEntry ); DWORD VerifyIISService( IN LPWSTR MDPath, IN DWORD ServiceType, IN DWORD dwPort, IN SOCKADDR saServer, IN PLOG_EVENT_ROUTINE LogEvent ); DWORD GetServerBindings( LPWSTR MDPath, DWORD dwServiceType, SOCKADDR* psaServer, LPDWORD pdwPort ); HRESOURCE ClusterGetResourceDependency( IN LPCWSTR ResourceName, IN LPCWSTR ResourceType, IN LPIIS_RESOURCE ResourceEntry, IN PLOG_EVENT_ROUTINE LogEvent ); DWORD ResUtilSetSzProperty( IN HKEY RegistryKey, IN LPCWSTR PropName, IN LPCWSTR NewValue, IN OUT PWSTR * OutValue ); DWORD WINAPI ResUtilReadProperties( IN HKEY RegistryKey, IN const PRESUTIL_PROPERTY_ITEM PropertyTable, IN OUT LPBYTE OutParams, IN RESOURCE_HANDLE ResourceHandle, IN PLOG_EVENT_ROUTINE LogEvent ); class CMetaData { public: CMetaData() { m_hMB = NULL; } ~CMetaData() { Close(); } BOOL Open( LPWSTR pszPath, BOOL fReconnect = FALSE, DWORD dwFlags = METADATA_PERMISSION_READ ); BOOL Close( VOID ); BOOL SetData( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, DWORD dwDataType, VOID * pvData, DWORD cbData, DWORD dwFlags = METADATA_INHERIT ); BOOL GetData( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, DWORD dwDataType, VOID * pvData, DWORD * cbData, DWORD dwFlags = METADATA_INHERIT ); BOOL SetDword( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, DWORD dwValue, DWORD dwFlags = METADATA_INHERIT ) { return SetData( pszPath, dwPropID, dwUserType, DWORD_METADATA, (PVOID) &dwValue, sizeof( DWORD ), dwFlags ); } BOOL GetDword( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, DWORD * pdwValue, DWORD dwFlags = METADATA_INHERIT ) { DWORD cb = sizeof(DWORD); return GetData( pszPath, dwPropID, dwUserType, DWORD_METADATA, pdwValue, &cb, dwFlags ); } BOOL GetString( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, WCHAR * pszValue, DWORD * pcbValue, DWORD dwFlags = METADATA_INHERIT ) { return GetData( pszPath, dwPropID, dwUserType, STRING_METADATA, pszValue, pcbValue, dwFlags ); } BOOL GetMultisz( LPWSTR pszPath, DWORD dwPropID, DWORD dwUserType, LPWSTR pszValue, DWORD* pcbValue, DWORD dwFlags = METADATA_INHERIT ) { return GetData( pszPath, dwPropID, dwUserType, MULTISZ_METADATA, (LPVOID)pszValue, pcbValue, dwFlags ); } static BOOL Init(); static BOOL Terminate(); BOOL GetMD(); BOOL ReleaseMD(); private: METADATA_HANDLE m_hMB; static IMSAdminBase* g_pMBCom; static CRITICAL_SECTION g_cs; } ; BOOL TcpSockSend( IN SOCKET sock, IN LPVOID pBuffer, IN DWORD cbBuffer, OUT PDWORD pcbTotalSent, IN DWORD nTimeout ); BOOL TcpSockRecv( IN SOCKET sock, IN LPVOID pBuffer, IN DWORD cbBuffer, OUT LPDWORD pbReceived, IN DWORD nTimeout ); INT WaitForSocketWorker( IN SOCKET sockRead, IN SOCKET sockWrite, IN LPBOOL pfRead, IN LPBOOL pfWrite, IN DWORD nTimeout ); SOCKET TcpSockConnectToHost( SOCKADDR* psaServer, DWORD dwPort, DWORD dwTimeOut ); VOID TcpSockClose( SOCKET hSocket ); #endif