ReactOS  0.4.15-dev-4922-ge8ccc85
assembly.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
#include "wine/debug.h"
#include "msipriv.h"
Include dependency graph for assembly.c:

Go to the source code of this file.

Classes

struct  assembly_name
 

Macros

#define COBJMACROS
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msi)
 
static BOOL load_fusion_dlls (MSIPACKAGE *package)
 
BOOL msi_init_assembly_caches (MSIPACKAGE *package)
 
void msi_destroy_assembly_caches (MSIPACKAGE *package)
 
static MSIRECORDget_assembly_record (MSIPACKAGE *package, const WCHAR *comp)
 
static UINT get_assembly_name_attribute (MSIRECORD *rec, LPVOID param)
 
static WCHARget_assembly_display_name (MSIDATABASE *db, const WCHAR *comp, MSIASSEMBLY *assembly)
 
static BOOL is_assembly_installed (IAssemblyCache *cache, const WCHAR *display_name)
 
WCHARmsi_get_assembly_path (MSIPACKAGE *package, const WCHAR *displayname)
 
IAssemblyEnummsi_create_assembly_enum (MSIPACKAGE *package, const WCHAR *displayname)
 
static const WCHARget_clr_version_str (enum clr_version version)
 
MSIASSEMBLYmsi_load_assembly (MSIPACKAGE *package, MSICOMPONENT *comp)
 
static enum clr_version get_clr_version (MSIPACKAGE *package, const WCHAR *filename)
 
UINT msi_install_assembly (MSIPACKAGE *package, MSICOMPONENT *comp)
 
UINT msi_uninstall_assembly (MSIPACKAGE *package, MSICOMPONENT *comp)
 
static WCHARbuild_local_assembly_path (const WCHAR *filename)
 
static LONG open_assemblies_key (UINT context, BOOL win32, HKEY *hkey)
 
static LONG open_local_assembly_key (UINT context, BOOL win32, const WCHAR *filename, HKEY *hkey)
 
static LONG delete_local_assembly_key (UINT context, BOOL win32, const WCHAR *filename)
 
static LONG open_global_assembly_key (UINT context, BOOL win32, HKEY *hkey)
 
UINT ACTION_MsiPublishAssemblies (MSIPACKAGE *package)
 
UINT ACTION_MsiUnpublishAssemblies (MSIPACKAGE *package)
 

Variables

static const WCHARclr_version []
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 23 of file assembly.c.

Function Documentation

◆ ACTION_MsiPublishAssemblies()

UINT ACTION_MsiPublishAssemblies ( MSIPACKAGE package)

Definition at line 595 of file assembly.c.

596 {
597  MSICOMPONENT *comp;
598 
599  if (package->script == SCRIPT_NONE)
600  return msi_schedule_action(package, SCRIPT_INSTALL, L"MsiPublishAssemblies");
601 
603  {
604  LONG res;
605  HKEY hkey;
606  GUID guid;
607  DWORD size;
608  WCHAR buffer[43];
609  MSIRECORD *uirow;
610  MSIASSEMBLY *assembly = comp->assembly;
611  BOOL win32;
612 
613  if (!assembly || !comp->ComponentId) continue;
614 
615  comp->Action = msi_get_component_action( package, comp );
616  if (comp->Action != INSTALLSTATE_LOCAL)
617  {
618  TRACE("component not scheduled for installation %s\n", debugstr_w(comp->Component));
619  continue;
620  }
621  TRACE("publishing %s\n", debugstr_w(comp->Component));
622 
623  CLSIDFromString( package->ProductCode, &guid );
625  buffer[20] = '>';
626  CLSIDFromString( comp->ComponentId, &guid );
627  encode_base85_guid( &guid, buffer + 21 );
628  buffer[42] = 0;
629 
630  win32 = assembly->attributes & msidbAssemblyAttributesWin32;
631  if (assembly->application)
632  {
633  MSIFILE *file = msi_get_loaded_file( package, assembly->application );
634  if (!file)
635  {
636  WARN("no matching file %s for local assembly\n", debugstr_w(assembly->application));
637  continue;
638  }
639  if ((res = open_local_assembly_key( package->Context, win32, file->TargetPath, &hkey )))
640  {
641  WARN( "failed to open local assembly key %ld\n", res );
642  return ERROR_FUNCTION_FAILED;
643  }
644  }
645  else
646  {
647  if ((res = open_global_assembly_key( package->Context, win32, &hkey )))
648  {
649  WARN( "failed to open global assembly key %ld\n", res );
650  return ERROR_FUNCTION_FAILED;
651  }
652  }
653  size = sizeof(buffer);
654  if ((res = RegSetValueExW( hkey, assembly->display_name, 0, REG_MULTI_SZ, (const BYTE *)buffer, size )))
655  {
656  WARN( "failed to set assembly value %ld\n", res );
657  }
658  RegCloseKey( hkey );
659 
660  uirow = MSI_CreateRecord( 2 );
661  MSI_RecordSetStringW( uirow, 2, assembly->display_name );
663  msiobj_release( &uirow->hdr );
664  }
665  return ERROR_SUCCESS;
666 }
LPWSTR ProductCode
Definition: msipriv.h:448
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
Definition: record.c:597
enum script script
Definition: msipriv.h:432
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIASSEMBLY * assembly
Definition: msipriv.h:540
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define WARN(fmt,...)
Definition: debug.h:112
GLuint buffer
Definition: glext.h:5915
INSTALLSTATE Action
Definition: msipriv.h:533
INSTALLSTATE msi_get_component_action(MSIPACKAGE *package, MSICOMPONENT *comp)
Definition: action.c:611
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
const GUID * guid
#define L(x)
Definition: ntvdm.h:50
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
static LONG open_local_assembly_key(UINT context, BOOL win32, const WCHAR *filename, HKEY *hkey)
Definition: assembly.c:535
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define REG_MULTI_SZ
Definition: nt_native.h:1501
#define debugstr_w
Definition: kernel32.h:32
INT MSI_ProcessMessage(MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD *) DECLSPEC_HIDDEN
Definition: package.c:1858
MSIFILE * msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *key)
Definition: action.c:574
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4899
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
__wchar_t WCHAR
Definition: xmlstorage.h:180
unsigned long DWORD
Definition: ntddk_ex.h:95
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
LPWSTR Component
Definition: msipriv.h:525
struct list components
Definition: msipriv.h:401
MSIRECORD * MSI_CreateRecord(UINT) DECLSPEC_HIDDEN
Definition: record.c:76
uint32_t entry
Definition: isohybrid.c:63
unsigned char BYTE
Definition: xxhash.c:193
LPWSTR ComponentId
Definition: msipriv.h:526
static LONG open_global_assembly_key(UINT context, BOOL win32, HKEY *hkey)
Definition: assembly.c:575
UINT Context
Definition: msipriv.h:459
GLuint res
Definition: glext.h:9613
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
#define RegCloseKey(hKey)
Definition: registry.h:47
UINT msi_schedule_action(MSIPACKAGE *package, UINT script, const WCHAR *action)
Definition: custom.c:90
BOOL encode_base85_guid(GUID *, LPWSTR) DECLSPEC_HIDDEN
Definition: registry.c:165
Definition: fci.c:126

◆ ACTION_MsiUnpublishAssemblies()

UINT ACTION_MsiUnpublishAssemblies ( MSIPACKAGE package)

Definition at line 668 of file assembly.c.

669 {
670  MSICOMPONENT *comp;
671 
672  if (package->script == SCRIPT_NONE)
673  return msi_schedule_action(package, SCRIPT_INSTALL, L"MsiUnpublishAssemblies");
674 
676  {
677  LONG res;
678  MSIRECORD *uirow;
679  MSIASSEMBLY *assembly = comp->assembly;
680  BOOL win32;
681 
682  if (!assembly || !comp->ComponentId) continue;
683 
684  comp->Action = msi_get_component_action( package, comp );
685  if (comp->Action != INSTALLSTATE_ABSENT)
686  {
687  TRACE("component not scheduled for removal %s\n", debugstr_w(comp->Component));
688  continue;
689  }
690  TRACE("unpublishing %s\n", debugstr_w(comp->Component));
691 
692  win32 = assembly->attributes & msidbAssemblyAttributesWin32;
693  if (assembly->application)
694  {
695  MSIFILE *file = msi_get_loaded_file( package, assembly->application );
696  if (!file)
697  {
698  WARN("no matching file %s for local assembly\n", debugstr_w(assembly->application));
699  continue;
700  }
701  if ((res = delete_local_assembly_key( package->Context, win32, file->TargetPath )))
702  WARN( "failed to delete local assembly key %ld\n", res );
703  }
704  else
705  {
706  HKEY hkey;
707  if ((res = open_global_assembly_key( package->Context, win32, &hkey )))
708  WARN( "failed to delete global assembly key %ld\n", res );
709  else
710  {
711  if ((res = RegDeleteValueW( hkey, assembly->display_name )))
712  WARN( "failed to delete global assembly value %ld\n", res );
713  RegCloseKey( hkey );
714  }
715  }
716 
717  uirow = MSI_CreateRecord( 2 );
718  MSI_RecordSetStringW( uirow, 2, assembly->display_name );
720  msiobj_release( &uirow->hdr );
721  }
722  return ERROR_SUCCESS;
723 }
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
Definition: record.c:597
enum script script
Definition: msipriv.h:432
#define ERROR_SUCCESS
Definition: deptool.c:10
MSIASSEMBLY * assembly
Definition: msipriv.h:540
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define WARN(fmt,...)
Definition: debug.h:112
INSTALLSTATE Action
Definition: msipriv.h:533
INSTALLSTATE msi_get_component_action(MSIPACKAGE *package, MSICOMPONENT *comp)
Definition: action.c:611
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define L(x)
Definition: ntvdm.h:50
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
INT MSI_ProcessMessage(MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD *) DECLSPEC_HIDDEN
Definition: package.c:1858
MSIFILE * msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *key)
Definition: action.c:574
#define TRACE(s)
Definition: solgame.cpp:4
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
LPWSTR Component
Definition: msipriv.h:525
struct list components
Definition: msipriv.h:401
MSIRECORD * MSI_CreateRecord(UINT) DECLSPEC_HIDDEN
Definition: record.c:76
uint32_t entry
Definition: isohybrid.c:63
static LONG delete_local_assembly_key(UINT context, BOOL win32, const WCHAR *filename)
Definition: assembly.c:555
LPWSTR ComponentId
Definition: msipriv.h:526
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2355
static LONG open_global_assembly_key(UINT context, BOOL win32, HKEY *hkey)
Definition: assembly.c:575
UINT Context
Definition: msipriv.h:459
GLuint res
Definition: glext.h:9613
#define RegCloseKey(hKey)
Definition: registry.h:47
UINT msi_schedule_action(MSIPACKAGE *package, UINT script, const WCHAR *action)
Definition: custom.c:90
Definition: fci.c:126

◆ build_local_assembly_path()

static WCHAR* build_local_assembly_path ( const WCHAR filename)
static

Definition at line 498 of file assembly.c.

499 {
500  UINT i;
501  WCHAR *ret;
502 
503  if (!(ret = msi_alloc( (lstrlenW( filename ) + 1) * sizeof(WCHAR) )))
504  return NULL;
505 
506  for (i = 0; filename[i]; i++)
507  {
508  if (filename[i] == '\\' || filename[i] == '/') ret[i] = '|';
509  else ret[i] = filename[i];
510  }
511  ret[i] = 0;
512  return ret;
513 }
const char * filename
Definition: ioapi.h:135
#define lstrlenW
Definition: compat.h:609
__wchar_t WCHAR
Definition: xmlstorage.h:180
int ret
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142

Referenced by delete_local_assembly_key(), and open_local_assembly_key().

◆ delete_local_assembly_key()

static LONG delete_local_assembly_key ( UINT  context,
BOOL  win32,
const WCHAR filename 
)
static

Definition at line 555 of file assembly.c.

556 {
557  LONG res;
558  HKEY root;
559  WCHAR *path;
560 
562  return ERROR_OUTOFMEMORY;
563 
564  if ((res = open_assemblies_key( context, win32, &root )))
565  {
566  msi_free( path );
567  return res;
568  }
569  res = RegDeleteKeyW( root, path );
570  RegCloseKey( root );
571  msi_free( path );
572  return res;
573 }
Definition: http.c:7251
GLsizei const GLchar ** path
Definition: glext.h:7234
struct _root root
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1237
static void msi_free(void *mem)
Definition: msipriv.h:1159
const char * filename
Definition: ioapi.h:135
long LONG
Definition: pedump.c:60
__wchar_t WCHAR
Definition: xmlstorage.h:180
static LONG open_assemblies_key(UINT context, BOOL win32, HKEY *hkey)
Definition: assembly.c:515
static WCHAR * build_local_assembly_path(const WCHAR *filename)
Definition: assembly.c:498
GLuint res
Definition: glext.h:9613
#define RegCloseKey(hKey)
Definition: registry.h:47
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by ACTION_MsiUnpublishAssemblies().

◆ get_assembly_display_name()

static WCHAR* get_assembly_display_name ( MSIDATABASE db,
const WCHAR comp,
MSIASSEMBLY assembly 
)
static

Definition at line 175 of file assembly.c.

176 {
177  struct assembly_name name;
178  WCHAR *display_name = NULL;
179  MSIQUERY *view;
180  UINT i, r;
181  int len;
182 
183  r = MSI_OpenQuery( db, &view, L"SELECT * FROM `MsiAssemblyName` WHERE `Component_` = '%s'", comp );
184  if (r != ERROR_SUCCESS)
185  return NULL;
186 
187  name.count = 0;
188  name.index = 0;
189  name.attrs = NULL;
190  MSI_IterateRecords( view, &name.count, NULL, NULL );
191  if (!name.count) goto done;
192 
193  name.attrs = msi_alloc( name.count * sizeof(WCHAR *) );
194  if (!name.attrs) goto done;
195 
197 
198  len = 0;
199  for (i = 0; i < name.count; i++) len += lstrlenW( name.attrs[i] ) + 1;
200 
201  display_name = msi_alloc( (len + 1) * sizeof(WCHAR) );
202  if (display_name)
203  {
204  display_name[0] = 0;
205  for (i = 0; i < name.count; i++)
206  {
207  lstrcatW( display_name, name.attrs[i] );
208  if (i < name.count - 1) lstrcatW( display_name, L"," );
209  }
210  }
211 
212 done:
213  msiobj_release( &view->hdr );
214  if (name.attrs)
215  {
216  for (i = 0; i < name.count; i++) msi_free( name.attrs[i] );
217  msi_free( name.attrs );
218  }
219  return display_name;
220 }
#define ERROR_SUCCESS
Definition: deptool.c:10
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static void msi_free(void *mem)
Definition: msipriv.h:1159
#define lstrlenW
Definition: compat.h:609
UINT WINAPIV MSI_OpenQuery(MSIDATABASE *, MSIQUERY **, LPCWSTR,...) DECLSPEC_HIDDEN
Definition: msiquery.c:138
#define L(x)
Definition: ntvdm.h:50
__wchar_t WCHAR
Definition: xmlstorage.h:180
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
static UINT get_assembly_name_attribute(MSIRECORD *rec, LPVOID param)
Definition: assembly.c:160
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
Definition: name.c:38
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142
static IOleDocumentView * view
Definition: activex.c:1749
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
UINT MSI_IterateRecords(MSIQUERY *, LPDWORD, record_func, LPVOID) DECLSPEC_HIDDEN
Definition: msiquery.c:163

Referenced by msi_load_assembly().

◆ get_assembly_name_attribute()

static UINT get_assembly_name_attribute ( MSIRECORD rec,
LPVOID  param 
)
static

Definition at line 160 of file assembly.c.

161 {
162  struct assembly_name *name = param;
163  const WCHAR *attr = MSI_RecordGetString( rec, 2 );
164  const WCHAR *value = MSI_RecordGetString( rec, 3 );
165  int len = lstrlenW( L"%s=\"%s\"" ) + lstrlenW( attr ) + lstrlenW( value );
166 
167  if (!(name->attrs[name->index] = msi_alloc( len * sizeof(WCHAR) )))
168  return ERROR_OUTOFMEMORY;
169 
170  if (!wcsicmp( attr, L"name" )) lstrcpyW( name->attrs[name->index++], value );
171  else swprintf( name->attrs[name->index++], len, L"%s=\"%s\"", attr, value );
172  return ERROR_SUCCESS;
173 }
Definition: pdh_main.c:93
#define ERROR_SUCCESS
Definition: deptool.c:10
#define lstrlenW
Definition: compat.h:609
#define L(x)
Definition: ntvdm.h:50
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT) DECLSPEC_HIDDEN
Definition: record.c:433
__wchar_t WCHAR
Definition: xmlstorage.h:180
GLfloat param
Definition: glext.h:5796
Definition: cookie.c:201
#define wcsicmp
Definition: compat.h:15
GLenum GLsizei len
Definition: glext.h:6722
int _cdecl swprintf(const WCHAR *,...)
#define lstrcpyW
Definition: compat.h:608
Definition: name.c:38
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by get_assembly_display_name().

◆ get_assembly_record()

static MSIRECORD* get_assembly_record ( MSIPACKAGE package,
const WCHAR comp 
)
static

Definition at line 124 of file assembly.c.

125 {
126  MSIQUERY *view;
127  MSIRECORD *rec;
128  UINT r;
129 
130  r = MSI_OpenQuery( package->db, &view, L"SELECT * FROM `MsiAssembly` WHERE `Component_` = '%s'", comp );
131  if (r != ERROR_SUCCESS)
132  return NULL;
133 
134  r = MSI_ViewExecute( view, NULL );
135  if (r != ERROR_SUCCESS)
136  {
137  msiobj_release( &view->hdr );
138  return NULL;
139  }
140  r = MSI_ViewFetch( view, &rec );
141  if (r != ERROR_SUCCESS)
142  {
143  msiobj_release( &view->hdr );
144  return NULL;
145  }
146  if (!MSI_RecordGetString( rec, 4 ))
147  TRACE("component is a global assembly\n");
148 
149  msiobj_release( &view->hdr );
150  return rec;
151 }
#define ERROR_SUCCESS
Definition: deptool.c:10
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
UINT MSI_ViewExecute(MSIQUERY *, MSIRECORD *) DECLSPEC_HIDDEN
Definition: msiquery.c:502
UINT WINAPIV MSI_OpenQuery(MSIDATABASE *, MSIQUERY **, LPCWSTR,...) DECLSPEC_HIDDEN
Definition: msiquery.c:138
#define L(x)
Definition: ntvdm.h:50
UINT MSI_ViewFetch(MSIQUERY *, MSIRECORD **) DECLSPEC_HIDDEN
Definition: msiquery.c:377
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT) DECLSPEC_HIDDEN
Definition: record.c:433
#define TRACE(s)
Definition: solgame.cpp:4
MSIDATABASE * db
Definition: msipriv.h:394
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static IOleDocumentView * view
Definition: activex.c:1749

Referenced by msi_load_assembly().

◆ get_clr_version()

static enum clr_version get_clr_version ( MSIPACKAGE package,
const WCHAR filename 
)
static

Definition at line 386 of file assembly.c.

387 {
388  DWORD len;
389  HRESULT hr;
391  WCHAR *strW;
392 
393  if (!package->pGetFileVersion) return CLR_VERSION_V10;
394 
395  hr = package->pGetFileVersion( filename, NULL, 0, &len );
397  if ((strW = msi_alloc( len * sizeof(WCHAR) )))
398  {
399  hr = package->pGetFileVersion( filename, strW, len, &len );
400  if (hr == S_OK)
401  {
402  UINT i;
403  for (i = 0; i < CLR_VERSION_MAX; i++)
404  if (!wcscmp( strW, clr_version[i] )) version = i;
405  }
406  msi_free( strW );
407  }
408  return version;
409 }
clr_version
Definition: msipriv.h:373
HRESULT hr
Definition: shlfolder.c:183
static void msi_free(void *mem)
Definition: msipriv.h:1159
const char * filename
Definition: ioapi.h:135
WCHAR strW[12]
Definition: clipboard.c:2029
static const WCHAR version[]
Definition: asmname.c:66
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define S_OK
Definition: intsafe.h:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142

Referenced by msi_install_assembly().

◆ get_clr_version_str()

static const WCHAR* get_clr_version_str ( enum clr_version  version)
static

Definition at line 312 of file assembly.c.

313 {
314  if (version >= ARRAY_SIZE( clr_version )) return L"unknown";
315  return clr_version[version];
316 }
clr_version
Definition: msipriv.h:373
#define L(x)
Definition: ntvdm.h:50
static const WCHAR version[]
Definition: asmname.c:66
#define ARRAY_SIZE(a)
Definition: main.h:24

Referenced by msi_load_assembly().

◆ is_assembly_installed()

static BOOL is_assembly_installed ( IAssemblyCache cache,
const WCHAR display_name 
)
static

Definition at line 222 of file assembly.c.

223 {
224  HRESULT hr;
226 
227  if (!cache) return FALSE;
228 
229  memset( &info, 0, sizeof(info) );
230  info.cbAssemblyInfo = sizeof(info);
231  hr = IAssemblyCache_QueryAssemblyInfo( cache, 0, display_name, &info );
232  if (hr == S_OK /* sxs version */ || hr == E_NOT_SUFFICIENT_BUFFER)
233  {
234  return (info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED);
235  }
236  TRACE( "QueryAssemblyInfo returned %#lx\n", hr );
237  return FALSE;
238 }
Definition: cache.c:48
#define ASSEMBLYINFO_FLAG_INSTALLED
Definition: cache.c:197
HRESULT hr
Definition: shlfolder.c:183
#define FALSE
Definition: types.h:117
static struct _test_info info[]
Definition: SetCursorPos.c:19
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define S_OK
Definition: intsafe.h:52
#define memset(x, y, z)
Definition: compat.h:39

Referenced by msi_load_assembly().

◆ load_fusion_dlls()

static BOOL load_fusion_dlls ( MSIPACKAGE package)
static

Definition at line 33 of file assembly.c.

34 {
35  HRESULT (WINAPI *pLoadLibraryShim)( const WCHAR *, const WCHAR *, void *, HMODULE * );
38 
39  lstrcpyW( path + len, L"\\mscoree.dll" );
40  if (package->hmscoree || !(package->hmscoree = LoadLibraryW( path ))) return TRUE;
41  if (!(pLoadLibraryShim = (void *)GetProcAddress( package->hmscoree, "LoadLibraryShim" )))
42  {
43  FreeLibrary( package->hmscoree );
44  package->hmscoree = NULL;
45  return TRUE;
46  }
47 
48  pLoadLibraryShim( L"fusion.dll", L"v1.0.3705", NULL, &package->hfusion10 );
49  pLoadLibraryShim( L"fusion.dll", L"v1.1.4322", NULL, &package->hfusion11 );
50  pLoadLibraryShim( L"fusion.dll", L"v2.0.50727", NULL, &package->hfusion20 );
51  pLoadLibraryShim( L"fusion.dll", L"v4.0.30319", NULL, &package->hfusion40 );
52 
53  return TRUE;
54 }
#define HRESULT
Definition: msvc.h:7
#define TRUE
Definition: types.h:120
HMODULE hfusion20
Definition: msipriv.h:417
#define L(x)
Definition: ntvdm.h:50
HMODULE hfusion40
Definition: msipriv.h:418
#define LoadLibraryW(x)
Definition: compat.h:606
#define FreeLibrary(x)
Definition: compat.h:607
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
HMODULE hfusion11
Definition: msipriv.h:416
GLenum GLsizei len
Definition: glext.h:6722
HMODULE hfusion10
Definition: msipriv.h:415
#define lstrcpyW
Definition: compat.h:608
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2313
#define NULL
Definition: types.h:112
HMODULE hmscoree
Definition: msipriv.h:419
#define GetProcAddress(x, y)
Definition: compat.h:612

Referenced by msi_init_assembly_caches().

◆ msi_create_assembly_enum()

IAssemblyEnum* msi_create_assembly_enum ( MSIPACKAGE package,
const WCHAR displayname 
)

Definition at line 265 of file assembly.c.

266 {
267  HRESULT hr;
270  WCHAR *str;
271  DWORD len = 0;
272 
273  if (!package->pCreateAssemblyNameObject || !package->pCreateAssemblyEnum) return NULL;
274 
275  hr = package->pCreateAssemblyNameObject( &name, displayname, CANOF_PARSE_DISPLAY_NAME, NULL );
276  if (FAILED( hr )) return NULL;
277 
278  hr = IAssemblyName_GetName( name, &len, NULL );
279  if (hr != E_NOT_SUFFICIENT_BUFFER || !(str = msi_alloc( len * sizeof(WCHAR) )))
280  {
281  IAssemblyName_Release( name );
282  return NULL;
283  }
284 
285  hr = IAssemblyName_GetName( name, &len, str );
286  IAssemblyName_Release( name );
287  if (FAILED( hr ))
288  {
289  msi_free( str );
290  return NULL;
291  }
292 
293  hr = package->pCreateAssemblyNameObject( &name, str, 0, NULL );
294  msi_free( str );
295  if (FAILED( hr )) return NULL;
296 
297  hr = package->pCreateAssemblyEnum( &ret, NULL, name, ASM_CACHE_GAC, NULL );
298  IAssemblyName_Release( name );
299  if (FAILED( hr )) return NULL;
300 
301  return ret;
302 }
HRESULT hr
Definition: shlfolder.c:183
static void msi_free(void *mem)
Definition: msipriv.h:1159
const WCHAR * str
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
unsigned long DWORD
Definition: ntddk_ex.h:95
int ret
GLenum GLsizei len
Definition: glext.h:6722
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define NULL
Definition: types.h:112
Definition: name.c:38
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142
GLuint const GLchar * name
Definition: glext.h:6031

Referenced by patch_assembly().

◆ msi_destroy_assembly_caches()

void msi_destroy_assembly_caches ( MSIPACKAGE package)

Definition at line 92 of file assembly.c.

93 {
94  UINT i;
95 
96  if (package->cache_sxs)
97  {
98  IAssemblyCache_Release( package->cache_sxs );
99  package->cache_sxs = NULL;
100  }
101  for (i = 0; i < CLR_VERSION_MAX; i++)
102  {
103  if (package->cache_net[i])
104  {
105  IAssemblyCache_Release( package->cache_net[i] );
106  package->cache_net[i] = NULL;
107  }
108  }
109  package->pGetFileVersion = NULL;
110  package->pCreateAssemblyNameObject = NULL;
111  package->pCreateAssemblyEnum = NULL;
112  FreeLibrary( package->hfusion10 );
113  FreeLibrary( package->hfusion11 );
114  FreeLibrary( package->hfusion20 );
115  FreeLibrary( package->hfusion40 );
116  FreeLibrary( package->hmscoree );
117  package->hfusion10 = NULL;
118  package->hfusion11 = NULL;
119  package->hfusion20 = NULL;
120  package->hfusion40 = NULL;
121  package->hmscoree = NULL;
122 }
HMODULE hfusion20
Definition: msipriv.h:417
HMODULE hfusion40
Definition: msipriv.h:418
#define FreeLibrary(x)
Definition: compat.h:607
IAssemblyCache * cache_sxs
Definition: msipriv.h:424
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
HMODULE hfusion11
Definition: msipriv.h:416
HMODULE hfusion10
Definition: msipriv.h:415
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
HMODULE hmscoree
Definition: msipriv.h:419

Referenced by MSI_FreePackage().

◆ msi_get_assembly_path()

WCHAR* msi_get_assembly_path ( MSIPACKAGE package,
const WCHAR displayname 
)

Definition at line 240 of file assembly.c.

241 {
242  HRESULT hr;
245 
246  if (!cache) return NULL;
247 
248  memset( &info, 0, sizeof(info) );
249  info.cbAssemblyInfo = sizeof(info);
250  hr = IAssemblyCache_QueryAssemblyInfo( cache, 0, displayname, &info );
251  if (hr != E_NOT_SUFFICIENT_BUFFER) return NULL;
252 
253  if (!(info.pszCurrentAssemblyPathBuf = msi_alloc( info.cchBuf * sizeof(WCHAR) ))) return NULL;
254 
255  hr = IAssemblyCache_QueryAssemblyInfo( cache, 0, displayname, &info );
256  if (FAILED( hr ))
257  {
258  msi_free( info.pszCurrentAssemblyPathBuf );
259  return NULL;
260  }
261  TRACE("returning %s\n", debugstr_w(info.pszCurrentAssemblyPathBuf));
262  return info.pszCurrentAssemblyPathBuf;
263 }
Definition: cache.c:48
HRESULT hr
Definition: shlfolder.c:183
static void msi_free(void *mem)
Definition: msipriv.h:1159
static struct _test_info info[]
Definition: SetCursorPos.c:19
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define NULL
Definition: types.h:112
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1142
#define memset(x, y, z)
Definition: compat.h:39

Referenced by patch_assembly().

◆ msi_init_assembly_caches()

BOOL msi_init_assembly_caches ( MSIPACKAGE package)

Definition at line 56 of file assembly.c.

57 {
58  HRESULT (WINAPI *pCreateAssemblyCache)( IAssemblyCache **, DWORD );
59 
60  if (package->cache_sxs) return TRUE;
61  if (CreateAssemblyCache( &package->cache_sxs, 0 ) != S_OK) return FALSE;
62 
63  if (!load_fusion_dlls( package )) return FALSE;
64  package->pGetFileVersion = (void *)GetProcAddress( package->hmscoree, "GetFileVersion" ); /* missing from v1.0.3705 */
65 
66  if (package->hfusion10)
67  {
68  pCreateAssemblyCache = (void *)GetProcAddress( package->hfusion10, "CreateAssemblyCache" );
69  pCreateAssemblyCache( &package->cache_net[CLR_VERSION_V10], 0 );
70  }
71  if (package->hfusion11)
72  {
73  pCreateAssemblyCache = (void *)GetProcAddress( package->hfusion11, "CreateAssemblyCache" );
74  pCreateAssemblyCache( &package->cache_net[CLR_VERSION_V11], 0 );
75  }
76  if (package->hfusion20)
77  {
78  pCreateAssemblyCache = (void *)GetProcAddress( package->hfusion20, "CreateAssemblyCache" );
79  pCreateAssemblyCache( &package->cache_net[CLR_VERSION_V20], 0 );
80  }
81  if (package->hfusion40)
82  {
83  pCreateAssemblyCache = (void *)GetProcAddress( package->hfusion40, "CreateAssemblyCache" );
84  pCreateAssemblyCache( &package->cache_net[CLR_VERSION_V40], 0 );
85  package->pCreateAssemblyNameObject = (void *)GetProcAddress( package->hfusion40, "CreateAssemblyNameObject" );
86  package->pCreateAssemblyEnum = (void *)GetProcAddress( package->hfusion40, "CreateAssemblyEnum" );
87  }
88 
89  return TRUE;
90 }
#define HRESULT
Definition: msvc.h:7
#define TRUE
Definition: types.h:120
HMODULE hfusion20
Definition: msipriv.h:417
static BOOL load_fusion_dlls(MSIPACKAGE *package)
Definition: assembly.c:33
#define DWORD
Definition: nt_native.h:44
#define FALSE
Definition: types.h:117
HMODULE hfusion40
Definition: msipriv.h:418
IAssemblyCache * cache_sxs
Definition: msipriv.h:424
#define WINAPI
Definition: msvc.h:6
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
HMODULE hfusion11
Definition: msipriv.h:416
HMODULE hfusion10
Definition: msipriv.h:415
#define S_OK
Definition: intsafe.h:52
HMODULE hmscoree
Definition: msipriv.h:419
HRESULT WINAPI CreateAssemblyCache(IAssemblyCache **ppAsmCache, DWORD dwReserved)
Definition: asmcache.c:555
#define GetProcAddress(x, y)
Definition: compat.h:612

Referenced by MSI_OpenPackageW().

◆ msi_install_assembly()

UINT msi_install_assembly ( MSIPACKAGE package,
MSICOMPONENT comp 
)

Definition at line 411 of file assembly.c.

412 {
413  HRESULT hr;
414  const WCHAR *manifest;
416  MSIASSEMBLY *assembly = comp->assembly;
418 
419  if (comp->assembly->feature)
420  feature = msi_get_loaded_feature( package, comp->assembly->feature );
421 
422  if (assembly->application)
423  {
424  if (feature) feature->Action = INSTALLSTATE_LOCAL;
425  return ERROR_SUCCESS;
426  }
427  if (assembly->attributes == msidbAssemblyAttributesWin32)
428  {
429  if (!assembly->manifest)
430  {
431  WARN("no manifest\n");
432  return ERROR_FUNCTION_FAILED;
433  }
435  cache = package->cache_sxs;
436  }
437  else
438  {
439  manifest = msi_get_loaded_file( package, comp->KeyPath )->TargetPath;
440  cache = package->cache_net[get_clr_version( package, manifest )];
441  if (!cache) return ERROR_SUCCESS;
442  }
443  TRACE("installing assembly %s\n", debugstr_w(manifest));
444 
445  hr = IAssemblyCache_InstallAssembly( cache, 0, manifest, NULL );
446  if (hr != S_OK)
447  {
448  ERR( "failed to install assembly %s (%#lx)\n", debugstr_w(manifest), hr );
449  return ERROR_FUNCTION_FAILED;
450  }
451  if (feature) feature->Action = INSTALLSTATE_LOCAL;
452  assembly->installed = TRUE;
453  return ERROR_SUCCESS;
454 }
Definition: cache.c:48
INTERNETFEATURELIST feature
Definition: misc.c:1719
MSIFEATURE * msi_get_loaded_feature(MSIPACKAGE *package, const WCHAR *Feature)
Definition: action.c:563
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
MSIASSEMBLY * assembly
Definition: msipriv.h:540
#define TRUE
Definition: types.h:120
struct file_info manifest
Definition: actctx.c:469
#define WARN(fmt,...)
Definition: debug.h:112
LPWSTR KeyPath
Definition: msipriv.h:530
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985
#define debugstr_w
Definition: kernel32.h:32
LPWSTR feature
Definition: msipriv.h:512
MSIFILE * msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *key)
Definition: action.c:574
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
IAssemblyCache * cache_sxs
Definition: msipriv.h:424
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
static IOleCache * cache
Definition: ole2.c:75
#define ERR(fmt,...)
Definition: debug.h:110
static enum clr_version get_clr_version(MSIPACKAGE *package, const WCHAR *filename)
Definition: assembly.c:386
#define S_OK
Definition: intsafe.h:52
#define NULL
Definition: types.h:112
static const CHAR manifest[]
Definition: v6util.h:39
LPWSTR TargetPath
Definition: msipriv.h:617

Referenced by ACTION_InstallFiles(), and ACTION_PatchFiles().

◆ msi_load_assembly()

MSIASSEMBLY* msi_load_assembly ( MSIPACKAGE package,
MSICOMPONENT comp 
)

Definition at line 319 of file assembly.c.

320 {
321  MSIRECORD *rec;
322  MSIASSEMBLY *a;
323 
324  if (!(rec = get_assembly_record( package, comp->Component ))) return NULL;
325  if (!(a = msi_alloc_zero( sizeof(MSIASSEMBLY) )))
326  {
327  msiobj_release( &rec->hdr );
328  return NULL;
329  }
330  a->feature = strdupW( MSI_RecordGetString( rec, 2 ) );
331  TRACE("feature %s\n", debugstr_w(a->feature));
332 
333  a->manifest = strdupW( MSI_RecordGetString( rec, 3 ) );
334  TRACE("manifest %s\n", debugstr_w(a->manifest));
335 
336  a->application = strdupW( MSI_RecordGetString( rec, 4 ) );
337  TRACE("application %s\n", debugstr_w(a->application));
338 
339  a->attributes = MSI_RecordGetInteger( rec, 5 );
340  TRACE( "attributes %lu\n", a->attributes );
341 
342  if (!(a->display_name = get_assembly_display_name( package->db, comp->Component, a )))
343  {
344  WARN("can't get display name\n");
345  msiobj_release( &rec->hdr );
346  msi_free( a->feature );
347  msi_free( a->manifest );
348  msi_free( a->application );
349  msi_free( a );
350  return NULL;
351  }
352  TRACE("display name %s\n", debugstr_w(a->display_name));
353 
354  if (a->application)
355  {
356  /* We can't check the manifest here because the target path may still change.
357  So we assume that the assembly is not installed and lean on the InstallFiles
358  action to determine which files need to be installed.
359  */
360  a->installed = FALSE;
361  }
362  else
363  {
364  if (a->attributes == msidbAssemblyAttributesWin32)
365  a->installed = is_assembly_installed( package->cache_sxs, a->display_name );
366  else
367  {
368  UINT i;
369  for (i = 0; i < CLR_VERSION_MAX; i++)
370  {
371  a->clr_version[i] = is_assembly_installed( package->cache_net[i], a->display_name );
372  if (a->clr_version[i])
373  {
374  TRACE("runtime version %s\n", debugstr_w(get_clr_version_str( i )));
375  a->installed = TRUE;
376  break;
377  }
378  }
379  }
380  }
381  TRACE("assembly is %s\n", a->installed ? "installed" : "not installed");
382  msiobj_release( &rec->hdr );
383  return a;
384 }
static const WCHAR * get_clr_version_str(enum clr_version version)
Definition: assembly.c:312
static WCHAR * get_assembly_display_name(MSIDATABASE *db, const WCHAR *comp, MSIASSEMBLY *assembly)
Definition: assembly.c:175
#define TRUE
Definition: types.h:120
MSIOBJECTHDR hdr
Definition: msipriv.h:151
#define WARN(fmt,...)
Definition: debug.h:112
static void msi_free(void *mem)
Definition: msipriv.h:1159
static void * msi_alloc_zero(size_t len) __WINE_ALLOC_SIZE(1)
Definition: msipriv.h:1148
#define FALSE
Definition: types.h:117
#define a
Definition: ke_i.h:78
static MSIRECORD * get_assembly_record(MSIPACKAGE *package, const WCHAR *comp)
Definition: assembly.c:124
#define debugstr_w
Definition: kernel32.h:32
static BOOL is_assembly_installed(IAssemblyCache *cache, const WCHAR *display_name)
Definition: assembly.c:222
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT) DECLSPEC_HIDDEN
Definition: record.c:433
#define TRACE(s)
Definition: solgame.cpp:4
IAssemblyCache * cache_sxs
Definition: msipriv.h:424
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
MSIDATABASE * db
Definition: msipriv.h:394
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
LPWSTR Component
Definition: msipriv.h:525
int MSI_RecordGetInteger(MSIRECORD *, UINT) DECLSPEC_HIDDEN
Definition: record.c:213
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
static LPWSTR strdupW(LPCWSTR src)
Definition: assembly.c:67

Referenced by load_component().

◆ msi_uninstall_assembly()

UINT msi_uninstall_assembly ( MSIPACKAGE package,
MSICOMPONENT comp 
)

Definition at line 456 of file assembly.c.

457 {
458  HRESULT hr;
460  MSIASSEMBLY *assembly = comp->assembly;
462 
463  if (comp->assembly->feature)
464  feature = msi_get_loaded_feature( package, comp->assembly->feature );
465 
466  if (assembly->application)
467  {
468  if (feature) feature->Action = INSTALLSTATE_ABSENT;
469  return ERROR_SUCCESS;
470  }
471  TRACE("removing %s\n", debugstr_w(assembly->display_name));
472 
473  if (assembly->attributes == msidbAssemblyAttributesWin32)
474  {
475  cache = package->cache_sxs;
476  hr = IAssemblyCache_UninstallAssembly( cache, 0, assembly->display_name, NULL, NULL );
477  if (FAILED( hr )) WARN( "failed to uninstall assembly %#lx\n", hr );
478  }
479  else
480  {
481  unsigned int i;
482  for (i = 0; i < CLR_VERSION_MAX; i++)
483  {
484  if (!assembly->clr_version[i]) continue;
485  cache = package->cache_net[i];
486  if (cache)
487  {
488  hr = IAssemblyCache_UninstallAssembly( cache, 0, assembly->display_name, NULL, NULL );
489  if (FAILED( hr )) WARN( "failed to uninstall assembly %#lx\n", hr );
490  }
491  }
492  }
493  if (feature) feature->Action = INSTALLSTATE_ABSENT;
494  assembly->installed = FALSE;
495  return ERROR_SUCCESS;
496 }
Definition: cache.c:48
INTERNETFEATURELIST feature
Definition: misc.c:1719
MSIFEATURE * msi_get_loaded_feature(MSIPACKAGE *package, const WCHAR *Feature)
Definition: action.c:563
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
MSIASSEMBLY * assembly
Definition: msipriv.h:540
#define WARN(fmt,...)
Definition: debug.h:112
#define FALSE
Definition: types.h:117
#define debugstr_w
Definition: kernel32.h:32
LPWSTR feature
Definition: msipriv.h:512
#define TRACE(s)
Definition: solgame.cpp:4
LONG HRESULT
Definition: typedefs.h:79
IAssemblyCache * cache_sxs
Definition: msipriv.h:424
WCHAR DWORD const WCHAR void IUnknown IAssemblyName void *IAssemblyCache * cache_net[CLR_VERSION_MAX]
Definition: msipriv.h:422
static IOleCache * cache
Definition: ole2.c:75
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define NULL
Definition: types.h:112

Referenced by ACTION_RemoveFiles().

◆ open_assemblies_key()

static LONG open_assemblies_key ( UINT  context,
BOOL  win32,
HKEY hkey 
)
static

Definition at line 515 of file assembly.c.

516 {
517  HKEY root;
518  const WCHAR *path;
519 
521  {
523  if (win32) path = L"Installer\\Win32Assemblies\\";
524  else path = L"Installer\\Assemblies\\";
525  }
526  else
527  {
529  if (win32) path = L"Software\\Microsoft\\Installer\\Win32Assemblies\\";
530  else path = L"Software\\Microsoft\\Installer\\Assemblies\\";
531  }
532  return RegCreateKeyW( root, path, hkey );
533 }
Definition: http.c:7251
GLsizei const GLchar ** path
Definition: glext.h:7234
#define HKEY_CURRENT_USER
Definition: winreg.h:11
struct _root root
#define L(x)
Definition: ntvdm.h:50
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1199
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by delete_local_assembly_key(), and open_local_assembly_key().

◆ open_global_assembly_key()

static LONG open_global_assembly_key ( UINT  context,
BOOL  win32,
HKEY hkey 
)
static

Definition at line 575 of file assembly.c.

576 {
577  HKEY root;
578  const WCHAR *path;
579 
581  {
583  if (win32) path = L"Installer\\Win32Assemblies\\Global";
584  else path = L"Installer\\Assemblies\\Global";
585  }
586  else
587  {
589  if (win32) path = L"Software\\Microsoft\\Installer\\Win32Assemblies\\Global";
590  else path = L"Software\\Microsoft\\Installer\\Assemblies\\Global";
591  }
592  return RegCreateKeyW( root, path, hkey );
593 }
Definition: http.c:7251
GLsizei const GLchar ** path
Definition: glext.h:7234
#define HKEY_CURRENT_USER
Definition: winreg.h:11
struct _root root
#define L(x)
Definition: ntvdm.h:50
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1199
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by ACTION_MsiPublishAssemblies(), and ACTION_MsiUnpublishAssemblies().

◆ open_local_assembly_key()

static LONG open_local_assembly_key ( UINT  context,
BOOL  win32,
const WCHAR filename,
HKEY hkey 
)
static

Definition at line 535 of file assembly.c.

536 {
537  LONG res;
538  HKEY root;
539  WCHAR *path;
540 
542  return ERROR_OUTOFMEMORY;
543 
544  if ((res = open_assemblies_key( context, win32, &root )))
545  {
546  msi_free( path );
547  return res;
548  }
549  res = RegCreateKeyW( root, path, hkey );
550  RegCloseKey( root );
551  msi_free( path );
552  return res;
553 }
Definition: http.c:7251
GLsizei const GLchar ** path
Definition: glext.h:7234
struct _root root
static void msi_free(void *mem)
Definition: msipriv.h:1159
const char * filename
Definition: ioapi.h:135
long LONG
Definition: pedump.c:60
__wchar_t WCHAR
Definition: xmlstorage.h:180
static LONG open_assemblies_key(UINT context, BOOL win32, HKEY *hkey)
Definition: assembly.c:515
LONG WINAPI RegCreateKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1199
static WCHAR * build_local_assembly_path(const WCHAR *filename)
Definition: assembly.c:498
GLuint res
Definition: glext.h:9613
#define RegCloseKey(hKey)
Definition: registry.h:47
#define ERROR_OUTOFMEMORY
Definition: deptool.c:13

Referenced by ACTION_MsiPublishAssemblies().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msi  )

Variable Documentation

◆ clr_version

const WCHAR* clr_version[]
static
Initial value:
=
{
L"v1.0.3705",
L"v1.2.4322",
L"v2.0.50727",
L"v4.0.30319"
}
#define L(x)
Definition: ntvdm.h:50

Definition at line 304 of file assembly.c.