184 lines
4.5 KiB
C++
184 lines
4.5 KiB
C++
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1997 Microsoft Corporation
|
|||
|
|
|||
|
Module Name :
|
|||
|
setable.hxx
|
|||
|
|
|||
|
Abstract:
|
|||
|
This module just defines the Server Extensions (Module) table.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Murali R. Krishnan ( MuraliK ) 07-Feb-1997
|
|||
|
|
|||
|
Environment:
|
|||
|
User Mode - Win32
|
|||
|
|
|||
|
Project:
|
|||
|
|
|||
|
Internet Server Applications Host DLL
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
# ifndef _SETABLE_HXX_
|
|||
|
# define _SETABLE_HXX_
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* Include Headers
|
|||
|
************************************************************/
|
|||
|
|
|||
|
# include "isapi.hxx"
|
|||
|
# include "wamxinfo.hxx"
|
|||
|
|
|||
|
|
|||
|
/************************************************************
|
|||
|
* Type Definitions
|
|||
|
************************************************************/
|
|||
|
|
|||
|
typedef DWORD APIERR; // An error code from a Win32 API.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
class SESD_LIST
|
|||
|
|
|||
|
Defines the data structure for the list of Server Extensions
|
|||
|
Scheduled for Deletion.
|
|||
|
|
|||
|
Non-cached extensions have to be deleted from a thread different
|
|||
|
from the one calling ReleaseExtension(). This is because we can
|
|||
|
end up doing ReleaseExtension() while on an ISAPI thread.
|
|||
|
|
|||
|
This class implements the thread switch using ATQ scheduler
|
|||
|
workitem API.
|
|||
|
|
|||
|
Used inside SE_TABLE.
|
|||
|
|
|||
|
--*/
|
|||
|
class SESD_LIST {
|
|||
|
public:
|
|||
|
SESD_LIST(VOID);
|
|||
|
~SESD_LIST(VOID);
|
|||
|
|
|||
|
VOID ScheduleExtensionForDeletion( IN PHSE psExt);
|
|||
|
VOID WaitTillFinished(VOID);
|
|||
|
|
|||
|
private:
|
|||
|
CRITICAL_SECTION m_csLock;
|
|||
|
DWORD m_idWorkItem; // scheduler workitem
|
|||
|
LIST_ENTRY m_Head; // list of extensions scheduled for deletion
|
|||
|
|
|||
|
VOID Lock(VOID) { EnterCriticalSection( &m_csLock); }
|
|||
|
VOID Unlock(VOID) { LeaveCriticalSection( &m_csLock); }
|
|||
|
|
|||
|
static VOID WINAPI SchedulerCallback( void *);
|
|||
|
VOID DeleteScheduledExtensions(VOID);
|
|||
|
|
|||
|
}; // class SESD_LIST
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*++
|
|||
|
class SE_TABLE
|
|||
|
|
|||
|
Defines the data structure for the Server Extensions table.
|
|||
|
The Server extensions table maintains a list of pointers to
|
|||
|
the Server Extensions Objects (ISAPI DLLs). It is protected
|
|||
|
internally using a lock and a reference count.
|
|||
|
Since there can only be one copy of the ISAPI DLL loaded
|
|||
|
per process using SE_TABLE, we have an internal reference
|
|||
|
count of users of the SE_TABLE. Whenever this internal
|
|||
|
ref count hits 0, all the server extensions will be freed up.
|
|||
|
|
|||
|
Note: The object itself has a longer lifetime than the ref count for WAMs
|
|||
|
holding this object in memory. The object might live with cRefWams of 0
|
|||
|
so that the global instance can be reused.
|
|||
|
NYI: Avoid this long life-time issue, if possible.
|
|||
|
|
|||
|
--*/
|
|||
|
class SE_TABLE {
|
|||
|
public:
|
|||
|
|
|||
|
SE_TABLE(VOID);
|
|||
|
|
|||
|
~SE_TABLE(VOID);
|
|||
|
|
|||
|
LONG AddRefWam(VOID) { return ( InterlockedIncrement( &m_cRefWams));}
|
|||
|
inline VOID ReleaseRefWam(VOID);
|
|||
|
|
|||
|
BOOL UnloadExtensions( VOID);
|
|||
|
|
|||
|
BOOL GetExtension(IN const CHAR * pchModuleName,
|
|||
|
IN HANDLE hImpersonation,
|
|||
|
IN BOOL fCacheImpersonation,
|
|||
|
IN BOOL fCache,
|
|||
|
OUT PHSE * psExt = NULL
|
|||
|
);
|
|||
|
|
|||
|
BOOL RefreshAcl( IN const CHAR * pchDLL);
|
|||
|
BOOL RefreshAcl( IN DWORD dwId );
|
|||
|
|
|||
|
dllexp
|
|||
|
BOOL FlushAccessToken( IN HANDLE hAccTok);
|
|||
|
|
|||
|
dllexp VOID
|
|||
|
ReleaseExtension( IN PHSE psExt);
|
|||
|
|
|||
|
VOID PrintRequestCounts(VOID);
|
|||
|
|
|||
|
dllexp
|
|||
|
VOID Print(VOID);
|
|||
|
|
|||
|
private:
|
|||
|
// NYI: Use a hash table or some such thing here...
|
|||
|
LONG m_cRefWams;
|
|||
|
LIST_ENTRY m_ExtensionHead; // list of all extensions
|
|||
|
CRITICAL_SECTION m_csLock;
|
|||
|
SESD_LIST m_sesdExtensions; // extensions scheduled for deletion
|
|||
|
|
|||
|
inline VOID InsertIntoListWithLock( HSE_BASE * pExt);
|
|||
|
inline VOID RemoveFromList( HSE_BASE * pExt);
|
|||
|
|
|||
|
VOID Lock(VOID) { EnterCriticalSection( &m_csLock); }
|
|||
|
VOID Unlock(VOID) { LeaveCriticalSection( &m_csLock); }
|
|||
|
|
|||
|
}; // class SE_TABLE
|
|||
|
|
|||
|
|
|||
|
inline VOID SE_TABLE::ReleaseRefWam(VOID)
|
|||
|
{
|
|||
|
if ( (m_cRefWams > 0 ) && !InterlockedDecrement( &m_cRefWams)) {
|
|||
|
DBG_REQUIRE( UnloadExtensions());
|
|||
|
}
|
|||
|
} // SE_TABLE::ReleaseRefWam()
|
|||
|
|
|||
|
|
|||
|
VOID SE_TABLE::InsertIntoListWithLock( HSE_BASE * pExt)
|
|||
|
{ InsertHeadList( &m_ExtensionHead, &pExt->m_ListEntry); }
|
|||
|
|
|||
|
inline VOID SE_TABLE::RemoveFromList( HSE_BASE * pExt)
|
|||
|
{
|
|||
|
Lock();
|
|||
|
RemoveEntryList( &pExt->m_ListEntry);
|
|||
|
Unlock();
|
|||
|
} // SE_TABLE::RemoveFromList()
|
|||
|
|
|||
|
|
|||
|
APIERR
|
|||
|
InitializeHseExtensions( VOID );
|
|||
|
|
|||
|
VOID
|
|||
|
CleanupHseExtensions( VOID );
|
|||
|
|
|||
|
typedef SE_TABLE * PSE_TABLE;
|
|||
|
|
|||
|
|
|||
|
extern PSE_TABLE g_psextensions; // all extensions
|
|||
|
|
|||
|
# endif // _SETABLE_HXX_
|
|||
|
|
|||
|
/************************ End of File ***********************/
|