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.
159 lines
4.9 KiB
159 lines
4.9 KiB
/*++
|
|
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cassemblyrecoveryinfo.h
|
|
|
|
Abstract:
|
|
|
|
Author:
|
|
|
|
Environment:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#pragma once
|
|
|
|
class CAssemblyRecoveryInfo;
|
|
|
|
#include "fusionbuffer.h"
|
|
#include "csecuritymetadata.h"
|
|
|
|
#define WINSXS_INSTALL_SOURCE_BASEDIR (L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup")
|
|
#define WINSXS_INSTALL_SVCPACK_REGKEY (L"ServicePackSourcePath")
|
|
#define WINSXS_INSTALL_SOURCEPATH_REGKEY (L"SourcePath")
|
|
#define WINSXS_INSTALL_SOURCE_IS_CDROM (L"CDInstall")
|
|
|
|
class CAssemblyRecoveryInfo
|
|
{
|
|
private:
|
|
CStringBuffer m_sbAssemblyDirectoryName;
|
|
CSecurityMetaData m_SecurityMetaData;
|
|
BOOL m_fLoadedAndReady;
|
|
bool m_fHadCatalog;
|
|
|
|
BOOL ResolveWinSourceMediaURL(PCWSTR wszSource, CBaseStringBuffer &rsbDestination) const;
|
|
BOOL ResolveCDRomURL(PCWSTR wszSource, CBaseStringBuffer &rsbDestination) const;
|
|
|
|
enum CDRomSearchType
|
|
{
|
|
CDRST_Tagfile,
|
|
CDRST_SerialNumber,
|
|
CDRST_VolumeName
|
|
};
|
|
|
|
public:
|
|
CAssemblyRecoveryInfo()
|
|
:
|
|
m_fLoadedAndReady(FALSE),
|
|
m_fHadCatalog(false)
|
|
{ }
|
|
|
|
BOOL Initialize()
|
|
{
|
|
FN_PROLOG_WIN32
|
|
|
|
m_sbAssemblyDirectoryName.Clear();
|
|
m_fLoadedAndReady = FALSE;
|
|
IFW32FALSE_EXIT( m_SecurityMetaData.Initialize() );
|
|
|
|
FN_EPILOG
|
|
}
|
|
|
|
const CSecurityMetaData &GetSecurityInformation() const { return m_SecurityMetaData; }
|
|
CSecurityMetaData& GetSecurityInformation() { return m_SecurityMetaData; }
|
|
|
|
const CCodebaseInformationList& GetCodeBaseList() const { return m_SecurityMetaData.GetCodeBaseList(); }
|
|
//protected:
|
|
CCodebaseInformationList& GetCodeBaseList() { return m_SecurityMetaData.GetCodeBaseList(); }
|
|
public:
|
|
|
|
//
|
|
// Fill out this object from a registry key
|
|
//
|
|
BOOL AssociateWithAssembly(CBaseStringBuffer &rcbuffLoadFromKeyName, bool &rfNoAssembly);
|
|
|
|
//
|
|
// Take an existing value - sort of like "initialize"
|
|
//
|
|
BOOL CopyValue(const CAssemblyRecoveryInfo &rsrc);
|
|
|
|
//
|
|
// Cheap, but effective.
|
|
//
|
|
const CBaseStringBuffer &GetAssemblyDirectoryName() const { return m_sbAssemblyDirectoryName; }
|
|
BOOL GetHasCatalog() const { return TRUE; }
|
|
BOOL GetInfoPrepared() const { return m_fLoadedAndReady; }
|
|
|
|
//
|
|
// Setters - useful for registration
|
|
//
|
|
BOOL SetAssemblyIdentity(IN const CBaseStringBuffer &rsb) { return m_SecurityMetaData.SetTextualIdentity(rsb); }
|
|
BOOL SetAssemblyIdentity( IN PCASSEMBLY_IDENTITY pcidAssembly );
|
|
|
|
VOID SetHasCatalog(IN BOOL fHasCatalog) { }
|
|
|
|
//
|
|
// Call this to try and resolve the internally listed codebase against
|
|
// the system and return it into sbFinalCodebase. Returns TRUE if the
|
|
// operation is successful, not based on whether the codebase is valid.
|
|
//
|
|
BOOL ResolveCodebase(CBaseStringBuffer &rsbFinalCodebase, SxsWFPResolveCodebase &rCodebaseType) const;
|
|
|
|
//
|
|
// Last bit of bookkeeping necessary before writing the assembly to disk
|
|
//
|
|
BOOL PrepareForWriting();
|
|
BOOL WriteSecondaryAssemblyInfoIntoRegistryKey(CRegKey & rhkRegistryNode) const;
|
|
#define SXSP_WRITE_PRIMARY_ASSEMBLY_INFO_TO_REGISTRY_KEY_FLAG_REFRESH (0x00000001)
|
|
BOOL WritePrimaryAssemblyInfoToRegistryKey(ULONG Flags, CRegKey & rhkRegistryNode) const;
|
|
BOOL ClearExistingRegistryData();
|
|
VOID RestorePreviouslyExistingRegistryData();
|
|
BOOL OpenInstallationSubKey(CFusionRegKey& hkSingleAssemblyInfo, DWORD OpenOrCreate, DWORD Access);
|
|
|
|
private:
|
|
CAssemblyRecoveryInfo(const CAssemblyRecoveryInfo &);
|
|
void operator =(const CAssemblyRecoveryInfo &);
|
|
};
|
|
|
|
MAKE_CFUSIONARRAY_READY(CAssemblyRecoveryInfo, CopyValue);
|
|
|
|
/*
|
|
These are instantiated (in an unsearchable way) by the URLTAGINFO macro below.
|
|
URLHEAD_WINSOURCE
|
|
URLHEAD_FILE URLHEAD_CDROM
|
|
URLHEAD_TAG
|
|
URLHEAD_CDROM_TYPE_TAG
|
|
URLHEAD_CDROM_TYPE_SERIALNUMBER
|
|
URLHEAD_CDROM_TYPE_VOLUMENAME
|
|
*/
|
|
extern const UNICODE_STRING UnicodeString_URLHEAD_WINSOURCE;
|
|
|
|
#define URLTAGINFO( namevalue, str ) \
|
|
__declspec(selectany) extern const WCHAR URLHEAD_ ##namevalue [] = ( str ); \
|
|
static const SIZE_T URLHEAD_LENGTH_ ##namevalue = \
|
|
( sizeof( URLHEAD_ ##namevalue ) / sizeof( WCHAR ) ) - 1;
|
|
|
|
//
|
|
// Move these to a .cpp file.
|
|
//
|
|
|
|
URLTAGINFO(FILE, L"file:")
|
|
URLTAGINFO(CDROM, L"cdrom:")
|
|
URLTAGINFO(WINSOURCE, L"x-ms-windows-source:")
|
|
//URLTAGINFO(DARWINSOURCE, L"x-ms-darwin-source:")
|
|
URLTAGINFO(HTTP, L"http:")
|
|
|
|
// These things are not URL heads but nonetheless still use the same macro
|
|
URLTAGINFO(CDROM_TYPE_TAG, L"tagfile")
|
|
URLTAGINFO(CDROM_TYPE_SERIALNUMBER, L"serialnumber")
|
|
URLTAGINFO(CDROM_TYPE_VOLUMENAME, L"volumename")
|
|
|
|
BOOL
|
|
SxspLooksLikeAssemblyDirectoryName(
|
|
const CBaseStringBuffer &rsbDoesLookLikeName,
|
|
BOOL &rbLooksLikeAssemblyName
|
|
);
|