Leaked source code of windows server 2003
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

#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);
};