629 lines
17 KiB
C
629 lines
17 KiB
C
|
/*===================================================================
|
||
|
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
|