From a80d96dbae7a6854357d2f29b9714e7e3dc87e60 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 23 Apr 2014 14:48:52 +0000 Subject: [PATCH] [MSI] * Sync with Wine 1.7.17. CORE-8080 svn path=/trunk/; revision=62918 --- reactos/dll/win32/msi/action.c | 112 ++++++------ reactos/dll/win32/msi/classes.c | 171 ++++++++---------- reactos/dll/win32/msi/custom.c | 15 +- reactos/dll/win32/msi/dialog.c | 72 +++++--- reactos/dll/win32/msi/format.c | 8 +- reactos/dll/win32/msi/media.c | 15 +- reactos/dll/win32/msi/msi.c | 14 +- reactos/dll/win32/msi/msi.rc | 4 +- reactos/dll/win32/msi/msipriv.h | 10 +- reactos/dll/win32/msi/msiserver.idl | 31 ++-- reactos/dll/win32/msi/msiserver.rgs | 9 +- reactos/dll/win32/msi/msiserver_r.rgs | 92 ++++++++++ .../win32/msi/{msi.rgs => msiserver_t.rgs} | 92 ---------- reactos/dll/win32/msi/package.c | 1 + reactos/dll/win32/msi/record.c | 4 +- reactos/dll/win32/msi/source.c | 2 +- reactos/dll/win32/msi/sql.y | 2 +- reactos/dll/win32/msi/table.c | 12 +- reactos/include/psdk/msi.h | 6 +- reactos/media/doc/README.WINE | 2 +- 20 files changed, 345 insertions(+), 329 deletions(-) create mode 100644 reactos/dll/win32/msi/msiserver_r.rgs rename reactos/dll/win32/msi/{msi.rgs => msiserver_t.rgs} (56%) diff --git a/reactos/dll/win32/msi/action.c b/reactos/dll/win32/msi/action.c index b6c18616bc7..b5c2412baf6 100644 --- a/reactos/dll/win32/msi/action.c +++ b/reactos/dll/win32/msi/action.c @@ -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); diff --git a/reactos/dll/win32/msi/classes.c b/reactos/dll/win32/msi/classes.c index 90df9025186..eb159798132 100644 --- a/reactos/dll/win32/msi/classes.c +++ b/reactos/dll/win32/msi/classes.c @@ -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; diff --git a/reactos/dll/win32/msi/custom.c b/reactos/dll/win32/msi/custom.c index aeab7b5f788..a750c7a3fe7 100644 --- a/reactos/dll/win32/msi/custom.c +++ b/reactos/dll/win32/msi/custom.c @@ -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; } diff --git a/reactos/dll/win32/msi/dialog.c b/reactos/dll/win32/msi/dialog.c index 923b9c6d17b..9959bd1287e 100644 --- a/reactos/dll/win32/msi/dialog.c +++ b/reactos/dll/win32/msi/dialog.c @@ -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; inum_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; rgroup[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; rgroup[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 ); diff --git a/reactos/dll/win32/msi/format.c b/reactos/dll/win32/msi/format.c index a56b8f8a0d1..142f356155a 100644 --- a/reactos/dll/win32/msi/format.c +++ b/reactos/dll/win32/msi/format.c @@ -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); diff --git a/reactos/dll/win32/msi/media.c b/reactos/dll/win32/msi/media.c index 24f89693dd6..3d0eb8a9182 100644 --- a/reactos/dll/win32/msi/media.c +++ b/reactos/dll/win32/msi/media.c @@ -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 ); diff --git a/reactos/dll/win32/msi/msi.c b/reactos/dll/win32/msi/msi.c index 1098055953c..00ef89f3f1a 100644 --- a/reactos/dll/win32/msi/msi.c +++ b/reactos/dll/win32/msi/msi.c @@ -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; } diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc index 3e8d8d01a49..5597391a13f 100644 --- a/reactos/dll/win32/msi/msi.rc +++ b/reactos/dll/win32/msi/msi.rc @@ -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 diff --git a/reactos/dll/win32/msi/msipriv.h b/reactos/dll/win32/msi/msipriv.h index 37c06caa2cc..ec772b8b43e 100644 --- a/reactos/dll/win32/msi/msipriv.h +++ b/reactos/dll/win32/msi/msipriv.h @@ -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; diff --git a/reactos/dll/win32/msi/msiserver.idl b/reactos/dll/win32/msi/msiserver.idl index 669d7f28a89..50526024a27 100644 --- a/reactos/dll/win32/msi/msiserver.idl +++ b/reactos/dll/win32/msi/msiserver.idl @@ -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; } } diff --git a/reactos/dll/win32/msi/msiserver.rgs b/reactos/dll/win32/msi/msiserver.rgs index 9f408db4264..1313bd91ce5 100644 --- a/reactos/dll/win32/msi/msiserver.rgs +++ b/reactos/dll/win32/msi/msiserver.rgs @@ -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' + } } } diff --git a/reactos/dll/win32/msi/msiserver_r.rgs b/reactos/dll/win32/msi/msiserver_r.rgs new file mode 100644 index 00000000000..cdfd3be9689 --- /dev/null +++ b/reactos/dll/win32/msi/msiserver_r.rgs @@ -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}' + } +} diff --git a/reactos/dll/win32/msi/msi.rgs b/reactos/dll/win32/msi/msiserver_t.rgs similarity index 56% rename from reactos/dll/win32/msi/msi.rgs rename to reactos/dll/win32/msi/msiserver_t.rgs index 7bd3efef385..6662cba9091 100644 --- a/reactos/dll/win32/msi/msi.rgs +++ b/reactos/dll/win32/msi/msiserver_t.rgs @@ -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}' } } diff --git a/reactos/dll/win32/msi/package.c b/reactos/dll/win32/msi/package.c index 50343597fa7..a63bd427ad0 100644 --- a/reactos/dll/win32/msi/package.c +++ b/reactos/dll/win32/msi/package.c @@ -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; } diff --git a/reactos/dll/win32/msi/record.c b/reactos/dll/win32/msi/record.c index 792dc6e973d..74a30b255ba 100644 --- a/reactos/dll/win32/msi/record.c +++ b/reactos/dll/win32/msi/record.c @@ -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); diff --git a/reactos/dll/win32/msi/source.c b/reactos/dll/win32/msi/source.c index 37cdec20d4f..ecfcde4c6d0 100644 --- a/reactos/dll/win32/msi/source.c +++ b/reactos/dll/win32/msi/source.c @@ -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); diff --git a/reactos/dll/win32/msi/sql.y b/reactos/dll/win32/msi/sql.y index fa547412c03..553cc6dd0b5 100644 --- a/reactos/dll/win32/msi/sql.y +++ b/reactos/dll/win32/msi/sql.y @@ -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]=='\'') ) ) { diff --git a/reactos/dll/win32/msi/table.c b/reactos/dll/win32/msi/table.c index 87f7fbb0e8e..41f48e7f87e 100644 --- a/reactos/dll/win32/msi/table.c +++ b/reactos/dll/win32/msi/table.c @@ -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) diff --git a/reactos/include/psdk/msi.h b/reactos/include/psdk/msi.h index 5e162e9a42b..e92d9eef88a 100644 --- a/reactos/include/psdk/msi.h +++ b/reactos/include/psdk/msi.h @@ -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 diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index ec2be7c5623..38b56f17dda 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -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