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.
153 lines
4.7 KiB
153 lines
4.7 KiB
#pragma once
|
|
|
|
#define OTHERFILES 0
|
|
#define MANIFEST 1
|
|
#define COMPONENT 2
|
|
|
|
#include "List.h"
|
|
#include "fusion.h"
|
|
|
|
#define ASSEMBLY_CACHE_TYPE_IMPORT 0x1
|
|
#define ASSEMBLY_CACHE_TYPE_EMIT 0x2
|
|
#define ASSEMBLY_CACHE_TYPE_APP 0x4
|
|
#define ASSEMBLY_CACHE_TYPE_SHARED 0x8
|
|
|
|
class CAssemblyCache : public IAssemblyCacheImport, public IAssemblyCacheEmit
|
|
{
|
|
public:
|
|
enum CacheFlags
|
|
{
|
|
Base = 0,
|
|
Temp,
|
|
Manifests,
|
|
Shared
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
CONFIRMED = 0,
|
|
VISIBLE,
|
|
CRITICAL
|
|
} CacheStatus;
|
|
|
|
// IUnknown methods
|
|
STDMETHODIMP QueryInterface(REFIID riid,void ** ppv);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
// Import/Emit methods
|
|
STDMETHOD(GetManifestImport)(
|
|
/* out */ LPASSEMBLY_MANIFEST_IMPORT *ppManifestImport);
|
|
|
|
STDMETHOD(GetAssemblyIdentity)(
|
|
/* out */ LPASSEMBLY_IDENTITY *ppAssemblyId);
|
|
|
|
STDMETHOD(GetManifestFilePath)(
|
|
/* out */ LPOLESTR *ppwzManifestFilePath,
|
|
/* in, out */ LPDWORD ccManifestFilePath);
|
|
|
|
STDMETHOD(GetManifestFileDir)(
|
|
/* out */ LPOLESTR *ppwzManifestFileDir,
|
|
/* in, out */ LPDWORD ccManifestFileDir);
|
|
|
|
STDMETHOD(GetDisplayName)(
|
|
/* out */ LPOLESTR *ppwzDisplayName,
|
|
/* out */ LPDWORD ccDisplayName);
|
|
|
|
// Import only methods
|
|
STDMETHOD(FindExistMatching)(
|
|
/* in */ IManifestInfo *pAssemblyFileInfo,
|
|
/* out */ LPOLESTR *ppwzPath);
|
|
|
|
// Emit only methods
|
|
STDMETHOD(CopyFile)(
|
|
/* in */ LPOLESTR pwzSourcePath,
|
|
/* in */ LPOLESTR pwzFileName,
|
|
/* in */ DWORD dwFlags);
|
|
|
|
STDMETHOD(Commit)(
|
|
/* in */ DWORD dwFlags);
|
|
|
|
|
|
// Retrieve (import).
|
|
static HRESULT Retrieve(
|
|
LPASSEMBLY_CACHE_IMPORT *ppAssemblyCacheImport,
|
|
LPASSEMBLY_IDENTITY pAssemblyIdentity,
|
|
DWORD dwFlags);
|
|
|
|
// Create (emit)
|
|
static HRESULT Create(
|
|
LPASSEMBLY_CACHE_EMIT *ppAssemblyCacheEmit,
|
|
LPASSEMBLY_CACHE_EMIT pAssemblyCacheEmit,
|
|
DWORD dwFlags);
|
|
|
|
|
|
// ctor, dtor
|
|
CAssemblyCache();
|
|
~CAssemblyCache();
|
|
|
|
|
|
// Static apis.
|
|
static HRESULT GetCacheRootDir(CString &sCacheDir, CacheFlags eFlags);
|
|
static HRESULT IsCached(IAssemblyIdentity *pAppId);
|
|
static HRESULT IsKnownAssembly(IAssemblyIdentity *pId, DWORD dwFlags);
|
|
static HRESULT IsaMissingSystemAssembly(IAssemblyIdentity *pId, DWORD dwFlags);
|
|
static HRESULT CreateFusionAssemblyCache(IAssemblyCache **ppFusionAsmCache);
|
|
static HRESULT GlobalCacheLookup(IAssemblyIdentity *pId, CString& sCurrentAssemblyPath);
|
|
static HRESULT GlobalCacheInstall(IAssemblyCacheImport *pCacheImport, CString &sCurrentAssemblyPath,
|
|
CString& sInstallerRefString);
|
|
|
|
static HRESULT CreateFusionAssemblyCacheEx(
|
|
IAssemblyCache **ppFusionAsmCache);
|
|
|
|
static HRESULT SearchForHighestVersionInCache(
|
|
LPWSTR *ppwzResultDisplayName,
|
|
LPWSTR pwzSearchDisplayName,
|
|
CAssemblyCache::CacheStatus eCacheStatus,
|
|
CAssemblyCache* pCache);
|
|
|
|
static LPCWSTR FindVersionInDisplayName(LPCWSTR pwzDisplayName);
|
|
static int CompareVersion(LPCWSTR pwzVersion1, LPCWSTR pwzVersion2);
|
|
static HRESULT DeleteAssemblyAndModules(LPWSTR pszManifestFilePath);
|
|
|
|
static HRESULT CAssemblyCache::GetStatusStrings( CacheStatus eStatus,
|
|
LPWSTR *ppValueString,
|
|
LPCWSTR pwzDisplayName,
|
|
CString& sRelStatusKey);
|
|
// status get/set methods
|
|
static BOOL IsStatus(LPWSTR pwzDisplayName, CacheStatus eStatus);
|
|
static HRESULT SetStatus(LPWSTR pwzDisplayName, CacheStatus eStatus, BOOL fStatus);
|
|
|
|
private:
|
|
DWORD _dwSig;
|
|
DWORD _cRef;
|
|
DWORD _hr;
|
|
DWORD _dwFlags;
|
|
CString _sRootDir;
|
|
CString _sManifestFileDir;
|
|
CString _sManifestFilePath;
|
|
CString _sDisplayName;
|
|
LPASSEMBLY_MANIFEST_IMPORT _pManifestImport;
|
|
LPASSEMBLY_IDENTITY _pAssemblyId;
|
|
|
|
// Fusion's assembly cache interface (cached ptr).
|
|
static IAssemblyCache *g_pFusionAssemblyCache;
|
|
|
|
HRESULT Init(CAssemblyCache* pAssemblyCache, DWORD dwType);
|
|
|
|
|
|
|
|
|
|
friend class CAssemblyCacheEnum;
|
|
};
|
|
|
|
|
|
inline CAssemblyCache::CacheFlags operator++(CAssemblyCache::CacheFlags &rs, int)
|
|
{
|
|
return rs = (CAssemblyCache::CacheFlags) (rs+1);
|
|
};
|
|
|
|
|
|
|
|
|
|
|