mirror of https://github.com/tongzx/nt5src
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
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
|