/*** Autogenerated by WIDL 5.16 from include/fusion.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __fusion_h__
#define __fusion_h__

/* Forward declarations */

#ifndef __IAssemblyCache_FWD_DEFINED__
#define __IAssemblyCache_FWD_DEFINED__
typedef interface IAssemblyCache IAssemblyCache;
#ifdef __cplusplus
interface IAssemblyCache;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyCacheItem_FWD_DEFINED__
#define __IAssemblyCacheItem_FWD_DEFINED__
typedef interface IAssemblyCacheItem IAssemblyCacheItem;
#ifdef __cplusplus
interface IAssemblyCacheItem;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyName_FWD_DEFINED__
#define __IAssemblyName_FWD_DEFINED__
typedef interface IAssemblyName IAssemblyName;
#ifdef __cplusplus
interface IAssemblyName;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyEnum_FWD_DEFINED__
#define __IAssemblyEnum_FWD_DEFINED__
typedef interface IAssemblyEnum IAssemblyEnum;
#ifdef __cplusplus
interface IAssemblyEnum;
#endif /* __cplusplus */
#endif

#ifndef __IInstallReferenceItem_FWD_DEFINED__
#define __IInstallReferenceItem_FWD_DEFINED__
typedef interface IInstallReferenceItem IInstallReferenceItem;
#ifdef __cplusplus
interface IInstallReferenceItem;
#endif /* __cplusplus */
#endif

#ifndef __IInstallReferenceEnum_FWD_DEFINED__
#define __IInstallReferenceEnum_FWD_DEFINED__
typedef interface IInstallReferenceEnum IInstallReferenceEnum;
#ifdef __cplusplus
interface IInstallReferenceEnum;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <objidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __IAssemblyCache_FWD_DEFINED__
#define __IAssemblyCache_FWD_DEFINED__
typedef interface IAssemblyCache IAssemblyCache;
#ifdef __cplusplus
interface IAssemblyCache;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyCacheItem_FWD_DEFINED__
#define __IAssemblyCacheItem_FWD_DEFINED__
typedef interface IAssemblyCacheItem IAssemblyCacheItem;
#ifdef __cplusplus
interface IAssemblyCacheItem;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyEnum_FWD_DEFINED__
#define __IAssemblyEnum_FWD_DEFINED__
typedef interface IAssemblyEnum IAssemblyEnum;
#ifdef __cplusplus
interface IAssemblyEnum;
#endif /* __cplusplus */
#endif

#ifndef __IAssemblyName_FWD_DEFINED__
#define __IAssemblyName_FWD_DEFINED__
typedef interface IAssemblyName IAssemblyName;
#ifdef __cplusplus
interface IAssemblyName;
#endif /* __cplusplus */
#endif

typedef enum __WIDL_fusion_generated_name_0000000E {
    ASM_CACHE_ZAP = 0x1,
    ASM_CACHE_GAC = 0x2,
    ASM_CACHE_DOWNLOAD = 0x4,
    ASM_CACHE_ROOT = 0x8,
    ASM_CACHE_ROOT_EX = 0x80
} ASM_CACHE_FLAGS;
typedef enum __WIDL_fusion_generated_name_0000000F {
    peNone = 0x0,
    peMSIL = 0x1,
    peI386 = 0x2,
    peIA64 = 0x3,
    peAMD64 = 0x4,
    peARM = 0x5,
    peInvalid = 0xffffffff
} PEKIND;
typedef enum _tagAssemblyComparisonResult {
    ACR_Unknown = 0,
    ACR_EquivalentFullMatch = 1,
    ACR_EquivalentWeakNamed = 2,
    ACR_EquivalentFXUnified = 3,
    ACR_EquivalentUnified = 4,
    ACR_NonEquivalentVersion = 5,
    ACR_NonEquivalent = 6,
    ACR_EquivalentPartialMatch = 7,
    ACR_EquivalentPartialWeakNamed = 8,
    ACR_EquivalentPartialUnified = 9,
    ACR_EquivalentPartialFXUnified = 10,
    ACR_NonEquivalentPartialVersion = 11
} AssemblyComparisonResult;
/*****************************************************************************
 * IAssemblyCache interface
 */
#ifndef __IAssemblyCache_INTERFACE_DEFINED__
#define __IAssemblyCache_INTERFACE_DEFINED__

typedef struct _FUSION_INSTALL_REFERENCE_ {
    DWORD cbSize;
    DWORD dwFlags;
    GUID guidScheme;
    LPCWSTR szIdentifier;
    LPCWSTR szNonCannonicalData;
} FUSION_INSTALL_REFERENCE;
typedef struct _FUSION_INSTALL_REFERENCE_ *LPFUSION_INSTALL_REFERENCE;
typedef const FUSION_INSTALL_REFERENCE *LPCFUSION_INSTALL_REFERENCE;
typedef struct _ASSEMBLY_INFO {
    ULONG cbAssemblyInfo;
    DWORD dwAssemblyFlags;
    ULARGE_INTEGER uliAssemblySizeInKB;
    LPWSTR pszCurrentAssemblyPathBuf;
    ULONG cchBuf;
} ASSEMBLY_INFO;
#define IASSEMBLYCACHE_INSTALL_FLAG_REFRESH       0x00000001
#define IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH 0x00000002
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED 1
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_STILL_IN_USE 2
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED 3
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_DELETE_PENDING 4
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_HAS_INSTALL_REFERENCES 5
#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_REFERENCE_NOT_FOUND 6
#define QUERYASMINFO_FLAG_VALIDATE   0x00000001
#define QUERYASMINFO_FLAG_GETSIZE    0x00000002
#define ASSEMBLYINFO_FLAG_INSTALLED       0x00000001
#define ASSEMBLYINFO_FLAG_PAYLOADRESIDENT 0x00000002
DEFINE_GUID(IID_IAssemblyCache, 0xe707dcde, 0xd1cd, 0x11d2, 0xba,0xb9, 0x00,0xc0,0x4f,0x8e,0xce,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e707dcde-d1cd-11d2-bab9-00c04f8eceae")
IAssemblyCache : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE UninstallAssembly(
        DWORD dwFlags,
        LPCWSTR pszAssemblyName,
        LPCFUSION_INSTALL_REFERENCE pRefData,
        ULONG *pulDisposition) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryAssemblyInfo(
        DWORD dwFlags,
        LPCWSTR pszAssemblyName,
        ASSEMBLY_INFO *pAsmInfo) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAssemblyCacheItem(
        DWORD dwFlags,
        PVOID pvReserved,
        IAssemblyCacheItem **ppAsmItem,
        LPCWSTR pszAssemblyName) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateAssemblyScavenger(
        IUnknown **ppUnkReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstallAssembly(
        DWORD dwFlags,
        LPCWSTR pszManifestFilePath,
        LPCFUSION_INSTALL_REFERENCE pRefData) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssemblyCache, 0xe707dcde, 0xd1cd, 0x11d2, 0xba,0xb9, 0x00,0xc0,0x4f,0x8e,0xce,0xae)
#endif
#else
typedef struct IAssemblyCacheVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssemblyCache *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssemblyCache *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssemblyCache *This);

    /*** IAssemblyCache methods ***/
    HRESULT (STDMETHODCALLTYPE *UninstallAssembly)(
        IAssemblyCache *This,
        DWORD dwFlags,
        LPCWSTR pszAssemblyName,
        LPCFUSION_INSTALL_REFERENCE pRefData,
        ULONG *pulDisposition);

    HRESULT (STDMETHODCALLTYPE *QueryAssemblyInfo)(
        IAssemblyCache *This,
        DWORD dwFlags,
        LPCWSTR pszAssemblyName,
        ASSEMBLY_INFO *pAsmInfo);

    HRESULT (STDMETHODCALLTYPE *CreateAssemblyCacheItem)(
        IAssemblyCache *This,
        DWORD dwFlags,
        PVOID pvReserved,
        IAssemblyCacheItem **ppAsmItem,
        LPCWSTR pszAssemblyName);

    HRESULT (STDMETHODCALLTYPE *CreateAssemblyScavenger)(
        IAssemblyCache *This,
        IUnknown **ppUnkReserved);

    HRESULT (STDMETHODCALLTYPE *InstallAssembly)(
        IAssemblyCache *This,
        DWORD dwFlags,
        LPCWSTR pszManifestFilePath,
        LPCFUSION_INSTALL_REFERENCE pRefData);

    END_INTERFACE
} IAssemblyCacheVtbl;

interface IAssemblyCache {
    CONST_VTBL IAssemblyCacheVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssemblyCache_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssemblyCache_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssemblyCache_Release(This) (This)->lpVtbl->Release(This)
/*** IAssemblyCache methods ***/
#define IAssemblyCache_UninstallAssembly(This,dwFlags,pszAssemblyName,pRefData,pulDisposition) (This)->lpVtbl->UninstallAssembly(This,dwFlags,pszAssemblyName,pRefData,pulDisposition)
#define IAssemblyCache_QueryAssemblyInfo(This,dwFlags,pszAssemblyName,pAsmInfo) (This)->lpVtbl->QueryAssemblyInfo(This,dwFlags,pszAssemblyName,pAsmInfo)
#define IAssemblyCache_CreateAssemblyCacheItem(This,dwFlags,pvReserved,ppAsmItem,pszAssemblyName) (This)->lpVtbl->CreateAssemblyCacheItem(This,dwFlags,pvReserved,ppAsmItem,pszAssemblyName)
#define IAssemblyCache_CreateAssemblyScavenger(This,ppUnkReserved) (This)->lpVtbl->CreateAssemblyScavenger(This,ppUnkReserved)
#define IAssemblyCache_InstallAssembly(This,dwFlags,pszManifestFilePath,pRefData) (This)->lpVtbl->InstallAssembly(This,dwFlags,pszManifestFilePath,pRefData)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssemblyCache_QueryInterface(IAssemblyCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssemblyCache_AddRef(IAssemblyCache* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssemblyCache_Release(IAssemblyCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssemblyCache methods ***/
static FORCEINLINE HRESULT IAssemblyCache_UninstallAssembly(IAssemblyCache* This,DWORD dwFlags,LPCWSTR pszAssemblyName,LPCFUSION_INSTALL_REFERENCE pRefData,ULONG *pulDisposition) {
    return This->lpVtbl->UninstallAssembly(This,dwFlags,pszAssemblyName,pRefData,pulDisposition);
}
static FORCEINLINE HRESULT IAssemblyCache_QueryAssemblyInfo(IAssemblyCache* This,DWORD dwFlags,LPCWSTR pszAssemblyName,ASSEMBLY_INFO *pAsmInfo) {
    return This->lpVtbl->QueryAssemblyInfo(This,dwFlags,pszAssemblyName,pAsmInfo);
}
static FORCEINLINE HRESULT IAssemblyCache_CreateAssemblyCacheItem(IAssemblyCache* This,DWORD dwFlags,PVOID pvReserved,IAssemblyCacheItem **ppAsmItem,LPCWSTR pszAssemblyName) {
    return This->lpVtbl->CreateAssemblyCacheItem(This,dwFlags,pvReserved,ppAsmItem,pszAssemblyName);
}
static FORCEINLINE HRESULT IAssemblyCache_CreateAssemblyScavenger(IAssemblyCache* This,IUnknown **ppUnkReserved) {
    return This->lpVtbl->CreateAssemblyScavenger(This,ppUnkReserved);
}
static FORCEINLINE HRESULT IAssemblyCache_InstallAssembly(IAssemblyCache* This,DWORD dwFlags,LPCWSTR pszManifestFilePath,LPCFUSION_INSTALL_REFERENCE pRefData) {
    return This->lpVtbl->InstallAssembly(This,dwFlags,pszManifestFilePath,pRefData);
}
#endif
#endif

#endif


#endif  /* __IAssemblyCache_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAssemblyCacheItem interface
 */
#ifndef __IAssemblyCacheItem_INTERFACE_DEFINED__
#define __IAssemblyCacheItem_INTERFACE_DEFINED__

#define STREAM_FORMAT_COMPLIB_MODULE    0
#define STREAM_FORMAT_COMPLIB_MANIFEST  1
#define STREAM_FORMAT_WIN32_MODULE      2
#define STREAM_FORMAT_WIN32_MANIFEST    4
#define IASSEMBLYCACHEITEM_COMMIT_FLAG_REFRESH       0x00000001
#define IASSEMBLYCACHEITEM_COMMIT_FLAG_FORCE_REFRESH 0x00000002
#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_INSTALLED 1
#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_REFRESHED 2
#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_ALREADY_INSTALLED 3
DEFINE_GUID(IID_IAssemblyCacheItem, 0x9e3aaeb4, 0xd1cd, 0x11d2, 0xba,0xb9, 0x00,0xc0,0x4f,0x8e,0xce,0xae);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9e3aaeb4-d1cd-11d2-bab9-00c04f8eceae")
IAssemblyCacheItem : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateStream(
        DWORD dwFlags,
        LPCWSTR pszStreamName,
        DWORD dwFormat,
        DWORD dwFormatFlags,
        IStream **ppIStream,
        ULARGE_INTEGER *puliMaxSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE Commit(
        DWORD dwFlags,
        ULONG *pulDisposition) = 0;

    virtual HRESULT STDMETHODCALLTYPE AbortItem(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssemblyCacheItem, 0x9e3aaeb4, 0xd1cd, 0x11d2, 0xba,0xb9, 0x00,0xc0,0x4f,0x8e,0xce,0xae)
#endif
#else
typedef struct IAssemblyCacheItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssemblyCacheItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssemblyCacheItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssemblyCacheItem *This);

    /*** IAssemblyCacheItem methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateStream)(
        IAssemblyCacheItem *This,
        DWORD dwFlags,
        LPCWSTR pszStreamName,
        DWORD dwFormat,
        DWORD dwFormatFlags,
        IStream **ppIStream,
        ULARGE_INTEGER *puliMaxSize);

    HRESULT (STDMETHODCALLTYPE *Commit)(
        IAssemblyCacheItem *This,
        DWORD dwFlags,
        ULONG *pulDisposition);

    HRESULT (STDMETHODCALLTYPE *AbortItem)(
        IAssemblyCacheItem *This);

    END_INTERFACE
} IAssemblyCacheItemVtbl;

interface IAssemblyCacheItem {
    CONST_VTBL IAssemblyCacheItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssemblyCacheItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssemblyCacheItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssemblyCacheItem_Release(This) (This)->lpVtbl->Release(This)
/*** IAssemblyCacheItem methods ***/
#define IAssemblyCacheItem_CreateStream(This,dwFlags,pszStreamName,dwFormat,dwFormatFlags,ppIStream,puliMaxSize) (This)->lpVtbl->CreateStream(This,dwFlags,pszStreamName,dwFormat,dwFormatFlags,ppIStream,puliMaxSize)
#define IAssemblyCacheItem_Commit(This,dwFlags,pulDisposition) (This)->lpVtbl->Commit(This,dwFlags,pulDisposition)
#define IAssemblyCacheItem_AbortItem(This) (This)->lpVtbl->AbortItem(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssemblyCacheItem_QueryInterface(IAssemblyCacheItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssemblyCacheItem_AddRef(IAssemblyCacheItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssemblyCacheItem_Release(IAssemblyCacheItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssemblyCacheItem methods ***/
static FORCEINLINE HRESULT IAssemblyCacheItem_CreateStream(IAssemblyCacheItem* This,DWORD dwFlags,LPCWSTR pszStreamName,DWORD dwFormat,DWORD dwFormatFlags,IStream **ppIStream,ULARGE_INTEGER *puliMaxSize) {
    return This->lpVtbl->CreateStream(This,dwFlags,pszStreamName,dwFormat,dwFormatFlags,ppIStream,puliMaxSize);
}
static FORCEINLINE HRESULT IAssemblyCacheItem_Commit(IAssemblyCacheItem* This,DWORD dwFlags,ULONG *pulDisposition) {
    return This->lpVtbl->Commit(This,dwFlags,pulDisposition);
}
static FORCEINLINE HRESULT IAssemblyCacheItem_AbortItem(IAssemblyCacheItem* This) {
    return This->lpVtbl->AbortItem(This);
}
#endif
#endif

#endif


#endif  /* __IAssemblyCacheItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAssemblyName interface
 */
#ifndef __IAssemblyName_INTERFACE_DEFINED__
#define __IAssemblyName_INTERFACE_DEFINED__

typedef IAssemblyName *LPASSEMBLYNAME;
typedef enum __WIDL_fusion_generated_name_00000010 {
    CANOF_PARSE_DISPLAY_NAME = 0x1,
    CANOF_SET_DEFAULT_VALUES = 0x2,
    CANOF_VERIFY_FRIEND_ASSEMBLYNAME = 0x4,
    CANOF_PARSE_FRIEND_DISPLAY_NAME = CANOF_PARSE_DISPLAY_NAME | CANOF_VERIFY_FRIEND_ASSEMBLYNAME
} CREATE_ASM_NAME_OBJ_FLAGS;
typedef enum __WIDL_fusion_generated_name_00000011 {
    ASM_NAME_PUBLIC_KEY = 0,
    ASM_NAME_PUBLIC_KEY_TOKEN = 1,
    ASM_NAME_HASH_VALUE = 2,
    ASM_NAME_NAME = 3,
    ASM_NAME_MAJOR_VERSION = 4,
    ASM_NAME_MINOR_VERSION = 5,
    ASM_NAME_BUILD_NUMBER = 6,
    ASM_NAME_REVISION_NUMBER = 7,
    ASM_NAME_CULTURE = 8,
    ASM_NAME_PROCESSOR_ID_ARRAY = 9,
    ASM_NAME_OSINFO_ARRAY = 10,
    ASM_NAME_HASH_ALGID = 11,
    ASM_NAME_ALIAS = 12,
    ASM_NAME_CODEBASE_URL = 13,
    ASM_NAME_CODEBASE_LASTMOD = 14,
    ASM_NAME_NULL_PUBLIC_KEY = 15,
    ASM_NAME_NULL_PUBLIC_KEY_TOKEN = 16,
    ASM_NAME_CUSTOM = 17,
    ASM_NAME_NULL_CUSTOM = 18,
    ASM_NAME_MVID = 19,
    ASM_NAME_FILE_MAJOR_VERSION = 20,
    ASM_NAME_FILE_MINOR_VERSION = 21,
    ASM_NAME_FILE_BUILD_NUMBER = 22,
    ASM_NAME_FILE_REVISION_NUMBER = 23,
    ASM_NAME_RETARGET = 24,
    ASM_NAME_SIGNATURE_BLOB = 25,
    ASM_NAME_CONFIG_MASK = 26,
    ASM_NAME_ARCHITECTURE = 27,
    ASM_NAME_MAX_PARAMS = 28
} ASM_NAME;
typedef enum __WIDL_fusion_generated_name_00000012 {
    ASM_DISPLAYF_VERSION = 0x1,
    ASM_DISPLAYF_CULTURE = 0x2,
    ASM_DISPLAYF_PUBLIC_KEY_TOKEN = 0x4,
    ASM_DISPLAYF_PUBLIC_KEY = 0x8,
    ASM_DISPLAYF_CUSTOM = 0x10,
    ASM_DISPLAYF_PROCESSORARCHITECTURE = 0x20,
    ASM_DISPLAYF_LANGUAGEID = 0x40,
    ASM_DISPLAYF_RETARGET = 0x80,
    ASM_DISPLAYF_CONFIG_MASK = 0x100,
    ASM_DISPLAYF_MVID = 0x200,
    ASM_DISPLAYF_FULL = (((ASM_DISPLAYF_VERSION | ASM_DISPLAYF_CULTURE) | ASM_DISPLAYF_PUBLIC_KEY_TOKEN) | ASM_DISPLAYF_RETARGET) | ASM_DISPLAYF_PROCESSORARCHITECTURE
} ASM_DISPLAY_FLAGS;
typedef enum __WIDL_fusion_generated_name_00000013 {
    ASM_CMPF_NAME = 0x1,
    ASM_CMPF_MAJOR_VERSION = 0x2,
    ASM_CMPF_MINOR_VERSION = 0x4,
    ASM_CMPF_BUILD_NUMBER = 0x8,
    ASM_CMPF_REVISION_NUMBER = 0x10,
    ASM_CMPF_VERSION = ((ASM_CMPF_MAJOR_VERSION | ASM_CMPF_MINOR_VERSION) | ASM_CMPF_BUILD_NUMBER) | ASM_CMPF_REVISION_NUMBER,
    ASM_CMPF_PUBLIC_KEY_TOKEN = 0x20,
    ASM_CMPF_CULTURE = 0x40,
    ASM_CMPF_CUSTOM = 0x80,
    ASM_CMPF_DEFAULT = 0x100,
    ASM_CMPF_RETARGET = 0x200,
    ASM_CMPF_ARCHITECTURE = 0x400,
    ASM_CMPF_CONFIG_MASK = 0x800,
    ASM_CMPF_MVID = 0x1000,
    ASM_CMPF_SIGNATURE = 0x2000,
    ASM_CMPF_IL_ALL = ((ASM_CMPF_NAME | ASM_CMPF_VERSION) | ASM_CMPF_PUBLIC_KEY_TOKEN) | ASM_CMPF_CULTURE,
    ASM_CMPF_IL_NO_VERSION = (ASM_CMPF_NAME | ASM_CMPF_PUBLIC_KEY_TOKEN) | ASM_CMPF_CULTURE
} ASM_CMP_FLAGS;
DEFINE_GUID(IID_IAssemblyName, 0xcd193bc0, 0xb4bc, 0x11d2, 0x98,0x33, 0x00,0xc0,0x4f,0xc3,0x1d,0x2e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cd193bc0-b4bc-11d2-9833-00c04fc31d2e")
IAssemblyName : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE SetProperty(
        DWORD PropertyId,
        LPVOID pvProperty,
        DWORD cbProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProperty(
        DWORD PropertyId,
        LPVOID pvProperty,
        LPDWORD pcbProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE Finalize(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDisplayName(
        LPOLESTR szDisplayName,
        LPDWORD pccDisplayName,
        DWORD dwDisplayFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reserved(
        REFIID refIID,
        IUnknown *pUnkReserved1,
        IUnknown *pUnkReserved2,
        LPCOLESTR szReserved,
        LONGLONG llReserved,
        LPVOID pvReserved,
        DWORD cbReserved,
        LPVOID *ppReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetName(
        LPDWORD lpcwBuffer,
        WCHAR *pwzName) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVersion(
        LPDWORD pdwVersionHi,
        LPDWORD pdwVersionLow) = 0;

    virtual HRESULT STDMETHODCALLTYPE IsEqual(
        IAssemblyName *pName,
        DWORD dwCmpFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IAssemblyName **pName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssemblyName, 0xcd193bc0, 0xb4bc, 0x11d2, 0x98,0x33, 0x00,0xc0,0x4f,0xc3,0x1d,0x2e)
#endif
#else
typedef struct IAssemblyNameVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssemblyName *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssemblyName *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssemblyName *This);

    /*** IAssemblyName methods ***/
    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IAssemblyName *This,
        DWORD PropertyId,
        LPVOID pvProperty,
        DWORD cbProperty);

    HRESULT (STDMETHODCALLTYPE *GetProperty)(
        IAssemblyName *This,
        DWORD PropertyId,
        LPVOID pvProperty,
        LPDWORD pcbProperty);

    HRESULT (STDMETHODCALLTYPE *Finalize)(
        IAssemblyName *This);

    HRESULT (STDMETHODCALLTYPE *GetDisplayName)(
        IAssemblyName *This,
        LPOLESTR szDisplayName,
        LPDWORD pccDisplayName,
        DWORD dwDisplayFlags);

    HRESULT (STDMETHODCALLTYPE *Reserved)(
        IAssemblyName *This,
        REFIID refIID,
        IUnknown *pUnkReserved1,
        IUnknown *pUnkReserved2,
        LPCOLESTR szReserved,
        LONGLONG llReserved,
        LPVOID pvReserved,
        DWORD cbReserved,
        LPVOID *ppReserved);

    HRESULT (STDMETHODCALLTYPE *GetName)(
        IAssemblyName *This,
        LPDWORD lpcwBuffer,
        WCHAR *pwzName);

    HRESULT (STDMETHODCALLTYPE *GetVersion)(
        IAssemblyName *This,
        LPDWORD pdwVersionHi,
        LPDWORD pdwVersionLow);

    HRESULT (STDMETHODCALLTYPE *IsEqual)(
        IAssemblyName *This,
        IAssemblyName *pName,
        DWORD dwCmpFlags);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAssemblyName *This,
        IAssemblyName **pName);

    END_INTERFACE
} IAssemblyNameVtbl;

interface IAssemblyName {
    CONST_VTBL IAssemblyNameVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssemblyName_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssemblyName_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssemblyName_Release(This) (This)->lpVtbl->Release(This)
/*** IAssemblyName methods ***/
#define IAssemblyName_SetProperty(This,PropertyId,pvProperty,cbProperty) (This)->lpVtbl->SetProperty(This,PropertyId,pvProperty,cbProperty)
#define IAssemblyName_GetProperty(This,PropertyId,pvProperty,pcbProperty) (This)->lpVtbl->GetProperty(This,PropertyId,pvProperty,pcbProperty)
#define IAssemblyName_Finalize(This) (This)->lpVtbl->Finalize(This)
#define IAssemblyName_GetDisplayName(This,szDisplayName,pccDisplayName,dwDisplayFlags) (This)->lpVtbl->GetDisplayName(This,szDisplayName,pccDisplayName,dwDisplayFlags)
#define IAssemblyName_Reserved(This,refIID,pUnkReserved1,pUnkReserved2,szReserved,llReserved,pvReserved,cbReserved,ppReserved) (This)->lpVtbl->Reserved(This,refIID,pUnkReserved1,pUnkReserved2,szReserved,llReserved,pvReserved,cbReserved,ppReserved)
#define IAssemblyName_GetName(This,lpcwBuffer,pwzName) (This)->lpVtbl->GetName(This,lpcwBuffer,pwzName)
#define IAssemblyName_GetVersion(This,pdwVersionHi,pdwVersionLow) (This)->lpVtbl->GetVersion(This,pdwVersionHi,pdwVersionLow)
#define IAssemblyName_IsEqual(This,pName,dwCmpFlags) (This)->lpVtbl->IsEqual(This,pName,dwCmpFlags)
#define IAssemblyName_Clone(This,pName) (This)->lpVtbl->Clone(This,pName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssemblyName_QueryInterface(IAssemblyName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssemblyName_AddRef(IAssemblyName* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssemblyName_Release(IAssemblyName* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssemblyName methods ***/
static FORCEINLINE HRESULT IAssemblyName_SetProperty(IAssemblyName* This,DWORD PropertyId,LPVOID pvProperty,DWORD cbProperty) {
    return This->lpVtbl->SetProperty(This,PropertyId,pvProperty,cbProperty);
}
static FORCEINLINE HRESULT IAssemblyName_GetProperty(IAssemblyName* This,DWORD PropertyId,LPVOID pvProperty,LPDWORD pcbProperty) {
    return This->lpVtbl->GetProperty(This,PropertyId,pvProperty,pcbProperty);
}
static FORCEINLINE HRESULT IAssemblyName_Finalize(IAssemblyName* This) {
    return This->lpVtbl->Finalize(This);
}
static FORCEINLINE HRESULT IAssemblyName_GetDisplayName(IAssemblyName* This,LPOLESTR szDisplayName,LPDWORD pccDisplayName,DWORD dwDisplayFlags) {
    return This->lpVtbl->GetDisplayName(This,szDisplayName,pccDisplayName,dwDisplayFlags);
}
static FORCEINLINE HRESULT IAssemblyName_Reserved(IAssemblyName* This,REFIID refIID,IUnknown *pUnkReserved1,IUnknown *pUnkReserved2,LPCOLESTR szReserved,LONGLONG llReserved,LPVOID pvReserved,DWORD cbReserved,LPVOID *ppReserved) {
    return This->lpVtbl->Reserved(This,refIID,pUnkReserved1,pUnkReserved2,szReserved,llReserved,pvReserved,cbReserved,ppReserved);
}
static FORCEINLINE HRESULT IAssemblyName_GetName(IAssemblyName* This,LPDWORD lpcwBuffer,WCHAR *pwzName) {
    return This->lpVtbl->GetName(This,lpcwBuffer,pwzName);
}
static FORCEINLINE HRESULT IAssemblyName_GetVersion(IAssemblyName* This,LPDWORD pdwVersionHi,LPDWORD pdwVersionLow) {
    return This->lpVtbl->GetVersion(This,pdwVersionHi,pdwVersionLow);
}
static FORCEINLINE HRESULT IAssemblyName_IsEqual(IAssemblyName* This,IAssemblyName *pName,DWORD dwCmpFlags) {
    return This->lpVtbl->IsEqual(This,pName,dwCmpFlags);
}
static FORCEINLINE HRESULT IAssemblyName_Clone(IAssemblyName* This,IAssemblyName **pName) {
    return This->lpVtbl->Clone(This,pName);
}
#endif
#endif

#endif


#endif  /* __IAssemblyName_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAssemblyEnum interface
 */
#ifndef __IAssemblyEnum_INTERFACE_DEFINED__
#define __IAssemblyEnum_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAssemblyEnum, 0x21b8916c, 0xf28e, 0x11d2, 0xa4,0x73, 0x00,0xc0,0x4f,0x8e,0xf4,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("21b8916c-f28e-11d2-a473-00c04f8ef448")
IAssemblyEnum : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetNextAssembly(
        LPVOID pvReserved,
        IAssemblyName **ppName,
        DWORD dwFlags) = 0;

    virtual HRESULT STDMETHODCALLTYPE Reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        IAssemblyEnum **ppEnum) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAssemblyEnum, 0x21b8916c, 0xf28e, 0x11d2, 0xa4,0x73, 0x00,0xc0,0x4f,0x8e,0xf4,0x48)
#endif
#else
typedef struct IAssemblyEnumVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IAssemblyEnum *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IAssemblyEnum *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IAssemblyEnum *This);

    /*** IAssemblyEnum methods ***/
    HRESULT (STDMETHODCALLTYPE *GetNextAssembly)(
        IAssemblyEnum *This,
        LPVOID pvReserved,
        IAssemblyName **ppName,
        DWORD dwFlags);

    HRESULT (STDMETHODCALLTYPE *Reset)(
        IAssemblyEnum *This);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        IAssemblyEnum *This,
        IAssemblyEnum **ppEnum);

    END_INTERFACE
} IAssemblyEnumVtbl;

interface IAssemblyEnum {
    CONST_VTBL IAssemblyEnumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAssemblyEnum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAssemblyEnum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAssemblyEnum_Release(This) (This)->lpVtbl->Release(This)
/*** IAssemblyEnum methods ***/
#define IAssemblyEnum_GetNextAssembly(This,pvReserved,ppName,dwFlags) (This)->lpVtbl->GetNextAssembly(This,pvReserved,ppName,dwFlags)
#define IAssemblyEnum_Reset(This) (This)->lpVtbl->Reset(This)
#define IAssemblyEnum_Clone(This,ppEnum) (This)->lpVtbl->Clone(This,ppEnum)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAssemblyEnum_QueryInterface(IAssemblyEnum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAssemblyEnum_AddRef(IAssemblyEnum* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAssemblyEnum_Release(IAssemblyEnum* This) {
    return This->lpVtbl->Release(This);
}
/*** IAssemblyEnum methods ***/
static FORCEINLINE HRESULT IAssemblyEnum_GetNextAssembly(IAssemblyEnum* This,LPVOID pvReserved,IAssemblyName **ppName,DWORD dwFlags) {
    return This->lpVtbl->GetNextAssembly(This,pvReserved,ppName,dwFlags);
}
static FORCEINLINE HRESULT IAssemblyEnum_Reset(IAssemblyEnum* This) {
    return This->lpVtbl->Reset(This);
}
static FORCEINLINE HRESULT IAssemblyEnum_Clone(IAssemblyEnum* This,IAssemblyEnum **ppEnum) {
    return This->lpVtbl->Clone(This,ppEnum);
}
#endif
#endif

#endif


#endif  /* __IAssemblyEnum_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallReferenceItem interface
 */
#ifndef __IInstallReferenceItem_INTERFACE_DEFINED__
#define __IInstallReferenceItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallReferenceItem, 0x582dac66, 0xe678, 0x449f, 0xab,0xa6, 0x6f,0xaa,0xec,0x8a,0x93,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("582dac66-e678-449f-aba6-6faaec8a9394")
IInstallReferenceItem : public IUnknown
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallReferenceItem, 0x582dac66, 0xe678, 0x449f, 0xab,0xa6, 0x6f,0xaa,0xec,0x8a,0x93,0x94)
#endif
#else
typedef struct IInstallReferenceItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInstallReferenceItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInstallReferenceItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInstallReferenceItem *This);

    END_INTERFACE
} IInstallReferenceItemVtbl;

interface IInstallReferenceItem {
    CONST_VTBL IInstallReferenceItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallReferenceItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallReferenceItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallReferenceItem_Release(This) (This)->lpVtbl->Release(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallReferenceItem_QueryInterface(IInstallReferenceItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallReferenceItem_AddRef(IInstallReferenceItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallReferenceItem_Release(IInstallReferenceItem* This) {
    return This->lpVtbl->Release(This);
}
#endif
#endif

#endif


#endif  /* __IInstallReferenceItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallReferenceEnum interface
 */
#ifndef __IInstallReferenceEnum_INTERFACE_DEFINED__
#define __IInstallReferenceEnum_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallReferenceEnum, 0x56b1a988, 0x7c0c, 0x4aa2, 0x86,0x39, 0xc3,0xeb,0x5a,0x90,0x22,0x6f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56b1a988-7c0c-4aa2-8639-c3eb5a90226f")
IInstallReferenceEnum : public IUnknown
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallReferenceEnum, 0x56b1a988, 0x7c0c, 0x4aa2, 0x86,0x39, 0xc3,0xeb,0x5a,0x90,0x22,0x6f)
#endif
#else
typedef struct IInstallReferenceEnumVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IInstallReferenceEnum *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IInstallReferenceEnum *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IInstallReferenceEnum *This);

    END_INTERFACE
} IInstallReferenceEnumVtbl;

interface IInstallReferenceEnum {
    CONST_VTBL IInstallReferenceEnumVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallReferenceEnum_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallReferenceEnum_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallReferenceEnum_Release(This) (This)->lpVtbl->Release(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallReferenceEnum_QueryInterface(IInstallReferenceEnum* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallReferenceEnum_AddRef(IInstallReferenceEnum* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallReferenceEnum_Release(IInstallReferenceEnum* This) {
    return This->lpVtbl->Release(This);
}
#endif
#endif

#endif


#endif  /* __IInstallReferenceEnum_INTERFACE_DEFINED__ */

HRESULT WINAPI ClearDownloadCache(void);
HRESULT WINAPI CompareAssemblyIdentity(LPCWSTR,WINBOOL,LPCWSTR,WINBOOL,WINBOOL*,AssemblyComparisonResult*);
HRESULT WINAPI CreateAssemblyCache(IAssemblyCache**,DWORD);
HRESULT WINAPI CreateAssemblyEnum(IAssemblyEnum**,IUnknown*,IAssemblyName*,DWORD,LPVOID);
HRESULT WINAPI CreateAssemblyNameObject(LPASSEMBLYNAME*,LPCWSTR,DWORD,LPVOID);
HRESULT WINAPI CreateInstallReferenceEnum(IInstallReferenceEnum**,IAssemblyName*,DWORD,LPVOID);
HRESULT WINAPI GetAssemblyIdentityFromFile(LPCWSTR,REFIID,IUnknown**);
HRESULT WINAPI GetCachePath(ASM_CACHE_FLAGS,LPWSTR,PDWORD);
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __fusion_h__ */
