Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

270 lines
6.3 KiB

/*-----------------------------------------------------------------------------
Copyright (c) 1995-1998 Microsoft Corporation
Module Name :
ptable.hxx
Abstract:
Header file for WAMINFO object.
Author:
Lei Jin ( LeiJin ) 13-Oct-1998
Environment:
User Mode - Win32
Project:
W3 services DLL
-----------------------------------------------------------------------------*/
#ifndef __W3SVC_PTABLE_HXX__
#define __W3SVC_PTABLE_HXX__
#include <lkrhash.h>
// Define const and macro.
//
#define uSizeCLSIDStr 39
#define RELEASE(p) {if ( p ) { p->Release(); p = NULL; }}
#define FREEBSTR(p) {if (p) {SysFreeString( p ); p = NULL;}}
// Define application modes currently supported
//
enum EAppMode
{
eAppInProc,
eAppOOPIsolated,
eAppOOPPool
};
// forward declarition
class CWamInfo;
/////////////////////////////////////////////////////////////////////
// CPorcessEntry
// A record that contains per process info, such as process id, process handle, etc.
//
/////////////////////////////////////////////////////////////////////
class CProcessEntry
{
public:
CProcessEntry( DWORD dwProcessId,
HANDLE hProcessHandle,
LPCWSTR pszPackageId
);
~CProcessEntry();
DWORD QueryProcessId() const;
HANDLE QueryProcessHandle() const;
WCHAR* QueryPackageId() const;
bool IsCrashed() const;
BOOL IsRecycling() const;
bool IsLinkedWithWamInfo() const;
bool FindWamInfo(CWamInfo** ppWamInfo);
void NotifyCrashed();
bool Recycle();
void AddRef();
void Release();
bool AddWamInfoToProcessEntry(CWamInfo* pWamInfo);
bool RemoveWamInfoFromProcessEntry
(
CWamInfo* pWamInfo,
bool* fDelete
);
public:
LIST_ENTRY m_ListHeadOfWamInfo;
DWORD m_dwShutdownTimeLimit;
DWORD m_dwShutdownStartTime;
CWamInfo * m_pShuttingDownCWamInfo;
private:
DWORD m_dwSignature;
DWORD m_dwProcessId;
HANDLE m_hProcessHandle;
long m_cRefs;
WCHAR m_wszPackageId[40]; // 40 >> uSizeCLSIDStr.
bool m_fCrashed;
BOOL m_fRecycling;
};
// Query Process Id.
inline DWORD CProcessEntry::QueryProcessId() const
{
return m_dwProcessId;
}
// Query COM+ application id(GUID).
inline WCHAR* CProcessEntry::QueryPackageId() const
{
return (WCHAR*)m_wszPackageId;
}
// Query Process handle.
inline HANDLE CProcessEntry::QueryProcessHandle() const
{
return m_hProcessHandle;
}
// Check to see fCrashed flag is set.
inline bool CProcessEntry::IsCrashed() const
{
return m_fCrashed;
}
// Check to see if process is recycling
inline BOOL CProcessEntry::IsRecycling() const
{
return m_fRecycling;
}
inline void CProcessEntry::AddRef()
{
InterlockedIncrement(&m_cRefs);
}
// Check to see any linked with any WamInfo.
inline bool CProcessEntry::IsLinkedWithWamInfo() const
{
return IsListEmpty(&m_ListHeadOfWamInfo);
}
// Set m_fCrashed flag to TRUE.
inline void CProcessEntry::NotifyCrashed()
{
InterlockedExchange((PLONG)&m_fCrashed, (LONG)TRUE);
}
////////////////////////////////////////////////////////////////////
// CProcessEntryHash
// A hash table for CProcessEntry. Implemented using LK-hashing.
// Key is DWORD type, process id.
//
///////////////////////////////////////////////////////////////////
class CProcessEntryHash
: public CTypedHashTable<CProcessEntryHash, CProcessEntry, DWORD>
{
public:
static DWORD ExtractKey(const CProcessEntry* pEntry);
static DWORD CalcKeyHash(DWORD dwKey);
static bool EqualKeys(DWORD dwKey1, DWORD dwKey2);
static void AddRefRecord(CProcessEntry* pEntry, int nIncr);
CProcessEntryHash
(
double maxload, // Bound on average chain length,
size_t initsize, // Initial size of Hash Table
size_t num_subtbls // #subordinate hash tables.
)
: CTypedHashTable<CProcessEntryHash, CProcessEntry, DWORD>
("PTable", maxload, initsize, num_subtbls)
{}
};
inline DWORD
CProcessEntryHash::ExtractKey(const CProcessEntry* pEntry)
{
return pEntry->QueryProcessId();
}
inline DWORD
CProcessEntryHash::CalcKeyHash(DWORD dwKey)
{
return dwKey;
}
inline bool
CProcessEntryHash::EqualKeys(DWORD dwKey1, DWORD dwKey2)
{
return (dwKey1 == dwKey2);
}
inline void
CProcessEntryHash::AddRefRecord(CProcessEntry* pEntry, int nIncr)
{
if (nIncr == 1)
{
pEntry->AddRef();
}
else
{
pEntry->Release();
}
}
interface ICOMAdminCatalog2;
////////////////////////////////////////////////////////////////
// CProcessTable
// Global data structure that manages the hash table.
////////////////////////////////////////////////////////////////
class CProcessTable
{
public:
CProcessTable();
~CProcessTable();
void Lock();
void UnLock();
CProcessEntry* AddWamInfoToProcessTable
(
CWamInfo *pWamInfo,
LPCWSTR szPackageId,
DWORD pid
);
bool RemoveWamInfoFromProcessTable
(
CWamInfo *pWamInfo
);
bool FindWamInfo
(
CProcessEntry* pProcessEntry,
CWamInfo** ppWamInfo
);
bool RecycleWamInfo
(
CWamInfo * pWamInfo
);
bool Init();
bool UnInit();
private:
HRESULT ShutdownProcess
(
DWORD dwProcEntryPid
);
DWORD m_dwCnt;
DWORD m_pCurrentProcessId;
CProcessEntryHash m_HashTable;
ICOMAdminCatalog2* m_pCatalog;
CRITICAL_SECTION m_csPTable;
};
inline void CProcessTable::Lock()
{
EnterCriticalSection(&m_csPTable);
}
inline void CProcessTable::UnLock()
{
LeaveCriticalSection(&m_csPTable);
}
#endif __W3SVC_WAMINFO_HXX__