/*=================================================================== 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