/*++ Copyright (c) 2000 Microsoft Corporation Module Name: dllredir.cpp Abstract: Activation context section contributor for the DLL Redirection section. Author: Jay Krell (a-JayK) April 2000 Revision History: --*/ #if (_MSC_VER > 1020) #pragma once #endif #include "Util.h" #include "cassemblyrecoveryinfo.h" #include "actctxgenctx.h" /*----------------------------------------------------------------------------- Side By(x) Side Install most of the work is actually done in dllredir.cpp -----------------------------------------------------------------------------*/ class CAssemblyInstallReferenceInformation { GUID m_SchemeGuid; CStringBuffer m_buffIdentifier; CStringBuffer m_buffNonCanonicalData; CStringBuffer m_buffGeneratedIdentifier; BOOL m_fIdentityStuffReady; DWORD m_dwFlags; CAssemblyReference m_IdentityReference; PRIVATIZE_COPY_CONSTRUCTORS(CAssemblyInstallReferenceInformation); public: SMARTTYPEDEF(CAssemblyInstallReferenceInformation); CAssemblyInstallReferenceInformation(); BOOL Initialize( PCSXS_INSTALL_REFERENCEW RefData ); const GUID &GetSchemeGuid() const { return m_SchemeGuid; } const CBaseStringBuffer &GetIdentifier() const { return m_buffIdentifier; } const CBaseStringBuffer &GetGeneratedIdentifier() const { return m_buffGeneratedIdentifier; } const CBaseStringBuffer &GetCanonicalData() const { return m_buffNonCanonicalData; } DWORD GetFlags() const { return m_dwFlags; } BOOL SetIdentity(PCASSEMBLY_IDENTITY pAsmIdent) { return m_IdentityReference.Initialize(pAsmIdent); } BOOL ForceReferenceData(PCWSTR pcwszPrecalcedData) { FN_PROLOG_WIN32 IFW32FALSE_EXIT( m_buffGeneratedIdentifier.Win32Assign( pcwszPrecalcedData, pcwszPrecalcedData != NULL ? ::wcslen(pcwszPrecalcedData) : 0)); m_fIdentityStuffReady = TRUE; FN_EPILOG } BOOL GenerateFileReference( IN const CBaseStringBuffer &buffKeyfileName, OUT CBaseStringBuffer &buffDrivePath, OUT CBaseStringBuffer &buffFilePart, OUT DWORD &dwDriveSerial ); const CAssemblyReference &GetIdentity() const { return m_IdentityReference; } BOOL GenerateIdentifierValue( CBaseStringBuffer *pbuffTarget = NULL ); BOOL GetIdentifierValue(CBaseStringBuffer &pBuffTarget) const { return pBuffTarget.Win32Assign(m_buffGeneratedIdentifier); } BOOL WriteIntoRegistry(const CFusionRegKey &rhkTargetKey) const; BOOL IsReferencePresentIn(const CFusionRegKey &rhkQueryKey, BOOL &rfPresent, BOOL *rfNonCanonicalMatches = NULL) const; BOOL DeleteReferenceFrom(const CFusionRegKey &rhkQueryKey, BOOL &rfWasDeleted) const; BOOL AcquireContents(const CAssemblyInstallReferenceInformation &); }; MAKE_CFUSIONARRAY_READY(CAssemblyInstallReferenceInformation, AcquireContents); #define CINSTALLITEM_VALID_REFERENCE (0x0000001) #define CINSTALLITEM_VALID_RECOVERY (0x0000002) #define CINSTALLITEM_VALID_IDENTITY (0x0000004) #define CINSTALLITEM_VALID_LOGFILE (0x0000008) class CInstalledItemEntry { PRIVATIZE_COPY_CONSTRUCTORS(CInstalledItemEntry); public: CAssemblyInstallReferenceInformation m_InstallReference; CSxsPointerWithNamedDestructor m_AssemblyIdentity; CAssemblyRecoveryInfo m_RecoveryInfo; CSmallStringBuffer m_buffLogFileName; CCodebaseInformation m_CodebaseInfo; DWORD m_dwValidItems; CInstalledItemEntry() : m_dwValidItems(0) { } ~CInstalledItemEntry() { } BOOL AcquireContents( const CInstalledItemEntry &other ); }; MAKE_CFUSIONARRAY_READY(CInstalledItemEntry, AcquireContents); class CAssemblyInstall { public: CAssemblyInstall(); ~CAssemblyInstall() { } BOOL BeginAssemblyInstall( DWORD flags, PSXS_INSTALLATION_FILE_COPY_CALLBACK installationCallback, PVOID installationContext, const CImpersonationData &ImpersonationData ); enum EInstallStage { eBegin, ePer, eEnd }; BOOL InstallAssembly( DWORD flags, PCWSTR manifestPath, PCSXS_INSTALL_SOURCE_INFO pcsisi, PCSXS_INSTALL_REFERENCEW pReference ); BOOL EndAssemblyInstall( DWORD flags, PVOID pvReserved = NULL ); BOOL InstallFile( const CBaseStringBuffer &ManifestPath, const CBaseStringBuffer &rbuffRelativeCodebase ); CDirWalk::ECallbackResult InstallDirectoryDirWalkCallback( CDirWalk::ECallbackReason reason, CDirWalk *pdirWalk, DWORD dwFlags, DWORD dwWalkDirFlags ); static CDirWalk::ECallbackResult StaticInstallDirectoryDirWalkCallback( CDirWalk::ECallbackReason reason, CDirWalk *dirWalk, DWORD dwWalkDirFlags ); BOOL InstallDirectory( const CBaseStringBuffer &rPath, DWORD flags, WCHAR wchCodebasePathSeparator ); ACTCTXGENCTX m_ActCtxGenCtx; CImpersonationData m_ImpersonationData; BOOL m_bSuccessfulSoFar; PSXS_INSTALL_SOURCE_INFO m_pInstallInfo; CFusionArray m_ItemsInstalled; // In parallel to the other paths we're building up, we also build a // relative path to the base of the directory walk which uses the // path separator(s) that were present in the codebase URL. WCHAR m_wchCodebasePathSeparator; CMediumStringBuffer m_buffCodebaseRelativePath; protected: BOOL WriteSingleInstallLog( const CInstalledItemEntry &item, BOOL bOverWrite = FALSE ); SXS_INSTALL_SOURCE_INFO m_CurrentInstallInfoCopy; private: CAssemblyInstall(const CAssemblyInstall &); void operator =(const CAssemblyInstall &); }; #define SXS_REFERENCE_CHUNK_SEPERATOR (L"_") #define SXS_REFERENCE_CHUNK_SEPERATOR_CCH (NUMBER_OF(SXS_REFERENCE_CHUNK_SEPERATOR)-1) #define WINSXS_INSTALLATION_REFERENCES_SUBKEY ( L"References")