mirror of
https://github.com/reactos/reactos.git
synced 2025-04-30 19:19:00 +00:00
[MSI]
* Sync with Wine 1.7.17. CORE-8080 svn path=/trunk/; revision=62918
This commit is contained in:
parent
d321a31575
commit
a80d96dbae
20 changed files with 345 additions and 329 deletions
|
@ -195,19 +195,20 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
||||||
enum parse_state state = state_quote;
|
enum parse_state state = state_quote;
|
||||||
const WCHAR *p;
|
const WCHAR *p;
|
||||||
WCHAR *out = value;
|
WCHAR *out = value;
|
||||||
int ignore, in_quotes = 0, count = 0, len = 0;
|
BOOL ignore, in_quotes = FALSE;
|
||||||
|
int count = 0, len = 0;
|
||||||
|
|
||||||
for (p = str; *p; p++)
|
for (p = str; *p; p++)
|
||||||
{
|
{
|
||||||
ignore = 0;
|
ignore = FALSE;
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case state_whitespace:
|
case state_whitespace:
|
||||||
switch (*p)
|
switch (*p)
|
||||||
{
|
{
|
||||||
case ' ':
|
case ' ':
|
||||||
in_quotes = 1;
|
in_quotes = TRUE;
|
||||||
ignore = 1;
|
ignore = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
case '"':
|
case '"':
|
||||||
|
@ -217,7 +218,7 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = state_token;
|
state = state_token;
|
||||||
in_quotes = 1;
|
in_quotes = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -234,12 +235,12 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
||||||
case ' ':
|
case ' ':
|
||||||
state = state_whitespace;
|
state = state_whitespace;
|
||||||
if (!count) goto done;
|
if (!count) goto done;
|
||||||
in_quotes = 1;
|
in_quotes = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!count) in_quotes = 0;
|
if (!count) in_quotes = FALSE;
|
||||||
else in_quotes = 1;
|
else in_quotes = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -255,13 +256,13 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
||||||
case ' ':
|
case ' ':
|
||||||
state = state_whitespace;
|
state = state_whitespace;
|
||||||
if (!count || (count > 1 && !len)) goto done;
|
if (!count || (count > 1 && !len)) goto done;
|
||||||
in_quotes = 1;
|
in_quotes = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
state = state_token;
|
state = state_token;
|
||||||
if (!count) in_quotes = 0;
|
if (!count) in_quotes = FALSE;
|
||||||
else in_quotes = 1;
|
else in_quotes = TRUE;
|
||||||
len++;
|
len++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -407,41 +408,21 @@ static BOOL ui_sequence_exists( MSIPACKAGE *package )
|
||||||
|
|
||||||
UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
|
UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
|
||||||
{
|
{
|
||||||
LPWSTR source, check;
|
WCHAR *source, *check, *p, *db;
|
||||||
|
|
||||||
if (msi_get_property_int( package->db, szInstalled, 0 ))
|
|
||||||
{
|
|
||||||
HKEY hkey;
|
|
||||||
|
|
||||||
MSIREG_OpenInstallProps( package->ProductCode, package->Context, NULL, &hkey, FALSE );
|
|
||||||
source = msi_reg_get_val_str( hkey, INSTALLPROPERTY_INSTALLSOURCEW );
|
|
||||||
RegCloseKey( hkey );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LPWSTR p, db;
|
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
db = msi_dup_property( package->db, szOriginalDatabase );
|
if (!(db = msi_dup_property( package->db, szOriginalDatabase )))
|
||||||
if (!db)
|
|
||||||
return ERROR_OUTOFMEMORY;
|
return ERROR_OUTOFMEMORY;
|
||||||
|
|
||||||
p = strrchrW( db, '\\' );
|
if (!(p = strrchrW( db, '\\' )) && !(p = strrchrW( db, '/' )))
|
||||||
if (!p)
|
|
||||||
{
|
|
||||||
p = strrchrW( db, '/' );
|
|
||||||
if (!p)
|
|
||||||
{
|
{
|
||||||
msi_free(db);
|
msi_free(db);
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
len = p - db + 2;
|
len = p - db + 2;
|
||||||
source = msi_alloc( len * sizeof(WCHAR) );
|
source = msi_alloc( len * sizeof(WCHAR) );
|
||||||
lstrcpynW( source, db, len );
|
lstrcpynW( source, db, len );
|
||||||
msi_free( db );
|
msi_free( db );
|
||||||
}
|
|
||||||
|
|
||||||
check = msi_dup_property( package->db, szSourceDir );
|
check = msi_dup_property( package->db, szSourceDir );
|
||||||
if (!check || replace)
|
if (!check || replace)
|
||||||
|
@ -1890,7 +1871,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
||||||
component->anyAbsent = 1;
|
component->anyAbsent = 1;
|
||||||
break;
|
break;
|
||||||
case INSTALLSTATE_ADVERTISED:
|
case INSTALLSTATE_ADVERTISED:
|
||||||
component->hasAdvertiseFeature = 1;
|
component->hasAdvertisedFeature = 1;
|
||||||
break;
|
break;
|
||||||
case INSTALLSTATE_SOURCE:
|
case INSTALLSTATE_SOURCE:
|
||||||
component->hasSourceFeature = 1;
|
component->hasSourceFeature = 1;
|
||||||
|
@ -1900,7 +1881,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
||||||
break;
|
break;
|
||||||
case INSTALLSTATE_DEFAULT:
|
case INSTALLSTATE_DEFAULT:
|
||||||
if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
|
if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
|
||||||
component->hasAdvertiseFeature = 1;
|
component->hasAdvertisedFeature = 1;
|
||||||
else if (feature->Attributes & msidbFeatureAttributesFavorSource)
|
else if (feature->Attributes & msidbFeatureAttributesFavorSource)
|
||||||
component->hasSourceFeature = 1;
|
component->hasSourceFeature = 1;
|
||||||
else
|
else
|
||||||
|
@ -1945,7 +1926,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
||||||
component->ActionRequest = INSTALLSTATE_SOURCE;
|
component->ActionRequest = INSTALLSTATE_SOURCE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (component->hasAdvertiseFeature)
|
if (component->hasAdvertisedFeature)
|
||||||
{
|
{
|
||||||
component->Action = INSTALLSTATE_ADVERTISED;
|
component->Action = INSTALLSTATE_ADVERTISED;
|
||||||
component->ActionRequest = INSTALLSTATE_ADVERTISED;
|
component->ActionRequest = INSTALLSTATE_ADVERTISED;
|
||||||
|
@ -3181,8 +3162,6 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package )
|
||||||
|
|
||||||
static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
|
static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
|
||||||
{
|
{
|
||||||
package->script->CurrentlyScripting = TRUE;
|
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3569,9 +3548,29 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
|
||||||
if (comp->num_clients <= 0)
|
if (comp->num_clients <= 0)
|
||||||
{
|
{
|
||||||
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
|
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
|
||||||
MSIREG_DeleteUserDataComponentKey( comp->ComponentId, szLocalSid );
|
rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, szLocalSid );
|
||||||
else
|
else
|
||||||
MSIREG_DeleteUserDataComponentKey( comp->ComponentId, NULL );
|
rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, NULL );
|
||||||
|
|
||||||
|
if (rc != ERROR_SUCCESS) WARN( "failed to delete component key %u\n", rc );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LONG res;
|
||||||
|
|
||||||
|
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
|
||||||
|
rc = MSIREG_OpenUserDataComponentKey( comp->ComponentId, szLocalSid, &hkey, FALSE );
|
||||||
|
else
|
||||||
|
rc = MSIREG_OpenUserDataComponentKey( comp->ComponentId, NULL, &hkey, FALSE );
|
||||||
|
|
||||||
|
if (rc != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
WARN( "failed to open component key %u\n", rc );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
res = RegDeleteValueW( hkey, squished_pc );
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
if (res) WARN( "failed to delete component value %d\n", res );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3823,7 +3822,7 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row )
|
||||||
filename = msi_dup_record_field( row, 3 );
|
filename = msi_dup_record_field( row, 3 );
|
||||||
msi_reduce_to_long_filename( filename );
|
msi_reduce_to_long_filename( filename );
|
||||||
|
|
||||||
extension = strchrW( filename, '.' );
|
extension = strrchrW( filename, '.' );
|
||||||
if (!extension || strcmpiW( extension, szlnk ))
|
if (!extension || strcmpiW( extension, szlnk ))
|
||||||
{
|
{
|
||||||
int len = strlenW( filename );
|
int len = strlenW( filename );
|
||||||
|
@ -5294,9 +5293,6 @@ static UINT ACTION_InstallFinalize(MSIPACKAGE *package)
|
||||||
UINT rc;
|
UINT rc;
|
||||||
WCHAR *remove;
|
WCHAR *remove;
|
||||||
|
|
||||||
/* turn off scheduling */
|
|
||||||
package->script->CurrentlyScripting= FALSE;
|
|
||||||
|
|
||||||
/* first do the same as an InstallExecute */
|
/* first do the same as an InstallExecute */
|
||||||
rc = ACTION_InstallExecute(package);
|
rc = ACTION_InstallExecute(package);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
|
@ -5801,7 +5797,11 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
|
||||||
ERR("Query failed\n");
|
ERR("Query failed\n");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
key = MSI_RecordGetString(row, 6);
|
if (!(key = MSI_RecordGetString(row, 6)))
|
||||||
|
{
|
||||||
|
msiobj_release(&row->hdr);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
file = msi_get_loaded_file(package, key);
|
file = msi_get_loaded_file(package, key);
|
||||||
msiobj_release(&row->hdr);
|
msiobj_release(&row->hdr);
|
||||||
if (!file)
|
if (!file)
|
||||||
|
@ -7823,8 +7823,6 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
|
||||||
else
|
else
|
||||||
rc = ACTION_ProcessExecSequence(package, FALSE);
|
rc = ACTION_ProcessExecSequence(package, FALSE);
|
||||||
|
|
||||||
package->script->CurrentlyScripting = FALSE;
|
|
||||||
|
|
||||||
/* process the ending type action */
|
/* process the ending type action */
|
||||||
if (rc == ERROR_SUCCESS)
|
if (rc == ERROR_SUCCESS)
|
||||||
ACTION_PerformActionSequence(package, -1);
|
ACTION_PerformActionSequence(package, -1);
|
||||||
|
|
|
@ -287,7 +287,7 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row )
|
||||||
cls->Feature = msi_get_loaded_feature(package, buffer);
|
cls->Feature = msi_get_loaded_feature(package, buffer);
|
||||||
|
|
||||||
cls->Attributes = MSI_RecordGetInteger(row,13);
|
cls->Attributes = MSI_RecordGetInteger(row,13);
|
||||||
|
cls->action = INSTALLSTATE_UNKNOWN;
|
||||||
return cls;
|
return cls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -416,7 +416,7 @@ static MSIEXTENSION *load_extension( MSIPACKAGE* package, MSIRECORD *row )
|
||||||
|
|
||||||
buffer = MSI_RecordGetString(row,5);
|
buffer = MSI_RecordGetString(row,5);
|
||||||
ext->Feature = msi_get_loaded_feature( package, buffer );
|
ext->Feature = msi_get_loaded_feature( package, buffer );
|
||||||
|
ext->action = INSTALLSTATE_UNKNOWN;
|
||||||
return ext;
|
return ext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,59 +689,6 @@ static UINT load_classes_and_such( MSIPACKAGE *package )
|
||||||
return load_all_mimes( package );
|
return load_all_mimes( package );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mark_progid_for_install( MSIPACKAGE* package, MSIPROGID *progid )
|
|
||||||
{
|
|
||||||
MSIPROGID *child;
|
|
||||||
|
|
||||||
if (!progid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (progid->InstallMe)
|
|
||||||
return;
|
|
||||||
|
|
||||||
progid->InstallMe = TRUE;
|
|
||||||
|
|
||||||
/* all children if this is a parent also install */
|
|
||||||
LIST_FOR_EACH_ENTRY( child, &package->progids, MSIPROGID, entry )
|
|
||||||
{
|
|
||||||
if (child->Parent == progid)
|
|
||||||
mark_progid_for_install( package, child );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mark_progid_for_uninstall( MSIPACKAGE *package, MSIPROGID *progid )
|
|
||||||
{
|
|
||||||
MSIPROGID *child;
|
|
||||||
|
|
||||||
if (!progid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!progid->InstallMe)
|
|
||||||
return;
|
|
||||||
|
|
||||||
progid->InstallMe = FALSE;
|
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( child, &package->progids, MSIPROGID, entry )
|
|
||||||
{
|
|
||||||
if (child->Parent == progid)
|
|
||||||
mark_progid_for_uninstall( package, child );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mark_mime_for_install( MSIMIME *mime )
|
|
||||||
{
|
|
||||||
if (!mime)
|
|
||||||
return;
|
|
||||||
mime->InstallMe = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mark_mime_for_uninstall( MSIMIME *mime )
|
|
||||||
{
|
|
||||||
if (!mime)
|
|
||||||
return;
|
|
||||||
mime->InstallMe = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
|
static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
|
||||||
{
|
{
|
||||||
static const WCHAR szRemoteServerName[] =
|
static const WCHAR szRemoteServerName[] =
|
||||||
|
@ -847,8 +794,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
||||||
}
|
}
|
||||||
TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls);
|
TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls);
|
||||||
|
|
||||||
cls->Installed = TRUE;
|
cls->action = INSTALLSTATE_LOCAL;
|
||||||
mark_progid_for_install( package, cls->ProgID );
|
|
||||||
|
|
||||||
RegCreateKeyW( hkey, cls->clsid, &hkey2 );
|
RegCreateKeyW( hkey, cls->clsid, &hkey2 );
|
||||||
|
|
||||||
|
@ -1005,8 +951,7 @@ UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
|
||||||
}
|
}
|
||||||
TRACE("Unregistering class %s (%p)\n", debugstr_w(cls->clsid), cls);
|
TRACE("Unregistering class %s (%p)\n", debugstr_w(cls->clsid), cls);
|
||||||
|
|
||||||
cls->Installed = FALSE;
|
cls->action = INSTALLSTATE_ABSENT;
|
||||||
mark_progid_for_uninstall( package, cls->ProgID );
|
|
||||||
|
|
||||||
res = RegDeleteTreeW( hkey, cls->clsid );
|
res = RegDeleteTreeW( hkey, cls->clsid );
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS)
|
||||||
|
@ -1094,6 +1039,35 @@ static UINT register_progid( const MSIPROGID* progid )
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const MSICLASS *get_progid_class( const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
while (progid)
|
||||||
|
{
|
||||||
|
if (progid->Parent) progid = progid->Parent;
|
||||||
|
if (progid->Class) return progid->Class;
|
||||||
|
if (!progid->Parent || progid->Parent == progid) break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL has_class_installed( const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
const MSICLASS *class = get_progid_class( progid );
|
||||||
|
if (!class || !class->ProgID) return FALSE;
|
||||||
|
return (class->action == INSTALLSTATE_LOCAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL has_one_extension_installed( const MSIPACKAGE *package, const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
const MSIEXTENSION *extension;
|
||||||
|
LIST_FOR_EACH_ENTRY( extension, &package->extensions, MSIEXTENSION, entry )
|
||||||
|
{
|
||||||
|
if (extension->ProgID == progid && !list_empty( &extension->verbs ) &&
|
||||||
|
extension->action == INSTALLSTATE_LOCAL) return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
||||||
{
|
{
|
||||||
MSIPROGID *progid;
|
MSIPROGID *progid;
|
||||||
|
@ -1106,17 +1080,11 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
||||||
{
|
{
|
||||||
/* check if this progid is to be installed */
|
if (!has_class_installed( progid ) && !has_one_extension_installed( package, progid ))
|
||||||
if (progid->Class && progid->Class->Installed)
|
|
||||||
progid->InstallMe = TRUE;
|
|
||||||
|
|
||||||
if (!progid->InstallMe)
|
|
||||||
{
|
{
|
||||||
TRACE("progid %s not scheduled to be installed\n",
|
TRACE("progid %s not scheduled to be installed\n", debugstr_w(progid->ProgID));
|
||||||
debugstr_w(progid->ProgID));
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Registering progid %s\n", debugstr_w(progid->ProgID));
|
TRACE("Registering progid %s\n", debugstr_w(progid->ProgID));
|
||||||
|
|
||||||
register_progid( progid );
|
register_progid( progid );
|
||||||
|
@ -1129,6 +1097,36 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL has_class_removed( const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
const MSICLASS *class = get_progid_class( progid );
|
||||||
|
if (!class || !class->ProgID) return FALSE;
|
||||||
|
return (class->action == INSTALLSTATE_ABSENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL has_extensions( const MSIPACKAGE *package, const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
const MSIEXTENSION *extension;
|
||||||
|
LIST_FOR_EACH_ENTRY( extension, &package->extensions, MSIEXTENSION, entry )
|
||||||
|
{
|
||||||
|
if (extension->ProgID == progid && !list_empty( &extension->verbs )) return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL has_all_extensions_removed( const MSIPACKAGE *package, const MSIPROGID *progid )
|
||||||
|
{
|
||||||
|
BOOL ret = FALSE;
|
||||||
|
const MSIEXTENSION *extension;
|
||||||
|
LIST_FOR_EACH_ENTRY( extension, &package->extensions, MSIEXTENSION, entry )
|
||||||
|
{
|
||||||
|
if (extension->ProgID == progid && !list_empty( &extension->verbs ) &&
|
||||||
|
extension->action == INSTALLSTATE_ABSENT) ret = TRUE;
|
||||||
|
else ret = FALSE;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
|
UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
|
||||||
{
|
{
|
||||||
MSIPROGID *progid;
|
MSIPROGID *progid;
|
||||||
|
@ -1142,16 +1140,12 @@ UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
||||||
{
|
{
|
||||||
/* check if this progid is to be removed */
|
if (!has_class_removed( progid ) ||
|
||||||
if (progid->Class && !progid->Class->Installed)
|
(has_extensions( package, progid ) && !has_all_extensions_removed( package, progid )))
|
||||||
progid->InstallMe = FALSE;
|
|
||||||
|
|
||||||
if (progid->InstallMe)
|
|
||||||
{
|
{
|
||||||
TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID));
|
TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Unregistering progid %s\n", debugstr_w(progid->ProgID));
|
TRACE("Unregistering progid %s\n", debugstr_w(progid->ProgID));
|
||||||
|
|
||||||
res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid->ProgID );
|
res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid->ProgID );
|
||||||
|
@ -1293,15 +1287,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
|
||||||
}
|
}
|
||||||
TRACE("Registering extension %s (%p)\n", debugstr_w(ext->Extension), ext);
|
TRACE("Registering extension %s (%p)\n", debugstr_w(ext->Extension), ext);
|
||||||
|
|
||||||
ext->Installed = TRUE;
|
ext->action = INSTALLSTATE_LOCAL;
|
||||||
|
|
||||||
/* this is only registered if the extension has at least 1 verb
|
|
||||||
* according to MSDN
|
|
||||||
*/
|
|
||||||
if (ext->ProgID && !list_empty( &ext->verbs ) )
|
|
||||||
mark_progid_for_install( package, ext->ProgID );
|
|
||||||
|
|
||||||
mark_mime_for_install(ext->Mime);
|
|
||||||
|
|
||||||
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
||||||
if (extension)
|
if (extension)
|
||||||
|
@ -1399,12 +1385,7 @@ UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
|
||||||
}
|
}
|
||||||
TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension));
|
TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension));
|
||||||
|
|
||||||
ext->Installed = FALSE;
|
ext->action = INSTALLSTATE_ABSENT;
|
||||||
|
|
||||||
if (ext->ProgID && !list_empty( &ext->verbs ))
|
|
||||||
mark_progid_for_uninstall( package, ext->ProgID );
|
|
||||||
|
|
||||||
mark_mime_for_uninstall( ext->Mime );
|
|
||||||
|
|
||||||
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
||||||
if (extension)
|
if (extension)
|
||||||
|
@ -1468,11 +1449,8 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
|
||||||
* check if the MIME is to be installed. Either as requested by an
|
* check if the MIME is to be installed. Either as requested by an
|
||||||
* extension or Class
|
* extension or Class
|
||||||
*/
|
*/
|
||||||
mt->InstallMe = (mt->InstallMe ||
|
if ((!mt->Class || mt->Class->action != INSTALLSTATE_LOCAL) &&
|
||||||
(mt->Class && mt->Class->Installed) ||
|
mt->Extension->action != INSTALLSTATE_LOCAL)
|
||||||
(mt->Extension && mt->Extension->Installed));
|
|
||||||
|
|
||||||
if (!mt->InstallMe)
|
|
||||||
{
|
{
|
||||||
TRACE("MIME %s not scheduled to be installed\n", debugstr_w(mt->ContentType));
|
TRACE("MIME %s not scheduled to be installed\n", debugstr_w(mt->ContentType));
|
||||||
continue;
|
continue;
|
||||||
|
@ -1522,11 +1500,8 @@ UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
|
||||||
LONG res;
|
LONG res;
|
||||||
LPWSTR mime_key;
|
LPWSTR mime_key;
|
||||||
|
|
||||||
mime->InstallMe = (mime->InstallMe ||
|
if ((!mime->Class || mime->Class->action != INSTALLSTATE_ABSENT) &&
|
||||||
(mime->Class && mime->Class->Installed) ||
|
mime->Extension->action != INSTALLSTATE_ABSENT)
|
||||||
(mime->Extension && mime->Extension->Installed));
|
|
||||||
|
|
||||||
if (mime->InstallMe)
|
|
||||||
{
|
{
|
||||||
TRACE("MIME %s not scheduled to be removed\n", debugstr_w(mime->ContentType));
|
TRACE("MIME %s not scheduled to be removed\n", debugstr_w(mime->ContentType));
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -203,8 +203,8 @@ static MSIBINARY *create_temp_binary( MSIPACKAGE *package, LPCWSTR source, BOOL
|
||||||
DWORD sz = MAX_PATH, write;
|
DWORD sz = MAX_PATH, write;
|
||||||
UINT r;
|
UINT r;
|
||||||
|
|
||||||
if (msi_get_property(package->db, szTempFolder, fmt, &sz) != ERROR_SUCCESS)
|
if (msi_get_property(package->db, szTempFolder, fmt, &sz) != ERROR_SUCCESS ||
|
||||||
GetTempPathW(MAX_PATH, fmt);
|
GetFileAttributesW(fmt) == INVALID_FILE_ATTRIBUTES) GetTempPathW(MAX_PATH, fmt);
|
||||||
|
|
||||||
if (!GetTempFileNameW( fmt, szMsi, 0, tmpfile ))
|
if (!GetTempFileNameW( fmt, szMsi, 0, tmpfile ))
|
||||||
{
|
{
|
||||||
|
@ -991,7 +991,7 @@ static UINT HANDLE_CustomType5_6( MSIPACKAGE *package, const WCHAR *source, cons
|
||||||
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
|
||||||
'`','B','i' ,'n','a','r','y','`',' ','W','H','E','R','E',' ',
|
'`','B','i' ,'n','a','r','y','`',' ','W','H','E','R','E',' ',
|
||||||
'`','N','a','m','e','`',' ','=',' ','\'','%','s','\'',0};
|
'`','N','a','m','e','`',' ','=',' ','\'','%','s','\'',0};
|
||||||
MSIRECORD *row = 0;
|
MSIRECORD *row = NULL;
|
||||||
msi_custom_action_info *info;
|
msi_custom_action_info *info;
|
||||||
CHAR *buffer = NULL;
|
CHAR *buffer = NULL;
|
||||||
WCHAR *bufferw = NULL;
|
WCHAR *bufferw = NULL;
|
||||||
|
@ -1005,10 +1005,14 @@ static UINT HANDLE_CustomType5_6( MSIPACKAGE *package, const WCHAR *source, cons
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
r = MSI_RecordReadStream(row, 2, NULL, &sz);
|
r = MSI_RecordReadStream(row, 2, NULL, &sz);
|
||||||
if (r != ERROR_SUCCESS) return r;
|
if (r != ERROR_SUCCESS) goto done;
|
||||||
|
|
||||||
buffer = msi_alloc( sz + 1 );
|
buffer = msi_alloc( sz + 1 );
|
||||||
if (!buffer) return ERROR_FUNCTION_FAILED;
|
if (!buffer)
|
||||||
|
{
|
||||||
|
r = ERROR_FUNCTION_FAILED;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
r = MSI_RecordReadStream(row, 2, buffer, &sz);
|
r = MSI_RecordReadStream(row, 2, buffer, &sz);
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
|
@ -1028,6 +1032,7 @@ static UINT HANDLE_CustomType5_6( MSIPACKAGE *package, const WCHAR *source, cons
|
||||||
done:
|
done:
|
||||||
msi_free(bufferw);
|
msi_free(bufferw);
|
||||||
msi_free(buffer);
|
msi_free(buffer);
|
||||||
|
msiobj_release(&row->hdr);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -763,12 +763,13 @@ static msi_control *msi_dialog_add_control( msi_dialog *dialog,
|
||||||
MSIRECORD *rec, LPCWSTR szCls, DWORD style )
|
MSIRECORD *rec, LPCWSTR szCls, DWORD style )
|
||||||
{
|
{
|
||||||
DWORD attributes;
|
DWORD attributes;
|
||||||
LPCWSTR text, name;
|
const WCHAR *text = NULL, *name, *control_type;
|
||||||
DWORD exstyle = 0;
|
DWORD exstyle = 0;
|
||||||
|
|
||||||
name = MSI_RecordGetString( rec, 2 );
|
name = MSI_RecordGetString( rec, 2 );
|
||||||
|
control_type = MSI_RecordGetString( rec, 3 );
|
||||||
attributes = MSI_RecordGetInteger( rec, 8 );
|
attributes = MSI_RecordGetInteger( rec, 8 );
|
||||||
text = MSI_RecordGetString( rec, 10 );
|
if (strcmpW( control_type, szScrollableText )) text = MSI_RecordGetString( rec, 10 );
|
||||||
|
|
||||||
TRACE("%s, %s, %08x, %s, %08x\n", debugstr_w(szCls), debugstr_w(name),
|
TRACE("%s, %s, %08x, %s, %08x\n", debugstr_w(szCls), debugstr_w(name),
|
||||||
attributes, debugstr_w(text), style);
|
attributes, debugstr_w(text), style);
|
||||||
|
@ -1802,7 +1803,15 @@ static void msi_mask_control_change( struct msi_maskedit_info *info )
|
||||||
val = msi_alloc( (info->num_chars+1)*sizeof(WCHAR) );
|
val = msi_alloc( (info->num_chars+1)*sizeof(WCHAR) );
|
||||||
for( i=0, n=0; i<info->num_groups; i++ )
|
for( i=0, n=0; i<info->num_groups; i++ )
|
||||||
{
|
{
|
||||||
if( (info->group[i].len + n) > info->num_chars )
|
if (info->group[i].len == ~0u)
|
||||||
|
{
|
||||||
|
UINT len = SendMessageW( info->group[i].hwnd, WM_GETTEXTLENGTH, 0, 0 );
|
||||||
|
val = msi_realloc( val, (len + 1) * sizeof(WCHAR) );
|
||||||
|
GetWindowTextW( info->group[i].hwnd, val, len + 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (info->group[i].len + n > info->num_chars)
|
||||||
{
|
{
|
||||||
ERR("can't fit control %d text into template\n",i);
|
ERR("can't fit control %d text into template\n",i);
|
||||||
break;
|
break;
|
||||||
|
@ -1821,6 +1830,7 @@ static void msi_mask_control_change( struct msi_maskedit_info *info )
|
||||||
}
|
}
|
||||||
n += r;
|
n += r;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TRACE("%d/%d controls were good\n", i, info->num_groups);
|
TRACE("%d/%d controls were good\n", i, info->num_groups);
|
||||||
|
|
||||||
|
@ -1914,14 +1924,14 @@ msi_maskedit_set_text( struct msi_maskedit_info *info, LPCWSTR text )
|
||||||
|
|
||||||
static struct msi_maskedit_info * msi_dialog_parse_groups( LPCWSTR mask )
|
static struct msi_maskedit_info * msi_dialog_parse_groups( LPCWSTR mask )
|
||||||
{
|
{
|
||||||
struct msi_maskedit_info * info = NULL;
|
struct msi_maskedit_info *info;
|
||||||
int i = 0, n = 0, total = 0;
|
int i = 0, n = 0, total = 0;
|
||||||
LPCWSTR p;
|
LPCWSTR p;
|
||||||
|
|
||||||
TRACE("masked control, template %s\n", debugstr_w(mask));
|
TRACE("masked control, template %s\n", debugstr_w(mask));
|
||||||
|
|
||||||
if( !mask )
|
if( !mask )
|
||||||
return info;
|
return NULL;
|
||||||
|
|
||||||
info = msi_alloc_zero( sizeof *info );
|
info = msi_alloc_zero( sizeof *info );
|
||||||
if( !info )
|
if( !info )
|
||||||
|
@ -1937,7 +1947,16 @@ static struct msi_maskedit_info * msi_dialog_parse_groups( LPCWSTR mask )
|
||||||
{
|
{
|
||||||
/* stop at the end of the string */
|
/* stop at the end of the string */
|
||||||
if( p[0] == 0 || p[0] == '>' )
|
if( p[0] == 0 || p[0] == '>' )
|
||||||
|
{
|
||||||
|
if (!total)
|
||||||
|
{
|
||||||
|
/* create a group for the empty mask */
|
||||||
|
info->group[0].type = '&';
|
||||||
|
info->group[0].len = ~0u;
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* count the number of the same identifier */
|
/* count the number of the same identifier */
|
||||||
for( n=0; p[n] == p[0]; n++ )
|
for( n=0; p[n] == p[0]; n++ )
|
||||||
|
@ -1983,9 +2002,16 @@ msi_maskedit_create_children( struct msi_maskedit_info *info, LPCWSTR font )
|
||||||
{
|
{
|
||||||
if (!msi_mask_editable( info->group[i].type ))
|
if (!msi_mask_editable( info->group[i].type ))
|
||||||
continue;
|
continue;
|
||||||
|
if (info->num_chars)
|
||||||
|
{
|
||||||
wx = (info->group[i].ofs * width) / info->num_chars;
|
wx = (info->group[i].ofs * width) / info->num_chars;
|
||||||
ww = (info->group[i].len * width) / info->num_chars;
|
ww = (info->group[i].len * width) / info->num_chars;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wx = 0;
|
||||||
|
ww = width;
|
||||||
|
}
|
||||||
hwnd = CreateWindowW( szEdit, NULL, style, wx, 0, ww, height,
|
hwnd = CreateWindowW( szEdit, NULL, style, wx, 0, ww, height,
|
||||||
info->hwnd, NULL, NULL, NULL );
|
info->hwnd, NULL, NULL, NULL );
|
||||||
if( !hwnd )
|
if( !hwnd )
|
||||||
|
@ -2969,7 +2995,7 @@ static void msi_dialog_update_directory_list( msi_dialog *dialog, msi_control *c
|
||||||
FindClose( file );
|
FindClose( file );
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT msi_dialog_directorylist_up( msi_dialog *dialog )
|
static UINT msi_dialog_directorylist_up( msi_dialog *dialog )
|
||||||
{
|
{
|
||||||
msi_control *control;
|
msi_control *control;
|
||||||
LPWSTR prop, path, ptr;
|
LPWSTR prop, path, ptr;
|
||||||
|
@ -3472,7 +3498,7 @@ static UINT msi_dialog_fill_controls( msi_dialog *dialog )
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT msi_dialog_reset( msi_dialog *dialog )
|
static UINT msi_dialog_reset( msi_dialog *dialog )
|
||||||
{
|
{
|
||||||
/* FIXME: should restore the original values of any properties we changed */
|
/* FIXME: should restore the original values of any properties we changed */
|
||||||
return msi_dialog_evaluate_control_conditions( dialog );
|
return msi_dialog_evaluate_control_conditions( dialog );
|
||||||
|
@ -3906,7 +3932,7 @@ static msi_dialog *dialog_create( MSIPACKAGE *package, const WCHAR *name, msi_di
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msi_dialog_end_dialog( msi_dialog *dialog )
|
static void msi_dialog_end_dialog( msi_dialog *dialog )
|
||||||
{
|
{
|
||||||
TRACE("%p\n", dialog);
|
TRACE("%p\n", dialog);
|
||||||
dialog->finished = 1;
|
dialog->finished = 1;
|
||||||
|
@ -3933,7 +3959,7 @@ void msi_dialog_check_messages( HANDLE handle )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* there's two choices for the UI thread */
|
/* there are two choices for the UI thread */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
process_pending_messages( NULL );
|
process_pending_messages( NULL );
|
||||||
|
|
|
@ -354,7 +354,11 @@ static LPWSTR build_default_format(const MSIRECORD* record)
|
||||||
{
|
{
|
||||||
max_len = len;
|
max_len = len;
|
||||||
buf = msi_realloc(buf, (max_len + 1) * sizeof(WCHAR));
|
buf = msi_realloc(buf, (max_len + 1) * sizeof(WCHAR));
|
||||||
if (!buf) return NULL;
|
if (!buf)
|
||||||
|
{
|
||||||
|
msi_free(rc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str)
|
if (str)
|
||||||
|
@ -715,10 +719,10 @@ static UINT replace_stack(FORMAT *format, STACK *stack, STACK *values)
|
||||||
|
|
||||||
format->n = n;
|
format->n = n;
|
||||||
beg = format_replace( format, propfound, nonprop, oldsize, type, replaced, len );
|
beg = format_replace( format, propfound, nonprop, oldsize, type, replaced, len );
|
||||||
|
msi_free(replaced);
|
||||||
if (!beg)
|
if (!beg)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
msi_free(replaced);
|
|
||||||
format->n = beg->n + beg->len;
|
format->n = beg->n + beg->len;
|
||||||
|
|
||||||
top = stack_peek(stack);
|
top = stack_peek(stack);
|
||||||
|
|
|
@ -126,7 +126,6 @@ static void CDECL cabinet_free(void *pv)
|
||||||
|
|
||||||
static INT_PTR CDECL cabinet_open(char *pszFile, int oflag, int pmode)
|
static INT_PTR CDECL cabinet_open(char *pszFile, int oflag, int pmode)
|
||||||
{
|
{
|
||||||
HANDLE handle;
|
|
||||||
DWORD dwAccess = 0;
|
DWORD dwAccess = 0;
|
||||||
DWORD dwShareMode = 0;
|
DWORD dwShareMode = 0;
|
||||||
DWORD dwCreateDisposition = OPEN_EXISTING;
|
DWORD dwCreateDisposition = OPEN_EXISTING;
|
||||||
|
@ -152,12 +151,8 @@ static INT_PTR CDECL cabinet_open(char *pszFile, int oflag, int pmode)
|
||||||
else if (oflag & _O_CREAT)
|
else if (oflag & _O_CREAT)
|
||||||
dwCreateDisposition = CREATE_ALWAYS;
|
dwCreateDisposition = CREATE_ALWAYS;
|
||||||
|
|
||||||
handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
|
return (INT_PTR)CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
|
||||||
dwCreateDisposition, 0, NULL);
|
dwCreateDisposition, 0, NULL);
|
||||||
if (handle == INVALID_HANDLE_VALUE)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return (INT_PTR)handle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT CDECL cabinet_read(INT_PTR hf, void *pv, UINT cb)
|
static UINT CDECL cabinet_read(INT_PTR hf, void *pv, UINT cb)
|
||||||
|
@ -214,12 +209,12 @@ static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode )
|
||||||
if (!cab)
|
if (!cab)
|
||||||
{
|
{
|
||||||
WARN("failed to get cabinet stream\n");
|
WARN("failed to get cabinet stream\n");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!cab->stream[0] || !(encoded = encode_streamname( FALSE, cab->stream + 1 )))
|
if (!cab->stream[0] || !(encoded = encode_streamname( FALSE, cab->stream + 1 )))
|
||||||
{
|
{
|
||||||
WARN("failed to encode stream name\n");
|
WARN("failed to encode stream name\n");
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
if (msi_clone_open_stream( package_disk.package->db, cab->storage, encoded, &stream ) != ERROR_SUCCESS)
|
if (msi_clone_open_stream( package_disk.package->db, cab->storage, encoded, &stream ) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
@ -228,7 +223,7 @@ static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode )
|
||||||
{
|
{
|
||||||
WARN("failed to open stream 0x%08x\n", hr);
|
WARN("failed to open stream 0x%08x\n", hr);
|
||||||
msi_free( encoded );
|
msi_free( encoded );
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msi_free( encoded );
|
msi_free( encoded );
|
||||||
|
|
|
@ -335,7 +335,7 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
|
||||||
BOOL succeeded = FALSE;
|
BOOL succeeded = FALSE;
|
||||||
|
|
||||||
static const WCHAR fmt[] = {'%','s',' ','P','A','T','C','H','=','"','%','s','"',0};
|
static const WCHAR fmt[] = {'%','s',' ','P','A','T','C','H','=','"','%','s','"',0};
|
||||||
static WCHAR empty[] = {0};
|
static const WCHAR empty[] = {0};
|
||||||
|
|
||||||
if (!szPatchPackage || !szPatchPackage[0])
|
if (!szPatchPackage || !szPatchPackage[0])
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
@ -1114,8 +1114,6 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
context = MSIINSTALLCONTEXT_MACHINE;
|
context = MSIINSTALLCONTEXT_MACHINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
|
|
||||||
|
|
||||||
if (!strcmpW( szAttribute, INSTALLPROPERTY_HELPLINKW ) ||
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_HELPLINKW ) ||
|
||||||
!strcmpW( szAttribute, INSTALLPROPERTY_HELPTELEPHONEW ) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_HELPTELEPHONEW ) ||
|
||||||
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLDATEW ) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLDATEW ) ||
|
||||||
|
@ -1138,9 +1136,11 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
r = ERROR_UNKNOWN_PRODUCT;
|
r = ERROR_UNKNOWN_PRODUCT;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
if (MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE))
|
||||||
if (!userdata)
|
{
|
||||||
return ERROR_UNKNOWN_PROPERTY;
|
r = ERROR_UNKNOWN_PROPERTY;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ))
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ))
|
||||||
szAttribute = display_name;
|
szAttribute = display_name;
|
||||||
|
@ -1150,6 +1150,7 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
val = msi_reg_get_value(userdata, szAttribute, &type);
|
val = msi_reg_get_value(userdata, szAttribute, &type);
|
||||||
if (!val)
|
if (!val)
|
||||||
val = empty;
|
val = empty;
|
||||||
|
RegCloseKey(userdata);
|
||||||
}
|
}
|
||||||
else if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTANCETYPEW ) ||
|
else if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTANCETYPEW ) ||
|
||||||
!strcmpW( szAttribute, INSTALLPROPERTY_TRANSFORMSW ) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_TRANSFORMSW ) ||
|
||||||
|
@ -1242,7 +1243,6 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
|
|
||||||
done:
|
done:
|
||||||
RegCloseKey(prodkey);
|
RegCloseKey(prodkey);
|
||||||
RegCloseKey(userdata);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
/* @makedep: msiserver.rgs */
|
/* @makedep: msiserver.rgs */
|
||||||
2 WINE_REGISTRY msiserver.rgs
|
2 WINE_REGISTRY msiserver.rgs
|
||||||
|
|
||||||
3 WINE_REGISTRY "msi.rgs"
|
3 WINE_REGISTRY msiserver_r.rgs
|
||||||
|
|
||||||
|
4 WINE_REGISTRY msiserver_t.rgs
|
||||||
|
|
||||||
/* @makedep: instadvert.bmp */
|
/* @makedep: instadvert.bmp */
|
||||||
0x1001 BITMAP instadvert.bmp
|
0x1001 BITMAP instadvert.bmp
|
||||||
|
|
|
@ -501,7 +501,7 @@ typedef struct tagMSICOMPONENT
|
||||||
int num_clients;
|
int num_clients;
|
||||||
|
|
||||||
unsigned int anyAbsent:1;
|
unsigned int anyAbsent:1;
|
||||||
unsigned int hasAdvertiseFeature:1;
|
unsigned int hasAdvertisedFeature:1;
|
||||||
unsigned int hasLocalFeature:1;
|
unsigned int hasLocalFeature:1;
|
||||||
unsigned int hasSourceFeature:1;
|
unsigned int hasSourceFeature:1;
|
||||||
} MSICOMPONENT;
|
} MSICOMPONENT;
|
||||||
|
@ -628,7 +628,7 @@ typedef struct tagMSICLASS
|
||||||
MSIFEATURE *Feature;
|
MSIFEATURE *Feature;
|
||||||
INT Attributes;
|
INT Attributes;
|
||||||
/* not in the table, set during installation */
|
/* not in the table, set during installation */
|
||||||
BOOL Installed;
|
INSTALLSTATE action;
|
||||||
} MSICLASS;
|
} MSICLASS;
|
||||||
|
|
||||||
typedef struct tagMSIMIME MSIMIME;
|
typedef struct tagMSIMIME MSIMIME;
|
||||||
|
@ -643,7 +643,7 @@ typedef struct tagMSIEXTENSION
|
||||||
MSIMIME *Mime;
|
MSIMIME *Mime;
|
||||||
MSIFEATURE *Feature;
|
MSIFEATURE *Feature;
|
||||||
/* not in the table, set during installation */
|
/* not in the table, set during installation */
|
||||||
BOOL Installed;
|
INSTALLSTATE action;
|
||||||
struct list verbs;
|
struct list verbs;
|
||||||
} MSIEXTENSION;
|
} MSIEXTENSION;
|
||||||
|
|
||||||
|
@ -656,7 +656,6 @@ struct tagMSIPROGID
|
||||||
LPWSTR Description;
|
LPWSTR Description;
|
||||||
LPWSTR IconPath;
|
LPWSTR IconPath;
|
||||||
/* not in the table, set during installation */
|
/* not in the table, set during installation */
|
||||||
BOOL InstallMe;
|
|
||||||
MSIPROGID *CurVer;
|
MSIPROGID *CurVer;
|
||||||
MSIPROGID *VersionInd;
|
MSIPROGID *VersionInd;
|
||||||
};
|
};
|
||||||
|
@ -678,8 +677,6 @@ struct tagMSIMIME
|
||||||
LPWSTR suffix;
|
LPWSTR suffix;
|
||||||
LPWSTR clsid;
|
LPWSTR clsid;
|
||||||
MSICLASS *Class;
|
MSICLASS *Class;
|
||||||
/* not in the table, set during installation */
|
|
||||||
BOOL InstallMe;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum SCRIPTS
|
enum SCRIPTS
|
||||||
|
@ -700,7 +697,6 @@ typedef struct tagMSISCRIPT
|
||||||
LPWSTR *Actions[SCRIPT_MAX];
|
LPWSTR *Actions[SCRIPT_MAX];
|
||||||
UINT ActionCount[SCRIPT_MAX];
|
UINT ActionCount[SCRIPT_MAX];
|
||||||
BOOL ExecuteSequenceRun;
|
BOOL ExecuteSequenceRun;
|
||||||
BOOL CurrentlyScripting;
|
|
||||||
UINT InWhatSequence;
|
UINT InWhatSequence;
|
||||||
LPWSTR *UniqueActions;
|
LPWSTR *UniqueActions;
|
||||||
UINT UniqueActionsCount;
|
UINT UniqueActionsCount;
|
||||||
|
|
|
@ -17,6 +17,10 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#pragma makedep ident
|
||||||
|
#pragma makedep register
|
||||||
|
#pragma makedep regtypelib
|
||||||
|
|
||||||
#include "msiserver_dispids.h"
|
#include "msiserver_dispids.h"
|
||||||
import "unknwn.idl";
|
import "unknwn.idl";
|
||||||
import "wtypes.idl";
|
import "wtypes.idl";
|
||||||
|
@ -148,6 +152,14 @@ coclass MsiServerMessage { interface IMsiMessage; }
|
||||||
]
|
]
|
||||||
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
|
||||||
|
|
||||||
|
[
|
||||||
|
helpstring("Microsoft Windows Installer"),
|
||||||
|
threading(apartment),
|
||||||
|
progid("WindowsInstaller.Installer"),
|
||||||
|
uuid(000c1090-0000-0000-c000-000000000046)
|
||||||
|
]
|
||||||
|
coclass MsiInstaller { interface Installer; }
|
||||||
|
|
||||||
[
|
[
|
||||||
uuid(000c1082-0000-0000-c000-000000000046)
|
uuid(000c1082-0000-0000-c000-000000000046)
|
||||||
]
|
]
|
||||||
|
@ -180,7 +192,6 @@ coclass WineMsiRemoteCustomAction { interface WineMsiRemoteCustomAction; }
|
||||||
]
|
]
|
||||||
coclass WineMsiRemotePackage { interface WineMsiRemotePackage; }
|
coclass WineMsiRemotePackage { interface WineMsiRemotePackage; }
|
||||||
|
|
||||||
|
|
||||||
[ uuid(000C1092-0000-0000-C000-000000000046), version(1.0) ]
|
[ uuid(000C1092-0000-0000-C000-000000000046), version(1.0) ]
|
||||||
library WindowsInstaller
|
library WindowsInstaller
|
||||||
{
|
{
|
||||||
|
@ -247,14 +258,14 @@ library WindowsInstaller
|
||||||
[id(DISPID_INSTALLER_OPENPACKAGE)]
|
[id(DISPID_INSTALLER_OPENPACKAGE)]
|
||||||
Session* OpenPackage(
|
Session* OpenPackage(
|
||||||
[in] VARIANT PackagePath,
|
[in] VARIANT PackagePath,
|
||||||
[in, optional, defaultvalue(0)] long Options);
|
[in, defaultvalue(0)] long Options);
|
||||||
[id(DISPID_INSTALLER_OPENPRODUCT)]
|
[id(DISPID_INSTALLER_OPENPRODUCT)]
|
||||||
Session* OpenProduct(
|
Session* OpenProduct(
|
||||||
[in] BSTR ProductCode);
|
[in] BSTR ProductCode);
|
||||||
[id(DISPID_INSTALLER_SUMMARYINFORMATION)]
|
[id(DISPID_INSTALLER_SUMMARYINFORMATION)]
|
||||||
SummaryInfo* SummaryInformation(
|
SummaryInfo* SummaryInformation(
|
||||||
[in] BSTR PackagePath,
|
[in] BSTR PackagePath,
|
||||||
[in, optional, defaultvalue(0)] long UpdateCount);
|
[in, defaultvalue(0)] long UpdateCount);
|
||||||
[id(DISPID_INSTALLER_OPENDATABASE)]
|
[id(DISPID_INSTALLER_OPENDATABASE)]
|
||||||
Database *OpenDatabase(
|
Database *OpenDatabase(
|
||||||
[in] BSTR DatabasePath,
|
[in] BSTR DatabasePath,
|
||||||
|
@ -266,7 +277,7 @@ library WindowsInstaller
|
||||||
[id(DISPID_INSTALLER_INSTALLPRODUCT)]
|
[id(DISPID_INSTALLER_INSTALLPRODUCT)]
|
||||||
void InstallProduct(
|
void InstallProduct(
|
||||||
[in] BSTR PackagePath,
|
[in] BSTR PackagePath,
|
||||||
[in, optional, defaultvalue("0")] BSTR PropertyValues);
|
[in, defaultvalue("0")] BSTR PropertyValues);
|
||||||
[id(DISPID_INSTALLER_VERSION)]
|
[id(DISPID_INSTALLER_VERSION)]
|
||||||
BSTR Version();
|
BSTR Version();
|
||||||
[id(DISPID_INSTALLER_LASTERRORRECORD)]
|
[id(DISPID_INSTALLER_LASTERRORRECORD)]
|
||||||
|
@ -389,7 +400,7 @@ library WindowsInstaller
|
||||||
properties:
|
properties:
|
||||||
methods:
|
methods:
|
||||||
[id(DISPID_VIEW_EXECUTE)]
|
[id(DISPID_VIEW_EXECUTE)]
|
||||||
void Execute([in, optional, defaultvalue(0)] Record *Params);
|
void Execute([in, defaultvalue(0)] Record *Params);
|
||||||
[id(DISPID_VIEW_FETCH)]
|
[id(DISPID_VIEW_FETCH)]
|
||||||
Record* Fetch();
|
Record* Fetch();
|
||||||
[id(DISPID_VIEW_MODIFY)]
|
[id(DISPID_VIEW_MODIFY)]
|
||||||
|
@ -408,7 +419,7 @@ library WindowsInstaller
|
||||||
[id(DISPID_DATABASE_OPENVIEW)]
|
[id(DISPID_DATABASE_OPENVIEW)]
|
||||||
View* OpenView([in] BSTR Sql);
|
View* OpenView([in] BSTR Sql);
|
||||||
[id(DISPID_DATABASE_SUMMARYINFORMATION), propget]
|
[id(DISPID_DATABASE_SUMMARYINFORMATION), propget]
|
||||||
SummaryInfo *SummaryInformation([in, optional, defaultvalue(0)] long UpdateCount);
|
SummaryInfo *SummaryInformation([in, defaultvalue(0)] long UpdateCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -547,12 +558,4 @@ library WindowsInstaller
|
||||||
properties:
|
properties:
|
||||||
methods:
|
methods:
|
||||||
}
|
}
|
||||||
|
|
||||||
[
|
|
||||||
helpstring("Microsoft Windows Installer"),
|
|
||||||
threading(apartment),
|
|
||||||
progid("WindowsInstaller.Installer"),
|
|
||||||
uuid(000c1090-0000-0000-c000-000000000046)
|
|
||||||
]
|
|
||||||
coclass MsiInstaller { interface Installer; }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,12 @@ HKCR
|
||||||
{
|
{
|
||||||
NoRemove CLSID
|
NoRemove CLSID
|
||||||
{
|
{
|
||||||
'{000C101D-0000-0000-C000-000000000046}' { DllVersion = s '3.1.4000' }
|
'{000C101D-0000-0000-C000-000000000046}' { DllVersion = s '4.5.6001' }
|
||||||
'{000C1090-0000-0000-C000-000000000046}' { InProcHandler32 = s 'ole32.dll' }
|
'{000C1090-0000-0000-C000-000000000046}'
|
||||||
|
{
|
||||||
|
TypeLib = s '{000C1092-0000-0000-C000-000000000046}'
|
||||||
|
Version = s '1.0'
|
||||||
|
InProcHandler32 = s 'ole32.dll'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
92
reactos/dll/win32/msi/msiserver_r.rgs
Normal file
92
reactos/dll/win32/msi/msiserver_r.rgs
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
HKCR
|
||||||
|
{
|
||||||
|
NoRemove Interface
|
||||||
|
{
|
||||||
|
'{7BDE2046-D03B-4FFC-B84C-A098F38CFF0B}' = s 'IWineMsiRemoteDatabase'
|
||||||
|
{
|
||||||
|
NumMethods = s 8
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'IWineMsiRemotePackage'
|
||||||
|
{
|
||||||
|
NumMethods = s 25
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{56D58B64-8780-4C22-A8BC-8B0B29E4A9F8}' = s 'IWineMsiRemoteCustomAction'
|
||||||
|
{
|
||||||
|
NumMethods = s 4
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{000C101C-0000-0000-C000-000000000046}' = s 'IMsiServer'
|
||||||
|
{
|
||||||
|
NumMethods = s 3
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{000C101D-0000-0000-C000-000000000046}' = s 'IMsiMessage'
|
||||||
|
{
|
||||||
|
NumMethods = s 3
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{000C1025-0000-0000-C000-000000000046}' = s 'IMsiCustomAction'
|
||||||
|
{
|
||||||
|
NumMethods = s 3
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'{000C1033-0000-0000-C000-000000000046}' = s 'IMsiRemoteAPI'
|
||||||
|
{
|
||||||
|
NumMethods = s 3
|
||||||
|
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NoRemove CLSID
|
||||||
|
{
|
||||||
|
'{000C101C-0000-0000-C000-000000000046}' = s 'Msi install server'
|
||||||
|
{
|
||||||
|
ProgId = s 'IMsiServer'
|
||||||
|
}
|
||||||
|
'{000C101D-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer Message RPC'
|
||||||
|
{
|
||||||
|
ProgId = s 'WindowsInstaller.Message'
|
||||||
|
}
|
||||||
|
'{000C103E-0000-0000-C000-000000000046}' = s 'PSFactoryBuffer'
|
||||||
|
{
|
||||||
|
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
|
||||||
|
}
|
||||||
|
'{000C1090-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer'
|
||||||
|
{
|
||||||
|
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
|
||||||
|
ProgId = s 'WindowsInstaller.Installer'
|
||||||
|
}
|
||||||
|
'{000C1082-0000-0000-C000-000000000046}' = s 'MsiTransform'
|
||||||
|
{
|
||||||
|
}
|
||||||
|
'{000C1084-0000-0000-C000-000000000046}' = s 'MsiDatabase'
|
||||||
|
{
|
||||||
|
}
|
||||||
|
'{000C1086-0000-0000-C000-000000000046}' = s 'MsiPatch'
|
||||||
|
{
|
||||||
|
}
|
||||||
|
'{000C1094-0000-0000-C000-000000000046}' = s 'MsiServerX3'
|
||||||
|
{
|
||||||
|
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
|
||||||
|
}
|
||||||
|
'{BA26E6FA-4F27-4F56-953A-3F90272018AA}' = s 'WineMsiRemoteCustomAction'
|
||||||
|
{
|
||||||
|
}
|
||||||
|
'{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'WineMsiRemotePackage'
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'IMsiServer' = s 'Msi install server'
|
||||||
|
{
|
||||||
|
CLSID = s '{000C101C-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'WindowsInstaller.Message' = s 'Microsoft Windows Installer Message RPC'
|
||||||
|
{
|
||||||
|
CLSID = s '{000C101D-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
'WindowsInstaller.Installer' = s 'Microsoft Windows Installer'
|
||||||
|
{
|
||||||
|
CLSID = s '{000C1090-0000-0000-C000-000000000046}'
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,86 +1,5 @@
|
||||||
HKCR
|
HKCR
|
||||||
{
|
{
|
||||||
NoRemove Interface
|
|
||||||
{
|
|
||||||
'{7BDE2046-D03B-4FFC-B84C-A098F38CFF0B}' = s 'IWineMsiRemoteDatabase'
|
|
||||||
{
|
|
||||||
NumMethods = s 8
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'IWineMsiRemotePackage'
|
|
||||||
{
|
|
||||||
NumMethods = s 25
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{56D58B64-8780-4C22-A8BC-8B0B29E4A9F8}' = s 'IWineMsiRemoteCustomAction'
|
|
||||||
{
|
|
||||||
NumMethods = s 4
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{000C101C-0000-0000-C000-000000000046}' = s 'IMsiServer'
|
|
||||||
{
|
|
||||||
NumMethods = s 3
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{000C101D-0000-0000-C000-000000000046}' = s 'IMsiMessage'
|
|
||||||
{
|
|
||||||
NumMethods = s 3
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{000C1025-0000-0000-C000-000000000046}' = s 'IMsiCustomAction'
|
|
||||||
{
|
|
||||||
NumMethods = s 3
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'{000C1033-0000-0000-C000-000000000046}' = s 'IMsiRemoteAPI'
|
|
||||||
{
|
|
||||||
NumMethods = s 3
|
|
||||||
ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NoRemove CLSID
|
|
||||||
{
|
|
||||||
'{000C101C-0000-0000-C000-000000000046}' = s 'Msi install server'
|
|
||||||
{
|
|
||||||
ProgId = s 'IMsiServer'
|
|
||||||
}
|
|
||||||
'{000C101D-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer Message RPC'
|
|
||||||
{
|
|
||||||
ProgId = s 'WindowsInstaller.Message'
|
|
||||||
}
|
|
||||||
'{000C103E-0000-0000-C000-000000000046}' = s 'PSFactoryBuffer'
|
|
||||||
{
|
|
||||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
|
|
||||||
}
|
|
||||||
'{000C1082-0000-0000-C000-000000000046}' = s 'MsiTransform'
|
|
||||||
{
|
|
||||||
}
|
|
||||||
'{000C1084-0000-0000-C000-000000000046}' = s 'MsiDatabase'
|
|
||||||
{
|
|
||||||
}
|
|
||||||
'{000C1086-0000-0000-C000-000000000046}' = s 'MsiPatch'
|
|
||||||
{
|
|
||||||
}
|
|
||||||
'{000C1094-0000-0000-C000-000000000046}' = s 'MsiServerX3'
|
|
||||||
{
|
|
||||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
|
|
||||||
}
|
|
||||||
'{BA26E6FA-4F27-4F56-953A-3F90272018AA}' = s 'WineMsiRemoteCustomAction'
|
|
||||||
{
|
|
||||||
}
|
|
||||||
'{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'WineMsiRemotePackage'
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'IMsiServer' = s 'Msi install server'
|
|
||||||
{
|
|
||||||
CLSID = s '{000C101C-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
'WindowsInstaller.Message' = s 'Microsoft Windows Installer Message RPC'
|
|
||||||
{
|
|
||||||
CLSID = s '{000C101D-0000-0000-C000-000000000046}'
|
|
||||||
}
|
|
||||||
|
|
||||||
NoRemove Typelib
|
NoRemove Typelib
|
||||||
{
|
{
|
||||||
NoRemove '{000C1092-0000-0000-C000-000000000046}'
|
NoRemove '{000C1092-0000-0000-C000-000000000046}'
|
||||||
|
@ -169,16 +88,5 @@ HKCR
|
||||||
}
|
}
|
||||||
NoRemove CLSID
|
NoRemove CLSID
|
||||||
{
|
{
|
||||||
'{000C1090-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer'
|
|
||||||
{
|
|
||||||
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' }
|
|
||||||
ProgId = s 'WindowsInstaller.Installer'
|
|
||||||
TypeLib = s '{000C1092-0000-0000-C000-000000000046}'
|
|
||||||
Version = s '1.0'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'WindowsInstaller.Installer' = s 'Microsoft Windows Installer'
|
|
||||||
{
|
|
||||||
CLSID = s '{000C1090-0000-0000-C000-000000000046}'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1052,6 +1052,7 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
WARN("Unable to query rev number: %d\n", rc);
|
WARN("Unable to query rev number: %d\n", rc);
|
||||||
|
msi_free( package_code );
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -358,7 +358,7 @@ BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, UINT iField )
|
||||||
|
|
||||||
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
|
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
|
||||||
if( !rec )
|
if( !rec )
|
||||||
return 0;
|
return FALSE;
|
||||||
msiobj_lock( &rec->hdr );
|
msiobj_lock( &rec->hdr );
|
||||||
ret = MSI_RecordIsNull( rec, iField );
|
ret = MSI_RecordIsNull( rec, iField );
|
||||||
msiobj_unlock( &rec->hdr );
|
msiobj_unlock( &rec->hdr );
|
||||||
|
@ -663,7 +663,7 @@ static UINT RECORD_StreamFromFile(LPCWSTR szFile, IStream **pstm)
|
||||||
hGlob = GlobalAlloc(GMEM_FIXED, sz);
|
hGlob = GlobalAlloc(GMEM_FIXED, sz);
|
||||||
if( hGlob )
|
if( hGlob )
|
||||||
{
|
{
|
||||||
BOOL r = ReadFile(handle, hGlob, sz, &read, NULL);
|
BOOL r = ReadFile(handle, hGlob, sz, &read, NULL) && read == sz;
|
||||||
if( !r )
|
if( !r )
|
||||||
{
|
{
|
||||||
GlobalFree(hGlob);
|
GlobalFree(hGlob);
|
||||||
|
|
|
@ -1135,7 +1135,7 @@ UINT WINAPI MsiSourceListAddSourceExW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
list_init(&sourcelist);
|
list_init(&sourcelist);
|
||||||
rc = fill_source_list(&sourcelist, typekey, &count);
|
rc = fill_source_list(&sourcelist, typekey, &count);
|
||||||
if (rc != ERROR_NO_MORE_ITEMS)
|
if (rc != ERROR_NO_MORE_ITEMS)
|
||||||
return rc;
|
goto done;
|
||||||
|
|
||||||
size = (lstrlenW(source) + 1) * sizeof(WCHAR);
|
size = (lstrlenW(source) + 1) * sizeof(WCHAR);
|
||||||
|
|
||||||
|
|
|
@ -816,7 +816,7 @@ UINT SQL_getstring( void *info, const struct sql_str *strdata, LPWSTR *str )
|
||||||
( (p[0]=='\'') && (p[len-1]!='\'') ) )
|
( (p[0]=='\'') && (p[len-1]!='\'') ) )
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
/* if there's quotes, remove them */
|
/* if there are quotes, remove them */
|
||||||
if( ( (p[0]=='`') && (p[len-1]=='`') ) ||
|
if( ( (p[0]=='`') && (p[len-1]=='`') ) ||
|
||||||
( (p[0]=='\'') && (p[len-1]=='\'') ) )
|
( (p[0]=='\'') && (p[len-1]=='\'') ) )
|
||||||
{
|
{
|
||||||
|
|
|
@ -545,7 +545,7 @@ static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO
|
||||||
|
|
||||||
*pcount = column_count;
|
*pcount = column_count;
|
||||||
|
|
||||||
/* if there's no columns, there's no table */
|
/* if there are no columns, there's no table */
|
||||||
if (!column_count)
|
if (!column_count)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
@ -1509,7 +1509,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *column )
|
||||||
{
|
{
|
||||||
UINT r, row, i;
|
UINT r, row, i;
|
||||||
|
|
||||||
/* check there's no null values where they're not allowed */
|
/* check there are no null values where they're not allowed */
|
||||||
for( i = 0; i < tv->num_cols; i++ )
|
for( i = 0; i < tv->num_cols; i++ )
|
||||||
{
|
{
|
||||||
if ( tv->columns[i].type & MSITYPE_NULLABLE )
|
if ( tv->columns[i].type & MSITYPE_NULLABLE )
|
||||||
|
@ -1541,7 +1541,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *column )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check there's no duplicate keys */
|
/* check there are no duplicate keys */
|
||||||
r = msi_table_find_row( tv, rec, &row, column );
|
r = msi_table_find_row( tv, rec, &row, column );
|
||||||
if (r == ERROR_SUCCESS)
|
if (r == ERROR_SUCCESS)
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
@ -1951,7 +1951,10 @@ static UINT TABLE_remove_column(struct tagMSIVIEW *view, LPCWSTR table, UINT num
|
||||||
|
|
||||||
r = TABLE_CreateView(tv->db, szColumns, &columns);
|
r = TABLE_CreateView(tv->db, szColumns, &columns);
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
msiobj_release(&rec->hdr);
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
r = msi_table_find_row((MSITABLEVIEW *)columns, rec, &row, NULL);
|
r = msi_table_find_row((MSITABLEVIEW *)columns, rec, &row, NULL);
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
|
@ -2073,7 +2076,10 @@ static UINT TABLE_drop(struct tagMSIVIEW *view)
|
||||||
|
|
||||||
r = TABLE_CreateView(tv->db, szTables, &tables);
|
r = TABLE_CreateView(tv->db, szTables, &tables);
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
msiobj_release(&rec->hdr);
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
r = msi_table_find_row((MSITABLEVIEW *)tables, rec, &row, NULL);
|
r = msi_table_find_row((MSITABLEVIEW *)tables, rec, &row, NULL);
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
|
|
|
@ -657,7 +657,7 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(_In_ LPCWSTR);
|
||||||
|
|
||||||
UINT WINAPI MsiConfigureProductA(_In_ LPCSTR, _In_ int, _In_ INSTALLSTATE);
|
UINT WINAPI MsiConfigureProductA(_In_ LPCSTR, _In_ int, _In_ INSTALLSTATE);
|
||||||
UINT WINAPI MsiConfigureProductW(_In_ LPCWSTR, _In_ int, _In_ INSTALLSTATE);
|
UINT WINAPI MsiConfigureProductW(_In_ LPCWSTR, _In_ int, _In_ INSTALLSTATE);
|
||||||
#define MsiConfigureProduct WINELIB_NAME_AW(MsiConfigureProduct);
|
#define MsiConfigureProduct WINELIB_NAME_AW(MsiConfigureProduct)
|
||||||
|
|
||||||
UINT
|
UINT
|
||||||
WINAPI
|
WINAPI
|
||||||
|
@ -675,7 +675,7 @@ MsiConfigureProductExW(
|
||||||
_In_ INSTALLSTATE,
|
_In_ INSTALLSTATE,
|
||||||
_In_opt_ LPCWSTR);
|
_In_opt_ LPCWSTR);
|
||||||
|
|
||||||
#define MsiConfigureProductEx WINELIB_NAME_AW(MsiConfigureProductEx);
|
#define MsiConfigureProductEx WINELIB_NAME_AW(MsiConfigureProductEx)
|
||||||
|
|
||||||
UINT
|
UINT
|
||||||
WINAPI
|
WINAPI
|
||||||
|
@ -691,7 +691,7 @@ MsiConfigureFeatureW(
|
||||||
_In_ LPCWSTR,
|
_In_ LPCWSTR,
|
||||||
_In_ INSTALLSTATE);
|
_In_ INSTALLSTATE);
|
||||||
|
|
||||||
#define MsiConfigureFeature WINELIB_NAME_AW(MsiConfigureFeature);
|
#define MsiConfigureFeature WINELIB_NAME_AW(MsiConfigureFeature)
|
||||||
|
|
||||||
UINT
|
UINT
|
||||||
WINAPI
|
WINAPI
|
||||||
|
|
|
@ -119,7 +119,7 @@ reactos/dll/win32/msg711.acm # Synced to Wine-1.7.1
|
||||||
reactos/dll/win32/msgsm32.acm # Synced to Wine-1.7.17
|
reactos/dll/win32/msgsm32.acm # Synced to Wine-1.7.17
|
||||||
reactos/dll/win32/mshtml # Synced to Wine-1.7.1
|
reactos/dll/win32/mshtml # Synced to Wine-1.7.1
|
||||||
reactos/dll/win32/mshtml.tlb # Synced to Wine-1.7.1
|
reactos/dll/win32/mshtml.tlb # Synced to Wine-1.7.1
|
||||||
reactos/dll/win32/msi # Synced to Wine-1.7.1
|
reactos/dll/win32/msi # Synced to Wine-1.7.17
|
||||||
reactos/dll/win32/msimg32 # Synced to Wine-1.7.1
|
reactos/dll/win32/msimg32 # Synced to Wine-1.7.1
|
||||||
reactos/dll/win32/msimtf # Synced to Wine-1.7.1
|
reactos/dll/win32/msimtf # Synced to Wine-1.7.1
|
||||||
reactos/dll/win32/msisip # Synced to Wine-1.7.1
|
reactos/dll/win32/msisip # Synced to Wine-1.7.1
|
||||||
|
|
Loading…
Reference in a new issue