[ros-diffs] [winesync] 33558: Autosyncing with Wine HEAD

winesync at svn.reactos.org winesync at svn.reactos.org
Sat May 17 21:46:02 CEST 2008


Author: winesync
Date: Sat May 17 14:46:01 2008
New Revision: 33558

URL: http://svn.reactos.org/svn/reactos?rev=33558&view=rev
Log:
Autosyncing with Wine HEAD

Added:
    trunk/reactos/dll/win32/msi/msi_Da.rc   (with props)
    trunk/reactos/dll/win32/msi/msi_Si.rc   (with props)
Modified:
    trunk/reactos/dll/win32/msi/action.c
    trunk/reactos/dll/win32/msi/classes.c
    trunk/reactos/dll/win32/msi/cond.tab.c
    trunk/reactos/dll/win32/msi/cond.y
    trunk/reactos/dll/win32/msi/custom.c
    trunk/reactos/dll/win32/msi/dialog.c
    trunk/reactos/dll/win32/msi/files.c
    trunk/reactos/dll/win32/msi/format.c
    trunk/reactos/dll/win32/msi/helpers.c
    trunk/reactos/dll/win32/msi/install.c
    trunk/reactos/dll/win32/msi/msi.c
    trunk/reactos/dll/win32/msi/msi.rbuild
    trunk/reactos/dll/win32/msi/msi.rc
    trunk/reactos/dll/win32/msi/msi_main.c
    trunk/reactos/dll/win32/msi/msi_ros.diff
    trunk/reactos/dll/win32/msi/msipriv.h
    trunk/reactos/dll/win32/msi/msiquery.c
    trunk/reactos/dll/win32/msi/msiserver.idl
    trunk/reactos/dll/win32/msi/package.c
    trunk/reactos/dll/win32/msi/registry.c
    trunk/reactos/dll/win32/msi/source.c
    trunk/reactos/dll/win32/msi/sql.tab.c
    trunk/reactos/dll/win32/msi/sql.y
    trunk/reactos/dll/win32/msi/suminfo.c
    trunk/reactos/dll/win32/msi/table.c
    trunk/reactos/dll/win32/msi/tokenize.c
    trunk/reactos/dll/win32/msi/where.c

Modified: trunk/reactos/dll/win32/msi/action.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/action.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/action.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/action.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -33,6 +33,10 @@
 #include "msipriv.h"
 #include "winuser.h"
 #include "shlobj.h"
+#include "objbase.h"
+#include "mscoree.h"
+#include "fusion.h"
+#include "shlwapi.h"
 #include "wine/unicode.h"
 #include "winver.h"
 
@@ -1246,6 +1250,9 @@
 {
     MSIFEATURE *feature;
 
+    if ( !name )
+        return NULL;
+
     LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
     {
         if ( !lstrcmpW( feature->Feature, name ) )
@@ -1985,7 +1992,7 @@
         if (MSI_EvaluateConditionW(package,Condition) == MSICONDITION_TRUE)
         {
             int level = MSI_RecordGetInteger(row,2);
-            TRACE("Reseting feature %s to level %i\n", debugstr_w(name), level);
+            TRACE("Resetting feature %s to level %i\n", debugstr_w(name), level);
             feature->Level = level;
         }
     }
@@ -2118,7 +2125,10 @@
         {'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
     static const WCHAR szlevel[] =
         {'I','N','S','T','A','L','L','L','E','V','E','L',0};
+    static const WCHAR szOutOfDiskSpace[] =
+        {'O','u','t','O','f','D','i','s','k','S','p','a','c','e',0};
     static const WCHAR szOne[] = { '1', 0 };
+    static const WCHAR szZero[] = { '0', 0 };
     MSICOMPONENT *comp;
     UINT rc;
     MSIQUERY * view;
@@ -2169,6 +2179,9 @@
     if (!level)
         MSI_SetPropertyW(package,szlevel, szOne);
     msi_free(level);
+
+    /* FIXME: check volume disk space */
+    MSI_SetPropertyW(package, szOutOfDiskSpace, szZero);
 
     ACTION_UpdateFeatureInstallStates(package);
 
@@ -2426,7 +2439,7 @@
     {
         static const WCHAR szEmpty[] = {0};
         value_data = (LPSTR)strdupW(szEmpty);
-        size = 0;
+        size = sizeof(szEmpty);
         type = REG_SZ;
     }
 
@@ -2767,7 +2780,7 @@
         }
     }
     
-    /* add a count for permenent */
+    /* add a count for permanent */
     if (comp->Attributes & msidbComponentAttributesPermanent)
         count ++;
     
@@ -2826,7 +2839,7 @@
                             comp->RefCount);
         /*
          * Write the keypath out if the component is to be registered
-         * and delete the key if the component is to be deregistered
+         * and delete the key if the component is to be unregistered
          */
         if (ACTION_VerifyComponentForAction( comp, INSTALLSTATE_LOCAL))
         {
@@ -3101,7 +3114,7 @@
     buffer = MSI_RecordGetString(row,2);
     target_folder = resolve_folder(package, buffer,FALSE,FALSE,TRUE,NULL);
 
-    /* may be needed because of a bug somehwere else */
+    /* may be needed because of a bug somewhere else */
     create_full_pathW(target_folder);
 
     filename = msi_dup_record_field( row, 3 );
@@ -3345,13 +3358,30 @@
 
     /* ok there is a lot more done here but i need to figure out what */
 
-    rc = MSIREG_OpenProductsKey(package->ProductCode,&hkey,TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    rc = MSIREG_OpenUserProductsKey(package->ProductCode,&hukey,TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
+    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+    {
+        rc = MSIREG_OpenLocalClassesProductKey(package->ProductCode, &hukey, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+
+        rc = MSIREG_OpenLocalSystemInstallProps(package->ProductCode, &props, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+    }
+    else
+    {
+        rc = MSIREG_OpenProductsKey(package->ProductCode,&hkey,TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+
+        rc = MSIREG_OpenUserProductsKey(package->ProductCode,&hukey,TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+
+        rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &props, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+    }
 
     rc = RegCreateKeyW(hukey, szSourceList, &source);
     if (rc != ERROR_SUCCESS)
@@ -3363,10 +3393,6 @@
     if (rc != ERROR_SUCCESS)
         goto end;
 
-    rc = MSIREG_OpenInstallPropertiesKey(package->ProductCode,&props,TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
     buffer = msi_dup_property( package, INSTALLPROPERTY_PRODUCTNAMEW );
     msi_reg_set_val_str( hukey, INSTALLPROPERTY_PRODUCTNAMEW, buffer );
     msi_free(buffer);
@@ -3400,19 +3426,19 @@
 
     buffer = strrchrW( package->PackagePath, '\\') + 1;
     rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                                package->Context, MSICODE_PRODUCT,
                                 INSTALLPROPERTY_PACKAGENAMEW, buffer );
     if (rc != ERROR_SUCCESS)
         goto end;
 
     rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                                package->Context, MSICODE_PRODUCT,
                                 INSTALLPROPERTY_MEDIAPACKAGEPATHW, szEmpty );
     if (rc != ERROR_SUCCESS)
         goto end;
 
     rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                                package->Context, MSICODE_PRODUCT,
                                 INSTALLPROPERTY_DISKPROMPTW, szEmpty );
     if (rc != ERROR_SUCCESS)
         goto end;
@@ -3759,8 +3785,10 @@
             size = strlenW(feature->Feature_Parent)*sizeof(WCHAR);
         if (!absent)
         {
+            static const WCHAR emptyW[] = {0};
+            size += sizeof(WCHAR);
             RegSetValueExW(hukey,feature->Feature,0,REG_SZ,
-                       (LPBYTE)feature->Feature_Parent,size);
+                           (LPBYTE)(feature->Feature_Parent ? feature->Feature_Parent : emptyW),size);
         }
         else
         {
@@ -3896,7 +3924,7 @@
 
     msi_reg_set_val_str( hkey, INSTALLPROPERTY_LOCALPACKAGEW, packagefile );
 
-    r = MSIREG_OpenInstallPropertiesKey(package->ProductCode, &props, TRUE);
+    r = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &props, TRUE);
     if (r != ERROR_SUCCESS)
         return r;
 
@@ -3986,9 +4014,18 @@
     if (rc != ERROR_SUCCESS)
         return rc;
 
-    rc = MSIREG_OpenInstallPropertiesKey(package->ProductCode, &props, TRUE);
-    if (rc != ERROR_SUCCESS)
-        return rc;
+    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+    {
+        rc = MSIREG_OpenLocalSystemInstallProps(package->ProductCode, &props, TRUE);
+        if (rc != ERROR_SUCCESS)
+            return rc;
+    }
+    else
+    {
+        rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &props, TRUE);
+        if (rc != ERROR_SUCCESS)
+            return rc;
+    }
 
     /* dump all the info i can grab */
     /* FIXME: Flesh out more information */
@@ -4060,7 +4097,7 @@
 
         msi_free(upgrade_code);
     }
-    
+
     RegCloseKey(hkey);
 
     rc = MSIREG_OpenUserDataProductKey(package->ProductCode, &hudkey, TRUE);
@@ -4221,13 +4258,13 @@
         DWORD size = 0;
 
         rc = MsiSourceListGetInfoW(package->ProductCode, NULL, 
-                MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                package->Context, MSICODE_PRODUCT,
                 INSTALLPROPERTY_DISKPROMPTW,NULL,&size);
         if (rc == ERROR_MORE_DATA)
         {
             prompt = msi_alloc(size * sizeof(WCHAR));
             MsiSourceListGetInfoW(package->ProductCode, NULL, 
-                    MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                    package->Context, MSICODE_PRODUCT,
                     INSTALLPROPERTY_DISKPROMPTW,prompt,&size);
         }
         else
@@ -4286,7 +4323,7 @@
     if (!productid)
         return ERROR_SUCCESS;
 
-    rc = MSIREG_OpenInstallPropertiesKey(package->ProductCode, &hkey, TRUE);
+    rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &hkey, TRUE);
     if (rc != ERROR_SUCCESS)
         goto end;
 
@@ -5046,7 +5083,7 @@
 static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
 {
     MSIPACKAGE *package = param;
-    LPCWSTR name, value, comp;
+    LPCWSTR name, value;
     LPWSTR data = NULL, newval = NULL;
     LPWSTR deformatted = NULL, ptr;
     DWORD flags, type, size;
@@ -5066,7 +5103,6 @@
 
     name = MSI_RecordGetString(rec, 2);
     value = MSI_RecordGetString(rec, 3);
-    comp = MSI_RecordGetString(rec, 4);
 
     res = env_set_flags(&name, &value, &flags);
     if (res != ERROR_SUCCESS)
@@ -5514,6 +5550,169 @@
         return ERROR_SUCCESS;
 
     rc = MSI_IterateRecords(view, NULL, ITERATE_MoveFiles, package);
+    msiobj_release(&view->hdr);
+
+    return rc;
+}
+
+static HRESULT (WINAPI *pCreateAssemblyCache)(IAssemblyCache **ppAsmCache,
+                                              DWORD dwReserved);
+static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR szDllName, LPCWSTR szVersion,
+                                          LPVOID pvReserved, HMODULE *phModDll);
+
+static BOOL init_functionpointers(void)
+{
+    HRESULT hr;
+    HMODULE hfusion;
+    HMODULE hmscoree;
+
+    static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0};
+
+    hmscoree = LoadLibraryA("mscoree.dll");
+    if (!hmscoree)
+    {
+        WARN("mscoree.dll not available\n");
+        return FALSE;
+    }
+
+    pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim");
+    if (!pLoadLibraryShim)
+    {
+        WARN("LoadLibraryShim not available\n");
+        FreeLibrary(hmscoree);
+        return FALSE;
+    }
+
+    hr = pLoadLibraryShim(szFusion, NULL, NULL, &hfusion);
+    if (FAILED(hr))
+    {
+        WARN("fusion.dll not available\n");
+        FreeLibrary(hmscoree);
+        return FALSE;
+    }
+
+    pCreateAssemblyCache = (void *)GetProcAddress(hfusion, "CreateAssemblyCache");
+
+    FreeLibrary(hmscoree);
+    return TRUE;
+}
+
+static UINT install_assembly(LPWSTR path)
+{
+    IAssemblyCache *cache;
+    HRESULT hr;
+    UINT r = ERROR_FUNCTION_FAILED;
+
+    if (!init_functionpointers() || !pCreateAssemblyCache)
+        return ERROR_FUNCTION_FAILED;
+
+    hr = pCreateAssemblyCache(&cache, 0);
+    if (FAILED(hr))
+        goto done;
+
+    hr = IAssemblyCache_InstallAssembly(cache, 0, path, NULL);
+    if (FAILED(hr))
+        ERR("Failed to install assembly: %s %08x\n", debugstr_w(path), hr);
+
+    r = ERROR_SUCCESS;
+
+done:
+    IAssemblyCache_Release(cache);
+    return r;
+}
+
+static UINT ITERATE_PublishAssembly( MSIRECORD *rec, LPVOID param )
+{
+    MSIPACKAGE *package = param;
+    MSICOMPONENT *comp;
+    MSIFEATURE *feature;
+    MSIFILE *file;
+    WCHAR path[MAX_PATH];
+    LPCWSTR app;
+    DWORD attr;
+    UINT r;
+
+    comp = get_loaded_component(package, MSI_RecordGetString(rec, 1));
+    if (!comp || !comp->Enabled ||
+        !(comp->Action & (INSTALLSTATE_LOCAL | INSTALLSTATE_SOURCE)))
+    {
+        ERR("Component not set for install, not publishing assembly\n");
+        return ERROR_SUCCESS;
+    }
+
+    feature = find_feature_by_name(package, MSI_RecordGetString(rec, 2));
+    if (feature)
+        msi_feature_set_state(feature, INSTALLSTATE_LOCAL);
+
+    if (MSI_RecordGetString(rec, 3))
+        FIXME("Manifest unhandled\n");
+
+    app = MSI_RecordGetString(rec, 4);
+    if (app)
+    {
+        FIXME("Assembly should be privately installed\n");
+        return ERROR_SUCCESS;
+    }
+
+    attr = MSI_RecordGetInteger(rec, 5);
+    if (attr == msidbAssemblyAttributesWin32)
+    {
+        FIXME("Win32 assemblies not handled\n");
+        return ERROR_SUCCESS;
+    }
+
+    /* FIXME: extract all files belonging to this component */
+    file = msi_find_file(package, comp->KeyPath);
+
+    GetTempPathW(MAX_PATH, path);
+
+    if (file->IsCompressed)
+    {
+        r = msi_extract_file(package, file, path);
+        if (r != ERROR_SUCCESS)
+        {
+            ERR("Failed to extract temporary assembly\n");
+            return r;
+        }
+
+        PathAddBackslashW(path);
+        lstrcatW(path, file->FileName);
+    }
+    else
+    {
+        PathAddBackslashW(path);
+        lstrcatW(path, file->FileName);
+
+        if (!CopyFileW(file->SourcePath, path, FALSE))
+        {
+            ERR("Failed to copy temporary assembly: %d\n", GetLastError());
+            return ERROR_FUNCTION_FAILED;
+        }
+    }
+
+    r = install_assembly(path);
+    if (r != ERROR_SUCCESS)
+        ERR("Failed to install assembly\n");
+
+    /* FIXME: write Installer assembly reg values */
+
+    return r;
+}
+
+static UINT ACTION_MsiPublishAssemblies( MSIPACKAGE *package )
+{
+    UINT rc;
+    MSIQUERY *view;
+
+    static const WCHAR ExecSeqQuery[] =
+        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+         '`','M','s','i','A','s','s','e','m','b','l','y','`',0};
+
+    rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
+    if (rc != ERROR_SUCCESS)
+        return ERROR_SUCCESS;
+
+    rc = MSI_IterateRecords(view, NULL, ITERATE_PublishAssembly, package);
     msiobj_release(&view->hdr);
 
     return rc;
@@ -5605,13 +5804,6 @@
     static const WCHAR table[] = {
         'E','n','v','i','r','o','n','m','e','n','t',0 };
     return msi_unimplemented_action_stub( package, "RemoveEnvironmentStrings", table );
-}
-
-static UINT ACTION_MsiPublishAssemblies( MSIPACKAGE *package )
-{
-    static const WCHAR table[] = {
-        'M','s','i','A','s','s','e','m','b','l','y',0 };
-    return msi_unimplemented_action_stub( package, "MsiPublishAssemblies", table );
 }
 
 static UINT ACTION_MsiUnpublishAssemblies( MSIPACKAGE *package )

Modified: trunk/reactos/dll/win32/msi/classes.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/classes.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/classes.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/classes.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -971,6 +971,8 @@
     {
         if (progid->Class)
             return progid->Class->clsid;
+        if (progid->Parent == progid)
+            break;
         progid = progid->Parent;
     }
     return NULL;

Modified: trunk/reactos/dll/win32/msi/cond.tab.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/cond.tab.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/cond.tab.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/cond.tab.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -218,13 +218,13 @@
 static const WCHAR szEmpty[] = { 0 };
 
 static INT compare_int( INT a, INT operator, INT b );
-static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b );
-
-static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b )
+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert );
+
+static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert )
 {
     INT r;
 
-    r = compare_string( a, op, b );
+    r = compare_string( a, op, b, convert );
     msi_free( a );
     msi_free( b );
     return r;
@@ -538,8 +538,8 @@
      175,   182,   186,   190,   195,   199,   208,   217,   221,   225,
      229,   233,   238,   243,   251,   252,   253,   254,   255,   256,
      257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-     267,   268,   272,   276,   283,   292,   296,   305,   314,   323,
-     335,   342,   356,   365
+     267,   268,   272,   276,   283,   292,   296,   305,   314,   327,
+     339,   346,   360,   369
 };
 #endif
 
@@ -1467,28 +1467,28 @@
   case 17:
 #line 218 "cond.y"
     {
-            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
         ;}
     break;
 
   case 18:
 #line 222 "cond.y"
     {
-            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
         ;}
     break;
 
   case 19:
 #line 226 "cond.y"
     {
-            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
         ;}
     break;
 
   case 20:
 #line 230 "cond.y"
     {
-            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), FALSE );
         ;}
     break;
 
@@ -1666,13 +1666,17 @@
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
             MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-            (yyval.value) = action;
+            if (action == INSTALLSTATE_UNKNOWN)
+                (yyval.value) = MSICONDITION_FALSE;
+            else
+                (yyval.value) = action;
+
             msi_free( (yyvsp[0].string) );
         ;}
     break;
 
   case 49:
-#line 324 "cond.y"
+#line 328 "cond.y"
     {
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
@@ -1684,7 +1688,7 @@
     break;
 
   case 50:
-#line 336 "cond.y"
+#line 340 "cond.y"
     {
             COND_input* cond = (COND_input*) info;
 
@@ -1694,7 +1698,7 @@
     break;
 
   case 51:
-#line 343 "cond.y"
+#line 347 "cond.y"
     {
             UINT len = GetEnvironmentVariableW( (yyvsp[0].string), NULL, 0 );
             (yyval.string) = NULL;
@@ -1708,7 +1712,7 @@
     break;
 
   case 52:
-#line 357 "cond.y"
+#line 361 "cond.y"
     {
             (yyval.string) = COND_GetString(&(yyvsp[0].str));
             if( !(yyval.string) )
@@ -1717,7 +1721,7 @@
     break;
 
   case 53:
-#line 366 "cond.y"
+#line 370 "cond.y"
     {
             LPWSTR szNum = COND_GetString(&(yyvsp[0].str));
             if( !szNum )
@@ -1732,7 +1736,7 @@
     }
 
 /* Line 1126 of yacc.c.  */
-#line 1736 "cond.tab.c"
+#line 1740 "cond.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -2000,7 +2004,7 @@
 }
 
 
-#line 375 "cond.y"
+#line 379 "cond.y"
 
 
 
@@ -2032,6 +2036,9 @@
 static BOOL str_is_number( LPCWSTR str )
 {
     int i;
+
+    if (!*str)
+        return FALSE;
 
     for (i = 0; i < lstrlenW( str ); i++)
         if (!isdigitW(str[i]))
@@ -2079,7 +2086,7 @@
     return 0;
 }
 
-static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b )
+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
 {
     if (operator >= COND_SS && operator <= COND_RHS)
         return compare_substring( a, operator, b );
@@ -2087,6 +2094,9 @@
     /* null and empty string are equivalent */
     if (!a) a = szEmpty;
     if (!b) b = szEmpty;
+
+    if (convert && str_is_number(a) && str_is_number(b))
+        return compare_int( atoiW(a), operator, atoiW(b) );
 
     /* a or b may be NULL */
     switch (operator)

Modified: trunk/reactos/dll/win32/msi/cond.y
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/cond.y?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/cond.y [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/cond.y [iso-8859-1] Sat May 17 14:46:01 2008
@@ -67,13 +67,13 @@
 static const WCHAR szEmpty[] = { 0 };
 
 static INT compare_int( INT a, INT operator, INT b );
-static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b );
-
-static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b )
+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert );
+
+static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert )
 {
     INT r;
 
-    r = compare_string( a, op, b );
+    r = compare_string( a, op, b, convert );
     msi_free( a );
     msi_free( b );
     return r;
@@ -216,19 +216,19 @@
         }
   | symbol_s operator symbol_s
         {
-            $$ = compare_and_free_strings( $1, $2, $3 );
+            $$ = compare_and_free_strings( $1, $2, $3, TRUE );
         }
   | symbol_s operator literal
         {
-            $$ = compare_and_free_strings( $1, $2, $3 );
+            $$ = compare_and_free_strings( $1, $2, $3, TRUE );
         }
   | literal operator symbol_s
         {
-            $$ = compare_and_free_strings( $1, $2, $3 );
+            $$ = compare_and_free_strings( $1, $2, $3, TRUE );
         }
   | literal operator literal
         {
-            $$ = compare_and_free_strings( $1, $2, $3 );
+            $$ = compare_and_free_strings( $1, $2, $3, FALSE );
         }
   | literal operator value_i
         {
@@ -408,6 +408,9 @@
 {
     int i;
 
+    if (!*str)
+        return FALSE;
+
     for (i = 0; i < lstrlenW( str ); i++)
         if (!isdigitW(str[i]))
             return FALSE;
@@ -454,7 +457,7 @@
     return 0;
 }
 
-static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b )
+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
 {
     if (operator >= COND_SS && operator <= COND_RHS)
         return compare_substring( a, operator, b );
@@ -462,6 +465,9 @@
     /* null and empty string are equivalent */
     if (!a) a = szEmpty;
     if (!b) b = szEmpty;
+
+    if (convert && str_is_number(a) && str_is_number(b))
+        return compare_int( atoiW(a), operator, atoiW(b) );
 
     /* a or b may be NULL */
     switch (operator)

Modified: trunk/reactos/dll/win32/msi/custom.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/custom.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/custom.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/custom.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -17,6 +17,9 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+
+#include "config.h"
+#include "wine/port.h"
 
 #define COBJMACROS
 

Modified: trunk/reactos/dll/win32/msi/dialog.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/dialog.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/dialog.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/dialog.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -2055,7 +2055,8 @@
     LPNMTREEVIEWW tv = (LPNMTREEVIEWW)param;
     MSIRECORD *row, *rec;
     MSIFOLDER *folder;
-    LPCWSTR dir;
+    MSIFEATURE *feature;
+    LPCWSTR dir, title = NULL;
     UINT r = ERROR_SUCCESS;
 
     static const WCHAR select[] = {
@@ -2069,7 +2070,16 @@
 
     info->selected = tv->itemNew.hItem;
 
-    row = MSI_QueryGetRecord( dialog->package->db, select, tv->itemNew.pszText );
+    if (!(tv->itemNew.mask & TVIF_TEXT))
+    {
+        feature = msi_seltree_feature_from_item( control->hwnd, tv->itemNew.hItem );
+        if (feature)
+            title = feature->Title;
+    }
+    else
+        title = tv->itemNew.pszText;
+
+    row = MSI_QueryGetRecord( dialog->package->db, select, title );
     if (!row)
         return ERROR_FUNCTION_FAILED;
 
@@ -3472,6 +3482,9 @@
 
     TRACE("%p %s\n", package, debugstr_w(szDialogName));
 
+    if (!hMsiHiddenWindow)
+        msi_dialog_register_class();
+
     /* allocate the structure for the dialog to use */
     dialog = msi_alloc_zero( sizeof *dialog + sizeof(WCHAR)*strlenW(szDialogName) );
     if( !dialog )

Modified: trunk/reactos/dll/win32/msi/files.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/files.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/files.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/files.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -57,20 +57,7 @@
 
 static const WCHAR cszTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0};
 
-struct media_info {
-    UINT disk_id;
-    UINT type;
-    UINT last_sequence;
-    LPWSTR disk_prompt;
-    LPWSTR cabinet;
-    LPWSTR first_volume;
-    LPWSTR volume_label;
-    BOOL is_continuous;
-    BOOL is_extracted;
-    WCHAR source[MAX_PATH];
-};
-
-static BOOL source_matches_volume(struct media_info *mi, LPWSTR source_root)
+static BOOL source_matches_volume(MSIMEDIAINFO *mi, LPWSTR source_root)
 {
     WCHAR volume_name[MAX_PATH + 1];
 
@@ -84,7 +71,7 @@
     return !lstrcmpW(mi->volume_label, volume_name);
 }
 
-static UINT msi_change_media( MSIPACKAGE *package, struct media_info *mi )
+static UINT msi_change_media( MSIPACKAGE *package, MSIMEDIAINFO *mi )
 {
     LPSTR msg;
     LPWSTR error, error_dialog;
@@ -169,7 +156,7 @@
 typedef struct
 {
     MSIPACKAGE* package;
-    struct media_info *mi;
+    MSIMEDIAINFO *mi;
 } CabData;
 
 static void * cabinet_alloc(ULONG cb)
@@ -265,7 +252,7 @@
     ui_progress( package, 2, f->FileSize, 0, 0);
 }
 
-static UINT msi_media_get_disk_info( MSIPACKAGE *package, struct media_info *mi )
+static UINT msi_media_get_disk_info( MSIPACKAGE *package, MSIMEDIAINFO *mi )
 {
     MSIRECORD *row;
     LPWSTR ptr;
@@ -311,7 +298,7 @@
     case fdintNEXT_CABINET:
     {
         CabData *data = (CabData *)pfdin->pv;
-        struct media_info *mi = data->mi;
+        MSIMEDIAINFO *mi = data->mi;
         LPWSTR cab = strdupAtoW(pfdin->psz1);
         UINT rc;
 
@@ -423,18 +410,18 @@
 }
 
 /***********************************************************************
- *            extract_cabinet_file
+ *            msi_cabextract
  *
  * Extract files from a cab file.
  */
-static BOOL extract_cabinet_file(MSIPACKAGE* package, struct media_info *mi)
+BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi,
+                    PFNFDINOTIFY notify, LPVOID data)
 {
     LPSTR cabinet, cab_path = NULL;
     LPWSTR ptr;
     HFDI hfdi;
     ERF erf;
     BOOL ret = FALSE;
-    CabData data;
 
     TRACE("Extracting %s\n", debugstr_w(mi->source));
 
@@ -457,10 +444,7 @@
 
     cab_path[ptr - mi->source] = '\0';
 
-    data.package = package;
-    data.mi = mi;
-
-    ret = FDICopy(hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, &data);
+    ret = FDICopy(hfdi, cabinet, cab_path, 0, notify, NULL, data);
     if (!ret)
         ERR("FDICopy failed\n");
 
@@ -495,7 +479,7 @@
         file->SourcePath = build_directory_name(2, path, file->File);
 }
 
-static void free_media_info( struct media_info *mi )
+void msi_free_media_info( MSIMEDIAINFO *mi )
 {
     msi_free( mi->disk_prompt );
     msi_free( mi->cabinet );
@@ -504,7 +488,7 @@
     msi_free( mi );
 }
 
-static UINT load_media_info(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
+UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
 {
     MSIRECORD *row;
     LPWSTR source_dir;
@@ -581,11 +565,11 @@
     }
 
     if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
-        msi_package_add_media_disk(package, MSIINSTALLCONTEXT_USERUNMANAGED,
+        msi_package_add_media_disk(package, package->Context,
                                    MSICODE_PRODUCT, mi->disk_id,
                                    mi->volume_label, mi->disk_prompt);
 
-    msi_package_add_info(package, MSIINSTALLCONTEXT_USERUNMANAGED,
+    msi_package_add_info(package, package->Context,
                          options, INSTALLPROPERTY_LASTUSEDSOURCEW, source);
 
     msi_free(source_dir);
@@ -593,7 +577,7 @@
 }
 
 /* FIXME: search NETWORK and URL sources as well */
-static UINT find_published_source(MSIPACKAGE *package, struct media_info *mi)
+static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
 {
     WCHAR source[MAX_PATH];
     WCHAR volume[MAX_PATH];
@@ -603,7 +587,7 @@
     UINT r;
 
     r = MsiSourceListGetInfoW(package->ProductCode, NULL,
-                              MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT,
+                              package->Context, MSICODE_PRODUCT,
                               INSTALLPROPERTY_LASTUSEDSOURCEW, source, &size);
     if (r != ERROR_SUCCESS)
         return r;
@@ -612,7 +596,7 @@
     volumesz = MAX_PATH;
     promptsz = MAX_PATH;
     while (MsiSourceListEnumMediaDisksW(package->ProductCode, NULL,
-                                        MSIINSTALLCONTEXT_USERUNMANAGED,
+                                        package->Context,
                                         MSICODE_PRODUCT, index++, &id,
                                         volume, &volumesz, prompt, &promptsz) == ERROR_SUCCESS)
     {
@@ -634,7 +618,7 @@
     return ERROR_FUNCTION_FAILED;
 }
 
-static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, struct media_info *mi)
+static UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
 {
     UINT rc = ERROR_SUCCESS;
 
@@ -642,7 +626,7 @@
     if (mi->is_continuous)
         return ERROR_SUCCESS;
 
-    rc = load_media_info(package, file, mi);
+    rc = msi_load_media_info(package, file, mi);
     if (rc != ERROR_SUCCESS)
     {
         ERR("Unable to load media info\n");
@@ -808,7 +792,7 @@
  */
 UINT ACTION_InstallFiles(MSIPACKAGE *package)
 {
-    struct media_info *mi;
+    MSIMEDIAINFO *mi;
     UINT rc = ERROR_SUCCESS;
     MSIFILE *file;
 
@@ -825,7 +809,7 @@
      */
     msi_create_component_directories( package );
 
-    mi = msi_alloc_zero( sizeof(struct media_info) );
+    mi = msi_alloc_zero( sizeof(MSIMEDIAINFO) );
 
     LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
     {
@@ -841,6 +825,8 @@
         if (file->Sequence > mi->last_sequence || mi->is_continuous ||
             (file->IsCompressed && !mi->is_extracted))
         {
+            CabData data;
+
             rc = ready_media(package, file, mi);
             if (rc != ERROR_SUCCESS)
             {
@@ -848,7 +834,11 @@
                 break;
             }
 
-            if (file->IsCompressed && !extract_cabinet_file(package, mi))
+            data.mi = mi;
+            data.package = package;
+
+            if (file->IsCompressed &&
+                !msi_cabextract(package, mi, cabinet_notify, &data))
             {
                 ERR("Failed to extract cabinet: %s\n", debugstr_w(mi->cabinet));
                 rc = ERROR_FUNCTION_FAILED;
@@ -881,7 +871,7 @@
         }
     }
 
-    free_media_info( mi );
+    msi_free_media_info( mi );
     return rc;
 }
 

Modified: trunk/reactos/dll/win32/msi/format.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/format.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/format.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/format.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -921,28 +921,13 @@
         HRESULT hr;
         IWineMsiRemotePackage *remote_package;
         BSTR value = NULL;
-        DWORD len;
         awstring wstr;
 
         remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
         if (remote_package)
         {
-            len = 0;
             hr = IWineMsiRemotePackage_FormatRecord( remote_package, hRecord,
-                                                     NULL, &len );
-            if (FAILED(hr))
-                goto done;
-
-            len++;
-            value = SysAllocStringLen( NULL, len );
-            if (!value)
-            {
-                r = ERROR_OUTOFMEMORY;
-                goto done;
-            }
-
-            hr = IWineMsiRemotePackage_FormatRecord( remote_package, hRecord,
-                                                     value, &len );
+                                                     &value );
             if (FAILED(hr))
                 goto done;
 

Modified: trunk/reactos/dll/win32/msi/helpers.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/helpers.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/helpers.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/helpers.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -19,7 +19,7 @@
  */
 
 /*
- * Here are helper functions formally in action.c that are used by a variaty of
+ * Here are helper functions formally in action.c that are used by a variety of
  * actions and functions.
  */
 
@@ -31,6 +31,8 @@
 #include "wine/debug.h"
 #include "msipriv.h"
 #include "winuser.h"
+#include "winreg.h"
+#include "shlwapi.h"
 #include "wine/unicode.h"
 #include "msidefs.h"
 
@@ -885,7 +887,7 @@
     return output;
 }
 
-/* update compoennt state based on a feature change */
+/* update component state based on a feature change */
 void ACTION_UpdateComponentStates(MSIPACKAGE *package, LPCWSTR szFeature)
 {
     INSTALLSTATE newstate;
@@ -1054,3 +1056,122 @@
 
     MessageBoxW( NULL, text, title, type );
 }
+
+typedef struct
+{
+    MSIPACKAGE *package;
+    MSIMEDIAINFO *mi;
+    MSIFILE *file;
+    LPWSTR destination;
+} CabData;
+
+static INT_PTR cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
+{
+    TRACE("(%d)\n", fdint);
+
+    switch (fdint)
+    {
+    case fdintNEXT_CABINET:
+    {
+        ERR("continuous cabinets not handled\n");
+        return 0;
+    }
+
+    case fdintCOPY_FILE:
+    {
+        CabData *data = (CabData*) pfdin->pv;
+        LPWSTR file, path;
+        DWORD attrs, size;
+        HANDLE handle;
+        MSIFILE *f;
+
+        file = strdupAtoW(pfdin->psz1);
+        f = get_loaded_file(data->package, file);
+        msi_free(file);
+
+        if (!f)
+        {
+            WARN("unknown file in cabinet (%s)\n",debugstr_a(pfdin->psz1));
+            return 0;
+        }
+
+        if (lstrcmpW(f->File, data->file->File))
+            return 0;
+
+        size = lstrlenW(data->destination) + lstrlenW(data->file->FileName) + 2;
+        path = msi_alloc(size * sizeof(WCHAR));
+        lstrcpyW(path, data->destination);
+        PathAddBackslashW(path);
+        lstrcatW(path, data->file->FileName);
+
+        TRACE("extracting %s\n", debugstr_w(path));
+
+        attrs = f->Attributes & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM);
+        if (!attrs) attrs = FILE_ATTRIBUTE_NORMAL;
+
+        handle = CreateFileW(path, GENERIC_READ | GENERIC_WRITE, 0,
+                             NULL, CREATE_ALWAYS, attrs, NULL);
+        if (handle == INVALID_HANDLE_VALUE)
+        {
+            if (GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES)
+                ERR("failed to create %s (error %d)\n",
+                    debugstr_w(path), GetLastError());
+
+            msi_free(path);
+            return 0;
+        }
+
+        msi_free(path);
+        return (INT_PTR)handle;
+    }
+
+    case fdintCLOSE_FILE_INFO:
+    {
+        FILETIME ft;
+        FILETIME ftLocal;
+        HANDLE handle = (HANDLE)pfdin->hf;
+
+        if (!DosDateTimeToFileTime(pfdin->date, pfdin->time, &ft))
+            return -1;
+        if (!LocalFileTimeToFileTime(&ft, &ftLocal))
+            return -1;
+        if (!SetFileTime(handle, &ftLocal, 0, &ftLocal))
+            return -1;
+        CloseHandle(handle);
+        return 1;
+    }
+
+    default:
+        return 0;
+    }
+}
+
+UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir)
+{
+    MSIMEDIAINFO *mi;
+    CabData data;
+    UINT r;
+
+    mi = msi_alloc_zero(sizeof(MSIMEDIAINFO));
+    if (!mi)
+        return ERROR_OUTOFMEMORY;
+
+    r = msi_load_media_info(package, file, mi);
+    if (r != ERROR_SUCCESS)
+        goto done;
+
+    data.package = package;
+    data.mi = mi;
+    data.file = file;
+    data.destination = destdir;
+
+    if (!msi_cabextract(package, mi, cabinet_notify, &data))
+    {
+        ERR("Failed to extract cabinet file\n");
+        r = ERROR_FUNCTION_FAILED;
+    }
+
+done:
+    msi_free_media_info(mi);
+    return r;
+}

Modified: trunk/reactos/dll/win32/msi/install.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/install.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/install.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/install.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -1169,15 +1169,16 @@
 
     TRACE("%p %i\n", package, iInstallLevel);
 
-    if (iInstallLevel<1 || iInstallLevel>32767)
+    if (iInstallLevel > 32767)
         return ERROR_INVALID_PARAMETER;
+
+    if (iInstallLevel < 1)
+        return MSI_SetFeatureStates( package );
 
     sprintfW( level, fmt, iInstallLevel );
     r = MSI_SetPropertyW( package, szInstallLevel, level );
     if ( r == ERROR_SUCCESS )
-    {
         r = MSI_SetFeatureStates( package );
-    }
 
     return r;
 }

Modified: trunk/reactos/dll/win32/msi/msi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -630,7 +630,7 @@
     if (classes)
         MSIREG_OpenLocalSystemProductKey(szProduct, &userdata, FALSE);
     else
-        MSIREG_OpenInstallPropertiesKey(szProduct, &userdata, FALSE);
+        MSIREG_OpenCurrentUserInstallProps(szProduct, &userdata, FALSE);
 
     if (!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPLINKW) ||
         !lstrcmpW(szAttribute, INSTALLPROPERTY_HELPTELEPHONEW) ||
@@ -939,7 +939,7 @@
     if (dwContext == MSIINSTALLCONTEXT_USERUNMANAGED)
     {
         package = INSTALLPROPERTY_LOCALPACKAGEW;
-        MSIREG_OpenInstallPropertiesKey(szProductCode, &props, FALSE);
+        MSIREG_OpenCurrentUserInstallProps(szProductCode, &props, FALSE);
 
         if (!props && !prod)
             goto done;
@@ -947,7 +947,7 @@
     else if (dwContext == MSIINSTALLCONTEXT_USERMANAGED)
     {
         package = managed_local_package;
-        MSIREG_OpenInstallPropertiesKey(szProductCode, &props, FALSE);
+        MSIREG_OpenCurrentUserInstallProps(szProductCode, &props, FALSE);
 
         if (!props && !managed)
             goto done;
@@ -1066,7 +1066,7 @@
         if (!prod && !classes)
             goto done;
 
-        /* FIME */
+        /* FIXME */
         val = strdupW(empty);
         r = msi_copy_outval(val, szValue, pcchValue);
     }
@@ -1197,7 +1197,7 @@
     if (context == MSIINSTALLCONTEXT_MACHINE)
         r = MSIREG_OpenLocalSystemProductKey(prodcode, &hkey, FALSE);
     else
-        r = MSIREG_OpenInstallPropertiesKey(prodcode, &hkey, FALSE);
+        r = MSIREG_OpenCurrentUserInstallProps(prodcode, &hkey, FALSE);
 
     if (r != ERROR_SUCCESS)
         return FALSE;
@@ -1303,57 +1303,67 @@
 
 INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct)
 {
-    UINT rc;
-    INSTALLSTATE state = INSTALLSTATE_UNKNOWN;
-    HKEY hkey = 0, props = 0;
-    DWORD sz;
-    BOOL userkey_exists = FALSE;
-
-    static const int GUID_LEN = 38;
-    static const WCHAR szInstallProperties[] = {
-            'I','n','s','t','a','l','l','P','r','o','p','e','r','t','i','e','s',0
-    };
+    INSTALLSTATE state = INSTALLSTATE_ADVERTISED;
+    HKEY prodkey = 0, userdata = 0;
+    BOOL user = TRUE;
+    DWORD val;
+    UINT r;
+
     static const WCHAR szWindowsInstaller[] = {
-            'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0
-    };
+        'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0};
 
     TRACE("%s\n", debugstr_w(szProduct));
 
-    if (!szProduct || !*szProduct || lstrlenW(szProduct) != GUID_LEN)
+    if (!szProduct || !*szProduct)
         return INSTALLSTATE_INVALIDARG;
 
-    rc = MSIREG_OpenUserProductsKey(szProduct,&hkey,FALSE);
-    if (rc == ERROR_SUCCESS)
-    {
-        userkey_exists = TRUE;
-        state = INSTALLSTATE_ADVERTISED;
-        RegCloseKey(hkey);
-    }
-
-    rc = MSIREG_OpenUserDataProductKey(szProduct,&hkey,FALSE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    rc = RegOpenKeyW(hkey, szInstallProperties, &props);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    sz = sizeof(state);
-    rc = RegQueryValueExW(props,szWindowsInstaller,NULL,NULL,(LPVOID)&state, &sz);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    if (state)
+    if (lstrlenW(szProduct) != GUID_SIZE - 1)
+        return INSTALLSTATE_INVALIDARG;
+
+    r = MSIREG_OpenLocalManagedProductKey(szProduct, &prodkey, FALSE);
+    if (r != ERROR_SUCCESS)
+    {
+        r = MSIREG_OpenUserProductsKey(szProduct, &prodkey, FALSE);
+        if (r != ERROR_SUCCESS)
+        {
+            r = MSIREG_OpenLocalClassesProductKey(szProduct, &prodkey, FALSE);
+            if (r == ERROR_SUCCESS)
+               user = FALSE;
+        }
+    }
+
+    if (user)
+    {
+        r = MSIREG_OpenCurrentUserInstallProps(szProduct, &userdata, FALSE);
+        if (r != ERROR_SUCCESS)
+            goto done;
+    }
+    else
+    {
+        r = MSIREG_OpenLocalSystemInstallProps(szProduct, &userdata, FALSE);
+        if (r != ERROR_SUCCESS)
+            goto done;
+    }
+
+    if (!msi_reg_get_val_dword(userdata, szWindowsInstaller, &val))
+        goto done;
+
+    if (val)
         state = INSTALLSTATE_DEFAULT;
     else
         state = INSTALLSTATE_UNKNOWN;
 
-    if (state == INSTALLSTATE_DEFAULT && !userkey_exists)
-        state = INSTALLSTATE_ABSENT;
-
-end:
-    RegCloseKey(props);
-    RegCloseKey(hkey);
+done:
+    if (!prodkey)
+    {
+        state = INSTALLSTATE_UNKNOWN;
+
+        if (userdata)
+            state = INSTALLSTATE_ABSENT;
+    }
+
+    RegCloseKey(prodkey);
+    RegCloseKey(userdata);
     return state;
 }
 
@@ -1786,7 +1796,7 @@
  *   szFeature     [I]  Feature's GUID string
  *
  * RETURNS
- *   INSTALLSTATE_LOCAL        Feature is installed and useable
+ *   INSTALLSTATE_LOCAL        Feature is installed and usable
  *   INSTALLSTATE_ABSENT       Feature is absent
  *   INSTALLSTATE_ADVERTISED   Feature should be installed on demand
  *   INSTALLSTATE_UNKNOWN      An error occurred

Modified: trunk/reactos/dll/win32/msi/msi.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi.rbuild?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi.rbuild [iso-8859-1] Sat May 17 14:46:01 2008
@@ -54,6 +54,7 @@
 	<include base="msi" root="intermediate">.</include>
 	<file>msi.spec</file>
 	<library>wine</library>
+	<library>uuid</library>
 	<library>urlmon</library>
 	<library>wininet</library>
 	<library>comctl32</library>
@@ -68,15 +69,14 @@
 	<library>advapi32</library>
 	<library>kernel32</library>
 	<library>odbccp32</library>
-	<library>uuid</library>
 	<library>ntdll</library>
-	<dependency>msiserver</dependency>
-	<dependency>msiheader</dependency>
+	<dependency>msi_msiserver_typelib</dependency>
+	<dependency>msi_msiserver_header</dependency>
 </module>
-<module name="msiserver" type="embeddedtypelib" allowwarnings="true">
+<module name="msi_msiserver_header" type="idlheader">
 	<file>msiserver.idl</file>
 </module>
-<module name="msiheader" type="idlheader">
+<module name="msi_msiserver_typelib" type="embeddedtypelib" allowwarnings="true">
 	<file>msiserver.idl</file>
 </module>
 </group>

Modified: trunk/reactos/dll/win32/msi/msi.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi.rc?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi.rc [iso-8859-1] Sat May 17 14:46:01 2008
@@ -28,6 +28,7 @@
 #include "version.rc"
 
 #include "msi_Bg.rc"
+#include "msi_Da.rc"
 #include "msi_De.rc"
 #include "msi_En.rc"
 #include "msi_Eo.rc"
@@ -42,11 +43,13 @@
 #include "msi_Pl.rc"
 #include "msi_Pt.rc"
 #include "msi_Ru.rc"
+#include "msi_Si.rc"
 #include "msi_Sv.rc"
 #include "msi_Tr.rc"
 
 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
 
+/* @makedep: msiserver.tlb */
 1 TYPELIB LOADONCALL DISCARDABLE msiserver.tlb
 
 /* @makedep: instadvert.bmp */

Added: trunk/reactos/dll/win32/msi/msi_Da.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi_Da.rc?rev=33558&view=auto
==============================================================================
--- trunk/reactos/dll/win32/msi/msi_Da.rc (added)
+++ trunk/reactos/dll/win32/msi/msi_Da.rc [iso-8859-1] Sat May 17 14:46:01 2008
@@ -1,0 +1,34 @@
+/*
+ * Danish language support
+ *
+ * Copyright (C) 2008 Jens Albretsen <jens at albretsen.dk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+	4 "Kunne ikke åbne den specificerede installationspakke. Kontroller stien og prøv igen."
+	5 "kunne ikke finden stien '%s'."
+	9 "indsæt disk '%s'"
+	10 "forkerte parametere."
+	11 "angiv kataloget som indeholder '%s'."
+	12 "featurens installationskilde mangler."
+        13 "featurens netværksdrev mangler."
+        14 "feature fra:"
+	15 "Vælg kataloget som indeholder '%s'."
+}

Propchange: trunk/reactos/dll/win32/msi/msi_Da.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/msi/msi_Si.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi_Si.rc?rev=33558&view=auto
==============================================================================
--- trunk/reactos/dll/win32/msi/msi_Si.rc (added)
+++ trunk/reactos/dll/win32/msi/msi_Si.rc [iso-8859-1] Sat May 17 14:46:01 2008
@@ -1,0 +1,38 @@
+/*
+ * Slovenian resources for MSI
+ *
+ * Copyright 2008 Rok Mandeljc
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#pragma code_page(65001)
+
+LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+{
+	4 "Navedenega namestitvenega paketa ni mogoče odpreti. Preverite ime datoteke in poskusite znova."
+	5 "pot %s ne obstaja"
+	9 "vnesite disk %s"
+	10 "neveljavni parametri"
+	11 "vnesite ime mape, ki vsebuje %s"
+	12 "manjkajoč namestitveni vir za namestitev funkcije"
+	13 "manjkajoč omrežni pogon za namestitev funkcijo"
+	14 "funkcija z:"
+	15 "izberite mapo, ki vsebuje %s"
+}
+
+#pragma code_page(default)

Propchange: trunk/reactos/dll/win32/msi/msi_Si.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/msi/msi_main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi_main.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi_main.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi_main.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -72,7 +72,6 @@
     case DLL_PROCESS_ATTACH:
         msi_hInstance = hinstDLL;
         DisableThreadLibraryCalls(hinstDLL);
-        msi_dialog_register_class();
         break;
     case DLL_PROCESS_DETACH:
         if (msi_typelib) ITypeLib_Release( msi_typelib );

Modified: trunk/reactos/dll/win32/msi/msi_ros.diff
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi_ros.diff?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi_ros.diff [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi_ros.diff [iso-8859-1] Sat May 17 14:46:01 2008
@@ -2,7 +2,7 @@
 ===================================================================
 --- cond.tab.c	(revision 31639)
 +++ cond.tab.c	(working copy)
-@@ -0,0 +1,2429 @@
+@@ -0,0 +1,2439 @@
 +/* A Bison parser, made by GNU Bison 2.1.  */
 +
 +/* Skeleton parser for Yacc-like parsing with Bison,
@@ -223,13 +223,13 @@
 +static const WCHAR szEmpty[] = { 0 };
 +
 +static INT compare_int( INT a, INT operator, INT b );
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b );
-+
-+static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b )
++static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert );
++
++static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert )
 +{
 +    INT r;
 +
-+    r = compare_string( a, op, b );
++    r = compare_string( a, op, b, convert );
 +    msi_free( a );
 +    msi_free( b );
 +    return r;
@@ -543,8 +543,8 @@
 +     175,   182,   186,   190,   195,   199,   208,   217,   221,   225,
 +     229,   233,   238,   243,   251,   252,   253,   254,   255,   256,
 +     257,   258,   259,   260,   261,   262,   263,   264,   265,   266,
-+     267,   268,   272,   276,   283,   292,   296,   305,   314,   323,
-+     335,   342,   356,   365
++     267,   268,   272,   276,   283,   292,   296,   305,   314,   327,
++     339,   346,   360,   369
 +};
 +#endif
 +
@@ -1472,28 +1472,28 @@
 +  case 17:
 +#line 218 "cond.y"
 +    {
-+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
++            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
 +        ;}
 +    break;
 +
 +  case 18:
 +#line 222 "cond.y"
 +    {
-+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
++            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
 +        ;}
 +    break;
 +
 +  case 19:
 +#line 226 "cond.y"
 +    {
-+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
++            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
 +        ;}
 +    break;
 +
 +  case 20:
 +#line 230 "cond.y"
 +    {
-+            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string) );
++            (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), FALSE );
 +        ;}
 +    break;
 +
@@ -1671,13 +1671,17 @@
 +            INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
 +      
 +            MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-+            (yyval.value) = action;
++            if (action == INSTALLSTATE_UNKNOWN)
++                (yyval.value) = MSICONDITION_FALSE;
++            else
++                (yyval.value) = action;
++
 +            msi_free( (yyvsp[0].string) );
 +        ;}
 +    break;
 +
 +  case 49:
-+#line 324 "cond.y"
++#line 328 "cond.y"
 +    {
 +            COND_input* cond = (COND_input*) info;
 +            INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
@@ -1689,7 +1693,7 @@
 +    break;
 +
 +  case 50:
-+#line 336 "cond.y"
++#line 340 "cond.y"
 +    {
 +            COND_input* cond = (COND_input*) info;
 +
@@ -1699,7 +1703,7 @@
 +    break;
 +
 +  case 51:
-+#line 343 "cond.y"
++#line 347 "cond.y"
 +    {
 +            UINT len = GetEnvironmentVariableW( (yyvsp[0].string), NULL, 0 );
 +            (yyval.string) = NULL;
@@ -1713,7 +1717,7 @@
 +    break;
 +
 +  case 52:
-+#line 357 "cond.y"
++#line 361 "cond.y"
 +    {
 +            (yyval.string) = COND_GetString(&(yyvsp[0].str));
 +            if( !(yyval.string) )
@@ -1722,7 +1726,7 @@
 +    break;
 +
 +  case 53:
-+#line 366 "cond.y"
++#line 370 "cond.y"
 +    {
 +            LPWSTR szNum = COND_GetString(&(yyvsp[0].str));
 +            if( !szNum )
@@ -1737,7 +1741,7 @@
 +    }
 +
 +/* Line 1126 of yacc.c.  */
-+#line 1736 "cond.tab.c"
++#line 1740 "cond.tab.c"
 +
 +  yyvsp -= yylen;
 +  yyssp -= yylen;
@@ -2005,7 +2009,7 @@
 +}
 +
 +
-+#line 375 "cond.y"
++#line 379 "cond.y"
 +
 +
 +
@@ -2037,6 +2041,9 @@
 +static BOOL str_is_number( LPCWSTR str )
 +{
 +    int i;
++
++    if (!*str)
++        return FALSE;
 +
 +    for (i = 0; i < lstrlenW( str ); i++)
 +        if (!isdigitW(str[i]))
@@ -2084,7 +2091,7 @@
 +    return 0;
 +}
 +
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b )
++static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
 +{
 +    if (operator >= COND_SS && operator <= COND_RHS)
 +        return compare_substring( a, operator, b );
@@ -2092,6 +2099,9 @@
 +    /* null and empty string are equivalent */
 +    if (!a) a = szEmpty;
 +    if (!b) b = szEmpty;
++
++    if (convert && str_is_number(a) && str_is_number(b))
++        return compare_int( atoiW(a), operator, atoiW(b) );
 +
 +    /* a or b may be NULL */
 +    switch (operator)
@@ -2623,7 +2633,7 @@
 ===================================================================
 --- sql.tab.c	(revision 31639)
 +++ sql.tab.c	(working copy)
-@@ -0,0 +1,2580 @@
+@@ -0,0 +1,2579 @@
 +/* A Bison parser, made by GNU Bison 2.1.  */
 +
 +/* Skeleton parser for Yacc-like parsing with Bison,
@@ -3188,13 +3198,13 @@
 +static const unsigned short int yyrline[] =
 +{
 +       0,   124,   124,   132,   133,   134,   135,   136,   137,   141,
-+     152,   165,   177,   192,   202,   215,   228,   238,   248,   261,
-+     265,   272,   282,   292,   299,   308,   312,   316,   323,   327,
-+     334,   338,   342,   346,   350,   354,   358,   365,   374,   387,
-+     391,   395,   411,   432,   433,   437,   444,   445,   461,   471,
-+     484,   489,   498,   504,   510,   516,   522,   528,   534,   540,
-+     546,   552,   558,   567,   568,   572,   579,   590,   591,   599,
-+     607,   613,   619,   625,   634,   643,   649,   658,   665,   674
++     151,   164,   176,   191,   201,   214,   227,   237,   247,   260,
++     264,   271,   281,   291,   298,   307,   311,   315,   322,   326,
++     333,   337,   341,   345,   349,   353,   357,   364,   373,   386,
++     390,   394,   410,   431,   432,   436,   443,   444,   460,   470,
++     483,   488,   497,   503,   509,   515,   521,   527,   533,   539,
++     545,   551,   557,   566,   567,   571,   578,   589,   590,   598,
++     606,   612,   618,   624,   633,   642,   648,   657,   664,   673
 +};
 +#endif
 +
@@ -4068,9 +4078,8 @@
 +    {
 +            SQL_input *sql = (SQL_input*) info;
 +            MSIVIEW *insert = NULL;
-+            UINT r;
-+
-+            r = INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
++
++            INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
 +            if( !insert )
 +                YYABORT;
 +            (yyval.query) = insert;
@@ -4078,7 +4087,7 @@
 +    break;
 +
 +  case 10:
-+#line 153 "sql.y"
++#line 152 "sql.y"
 +    {
 +            SQL_input *sql = (SQL_input*) info;
 +            MSIVIEW *insert = NULL;
@@ -4091,7 +4100,7 @@
 +    break;
 +
 +  case 11:
-+#line 166 "sql.y"
++#line 165 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *create = NULL;
@@ -4106,7 +4115,7 @@
 +    break;
 +
 +  case 12:
-+#line 178 "sql.y"
++#line 177 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *create = NULL;
@@ -4121,7 +4130,7 @@
 +    break;
 +
 +  case 13:
-+#line 193 "sql.y"
++#line 192 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *update = NULL;
@@ -4134,7 +4143,7 @@
 +    break;
 +
 +  case 14:
-+#line 203 "sql.y"
++#line 202 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *update = NULL;
@@ -4147,7 +4156,7 @@
 +    break;
 +
 +  case 15:
-+#line 216 "sql.y"
++#line 215 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *delete = NULL;
@@ -4160,7 +4169,7 @@
 +    break;
 +
 +  case 16:
-+#line 229 "sql.y"
++#line 228 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            MSIVIEW *alter = NULL;
@@ -4173,7 +4182,7 @@
 +    break;
 +
 +  case 17:
-+#line 239 "sql.y"
++#line 238 "sql.y"
 +    {
 +            SQL_input *sql = (SQL_input *)info;
 +            MSIVIEW *alter = NULL;
@@ -4186,7 +4195,7 @@
 +    break;
 +
 +  case 18:
-+#line 249 "sql.y"
++#line 248 "sql.y"
 +    {
 +            SQL_input *sql = (SQL_input *)info;
 +            MSIVIEW *alter = NULL;
@@ -4199,21 +4208,21 @@
 +    break;
 +
 +  case 19:
-+#line 262 "sql.y"
++#line 261 "sql.y"
 +    {
 +            (yyval.integer) = 1;
 +        ;}
 +    break;
 +
 +  case 20:
-+#line 266 "sql.y"
++#line 265 "sql.y"
 +    {
 +            (yyval.integer) = -1;
 +        ;}
 +    break;
 +
 +  case 21:
-+#line 273 "sql.y"
++#line 272 "sql.y"
 +    {
 +            if( SQL_MarkPrimaryKeys( (yyvsp[-3].column_list), (yyvsp[0].column_list) ) )
 +                (yyval.column_list) = (yyvsp[-3].column_list);
@@ -4223,7 +4232,7 @@
 +    break;
 +
 +  case 22:
-+#line 283 "sql.y"
++#line 282 "sql.y"
 +    {
 +            column_info *ci;
 +
@@ -4236,14 +4245,14 @@
 +    break;
 +
 +  case 23:
-+#line 293 "sql.y"
++#line 292 "sql.y"
 +    {
 +            (yyval.column_list) = (yyvsp[0].column_list);
 +        ;}
 +    break;
 +
 +  case 24:
-+#line 300 "sql.y"
++#line 299 "sql.y"
 +    {
 +            (yyval.column_list) = (yyvsp[-1].column_list);
 +            (yyval.column_list)->type = ((yyvsp[0].column_type) | MSITYPE_VALID);
@@ -4252,91 +4261,91 @@
 +    break;
 +
 +  case 25:
-+#line 309 "sql.y"
++#line 308 "sql.y"
 +    {
 +            (yyval.column_type) = (yyvsp[0].column_type);
 +        ;}
 +    break;
 +
 +  case 26:
-+#line 313 "sql.y"
++#line 312 "sql.y"
 +    {
 +            (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_LOCALIZABLE;
 +        ;}
 +    break;
 +
 +  case 27:
-+#line 317 "sql.y"
++#line 316 "sql.y"
 +    {
 +            (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_TEMPORARY;
 +        ;}
 +    break;
 +
 +  case 28:
-+#line 324 "sql.y"
++#line 323 "sql.y"
 +    {
 +            (yyval.column_type) |= MSITYPE_NULLABLE;
 +        ;}
 +    break;
 +
 +  case 29:
-+#line 328 "sql.y"
++#line 327 "sql.y"
 +    {
 +            (yyval.column_type) = (yyvsp[-2].column_type);
 +        ;}
 +    break;
 +
 +  case 30:
-+#line 335 "sql.y"
++#line 334 "sql.y"
 +    {
 +            (yyval.column_type) = MSITYPE_STRING | 1;
 +        ;}
 +    break;
 +
 +  case 31:
-+#line 339 "sql.y"
++#line 338 "sql.y"
 +    {
 +            (yyval.column_type) = MSITYPE_STRING | 0x400 | (yyvsp[-1].column_type);
 +        ;}
 +    break;
 +
 +  case 32:
-+#line 343 "sql.y"
++#line 342 "sql.y"
 +    {
 +            (yyval.column_type) = 2;
 +        ;}
 +    break;
 +
 +  case 33:
-+#line 347 "sql.y"
++#line 346 "sql.y"
 +    {
 +            (yyval.column_type) = 2;
 +        ;}
 +    break;
 +
 +  case 34:
-+#line 351 "sql.y"
++#line 350 "sql.y"
 +    {
 +            (yyval.column_type) = 2;
 +        ;}
 +    break;
 +
 +  case 35:
-+#line 355 "sql.y"
++#line 354 "sql.y"
 +    {
 +            (yyval.column_type) = 4;
 +        ;}
 +    break;
 +
 +  case 36:
-+#line 359 "sql.y"
++#line 358 "sql.y"
 +    {
 +            (yyval.column_type) = MSITYPE_STRING | MSITYPE_VALID;
 +        ;}
 +    break;
 +
 +  case 37:
-+#line 366 "sql.y"
++#line 365 "sql.y"
 +    {
 +            if( ( (yyvsp[0].integer) > 255 ) || ( (yyvsp[0].integer) < 0 ) )
 +                YYABORT;
@@ -4345,7 +4354,7 @@
 +    break;
 +
 +  case 38:
-+#line 375 "sql.y"
++#line 374 "sql.y"
 +    {
 +            UINT r;
 +
@@ -4361,14 +4370,14 @@
 +    break;
 +
 +  case 40:
-+#line 392 "sql.y"
++#line 391 "sql.y"
 +    {
 +            (yyval.query) = (yyvsp[0].query);
 +        ;}
 +    break;
 +
 +  case 41:
-+#line 396 "sql.y"
++#line 395 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            UINT r;
@@ -4384,7 +4393,7 @@
 +    break;
 +
 +  case 42:
-+#line 412 "sql.y"
++#line 411 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            UINT r;
@@ -4405,21 +4414,21 @@
 +    break;
 +
 +  case 44:
-+#line 434 "sql.y"
++#line 433 "sql.y"
 +    {
 +            (yyvsp[-2].column_list)->next = (yyvsp[0].column_list);
 +        ;}
 +    break;
 +
 +  case 45:
-+#line 438 "sql.y"
++#line 437 "sql.y"
 +    {
 +            (yyval.column_list) = NULL;
 +        ;}
 +    break;
 +
 +  case 47:
-+#line 446 "sql.y"
++#line 445 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            UINT r;
@@ -4435,7 +4444,7 @@
 +    break;
 +
 +  case 48:
-+#line 462 "sql.y"
++#line 461 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            UINT r;
@@ -4448,7 +4457,7 @@
 +    break;
 +
 +  case 49:
-+#line 472 "sql.y"
++#line 471 "sql.y"
 +    {
 +            SQL_input* sql = (SQL_input*) info;
 +            UINT r;
@@ -4461,14 +4470,14 @@
 +    break;
 +
 +  case 50:
-+#line 485 "sql.y"
++#line 484 "sql.y"
 +    {
 +            (yyval.string) = strdupW((yyvsp[0].string));
 +        ;}
 +    break;
 +
 +  case 51:
-+#line 490 "sql.y"
++#line 489 "sql.y"
 +    {
 +            (yyval.string) = parser_add_table((yyvsp[0].string), (yyvsp[-2].string));
 +            if (!(yyval.string))
@@ -4477,7 +4486,7 @@
 +    break;
 +
 +  case 52:
-+#line 499 "sql.y"
++#line 498 "sql.y"
 +    {
 +            (yyval.expr) = (yyvsp[-1].expr);
 +            if( !(yyval.expr) )
@@ -4486,7 +4495,7 @@
 +    break;
 +
 +  case 53:
-+#line 505 "sql.y"
++#line 504 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_AND, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4495,7 +4504,7 @@
 +    break;
 +
 +  case 54:
-+#line 511 "sql.y"
++#line 510 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_OR, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4504,7 +4513,7 @@
 +    break;
 +
 +  case 55:
-+#line 517 "sql.y"
++#line 516 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_EQ, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4513,7 +4522,7 @@
 +    break;
 +
 +  case 56:
-+#line 523 "sql.y"
++#line 522 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GT, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4522,7 +4531,7 @@
 +    break;
 +
 +  case 57:
-+#line 529 "sql.y"
++#line 528 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LT, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4531,7 +4540,7 @@
 +    break;
 +
 +  case 58:
-+#line 535 "sql.y"
++#line 534 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LE, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4540,7 +4549,7 @@
 +    break;
 +
 +  case 59:
-+#line 541 "sql.y"
++#line 540 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GE, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4549,7 +4558,7 @@
 +    break;
 +
 +  case 60:
-+#line 547 "sql.y"
++#line 546 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_NE, (yyvsp[0].expr) );
 +            if( !(yyval.expr) )
@@ -4558,7 +4567,7 @@
 +    break;
 +
 +  case 61:
-+#line 553 "sql.y"
++#line 552 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_unary( info, (yyvsp[-2].expr), OP_ISNULL );
 +            if( !(yyval.expr) )
@@ -4567,7 +4576,7 @@
 +    break;
 +
 +  case 62:
-+#line 559 "sql.y"
++#line 558 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_unary( info, (yyvsp[-3].expr), OP_NOTNULL );
 +            if( !(yyval.expr) )
@@ -4576,7 +4585,7 @@
 +    break;
 +
 +  case 65:
-+#line 573 "sql.y"
++#line 572 "sql.y"
 +    {
 +            (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
 +            if( !(yyval.column_list) )
@@ -4586,7 +4595,7 @@
 +    break;
 +
 +  case 66:
-+#line 580 "sql.y"
++#line 579 "sql.y"
 +    {
 +            (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
 +            if( !(yyval.column_list) )
@@ -4597,7 +4606,7 @@
 +    break;
 +
 +  case 68:
-+#line 592 "sql.y"
++#line 591 "sql.y"
 +    {
 +            (yyval.column_list) = (yyvsp[-2].column_list);
 +            (yyval.column_list)->next = (yyvsp[0].column_list);
@@ -4605,7 +4614,7 @@
 +    break;
 +
 +  case 69:
-+#line 600 "sql.y"
++#line 599 "sql.y"
 +    {
 +            (yyval.column_list) = (yyvsp[-2].column_list);
 +            (yyval.column_list)->val = (yyvsp[0].expr);
@@ -4613,7 +4622,7 @@
 +    break;
 +
 +  case 70:
-+#line 608 "sql.y"
++#line 607 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_ival( info, (yyvsp[0].integer) );
 +            if( !(yyval.expr) )
@@ -4622,7 +4631,7 @@
 +    break;
 +
 +  case 71:
-+#line 614 "sql.y"
++#line 613 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_ival( info, -(yyvsp[0].integer) );
 +            if( !(yyval.expr) )
@@ -4631,7 +4640,7 @@
 +    break;
 +
 +  case 72:
-+#line 620 "sql.y"
++#line 619 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_sval( info, &(yyvsp[0].str) );
 +            if( !(yyval.expr) )
@@ -4640,7 +4649,7 @@
 +    break;
 +
 +  case 73:
-+#line 626 "sql.y"
++#line 625 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_wildcard( info );
 +            if( !(yyval.expr) )
@@ -4649,7 +4658,7 @@
 +    break;
 +
 +  case 74:
-+#line 635 "sql.y"
++#line 634 "sql.y"
 +    {
 +            (yyval.expr) = EXPR_column( info, (yyvsp[0].column_list) );
 +            if( !(yyval.expr) )
@@ -4658,7 +4667,7 @@
 +    break;
 +
 +  case 75:
-+#line 644 "sql.y"
++#line 643 "sql.y"
 +    {
 +            (yyval.column_list) = parser_alloc_column( info, (yyvsp[-2].string), (yyvsp[0].string) );
 +            if( !(yyval.column_list) )
@@ -4667,7 +4676,7 @@
 +    break;
 +
 +  case 76:
-+#line 650 "sql.y"
++#line 649 "sql.y"
 +    {
 +            (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[0].string) );
 +            if( !(yyval.column_list) )
@@ -4676,14 +4685,14 @@
 +    break;
 +
 +  case 77:
-+#line 659 "sql.y"
++#line 658 "sql.y"
 +    {
 +            (yyval.string) = (yyvsp[0].string);
 +        ;}
 +    break;
 +
 +  case 78:
-+#line 666 "sql.y"
++#line 665 "sql.y"
 +    {
 +            (yyval.string) = SQL_getstring( info, &(yyvsp[0].str) );
 +            if( !(yyval.string) )
@@ -4692,7 +4701,7 @@
 +    break;
 +
 +  case 79:
-+#line 675 "sql.y"
++#line 674 "sql.y"
 +    {
 +            (yyval.integer) = SQL_getint( info );
 +        ;}
@@ -4703,7 +4712,7 @@
 +    }
 +
 +/* Line 1126 of yacc.c.  */
-+#line 2081 "sql.tab.c"
++#line 2080 "sql.tab.c"
 +
 +  yyvsp -= yylen;
 +  yyssp -= yylen;
@@ -4971,7 +4980,7 @@
 +}
 +
 +
-+#line 680 "sql.y"
++#line 679 "sql.y"
 +
 +
 +static LPWSTR parser_add_table(LPWSTR list, LPWSTR table)

Modified: trunk/reactos/dll/win32/msi/msipriv.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msipriv.h?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msipriv.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msipriv.h [iso-8859-1] Sat May 17 14:46:01 2008
@@ -26,6 +26,7 @@
 
 #include "windef.h"
 #include "winbase.h"
+#include "fdi.h"
 #include "msi.h"
 #include "msiquery.h"
 #include "objbase.h"
@@ -133,6 +134,20 @@
     LPWSTR disk_prompt;
 } MSIMEDIADISK;
 
+typedef struct tagMSIMEDIAINFO
+{
+    UINT disk_id;
+    UINT type;
+    UINT last_sequence;
+    LPWSTR disk_prompt;
+    LPWSTR cabinet;
+    LPWSTR first_volume;
+    LPWSTR volume_label;
+    BOOL is_continuous;
+    BOOL is_extracted;
+    WCHAR source[MAX_PATH];
+} MSIMEDIAINFO;
+
 typedef struct _column_info
 {
     LPCWSTR table;
@@ -307,6 +322,7 @@
     float center_y;
 
     UINT WordCount;
+    UINT Context;
 
     struct list subscriptions;
 
@@ -757,7 +773,8 @@
 extern UINT MSIREG_OpenProductsKey(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, HKEY* key, BOOL create);
-extern UINT MSIREG_OpenInstallPropertiesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUserFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
@@ -887,6 +904,10 @@
 extern void msi_ui_error( DWORD msg_id, DWORD type );
 extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
                         MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value);
+extern UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi);
+extern void msi_free_media_info(MSIMEDIAINFO *mi);
+extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, PFNFDINOTIFY notify, LPVOID data);
+extern UINT msi_extract_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR destdir);
 
 /* control event stuff */
 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,

Modified: trunk/reactos/dll/win32/msi/msiquery.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msiquery.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msiquery.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msiquery.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -869,14 +869,11 @@
         '`','T','a','b','l','e','`',' ','=',' ','\'','%','s','\'',0 };
     struct msi_primary_key_record_info info;
     MSIQUERY *query = NULL;
-    MSIVIEW *view;
-    UINT r;
-    
+    UINT r;
+
     r = MSI_OpenQuery( db, &query, sql, table );
     if( r != ERROR_SUCCESS )
         return r;
-
-    view = query->view;
 
     /* count the number of primary key records */
     info.n = 0;

Modified: trunk/reactos/dll/win32/msi/msiserver.idl
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msiserver.idl?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msiserver.idl [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msiserver.idl [iso-8859-1] Sat May 17 14:46:01 2008
@@ -70,7 +70,7 @@
     HRESULT SetComponentState( [in] BSTR component, [in] INSTALLSTATE state );
     HRESULT GetLanguage( [out] LANGID *language );
     HRESULT SetInstallLevel( [in] int level );
-    HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR value, [out] DWORD *size );
+    HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value );
     HRESULT EvaluateCondition( [in] BSTR condition );
 }
 

Modified: trunk/reactos/dll/win32/msi/package.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/package.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/package.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/package.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -416,7 +416,6 @@
     static const WCHAR szColorBits[] = {'C','o','l','o','r','B','i','t','s',0};
     static const WCHAR szIntFormat[] = {'%','d',0};
     static const WCHAR szIntel[] = { 'I','n','t','e','l',0 };
-    static const WCHAR szAllUsers[] = { 'A','L','L','U','S','E','R','S',0 };
     static const WCHAR szUserInfo[] = {
         'S','O','F','T','W','A','R','E','\\',
         'M','i','c','r','o','s','o','f','t','\\',
@@ -542,7 +541,6 @@
     /* in a wine environment the user is always admin and privileged */
     MSI_SetPropertyW(package,szAdminUser,szOne);
     MSI_SetPropertyW(package,szPriv,szOne);
-    MSI_SetPropertyW(package, szAllUsers, szOne);
 
     /* set the os things */
     OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
@@ -762,6 +760,30 @@
     return r;
 }
 
+static UINT msi_set_context(MSIPACKAGE *package)
+{
+    WCHAR val[10];
+    DWORD sz = 10;
+    DWORD num;
+    UINT r;
+
+    static const WCHAR szOne[] = {'1',0};
+    static const WCHAR szAllUsers[] = {'A','L','L','U','S','E','R','S',0};
+
+    package->Context = MSIINSTALLCONTEXT_USERUNMANAGED;
+
+    r = MSI_GetPropertyW(package, szAllUsers, val, &sz);
+    if (r == ERROR_SUCCESS)
+    {
+        num = atolW(val);
+        if (num == 1 || num == 2)
+            package->Context = MSIINSTALLCONTEXT_MACHINE;
+    }
+
+    MSI_SetPropertyW(package, szAllUsers, szOne);
+    return ERROR_SUCCESS;
+}
+
 MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
 {
     static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 };
@@ -801,6 +823,8 @@
 
         if (package->WordCount & MSIWORDCOUNT_ADMINISTRATIVE)
             msi_load_admin_properties( package );
+
+        msi_set_context( package );
     }
 
     return package;
@@ -1788,10 +1812,19 @@
 }
 
 static HRESULT WINAPI mrp_FormatRecord( IWineMsiRemotePackage *iface, MSIHANDLE record,
-                                 BSTR value, DWORD *size )
-{
-    msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
-    UINT r = MsiFormatRecordW(This->package, record, (LPWSTR)value, size);
+                                        BSTR *value)
+{
+    DWORD size = 0;
+    msi_remote_package_impl* This = mrp_from_IWineMsiRemotePackage( iface );
+    UINT r = MsiFormatRecordW(This->package, record, NULL, &size);
+    if (r == ERROR_SUCCESS)
+    {
+        *value = SysAllocStringLen(NULL, size);
+        if (!*value)
+            return E_OUTOFMEMORY;
+        size++;
+        r = MsiFormatRecordW(This->package, record, *value, &size);
+    }
     return HRESULT_FROM_WIN32(r);
 }
 

Modified: trunk/reactos/dll/win32/msi/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/registry.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/registry.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/registry.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -381,7 +381,7 @@
 
 LPWSTR msi_version_dword_to_str(DWORD version)
 {
-    const WCHAR fmt[] = { '%','u','.','%','u','.','%','u',0 };
+    static const WCHAR fmt[] = { '%','u','.','%','u','.','%','u',0 };
     LPWSTR str = msi_alloc(20);
     sprintfW(str, fmt,
              (version&0xff000000)>>24,
@@ -392,7 +392,10 @@
 
 LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
 {
-    DWORD len = value ? (lstrlenW(value) + 1) * sizeof (WCHAR) : 0;
+    static const WCHAR emptyW[] = {0};
+    DWORD len;
+    if (!value) value = emptyW;
+    len = (lstrlenW(value) + 1) * sizeof (WCHAR);
     return RegSetValueExW( hkey, name, 0, REG_SZ, (const BYTE *)value, len );
 }
 
@@ -753,34 +756,53 @@
     return rc;
 }
 
-UINT MSIREG_OpenInstallPropertiesKey(LPCWSTR szProduct, HKEY *key, BOOL create)
-{
-    UINT rc;
-    WCHAR squished_pc[GUID_SIZE];
-    WCHAR keypath[0x200];
-    LPWSTR usersid;
+static UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID,
+                                    HKEY *key, BOOL create)
+{
+    UINT rc;
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
 
     TRACE("%s\n", debugstr_w(szProduct));
     if (!squash_guid(szProduct, squished_pc))
         return ERROR_FUNCTION_FAILED;
     TRACE("squished (%s)\n", debugstr_w(squished_pc));
 
-    rc = get_user_sid(&usersid);
-    if (rc != ERROR_SUCCESS || !usersid)
-    {
-        ERR("Failed to retrieve user SID: %d\n", rc);
-        return rc;
-    }
-
-    sprintfW(keypath, szInstallProperties_fmt, usersid, squished_pc);
+    sprintfW(keypath, szInstallProperties_fmt, szUserSID, squished_pc);
 
     if (create)
         rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
     else
         rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
 
+    return rc;
+}
+
+UINT MSIREG_OpenCurrentUserInstallProps(LPCWSTR szProduct, HKEY *key,
+                                               BOOL create)
+{
+    UINT rc;
+    LPWSTR usersid;
+
+    rc = get_user_sid(&usersid);
+    if (rc != ERROR_SUCCESS || !usersid)
+    {
+        ERR("Failed to retrieve user SID: %d\n", rc);
+        return rc;
+    }
+
+    rc = MSIREG_OpenInstallProps(szProduct, usersid, key, create);
+
     LocalFree(usersid);
     return rc;
+}
+
+UINT MSIREG_OpenLocalSystemInstallProps(LPCWSTR szProduct, HKEY *key,
+                                        BOOL create)
+{
+    static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
+
+    return MSIREG_OpenInstallProps(szProduct, localsid, key, create);
 }
 
 UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct)

Modified: trunk/reactos/dll/win32/msi/source.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/source.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/source.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/source.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -153,7 +153,6 @@
     LPWSTR usersid = NULL;
     LPWSTR volume = NULL;
     LPWSTR prompt = NULL;
-    DWORD volumesz, promptsz;
     UINT r = ERROR_INVALID_PARAMETER;
 
     TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p)\n", debugstr_a(szProductCodeOrPatchCode),
@@ -183,11 +182,11 @@
         goto done;
 
     if (szVolumeLabel && pcchVolumeLabel)
-        volumesz = WideCharToMultiByte(CP_ACP, 0, volume, -1, szVolumeLabel,
+        WideCharToMultiByte(CP_ACP, 0, volume, -1, szVolumeLabel,
                             *pcchVolumeLabel + 1, NULL, NULL);
 
     if (szDiskPrompt)
-        promptsz = WideCharToMultiByte(CP_ACP, 0, prompt, -1, szDiskPrompt,
+        WideCharToMultiByte(CP_ACP, 0, prompt, -1, szDiskPrompt,
                             *pcchDiskPrompt + 1, NULL, NULL);
 
 done:
@@ -823,7 +822,7 @@
     }
     else if (strcmpW(INSTALLPROPERTY_PACKAGENAMEW, szProperty)==0)
     {
-        DWORD size = lstrlenW(szValue)*sizeof(WCHAR);
+        DWORD size = (lstrlenW(szValue) + 1) * sizeof(WCHAR);
         rc = RegSetValueExW(sourcekey, INSTALLPROPERTY_PACKAGENAMEW, 0,
                 REG_SZ, (const BYTE *)szValue, size);
         if (rc != ERROR_SUCCESS)

Modified: trunk/reactos/dll/win32/msi/sql.tab.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/sql.tab.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/sql.tab.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/sql.tab.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -562,13 +562,13 @@
 static const unsigned short int yyrline[] =
 {
        0,   124,   124,   132,   133,   134,   135,   136,   137,   141,
-     152,   165,   177,   192,   202,   215,   228,   238,   248,   261,
-     265,   272,   282,   292,   299,   308,   312,   316,   323,   327,
-     334,   338,   342,   346,   350,   354,   358,   365,   374,   387,
-     391,   395,   411,   432,   433,   437,   444,   445,   461,   471,
-     484,   489,   498,   504,   510,   516,   522,   528,   534,   540,
-     546,   552,   558,   567,   568,   572,   579,   590,   591,   599,
-     607,   613,   619,   625,   634,   643,   649,   658,   665,   674
+     151,   164,   176,   191,   201,   214,   227,   237,   247,   260,
+     264,   271,   281,   291,   298,   307,   311,   315,   322,   326,
+     333,   337,   341,   345,   349,   353,   357,   364,   373,   386,
+     390,   394,   410,   431,   432,   436,   443,   444,   460,   470,
+     483,   488,   497,   503,   509,   515,   521,   527,   533,   539,
+     545,   551,   557,   566,   567,   571,   578,   589,   590,   598,
+     606,   612,   618,   624,   633,   642,   648,   657,   664,   673
 };
 #endif
 
@@ -1442,9 +1442,8 @@
     {
             SQL_input *sql = (SQL_input*) info;
             MSIVIEW *insert = NULL;
-            UINT r;
-
-            r = INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
+
+            INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
             if( !insert )
                 YYABORT;
             (yyval.query) = insert;
@@ -1452,7 +1451,7 @@
     break;
 
   case 10:
-#line 153 "sql.y"
+#line 152 "sql.y"
     {
             SQL_input *sql = (SQL_input*) info;
             MSIVIEW *insert = NULL;
@@ -1465,7 +1464,7 @@
     break;
 
   case 11:
-#line 166 "sql.y"
+#line 165 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *create = NULL;
@@ -1480,7 +1479,7 @@
     break;
 
   case 12:
-#line 178 "sql.y"
+#line 177 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *create = NULL;
@@ -1495,7 +1494,7 @@
     break;
 
   case 13:
-#line 193 "sql.y"
+#line 192 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *update = NULL;
@@ -1508,7 +1507,7 @@
     break;
 
   case 14:
-#line 203 "sql.y"
+#line 202 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *update = NULL;
@@ -1521,7 +1520,7 @@
     break;
 
   case 15:
-#line 216 "sql.y"
+#line 215 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *delete = NULL;
@@ -1534,7 +1533,7 @@
     break;
 
   case 16:
-#line 229 "sql.y"
+#line 228 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             MSIVIEW *alter = NULL;
@@ -1547,7 +1546,7 @@
     break;
 
   case 17:
-#line 239 "sql.y"
+#line 238 "sql.y"
     {
             SQL_input *sql = (SQL_input *)info;
             MSIVIEW *alter = NULL;
@@ -1560,7 +1559,7 @@
     break;
 
   case 18:
-#line 249 "sql.y"
+#line 248 "sql.y"
     {
             SQL_input *sql = (SQL_input *)info;
             MSIVIEW *alter = NULL;
@@ -1573,21 +1572,21 @@
     break;
 
   case 19:
-#line 262 "sql.y"
+#line 261 "sql.y"
     {
             (yyval.integer) = 1;
         ;}
     break;
 
   case 20:
-#line 266 "sql.y"
+#line 265 "sql.y"
     {
             (yyval.integer) = -1;
         ;}
     break;
 
   case 21:
-#line 273 "sql.y"
+#line 272 "sql.y"
     {
             if( SQL_MarkPrimaryKeys( (yyvsp[-3].column_list), (yyvsp[0].column_list) ) )
                 (yyval.column_list) = (yyvsp[-3].column_list);
@@ -1597,7 +1596,7 @@
     break;
 
   case 22:
-#line 283 "sql.y"
+#line 282 "sql.y"
     {
             column_info *ci;
 
@@ -1610,14 +1609,14 @@
     break;
 
   case 23:
-#line 293 "sql.y"
+#line 292 "sql.y"
     {
             (yyval.column_list) = (yyvsp[0].column_list);
         ;}
     break;
 
   case 24:
-#line 300 "sql.y"
+#line 299 "sql.y"
     {
             (yyval.column_list) = (yyvsp[-1].column_list);
             (yyval.column_list)->type = ((yyvsp[0].column_type) | MSITYPE_VALID);
@@ -1626,91 +1625,91 @@
     break;
 
   case 25:
-#line 309 "sql.y"
+#line 308 "sql.y"
     {
             (yyval.column_type) = (yyvsp[0].column_type);
         ;}
     break;
 
   case 26:
-#line 313 "sql.y"
+#line 312 "sql.y"
     {
             (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_LOCALIZABLE;
         ;}
     break;
 
   case 27:
-#line 317 "sql.y"
+#line 316 "sql.y"
     {
             (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_TEMPORARY;
         ;}
     break;
 
   case 28:
-#line 324 "sql.y"
+#line 323 "sql.y"
     {
             (yyval.column_type) |= MSITYPE_NULLABLE;
         ;}
     break;
 
   case 29:
-#line 328 "sql.y"
+#line 327 "sql.y"
     {
             (yyval.column_type) = (yyvsp[-2].column_type);
         ;}
     break;
 
   case 30:
-#line 335 "sql.y"
+#line 334 "sql.y"
     {
             (yyval.column_type) = MSITYPE_STRING | 1;
         ;}
     break;
 
   case 31:
-#line 339 "sql.y"
+#line 338 "sql.y"
     {
             (yyval.column_type) = MSITYPE_STRING | 0x400 | (yyvsp[-1].column_type);
         ;}
     break;
 
   case 32:
-#line 343 "sql.y"
+#line 342 "sql.y"
     {
             (yyval.column_type) = 2;
         ;}
     break;
 
   case 33:
-#line 347 "sql.y"
+#line 346 "sql.y"
     {
             (yyval.column_type) = 2;
         ;}
     break;
 
   case 34:
-#line 351 "sql.y"
+#line 350 "sql.y"
     {
             (yyval.column_type) = 2;
         ;}
     break;
 
   case 35:
-#line 355 "sql.y"
+#line 354 "sql.y"
     {
             (yyval.column_type) = 4;
         ;}
     break;
 
   case 36:
-#line 359 "sql.y"
+#line 358 "sql.y"
     {
             (yyval.column_type) = MSITYPE_STRING | MSITYPE_VALID;
         ;}
     break;
 
   case 37:
-#line 366 "sql.y"
+#line 365 "sql.y"
     {
             if( ( (yyvsp[0].integer) > 255 ) || ( (yyvsp[0].integer) < 0 ) )
                 YYABORT;
@@ -1719,7 +1718,7 @@
     break;
 
   case 38:
-#line 375 "sql.y"
+#line 374 "sql.y"
     {
             UINT r;
 
@@ -1735,14 +1734,14 @@
     break;
 
   case 40:
-#line 392 "sql.y"
+#line 391 "sql.y"
     {
             (yyval.query) = (yyvsp[0].query);
         ;}
     break;
 
   case 41:
-#line 396 "sql.y"
+#line 395 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             UINT r;
@@ -1758,7 +1757,7 @@
     break;
 
   case 42:
-#line 412 "sql.y"
+#line 411 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             UINT r;
@@ -1779,21 +1778,21 @@
     break;
 
   case 44:
-#line 434 "sql.y"
+#line 433 "sql.y"
     {
             (yyvsp[-2].column_list)->next = (yyvsp[0].column_list);
         ;}
     break;
 
   case 45:
-#line 438 "sql.y"
+#line 437 "sql.y"
     {
             (yyval.column_list) = NULL;
         ;}
     break;
 
   case 47:
-#line 446 "sql.y"
+#line 445 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             UINT r;
@@ -1809,7 +1808,7 @@
     break;
 
   case 48:
-#line 462 "sql.y"
+#line 461 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             UINT r;
@@ -1822,7 +1821,7 @@
     break;
 
   case 49:
-#line 472 "sql.y"
+#line 471 "sql.y"
     {
             SQL_input* sql = (SQL_input*) info;
             UINT r;
@@ -1835,14 +1834,14 @@
     break;
 
   case 50:
-#line 485 "sql.y"
+#line 484 "sql.y"
     {
             (yyval.string) = strdupW((yyvsp[0].string));
         ;}
     break;
 
   case 51:
-#line 490 "sql.y"
+#line 489 "sql.y"
     {
             (yyval.string) = parser_add_table((yyvsp[0].string), (yyvsp[-2].string));
             if (!(yyval.string))
@@ -1851,7 +1850,7 @@
     break;
 
   case 52:
-#line 499 "sql.y"
+#line 498 "sql.y"
     {
             (yyval.expr) = (yyvsp[-1].expr);
             if( !(yyval.expr) )
@@ -1860,7 +1859,7 @@
     break;
 
   case 53:
-#line 505 "sql.y"
+#line 504 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_AND, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1869,7 +1868,7 @@
     break;
 
   case 54:
-#line 511 "sql.y"
+#line 510 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_OR, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1878,7 +1877,7 @@
     break;
 
   case 55:
-#line 517 "sql.y"
+#line 516 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_EQ, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1887,7 +1886,7 @@
     break;
 
   case 56:
-#line 523 "sql.y"
+#line 522 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GT, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1896,7 +1895,7 @@
     break;
 
   case 57:
-#line 529 "sql.y"
+#line 528 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LT, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1905,7 +1904,7 @@
     break;
 
   case 58:
-#line 535 "sql.y"
+#line 534 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LE, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1914,7 +1913,7 @@
     break;
 
   case 59:
-#line 541 "sql.y"
+#line 540 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GE, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1923,7 +1922,7 @@
     break;
 
   case 60:
-#line 547 "sql.y"
+#line 546 "sql.y"
     {
             (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_NE, (yyvsp[0].expr) );
             if( !(yyval.expr) )
@@ -1932,7 +1931,7 @@
     break;
 
   case 61:
-#line 553 "sql.y"
+#line 552 "sql.y"
     {
             (yyval.expr) = EXPR_unary( info, (yyvsp[-2].expr), OP_ISNULL );
             if( !(yyval.expr) )
@@ -1941,7 +1940,7 @@
     break;
 
   case 62:
-#line 559 "sql.y"
+#line 558 "sql.y"
     {
             (yyval.expr) = EXPR_unary( info, (yyvsp[-3].expr), OP_NOTNULL );
             if( !(yyval.expr) )
@@ -1950,7 +1949,7 @@
     break;
 
   case 65:
-#line 573 "sql.y"
+#line 572 "sql.y"
     {
             (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
             if( !(yyval.column_list) )
@@ -1960,7 +1959,7 @@
     break;
 
   case 66:
-#line 580 "sql.y"
+#line 579 "sql.y"
     {
             (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
             if( !(yyval.column_list) )
@@ -1971,7 +1970,7 @@
     break;
 
   case 68:
-#line 592 "sql.y"
+#line 591 "sql.y"
     {
             (yyval.column_list) = (yyvsp[-2].column_list);
             (yyval.column_list)->next = (yyvsp[0].column_list);
@@ -1979,7 +1978,7 @@
     break;
 
   case 69:
-#line 600 "sql.y"
+#line 599 "sql.y"
     {
             (yyval.column_list) = (yyvsp[-2].column_list);
             (yyval.column_list)->val = (yyvsp[0].expr);
@@ -1987,7 +1986,7 @@
     break;
 
   case 70:
-#line 608 "sql.y"
+#line 607 "sql.y"
     {
             (yyval.expr) = EXPR_ival( info, (yyvsp[0].integer) );
             if( !(yyval.expr) )
@@ -1996,7 +1995,7 @@
     break;
 
   case 71:
-#line 614 "sql.y"
+#line 613 "sql.y"
     {
             (yyval.expr) = EXPR_ival( info, -(yyvsp[0].integer) );
             if( !(yyval.expr) )
@@ -2005,7 +2004,7 @@
     break;
 
   case 72:
-#line 620 "sql.y"
+#line 619 "sql.y"
     {
             (yyval.expr) = EXPR_sval( info, &(yyvsp[0].str) );
             if( !(yyval.expr) )
@@ -2014,7 +2013,7 @@
     break;
 
   case 73:
-#line 626 "sql.y"
+#line 625 "sql.y"
     {
             (yyval.expr) = EXPR_wildcard( info );
             if( !(yyval.expr) )
@@ -2023,7 +2022,7 @@
     break;
 
   case 74:
-#line 635 "sql.y"
+#line 634 "sql.y"
     {
             (yyval.expr) = EXPR_column( info, (yyvsp[0].column_list) );
             if( !(yyval.expr) )
@@ -2032,7 +2031,7 @@
     break;
 
   case 75:
-#line 644 "sql.y"
+#line 643 "sql.y"
     {
             (yyval.column_list) = parser_alloc_column( info, (yyvsp[-2].string), (yyvsp[0].string) );
             if( !(yyval.column_list) )
@@ -2041,7 +2040,7 @@
     break;
 
   case 76:
-#line 650 "sql.y"
+#line 649 "sql.y"
     {
             (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[0].string) );
             if( !(yyval.column_list) )
@@ -2050,14 +2049,14 @@
     break;
 
   case 77:
-#line 659 "sql.y"
+#line 658 "sql.y"
     {
             (yyval.string) = (yyvsp[0].string);
         ;}
     break;
 
   case 78:
-#line 666 "sql.y"
+#line 665 "sql.y"
     {
             (yyval.string) = SQL_getstring( info, &(yyvsp[0].str) );
             if( !(yyval.string) )
@@ -2066,7 +2065,7 @@
     break;
 
   case 79:
-#line 675 "sql.y"
+#line 674 "sql.y"
     {
             (yyval.integer) = SQL_getint( info );
         ;}
@@ -2077,7 +2076,7 @@
     }
 
 /* Line 1126 of yacc.c.  */
-#line 2081 "sql.tab.c"
+#line 2080 "sql.tab.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
@@ -2345,7 +2344,7 @@
 }
 
 
-#line 680 "sql.y"
+#line 679 "sql.y"
 
 
 static LPWSTR parser_add_table(LPWSTR list, LPWSTR table)

Modified: trunk/reactos/dll/win32/msi/sql.y
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/sql.y?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/sql.y [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/sql.y [iso-8859-1] Sat May 17 14:46:01 2008
@@ -142,9 +142,8 @@
         {
             SQL_input *sql = (SQL_input*) info;
             MSIVIEW *insert = NULL;
-            UINT r;
-
-            r = INSERT_CreateView( sql->db, &insert, $3, $5, $9, FALSE );
+
+            INSERT_CreateView( sql->db, &insert, $3, $5, $9, FALSE );
             if( !insert )
                 YYABORT;
             $$ = insert;

Modified: trunk/reactos/dll/win32/msi/suminfo.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/suminfo.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/suminfo.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/suminfo.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -371,7 +371,7 @@
     LPBYTE data = NULL;
     ULONG count, sz;
     HRESULT r;
-    int i, n;
+    int i;
 
     /* write the header */
     sz = sizeof set_hdr;
@@ -397,7 +397,6 @@
     section_hdr.cbSection = sizeof section_hdr;
     section_hdr.cbSection += (get_property_count( si->property ) * sizeof idofs[0]);
     section_hdr.cProperties = 0;
-    n = 0;
     for( i = 0; i < MSI_MAX_PROPS; i++ )
     {
         sz = write_property_to_data( &si->property[i], NULL );

Modified: trunk/reactos/dll/win32/msi/table.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/table.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/table.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/table.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -1795,9 +1795,6 @@
         return ERROR_NO_MORE_ITEMS;
 
     *row = entry->row;
-
-    if (tv->order)
-        *row = tv->order->reorder[*row];
 
     return ERROR_SUCCESS;
 }

Modified: trunk/reactos/dll/win32/msi/tokenize.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/tokenize.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/tokenize.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/tokenize.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -77,6 +77,7 @@
 
 /*
 ** These are the keywords
+** They MUST be in alphabetical order
 */
 static const Keyword aKeywordTable[] = {
   { ADD_W, TK_ADD },

Modified: trunk/reactos/dll/win32/msi/where.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/where.c?rev=33558&r1=33557&r2=33558&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/where.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/where.c [iso-8859-1] Sat May 17 14:46:01 2008
@@ -86,6 +86,9 @@
 {
     MSIHASHENTRY *entry;
 
+    if (!table)
+        return ERROR_SUCCESS;
+
     if (!(entry = table[row % MSI_HASH_TABLE_SIZE]))
     {
         WARN("Row not found in hash table!\n");
@@ -503,15 +506,12 @@
                           MSIRECORD *rec, UINT row )
 {
     MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view;
-    UINT r;
 
     TRACE("%p %d %p\n", wv, eModifyMode, rec);
 
-    r = WHERE_execute(view, NULL);
-    if (r != ERROR_SUCCESS)
-        return r;
-
     find_entry_in_hash(wv->reorder, row - 1, &row);
+    row++;
+
     return wv->table->ops->modify( wv->table, eModifyMode, rec, row );
 }
 



More information about the Ros-diffs mailing list