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.
 
 
 
 
 
 

628 lines
17 KiB

/*===================================================================
Microsoft IIS
Microsoft Confidential.
Copyright 1997 Microsoft Corporation. All Rights Reserved.
Component: WAMREG
File: Auxfunc.h
supporting functions header file.
Owner: LeiJin
Note:
===================================================================*/
#ifndef _WAMREG_AUXFUNC_H
#define _WAMREG_AUXFUNC_H
#include "iadmw.h"
#include "comadmin.h"
#include "wmrgexp.h"
#include "dbgutil.h"
#include "iwamreg.h"
#include "iiscnfg.h"
// EMD_SET an action to set the corresponding metabase identifier in metabase.
// EMD_DELETE an action to delete the corresponding metabase identifier in metabase.
// EMD_NONE an NO-OP action.
#define EMD_SET 1
#define EMD_DELETE 2
#define EMD_NONE 0
// MDPropItem
// Used in WamRegMetabaseConfig, usually created an array of MDPropItem where each elment represents
// one WAMREG application property.
//
struct MDPropItem
{
DWORD dwMDIdentifier; // Metabase Indetitifer
DWORD dwType; // Metabase data type
union
{
DWORD dwVal; // used if dwType is a METADATA_DWORD type.
WCHAR* pwstrVal; // used if dwType is a METADATA_STRING type.
};
DWORD dwAction; // EMD_SET / EMD_DELETE / EMD_NONE
HRESULT hrStatus;
};
//
// Index to Wam Metabase Property
// Each one represents one WAMREG application related metabase property.
//
#define IWMDP_ROOT 0
#define IWMDP_ISOLATED 1
#define IWMDP_WAMCLSID 2
#define IWMDP_PACKAGEID 3
#define IWMDP_PACKAGE_NAME 4
#define IWMDP_LAST_OUTPROC_PID 5
#define IWMDP_FRIENDLY_NAME 6
#define IWMDP_APPSTATE 7
#define IWMDP_OOP_RECOVERLIMIT 8
#define IWMDP_OOP_APP_APPPOOL_ID 9
// Max of the above property.
#define IWMDP_MAX 10
//
// WamAdmLock is used to create an "Critical Section" when perserve the order of App Create/Delete/etc.
// requests.
//
class WamAdmLock
{
public:
WamAdmLock();
BOOL Init(); // Init the WamAdmLock data member.
BOOL UnInit(); // Uninit the WamAdmLock data member
VOID AcquireWriteLock(); // Acquire the Lock
VOID ReleaseWriteLock(); // Release the Lock.
private:
DWORD GetNextServiceToken();
VOID Lock(); // Internal CS lock.
VOID UnLock(); // Internal CS unlock.
// Data
DWORD m_dwServiceToken;
DWORD m_dwServiceNum;
HANDLE m_hWriteLock;
CRITICAL_SECTION m_csLock;
};
inline VOID WamAdmLock::Lock()
{
EnterCriticalSection(&m_csLock);
}
inline VOID WamAdmLock::UnLock()
{
LeaveCriticalSection(&m_csLock);
}
//
// WamRegGlobal
// Contains some default global constant.
// Contains a WamAdmLock memeber for DCOM level request locking.
//
class WamRegGlobal
{
public:
WamRegGlobal() {};
~WamRegGlobal() {};
BOOL Init();
BOOL UnInit();
VOID AcquireAdmWriteLock(VOID);
VOID ReleaseAdmWriteLock(VOID);
HRESULT CreatePooledApp
(
IN LPCWSTR szMetabasePath,
IN BOOL fInProc,
IN BOOL fRecover = FALSE
);
HRESULT CreateOutProcApp
(
IN LPCWSTR szMetabasePath,
IN BOOL fRecover = FALSE,
IN BOOL fSaveMB = TRUE
);
HRESULT CreateOutProcAppReplica
(
IN LPCWSTR szMetabasePath,
IN LPCWSTR szAppName,
IN LPCWSTR szWamClsid,
IN LPCWSTR szAppId
);
HRESULT DeleteApp
(
IN LPCWSTR szMetabasePath,
IN BOOL fRecoverable,
IN BOOL fRemoveAppPool
);
HRESULT RecoverApp
(
IN LPCWSTR szMetabasePath,
IN BOOL fForceRecover
);
HRESULT SzWamProgID
(
IN LPCWSTR pwszMetabasePath,
OUT LPWSTR *ppszWamProgID
);
HRESULT W3ServiceUtil
(
IN LPCWSTR szMDPath,
IN DWORD dwCommand,
OUT DWORD* dwCallBackResult
);
HRESULT ConstructFullPath
(
IN LPCWSTR pwszMetabasePathPrefix,
IN DWORD dwcPrefix,
IN LPCWSTR pwszPartialPath,
OUT LPWSTR* ppwszResult
);
BOOL FAppPathAllowConfig
(
IN LPCWSTR wszMetabasePath
);
BOOL FIsW3SVCRoot
(
IN LPCWSTR wszMetabasePath
);
private:
HRESULT GetNewSzGUID
(
OUT LPWSTR *ppszGUID
);
HRESULT GetViperPackageName
(
IN LPCWSTR wszMetabasePath,
OUT LPWSTR* pwszViperPackageName
);
public:
//Global Constant, self explained.
static const WCHAR g_szIISInProcPackageName[/*sizeof(DEFAULT_PACKAGENAME)/sizeof(WCHAR)*/];
static const WCHAR g_szIISInProcPackageID[];
static const WCHAR g_szInProcWAMCLSID[];
static const WCHAR g_szInProcWAMProgID[];
static const WCHAR g_szIISOOPPoolPackageName[];
static const WCHAR g_szIISOOPPoolPackageID[];
static const WCHAR g_szOOPPoolWAMCLSID[];
static const WCHAR g_szOOPPoolWAMProgID[];
static const WCHAR g_szMDAppPathPrefix[];
static const DWORD g_cchMDAppPathPrefix;
static const WCHAR g_szMDW3SVCRoot[];
static const DWORD g_cchMDW3SVCRoot;
private:
static WamAdmLock m_WamAdmLock; // a lock for all DCOM level requests.
};
inline VOID WamRegGlobal::AcquireAdmWriteLock(VOID)
{
m_WamAdmLock.AcquireWriteLock();
}
inline VOID WamRegGlobal::ReleaseAdmWriteLock(VOID)
{
m_WamAdmLock.ReleaseWriteLock();
}
//
// WamRegRegistryConfig
// Contains functions that access the Reigstry.
//
class WamRegRegistryConfig
{
public:
WamRegRegistryConfig() {};
~WamRegRegistryConfig() {};
HRESULT RegisterCLSID
(
IN LPCWSTR szCLSIDEntryIn,
IN LPCWSTR szProgIDIn,
IN BOOL fSetVIProgID
);
HRESULT UnRegisterCLSID
(
IN LPCWSTR wszCLSIDEntryIn,
IN BOOL fDeleteVIProgID
);
HRESULT LoadWamDllPath(VOID);
private:
HRESULT UnRegisterProgID
(
IN LPCWSTR szProgIDIn
);
static const REGSAM samDesired;
static CHAR m_szWamDllPath[MAX_PATH];
};
//
// WamRegPackageConfig
// Contains functions that access the MTS Admin API.
// Class defined to access MTS Admin interface.
//
class WamRegPackageConfig
{
public:
WamRegPackageConfig();
~WamRegPackageConfig();
HRESULT CreateCatalog(VOID); //Create an MTS catalog object
VOID Cleanup( VOID); // used for cleaning up state
HRESULT CreatePackage
(
IN LPCWSTR szPackageID,
IN LPCWSTR szPackageName,
IN LPCWSTR szIdentity,
IN LPCWSTR szIdPassword,
IN BOOL fInProc
);
HRESULT RemovePackage
(
IN LPCWSTR szPackageID
);
HRESULT AddComponentToPackage
(
IN LPCWSTR szPackageID,
IN LPCWSTR szComponentCLSID
);
HRESULT RemoveComponentFromPackage
(
IN LPCWSTR szPackageID,
IN LPCWSTR szComponentCLSID,
IN DWORD dwAppIsolated
);
BOOL IsPackageInstalled
(
IN LPCWSTR szPackageID,
IN LPCWSTR szComponentCLSID
);
HRESULT GetSafeArrayOfCLSIDs // Create an one element SafeArray object that contains szComponentCLSID
(
IN LPCWSTR szComponentCLSID,
OUT SAFEARRAY** pm_aCLSID
);
VOID ReleaseAll(VOID);
private:
enum TECatelogObject{eTPackage, eTComponent};
HRESULT SetPackageProperties( IN LPCWSTR * rgpszValues);
HRESULT SetPackageObjectProperty
(
IN LPCWSTR szPropertyName,
IN LPCWSTR szPropertyValue
);
HRESULT SetComponentObjectProperties(
IN LPCWSTR szComponentCLSID
);
HRESULT SetComponentObjectProperty
(
IN ICatalogObject * pComponent,
IN LPCWSTR szPropertyName,
IN LPCWSTR szPropertyValue,
BOOL fPropertyValue = FALSE
);
ICOMAdminCatalog* m_pCatalog;
ICatalogCollection* m_pPkgCollection;
ICatalogCollection* m_pCompCollection;
ICatalogObject* m_pPackage;
};
//
// WamRegMetabaseConfig
// Class defined to access the metabase, read/write application properties from/to Metabase.
//
class WamRegMetabaseConfig
{
public:
static HRESULT MetabaseInit
(
VOID
);
static HRESULT MetabaseUnInit
(
VOID
);
static BOOL Initialized( VOID )
{
return ( m_pMetabase != NULL );
}
HRESULT UpdateMD
(
IN MDPropItem* prgProp,
IN DWORD dwMDAttributes,
IN LPCWSTR wszMetabasePath,
IN BOOL fSaveData = FALSE
);
HRESULT MDUpdateIISDefault
(
IN LPCWSTR szIISPackageName,
IN LPCWSTR szIISPackageID,
IN LPCWSTR szDefaultWAMCLSID
);
HRESULT AbortUpdateMD
(
IN MDPropItem* prgProp,
IN LPCWSTR wszMetabasePath
);
HRESULT MDCreatePath
(
IN IMSAdminBase *pMetabaseIn,
IN LPCWSTR szMetabasePath
);
BOOL MDDoesPathExist
(
IN IMSAdminBase *pMetabaseIn,
IN LPCWSTR szMetabasePath
);
HRESULT MDSetStringProperty
(
IN IMSAdminBase * pMetabaseIn,
IN LPCWSTR szMetabasePath,
IN DWORD szMetabaseProperty,
IN LPCWSTR szMetabaseValue,
IN DWORD dwMDUserType = IIS_MD_UT_WAM
);
HRESULT MDSetKeyType
(
IN IMSAdminBase * pMetabaseIn,
IN LPCWSTR szMetabasePath,
IN LPCWSTR szKeyType
);
HRESULT MDDeleteKey
(
IN IMSAdminBase * pMetabaseIn,
IN LPCWSTR szMetabasePath,
IN LPCWSTR szKey
);
HRESULT MDGetDWORD
(
IN LPCWSTR szMetabasePath,
IN DWORD dwMDIdentifier,
OUT DWORD *pdwData
);
HRESULT MDSetAppState
(
IN LPCWSTR szMetabasePath,
IN DWORD dwState
);
HRESULT MDGetPropPaths
(
IN LPCWSTR szMetabasePath,
IN DWORD dwMDIdentifier,
OUT WCHAR** pBuffer,
OUT DWORD* pdwBufferSize
);
HRESULT MDGetWAMCLSID
(
IN LPCWSTR szMetabasePath,
IN OUT LPWSTR szWAMCLSID
);
HRESULT MDGetIdentity
(
IN LPWSTR szIdentity,
IN DWORD cbIdentity,
IN LPWSTR szPwd,
IN DWORD cbPwd
);
HRESULT MDGetAppName
(
IN LPCWSTR szMetaPath,
OUT LPWSTR * ppszAppName
);
HRESULT MDGetStringAttribute
(
IN LPCWSTR szMetaPath,
DWORD dwMDIdentifier,
OUT LPWSTR * ppszBuffer
);
HRESULT MDGetAllSiteRoots
(
OUT LPWSTR * ppszBuffer
);
HRESULT GetSignatureOnPath
(
IN LPCWSTR pwszMetabasePath,
OUT DWORD* pdwSignature
);
HRESULT GetWebServerName
(
IN LPCWSTR wszMetabasePath,
IN OUT LPWSTR wszWebServerName,
IN UINT cBuffer
);
HRESULT SaveData
(
VOID
);
HRESULT MDGetLastOutProcPackageID
(
IN LPCWSTR szMetabasePath,
IN OUT LPWSTR szLastOutProcPackageID
);
HRESULT MDRemoveProperty
(
IN LPCWSTR pwszMetabasePath,
DWORD dwIdentifier,
DWORD dwType
);
HRESULT MDRemovePropertyByArray
(
IN MDPropItem* prgProp
);
VOID InitPropItemData
(
IN OUT MDPropItem* pMDPropItem
);
HRESULT MDGetIDs
(
IN LPCWSTR szMetabasePath,
OUT LPWSTR szWAMCLSID,
OUT LPWSTR szPackageID,
IN DWORD dwAppMode
);
VOID MDSetPropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex,
IN LPCWSTR pwstrVal
);
VOID MDSetPropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex,
IN DWORD dwVal
);
VOID MDDeletePropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex
);
BOOL HasAdminAccess
(
VOID
);
private:
DWORD WamRegChkSum
(
IN LPCWSTR pszKey,
IN DWORD cchKey
);
// Time out for metabase = 5 seconds
static const DWORD m_dwMDDefaultTimeOut;
static const MDPropItem m_rgMDPropTemplate[];
//
// The global metabase pointer,
// created at the WAMREG start up time,
// deleted when WAMREG is shutdown.
//
static IMSAdminBaseW* m_pMetabase;
};
inline HRESULT WamRegMetabaseConfig::SaveData(VOID)
{
DBG_ASSERT(m_pMetabase);
return m_pMetabase->SaveData();
}
inline VOID WamRegMetabaseConfig::MDSetPropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex,
IN LPCWSTR pwstrVal
)
{
DBG_ASSERT(prgProps && iIndex < IWMDP_MAX);
prgProps[iIndex].dwAction = EMD_SET;
prgProps[iIndex].pwstrVal = (LPWSTR)pwstrVal;
}
inline VOID WamRegMetabaseConfig::MDSetPropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex,
IN DWORD dwVal
)
{
DBG_ASSERT(prgProps && iIndex < IWMDP_MAX);
prgProps[iIndex].dwAction = EMD_SET;
prgProps[iIndex].dwVal = dwVal;
}
inline VOID WamRegMetabaseConfig::MDDeletePropItem
(
IN MDPropItem* prgProps,
IN DWORD iIndex
)
{
DBG_ASSERT(prgProps && iIndex < IWMDP_MAX);
prgProps[iIndex].dwAction = EMD_DELETE;
}
extern WamRegGlobal g_WamRegGlobal;
extern WamRegRegistryConfig g_RegistryConfig;
#endif // _WAMREG_AUXFUNC_H