/*++ Copyright (c) 1995-1997 Microsoft Corporation Module Name : wamobj.hxx Abstract: Header file for the WAM (web application manager) object Author: David Kaplan ( DaveK ) 11-Mar-1997 Environment: User Mode - Win32 Project: Wam DLL --*/ # ifndef _WAMOBJ_HXX_ # define _WAMOBJ_HXX_ # define WAM_SIGNATURE (DWORD )' MAW' // will become "WAM " on debug # define WAM_SIGNATURE_FREE (DWORD )'fMAW' // will become "WAMf" on debug /************************************************************ * Include Headers ************************************************************/ # include "wam.h" # include "wamstats.hxx" # include "resource.h" /************************************************************ * Forward References ************************************************************/ class HSE_BASE; class WAM_EXEC_INFO; /************************************************************ * Type Definitions ************************************************************/ /*++ class WAM Class definition for the WAM object. --*/ class ATL_NO_VTABLE WAM : public CComObjectRootEx, public CComCoClass, public IWam { public: WAM() : m_WamStats(), m_dwSignature( WAM_SIGNATURE), m_fShuttingDown( FALSE ), m_pUnkMarshaler(NULL) { } ~WAM() { // check for memory corruption and dangling pointers m_dwSignature = WAM_SIGNATURE_FREE; } DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_REGISTRY_RESOURCEID(IDR_WAM) BEGIN_COM_MAP(WAM) COM_INTERFACE_ENTRY(IWam) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) END_COM_MAP() HRESULT FinalConstruct() { return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; public: //------------------------------------------------------------ // Methods for IWam interface //------------------------------------------------------------ STDMETHODIMP InitWam ( BOOL fInProcess, // are we in-proc or out-of-proc? BOOL fInPool, // !Isolated BOOL fEnableTryExcept, // catch exceptions in ISAPI calls? int pt, // PLATFORM_TYPE - are we running on Win95? DWORD *pPID // Process Id of the process the wam was created in ); STDMETHODIMP StartShutdown ( ); STDMETHODIMP UninitWam ( ); STDMETHODIMP ProcessRequest ( IWamRequest * pIWamRequest, DWORD cbWrcStrings, OOP_CORE_STATE * pOopCoreState, BOOL * pfHandled ); STDMETHODIMP ProcessAsyncIO ( #ifdef _WIN64 UINT64 pWamExecInfoIn, // WAM_EXEC_INFO * #else DWORD_PTR pWamExecInfoIn, // WAM_EXEC_INFO * #endif DWORD dwStatus, DWORD cbWritten ); STDMETHODIMP ProcessAsyncReadOop ( #ifdef _WIN64 UINT64 pWamExecInfoIn, // WAM_EXEC_INFO * #else DWORD_PTR pWamExecInfoIn, // WAM_EXEC_INFO * #endif DWORD dwStatus, DWORD cbRead, unsigned char * lpDataRead ); STDMETHOD( GetStatistics )( /*[in]*/ DWORD Level, /*[out, switch_is(Level)]*/ LPWAM_STATISTICS_INFO pWamStatsInfo ); //------------------------------------------------------------ // Local methods of the object //------------------------------------------------------------ BOOL IsValid( VOID) const { return (m_dwSignature == WAM_SIGNATURE);} WAM_STATISTICS & QueryWamStats(VOID) { return ( m_WamStats); } VOID Lock(VOID) { EnterCriticalSection( &m_csWamExecInfoList); } VOID Unlock(VOID) { LeaveCriticalSection( &m_csWamExecInfoList); } BOOL FInProcess(VOID) { return ( m_fInProcess ); } BOOL FInPool(VOID) { return m_fInPool; } inline VOID RemoveFromList( PLIST_ENTRY pl); inline VOID InsertIntoList( PLIST_ENTRY pl); inline BOOL FWin95( VOID ); private: VOID HseReleaseExtension( IN HSE_BASE * psExt); DWORD InvokeExtension( IN HSE_BASE * psExt, const char * szISADllPath, WAM_EXEC_INFO * pWamExecInfo ); HRESULT ProcessAsyncIOImpl ( #ifdef _WIN64 UINT64 pWamExecInfoIn, #else DWORD_PTR pWamExecInfoIn, #endif DWORD dwStatus, DWORD cbRead, LPBYTE lpDataRead = NULL ); private: DWORD m_dwSignature; BOOL m_fInProcess; // inproc or oop? BOOL m_fInPool; // can have multiple WAMs BOOL m_fShuttingDown; // shutting down? // list of wamexecinfo's currently running in this wam LIST_ENTRY m_WamExecInfoListHead; // critical section for accessing list CRITICAL_SECTION m_csWamExecInfoList; WAM_STATISTICS m_WamStats; // wam stats object PLATFORM_TYPE m_pt; // win95, nt, etc. }; // class WAM typedef WAM * PWAM; inline VOID WAM::InsertIntoList( PLIST_ENTRY pl) { Lock(); InsertHeadList( &m_WamExecInfoListHead, pl ); Unlock(); } // WAM::InsertIntoList() inline VOID WAM::RemoveFromList( PLIST_ENTRY pl) { Lock(); RemoveEntryList( pl ); Unlock(); } // WAM::RemoveFromList() inline BOOL WAM::FWin95( VOID ) { return ( m_pt == PtWindows95 || m_pt == PtWindows9x ); } /************************************************************ * Function Prototypes ************************************************************/ typedef LONG (WINAPI * PFN_INTERLOCKED_COMPARE_EXCHANGE)( LONG *Destination, LONG Exchange, LONG Comperand ); extern PFN_INTERLOCKED_COMPARE_EXCHANGE g_pfnInterlockedCompareExchange; // Macro for interlocked compare exchange so that things are smooth. # define INTERLOCKED_COMPARE_EXCHANGE( pvDest, pvNewValue, pvComparand) \ (g_pfnInterlockedCompareExchange)( pvDest, pvNewValue, pvComparand) HRESULT DoGlobalInitializations(IN BOOL fInProc, IN BOOL fEnableTryExcept); HRESULT DoGlobalCleanup(VOID); // Global flag to enable try/except extern BOOL g_fEnableTryExcept; # endif // _WAMOBJ_HXX_ /************************ End of File ***********************/