mirror of
https://github.com/reactos/reactos.git
synced 2024-12-30 19:14:31 +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;
|
||||
const WCHAR *p;
|
||||
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++)
|
||||
{
|
||||
ignore = 0;
|
||||
ignore = FALSE;
|
||||
switch (state)
|
||||
{
|
||||
case state_whitespace:
|
||||
switch (*p)
|
||||
{
|
||||
case ' ':
|
||||
in_quotes = 1;
|
||||
ignore = 1;
|
||||
in_quotes = TRUE;
|
||||
ignore = TRUE;
|
||||
len++;
|
||||
break;
|
||||
case '"':
|
||||
|
@ -217,7 +218,7 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
|||
break;
|
||||
default:
|
||||
state = state_token;
|
||||
in_quotes = 1;
|
||||
in_quotes = TRUE;
|
||||
len++;
|
||||
break;
|
||||
}
|
||||
|
@ -234,12 +235,12 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
|||
case ' ':
|
||||
state = state_whitespace;
|
||||
if (!count) goto done;
|
||||
in_quotes = 1;
|
||||
in_quotes = TRUE;
|
||||
len++;
|
||||
break;
|
||||
default:
|
||||
if (!count) in_quotes = 0;
|
||||
else in_quotes = 1;
|
||||
if (!count) in_quotes = FALSE;
|
||||
else in_quotes = TRUE;
|
||||
len++;
|
||||
break;
|
||||
}
|
||||
|
@ -255,13 +256,13 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes )
|
|||
case ' ':
|
||||
state = state_whitespace;
|
||||
if (!count || (count > 1 && !len)) goto done;
|
||||
in_quotes = 1;
|
||||
in_quotes = TRUE;
|
||||
len++;
|
||||
break;
|
||||
default:
|
||||
state = state_token;
|
||||
if (!count) in_quotes = 0;
|
||||
else in_quotes = 1;
|
||||
if (!count) in_quotes = FALSE;
|
||||
else in_quotes = TRUE;
|
||||
len++;
|
||||
break;
|
||||
}
|
||||
|
@ -407,41 +408,21 @@ static BOOL ui_sequence_exists( MSIPACKAGE *package )
|
|||
|
||||
UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
|
||||
{
|
||||
LPWSTR source, check;
|
||||
WCHAR *source, *check, *p, *db;
|
||||
DWORD len;
|
||||
|
||||
if (msi_get_property_int( package->db, szInstalled, 0 ))
|
||||
if (!(db = msi_dup_property( package->db, szOriginalDatabase )))
|
||||
return ERROR_OUTOFMEMORY;
|
||||
|
||||
if (!(p = strrchrW( db, '\\' )) && !(p = strrchrW( db, '/' )))
|
||||
{
|
||||
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;
|
||||
|
||||
db = msi_dup_property( package->db, szOriginalDatabase );
|
||||
if (!db)
|
||||
return ERROR_OUTOFMEMORY;
|
||||
|
||||
p = strrchrW( db, '\\' );
|
||||
if (!p)
|
||||
{
|
||||
p = strrchrW( db, '/' );
|
||||
if (!p)
|
||||
{
|
||||
msi_free(db);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
len = p - db + 2;
|
||||
source = msi_alloc( len * sizeof(WCHAR) );
|
||||
lstrcpynW( source, db, len );
|
||||
msi_free( db );
|
||||
msi_free(db);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
len = p - db + 2;
|
||||
source = msi_alloc( len * sizeof(WCHAR) );
|
||||
lstrcpynW( source, db, len );
|
||||
msi_free( db );
|
||||
|
||||
check = msi_dup_property( package->db, szSourceDir );
|
||||
if (!check || replace)
|
||||
|
@ -1890,7 +1871,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
|||
component->anyAbsent = 1;
|
||||
break;
|
||||
case INSTALLSTATE_ADVERTISED:
|
||||
component->hasAdvertiseFeature = 1;
|
||||
component->hasAdvertisedFeature = 1;
|
||||
break;
|
||||
case INSTALLSTATE_SOURCE:
|
||||
component->hasSourceFeature = 1;
|
||||
|
@ -1900,7 +1881,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
|||
break;
|
||||
case INSTALLSTATE_DEFAULT:
|
||||
if (feature->Attributes & msidbFeatureAttributesFavorAdvertise)
|
||||
component->hasAdvertiseFeature = 1;
|
||||
component->hasAdvertisedFeature = 1;
|
||||
else if (feature->Attributes & msidbFeatureAttributesFavorSource)
|
||||
component->hasSourceFeature = 1;
|
||||
else
|
||||
|
@ -1945,7 +1926,7 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
|
|||
component->ActionRequest = INSTALLSTATE_SOURCE;
|
||||
continue;
|
||||
}
|
||||
if (component->hasAdvertiseFeature)
|
||||
if (component->hasAdvertisedFeature)
|
||||
{
|
||||
component->Action = INSTALLSTATE_ADVERTISED;
|
||||
component->ActionRequest = INSTALLSTATE_ADVERTISED;
|
||||
|
@ -3181,8 +3162,6 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package )
|
|||
|
||||
static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
|
||||
{
|
||||
package->script->CurrentlyScripting = TRUE;
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -3569,9 +3548,29 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
|
|||
if (comp->num_clients <= 0)
|
||||
{
|
||||
if (package->Context == MSIINSTALLCONTEXT_MACHINE)
|
||||
MSIREG_DeleteUserDataComponentKey( comp->ComponentId, szLocalSid );
|
||||
rc = MSIREG_DeleteUserDataComponentKey( comp->ComponentId, szLocalSid );
|
||||
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 );
|
||||
msi_reduce_to_long_filename( filename );
|
||||
|
||||
extension = strchrW( filename, '.' );
|
||||
extension = strrchrW( filename, '.' );
|
||||
if (!extension || strcmpiW( extension, szlnk ))
|
||||
{
|
||||
int len = strlenW( filename );
|
||||
|
@ -5294,9 +5293,6 @@ static UINT ACTION_InstallFinalize(MSIPACKAGE *package)
|
|||
UINT rc;
|
||||
WCHAR *remove;
|
||||
|
||||
/* turn off scheduling */
|
||||
package->script->CurrentlyScripting= FALSE;
|
||||
|
||||
/* first do the same as an InstallExecute */
|
||||
rc = ACTION_InstallExecute(package);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
|
@ -5801,7 +5797,11 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param)
|
|||
ERR("Query failed\n");
|
||||
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);
|
||||
msiobj_release(&row->hdr);
|
||||
if (!file)
|
||||
|
@ -7823,8 +7823,6 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
|
|||
else
|
||||
rc = ACTION_ProcessExecSequence(package, FALSE);
|
||||
|
||||
package->script->CurrentlyScripting = FALSE;
|
||||
|
||||
/* process the ending type action */
|
||||
if (rc == ERROR_SUCCESS)
|
||||
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->Attributes = MSI_RecordGetInteger(row,13);
|
||||
|
||||
cls->action = INSTALLSTATE_UNKNOWN;
|
||||
return cls;
|
||||
}
|
||||
|
||||
|
@ -416,7 +416,7 @@ static MSIEXTENSION *load_extension( MSIPACKAGE* package, MSIRECORD *row )
|
|||
|
||||
buffer = MSI_RecordGetString(row,5);
|
||||
ext->Feature = msi_get_loaded_feature( package, buffer );
|
||||
|
||||
ext->action = INSTALLSTATE_UNKNOWN;
|
||||
return ext;
|
||||
}
|
||||
|
||||
|
@ -689,59 +689,6 @@ static UINT load_classes_and_such( MSIPACKAGE *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 const WCHAR szRemoteServerName[] =
|
||||
|
@ -847,8 +794,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
|
|||
}
|
||||
TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls);
|
||||
|
||||
cls->Installed = TRUE;
|
||||
mark_progid_for_install( package, cls->ProgID );
|
||||
cls->action = INSTALLSTATE_LOCAL;
|
||||
|
||||
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);
|
||||
|
||||
cls->Installed = FALSE;
|
||||
mark_progid_for_uninstall( package, cls->ProgID );
|
||||
cls->action = INSTALLSTATE_ABSENT;
|
||||
|
||||
res = RegDeleteTreeW( hkey, cls->clsid );
|
||||
if (res != ERROR_SUCCESS)
|
||||
|
@ -1094,6 +1039,35 @@ static UINT register_progid( const MSIPROGID* progid )
|
|||
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)
|
||||
{
|
||||
MSIPROGID *progid;
|
||||
|
@ -1106,17 +1080,11 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
|||
|
||||
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
||||
{
|
||||
/* check if this progid is to be installed */
|
||||
if (progid->Class && progid->Class->Installed)
|
||||
progid->InstallMe = TRUE;
|
||||
|
||||
if (!progid->InstallMe)
|
||||
if (!has_class_installed( progid ) && !has_one_extension_installed( package, progid ))
|
||||
{
|
||||
TRACE("progid %s not scheduled to be installed\n",
|
||||
debugstr_w(progid->ProgID));
|
||||
TRACE("progid %s not scheduled to be installed\n", debugstr_w(progid->ProgID));
|
||||
continue;
|
||||
}
|
||||
|
||||
TRACE("Registering progid %s\n", debugstr_w(progid->ProgID));
|
||||
|
||||
register_progid( progid );
|
||||
|
@ -1129,6 +1097,36 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
|
|||
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 )
|
||||
{
|
||||
MSIPROGID *progid;
|
||||
|
@ -1142,16 +1140,12 @@ UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
|
|||
|
||||
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
||||
{
|
||||
/* check if this progid is to be removed */
|
||||
if (progid->Class && !progid->Class->Installed)
|
||||
progid->InstallMe = FALSE;
|
||||
|
||||
if (progid->InstallMe)
|
||||
if (!has_class_removed( progid ) ||
|
||||
(has_extensions( package, progid ) && !has_all_extensions_removed( package, progid )))
|
||||
{
|
||||
TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID));
|
||||
continue;
|
||||
}
|
||||
|
||||
TRACE("Unregistering progid %s\n", debugstr_w(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);
|
||||
|
||||
ext->Installed = TRUE;
|
||||
|
||||
/* 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);
|
||||
ext->action = INSTALLSTATE_LOCAL;
|
||||
|
||||
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
||||
if (extension)
|
||||
|
@ -1399,12 +1385,7 @@ UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
|
|||
}
|
||||
TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension));
|
||||
|
||||
ext->Installed = FALSE;
|
||||
|
||||
if (ext->ProgID && !list_empty( &ext->verbs ))
|
||||
mark_progid_for_uninstall( package, ext->ProgID );
|
||||
|
||||
mark_mime_for_uninstall( ext->Mime );
|
||||
ext->action = INSTALLSTATE_ABSENT;
|
||||
|
||||
extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
|
||||
if (extension)
|
||||
|
@ -1468,11 +1449,8 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
|
|||
* check if the MIME is to be installed. Either as requested by an
|
||||
* extension or Class
|
||||
*/
|
||||
mt->InstallMe = (mt->InstallMe ||
|
||||
(mt->Class && mt->Class->Installed) ||
|
||||
(mt->Extension && mt->Extension->Installed));
|
||||
|
||||
if (!mt->InstallMe)
|
||||
if ((!mt->Class || mt->Class->action != INSTALLSTATE_LOCAL) &&
|
||||
mt->Extension->action != INSTALLSTATE_LOCAL)
|
||||
{
|
||||
TRACE("MIME %s not scheduled to be installed\n", debugstr_w(mt->ContentType));
|
||||
continue;
|
||||
|
@ -1522,11 +1500,8 @@ UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
|
|||
LONG res;
|
||||
LPWSTR mime_key;
|
||||
|
||||
mime->InstallMe = (mime->InstallMe ||
|
||||
(mime->Class && mime->Class->Installed) ||
|
||||
(mime->Extension && mime->Extension->Installed));
|
||||
|
||||
if (mime->InstallMe)
|
||||
if ((!mime->Class || mime->Class->action != INSTALLSTATE_ABSENT) &&
|
||||
mime->Extension->action != INSTALLSTATE_ABSENT)
|
||||
{
|
||||
TRACE("MIME %s not scheduled to be removed\n", debugstr_w(mime->ContentType));
|
||||
continue;
|
||||
|
|
|
@ -203,8 +203,8 @@ static MSIBINARY *create_temp_binary( MSIPACKAGE *package, LPCWSTR source, BOOL
|
|||
DWORD sz = MAX_PATH, write;
|
||||
UINT r;
|
||||
|
||||
if (msi_get_property(package->db, szTempFolder, fmt, &sz) != ERROR_SUCCESS)
|
||||
GetTempPathW(MAX_PATH, fmt);
|
||||
if (msi_get_property(package->db, szTempFolder, fmt, &sz) != ERROR_SUCCESS ||
|
||||
GetFileAttributesW(fmt) == INVALID_FILE_ATTRIBUTES) GetTempPathW(MAX_PATH, fmt);
|
||||
|
||||
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',' ',
|
||||
'`','B','i' ,'n','a','r','y','`',' ','W','H','E','R','E',' ',
|
||||
'`','N','a','m','e','`',' ','=',' ','\'','%','s','\'',0};
|
||||
MSIRECORD *row = 0;
|
||||
MSIRECORD *row = NULL;
|
||||
msi_custom_action_info *info;
|
||||
CHAR *buffer = NULL;
|
||||
WCHAR *bufferw = NULL;
|
||||
|
@ -1005,10 +1005,14 @@ static UINT HANDLE_CustomType5_6( MSIPACKAGE *package, const WCHAR *source, cons
|
|||
return ERROR_FUNCTION_FAILED;
|
||||
|
||||
r = MSI_RecordReadStream(row, 2, NULL, &sz);
|
||||
if (r != ERROR_SUCCESS) return r;
|
||||
if (r != ERROR_SUCCESS) goto done;
|
||||
|
||||
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);
|
||||
if (r != ERROR_SUCCESS)
|
||||
|
@ -1028,6 +1032,7 @@ static UINT HANDLE_CustomType5_6( MSIPACKAGE *package, const WCHAR *source, cons
|
|||
done:
|
||||
msi_free(bufferw);
|
||||
msi_free(buffer);
|
||||
msiobj_release(&row->hdr);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
@ -763,12 +763,13 @@ static msi_control *msi_dialog_add_control( msi_dialog *dialog,
|
|||
MSIRECORD *rec, LPCWSTR szCls, DWORD style )
|
||||
{
|
||||
DWORD attributes;
|
||||
LPCWSTR text, name;
|
||||
const WCHAR *text = NULL, *name, *control_type;
|
||||
DWORD exstyle = 0;
|
||||
|
||||
name = MSI_RecordGetString( rec, 2 );
|
||||
control_type = MSI_RecordGetString( rec, 3 );
|
||||
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),
|
||||
attributes, debugstr_w(text), style);
|
||||
|
@ -1802,24 +1803,33 @@ static void msi_mask_control_change( struct msi_maskedit_info *info )
|
|||
val = msi_alloc( (info->num_chars+1)*sizeof(WCHAR) );
|
||||
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)
|
||||
{
|
||||
ERR("can't fit control %d text into template\n",i);
|
||||
break;
|
||||
}
|
||||
if (!msi_mask_editable(info->group[i].type))
|
||||
{
|
||||
for(r=0; r<info->group[i].len; r++)
|
||||
val[n+r] = info->group[i].type;
|
||||
val[n+r] = 0;
|
||||
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
|
||||
{
|
||||
r = GetWindowTextW( info->group[i].hwnd, &val[n], info->group[i].len+1 );
|
||||
if( r != info->group[i].len )
|
||||
if (info->group[i].len + n > info->num_chars)
|
||||
{
|
||||
ERR("can't fit control %d text into template\n",i);
|
||||
break;
|
||||
}
|
||||
if (!msi_mask_editable(info->group[i].type))
|
||||
{
|
||||
for(r=0; r<info->group[i].len; r++)
|
||||
val[n+r] = info->group[i].type;
|
||||
val[n+r] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = GetWindowTextW( info->group[i].hwnd, &val[n], info->group[i].len+1 );
|
||||
if( r != info->group[i].len )
|
||||
break;
|
||||
}
|
||||
n += r;
|
||||
}
|
||||
n += r;
|
||||
}
|
||||
|
||||
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 )
|
||||
{
|
||||
struct msi_maskedit_info * info = NULL;
|
||||
struct msi_maskedit_info *info;
|
||||
int i = 0, n = 0, total = 0;
|
||||
LPCWSTR p;
|
||||
|
||||
TRACE("masked control, template %s\n", debugstr_w(mask));
|
||||
|
||||
if( !mask )
|
||||
return info;
|
||||
return NULL;
|
||||
|
||||
info = msi_alloc_zero( sizeof *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 */
|
||||
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;
|
||||
}
|
||||
|
||||
/* count the number of the same identifier */
|
||||
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 ))
|
||||
continue;
|
||||
wx = (info->group[i].ofs * width) / info->num_chars;
|
||||
ww = (info->group[i].len * width) / info->num_chars;
|
||||
|
||||
if (info->num_chars)
|
||||
{
|
||||
wx = (info->group[i].ofs * 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,
|
||||
info->hwnd, NULL, NULL, NULL );
|
||||
if( !hwnd )
|
||||
|
@ -2969,7 +2995,7 @@ static void msi_dialog_update_directory_list( msi_dialog *dialog, msi_control *c
|
|||
FindClose( file );
|
||||
}
|
||||
|
||||
UINT msi_dialog_directorylist_up( msi_dialog *dialog )
|
||||
static UINT msi_dialog_directorylist_up( msi_dialog *dialog )
|
||||
{
|
||||
msi_control *control;
|
||||
LPWSTR prop, path, ptr;
|
||||
|
@ -3472,7 +3498,7 @@ static UINT msi_dialog_fill_controls( msi_dialog *dialog )
|
|||
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 */
|
||||
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;
|
||||
}
|
||||
|
||||
void msi_dialog_end_dialog( msi_dialog *dialog )
|
||||
static void msi_dialog_end_dialog( msi_dialog *dialog )
|
||||
{
|
||||
TRACE("%p\n", dialog);
|
||||
dialog->finished = 1;
|
||||
|
@ -3933,7 +3959,7 @@ void msi_dialog_check_messages( HANDLE handle )
|
|||
return;
|
||||
}
|
||||
|
||||
/* there's two choices for the UI thread */
|
||||
/* there are two choices for the UI thread */
|
||||
while (1)
|
||||
{
|
||||
process_pending_messages( NULL );
|
||||
|
|
|
@ -354,7 +354,11 @@ static LPWSTR build_default_format(const MSIRECORD* record)
|
|||
{
|
||||
max_len = len;
|
||||
buf = msi_realloc(buf, (max_len + 1) * sizeof(WCHAR));
|
||||
if (!buf) return NULL;
|
||||
if (!buf)
|
||||
{
|
||||
msi_free(rc);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (str)
|
||||
|
@ -715,10 +719,10 @@ static UINT replace_stack(FORMAT *format, STACK *stack, STACK *values)
|
|||
|
||||
format->n = n;
|
||||
beg = format_replace( format, propfound, nonprop, oldsize, type, replaced, len );
|
||||
msi_free(replaced);
|
||||
if (!beg)
|
||||
return ERROR_SUCCESS;
|
||||
|
||||
msi_free(replaced);
|
||||
format->n = beg->n + beg->len;
|
||||
|
||||
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)
|
||||
{
|
||||
HANDLE handle;
|
||||
DWORD dwAccess = 0;
|
||||
DWORD dwShareMode = 0;
|
||||
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)
|
||||
dwCreateDisposition = CREATE_ALWAYS;
|
||||
|
||||
handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
|
||||
dwCreateDisposition, 0, NULL);
|
||||
if (handle == INVALID_HANDLE_VALUE)
|
||||
return 0;
|
||||
|
||||
return (INT_PTR)handle;
|
||||
return (INT_PTR)CreateFileA(pszFile, dwAccess, dwShareMode, NULL,
|
||||
dwCreateDisposition, 0, NULL);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
WARN("failed to get cabinet stream\n");
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
if (!cab->stream[0] || !(encoded = encode_streamname( FALSE, cab->stream + 1 )))
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
@ -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);
|
||||
msi_free( encoded );
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
msi_free( encoded );
|
||||
|
|
|
@ -335,7 +335,7 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
|
|||
BOOL succeeded = FALSE;
|
||||
|
||||
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])
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
@ -1114,8 +1114,6 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
|||
context = MSIINSTALLCONTEXT_MACHINE;
|
||||
}
|
||||
|
||||
MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
|
||||
|
||||
if (!strcmpW( szAttribute, INSTALLPROPERTY_HELPLINKW ) ||
|
||||
!strcmpW( szAttribute, INSTALLPROPERTY_HELPTELEPHONEW ) ||
|
||||
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLDATEW ) ||
|
||||
|
@ -1138,9 +1136,11 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
|||
r = ERROR_UNKNOWN_PRODUCT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!userdata)
|
||||
return ERROR_UNKNOWN_PROPERTY;
|
||||
if (MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE))
|
||||
{
|
||||
r = ERROR_UNKNOWN_PROPERTY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ))
|
||||
szAttribute = display_name;
|
||||
|
@ -1150,6 +1150,7 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
|||
val = msi_reg_get_value(userdata, szAttribute, &type);
|
||||
if (!val)
|
||||
val = empty;
|
||||
RegCloseKey(userdata);
|
||||
}
|
||||
else if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTANCETYPEW ) ||
|
||||
!strcmpW( szAttribute, INSTALLPROPERTY_TRANSFORMSW ) ||
|
||||
|
@ -1242,7 +1243,6 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
|||
|
||||
done:
|
||||
RegCloseKey(prodkey);
|
||||
RegCloseKey(userdata);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
@ -69,7 +69,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
|||
/* @makedep: 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 */
|
||||
0x1001 BITMAP instadvert.bmp
|
||||
|
|
|
@ -501,7 +501,7 @@ typedef struct tagMSICOMPONENT
|
|||
int num_clients;
|
||||
|
||||
unsigned int anyAbsent:1;
|
||||
unsigned int hasAdvertiseFeature:1;
|
||||
unsigned int hasAdvertisedFeature:1;
|
||||
unsigned int hasLocalFeature:1;
|
||||
unsigned int hasSourceFeature:1;
|
||||
} MSICOMPONENT;
|
||||
|
@ -628,7 +628,7 @@ typedef struct tagMSICLASS
|
|||
MSIFEATURE *Feature;
|
||||
INT Attributes;
|
||||
/* not in the table, set during installation */
|
||||
BOOL Installed;
|
||||
INSTALLSTATE action;
|
||||
} MSICLASS;
|
||||
|
||||
typedef struct tagMSIMIME MSIMIME;
|
||||
|
@ -643,7 +643,7 @@ typedef struct tagMSIEXTENSION
|
|||
MSIMIME *Mime;
|
||||
MSIFEATURE *Feature;
|
||||
/* not in the table, set during installation */
|
||||
BOOL Installed;
|
||||
INSTALLSTATE action;
|
||||
struct list verbs;
|
||||
} MSIEXTENSION;
|
||||
|
||||
|
@ -656,7 +656,6 @@ struct tagMSIPROGID
|
|||
LPWSTR Description;
|
||||
LPWSTR IconPath;
|
||||
/* not in the table, set during installation */
|
||||
BOOL InstallMe;
|
||||
MSIPROGID *CurVer;
|
||||
MSIPROGID *VersionInd;
|
||||
};
|
||||
|
@ -678,8 +677,6 @@ struct tagMSIMIME
|
|||
LPWSTR suffix;
|
||||
LPWSTR clsid;
|
||||
MSICLASS *Class;
|
||||
/* not in the table, set during installation */
|
||||
BOOL InstallMe;
|
||||
};
|
||||
|
||||
enum SCRIPTS
|
||||
|
@ -700,7 +697,6 @@ typedef struct tagMSISCRIPT
|
|||
LPWSTR *Actions[SCRIPT_MAX];
|
||||
UINT ActionCount[SCRIPT_MAX];
|
||||
BOOL ExecuteSequenceRun;
|
||||
BOOL CurrentlyScripting;
|
||||
UINT InWhatSequence;
|
||||
LPWSTR *UniqueActions;
|
||||
UINT UniqueActionsCount;
|
||||
|
|
|
@ -17,6 +17,10 @@
|
|||
* 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"
|
||||
import "unknwn.idl";
|
||||
import "wtypes.idl";
|
||||
|
@ -148,6 +152,14 @@ coclass MsiServerMessage { interface IMsiMessage; }
|
|||
]
|
||||
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)
|
||||
]
|
||||
|
@ -180,7 +192,6 @@ coclass WineMsiRemoteCustomAction { interface WineMsiRemoteCustomAction; }
|
|||
]
|
||||
coclass WineMsiRemotePackage { interface WineMsiRemotePackage; }
|
||||
|
||||
|
||||
[ uuid(000C1092-0000-0000-C000-000000000046), version(1.0) ]
|
||||
library WindowsInstaller
|
||||
{
|
||||
|
@ -247,14 +258,14 @@ library WindowsInstaller
|
|||
[id(DISPID_INSTALLER_OPENPACKAGE)]
|
||||
Session* OpenPackage(
|
||||
[in] VARIANT PackagePath,
|
||||
[in, optional, defaultvalue(0)] long Options);
|
||||
[in, defaultvalue(0)] long Options);
|
||||
[id(DISPID_INSTALLER_OPENPRODUCT)]
|
||||
Session* OpenProduct(
|
||||
[in] BSTR ProductCode);
|
||||
[id(DISPID_INSTALLER_SUMMARYINFORMATION)]
|
||||
SummaryInfo* SummaryInformation(
|
||||
[in] BSTR PackagePath,
|
||||
[in, optional, defaultvalue(0)] long UpdateCount);
|
||||
[in, defaultvalue(0)] long UpdateCount);
|
||||
[id(DISPID_INSTALLER_OPENDATABASE)]
|
||||
Database *OpenDatabase(
|
||||
[in] BSTR DatabasePath,
|
||||
|
@ -266,7 +277,7 @@ library WindowsInstaller
|
|||
[id(DISPID_INSTALLER_INSTALLPRODUCT)]
|
||||
void InstallProduct(
|
||||
[in] BSTR PackagePath,
|
||||
[in, optional, defaultvalue("0")] BSTR PropertyValues);
|
||||
[in, defaultvalue("0")] BSTR PropertyValues);
|
||||
[id(DISPID_INSTALLER_VERSION)]
|
||||
BSTR Version();
|
||||
[id(DISPID_INSTALLER_LASTERRORRECORD)]
|
||||
|
@ -389,7 +400,7 @@ library WindowsInstaller
|
|||
properties:
|
||||
methods:
|
||||
[id(DISPID_VIEW_EXECUTE)]
|
||||
void Execute([in, optional, defaultvalue(0)] Record *Params);
|
||||
void Execute([in, defaultvalue(0)] Record *Params);
|
||||
[id(DISPID_VIEW_FETCH)]
|
||||
Record* Fetch();
|
||||
[id(DISPID_VIEW_MODIFY)]
|
||||
|
@ -408,7 +419,7 @@ library WindowsInstaller
|
|||
[id(DISPID_DATABASE_OPENVIEW)]
|
||||
View* OpenView([in] BSTR Sql);
|
||||
[id(DISPID_DATABASE_SUMMARYINFORMATION), propget]
|
||||
SummaryInfo *SummaryInformation([in, optional, defaultvalue(0)] long UpdateCount);
|
||||
SummaryInfo *SummaryInformation([in, defaultvalue(0)] long UpdateCount);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
|
@ -547,12 +558,4 @@ library WindowsInstaller
|
|||
properties:
|
||||
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
|
||||
{
|
||||
'{000C101D-0000-0000-C000-000000000046}' { DllVersion = s '3.1.4000' }
|
||||
'{000C1090-0000-0000-C000-000000000046}' { InProcHandler32 = s 'ole32.dll' }
|
||||
'{000C101D-0000-0000-C000-000000000046}' { DllVersion = s '4.5.6001' }
|
||||
'{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
|
||||
{
|
||||
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 '{000C1092-0000-0000-C000-000000000046}'
|
||||
|
@ -169,16 +88,5 @@ HKCR
|
|||
}
|
||||
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)
|
||||
{
|
||||
WARN("Unable to query rev number: %d\n", rc);
|
||||
msi_free( package_code );
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
|
|
@ -358,7 +358,7 @@ BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, UINT iField )
|
|||
|
||||
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
|
||||
if( !rec )
|
||||
return 0;
|
||||
return FALSE;
|
||||
msiobj_lock( &rec->hdr );
|
||||
ret = MSI_RecordIsNull( rec, iField );
|
||||
msiobj_unlock( &rec->hdr );
|
||||
|
@ -663,7 +663,7 @@ static UINT RECORD_StreamFromFile(LPCWSTR szFile, IStream **pstm)
|
|||
hGlob = GlobalAlloc(GMEM_FIXED, sz);
|
||||
if( hGlob )
|
||||
{
|
||||
BOOL r = ReadFile(handle, hGlob, sz, &read, NULL);
|
||||
BOOL r = ReadFile(handle, hGlob, sz, &read, NULL) && read == sz;
|
||||
if( !r )
|
||||
{
|
||||
GlobalFree(hGlob);
|
||||
|
|
|
@ -1135,7 +1135,7 @@ UINT WINAPI MsiSourceListAddSourceExW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
|||
list_init(&sourcelist);
|
||||
rc = fill_source_list(&sourcelist, typekey, &count);
|
||||
if (rc != ERROR_NO_MORE_ITEMS)
|
||||
return rc;
|
||||
goto done;
|
||||
|
||||
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]!='\'') ) )
|
||||
return ERROR_FUNCTION_FAILED;
|
||||
|
||||
/* if there's quotes, remove them */
|
||||
/* if there are quotes, remove them */
|
||||
if( ( (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;
|
||||
|
||||
/* if there's no columns, there's no table */
|
||||
/* if there are no columns, there's no table */
|
||||
if (!column_count)
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
||||
|
@ -1509,7 +1509,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *column )
|
|||
{
|
||||
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++ )
|
||||
{
|
||||
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 );
|
||||
if (r == ERROR_SUCCESS)
|
||||
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);
|
||||
if (r != ERROR_SUCCESS)
|
||||
{
|
||||
msiobj_release(&rec->hdr);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = msi_table_find_row((MSITABLEVIEW *)columns, rec, &row, NULL);
|
||||
if (r != ERROR_SUCCESS)
|
||||
|
@ -2073,7 +2076,10 @@ static UINT TABLE_drop(struct tagMSIVIEW *view)
|
|||
|
||||
r = TABLE_CreateView(tv->db, szTables, &tables);
|
||||
if (r != ERROR_SUCCESS)
|
||||
{
|
||||
msiobj_release(&rec->hdr);
|
||||
return r;
|
||||
}
|
||||
|
||||
r = msi_table_find_row((MSITABLEVIEW *)tables, rec, &row, NULL);
|
||||
if (r != ERROR_SUCCESS)
|
||||
|
|
|
@ -657,7 +657,7 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(_In_ LPCWSTR);
|
|||
|
||||
UINT WINAPI MsiConfigureProductA(_In_ LPCSTR, _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
|
||||
WINAPI
|
||||
|
@ -675,7 +675,7 @@ MsiConfigureProductExW(
|
|||
_In_ INSTALLSTATE,
|
||||
_In_opt_ LPCWSTR);
|
||||
|
||||
#define MsiConfigureProductEx WINELIB_NAME_AW(MsiConfigureProductEx);
|
||||
#define MsiConfigureProductEx WINELIB_NAME_AW(MsiConfigureProductEx)
|
||||
|
||||
UINT
|
||||
WINAPI
|
||||
|
@ -691,7 +691,7 @@ MsiConfigureFeatureW(
|
|||
_In_ LPCWSTR,
|
||||
_In_ INSTALLSTATE);
|
||||
|
||||
#define MsiConfigureFeature WINELIB_NAME_AW(MsiConfigureFeature);
|
||||
#define MsiConfigureFeature WINELIB_NAME_AW(MsiConfigureFeature)
|
||||
|
||||
UINT
|
||||
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/mshtml # 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/msimtf # Synced to Wine-1.7.1
|
||||
reactos/dll/win32/msisip # Synced to Wine-1.7.1
|
||||
|
|
Loading…
Reference in a new issue