[ros-diffs] [fireball] 34375: Autosyncing with Wine HEAD

fireball at svn.reactos.org fireball at svn.reactos.org
Tue Jul 8 22:52:30 CEST 2008


Author: fireball
Date: Tue Jul  8 15:52:29 2008
New Revision: 34375

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

Added:
    trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc   (with props)
    trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc   (with props)
    trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc   (with props)
Modified:
    trunk/reactos/dll/win32/msi/action.c
    trunk/reactos/dll/win32/msi/automation.c
    trunk/reactos/dll/win32/msi/database.c
    trunk/reactos/dll/win32/msi/files.c
    trunk/reactos/dll/win32/msi/helpers.c
    trunk/reactos/dll/win32/msi/msi.c
    trunk/reactos/dll/win32/msi/msi.spec
    trunk/reactos/dll/win32/msi/msi_Sv.rc
    trunk/reactos/dll/win32/msi/msipriv.h
    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/msvfw32/drawdib.c
    trunk/reactos/dll/win32/msvfw32/msvfw32_Es.rc
    trunk/reactos/dll/win32/msvfw32/msvfw32_No.rc
    trunk/reactos/dll/win32/msvfw32/msvfw32_Sv.rc
    trunk/reactos/dll/win32/msvfw32/rsrc.rc
    trunk/reactos/dll/win32/netapi32/access.c
    trunk/reactos/dll/win32/netapi32/ds.c
    trunk/reactos/dll/win32/netapi32/nbnamecache.h
    trunk/reactos/dll/win32/netapi32/wksta.c

Modified: trunk/reactos/dll/win32/msi/action.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/action.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/action.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/action.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -648,6 +648,30 @@
     return ERROR_SUCCESS;
 }
 
+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;
+}
+
 /****************************************************
  * TOP level entry points 
  *****************************************************/
@@ -710,6 +734,7 @@
 
     /* properties may have been added by a transform */
     msi_clone_properties( package );
+    msi_set_context( package );
 
     if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) >= INSTALLUILEVEL_REDUCED )
     {
@@ -1464,6 +1489,25 @@
         file->IsCompressed = package->WordCount & MSIWORDCOUNT_COMPRESSED;
     }
 
+    if (!file->IsCompressed)
+    {
+        LPWSTR p, path;
+
+        p = resolve_folder(package, file->Component->Directory,
+                           TRUE, FALSE, TRUE, NULL);
+        path = build_directory_name(2, p, file->ShortName);
+
+        if (file->LongName &&
+            GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES)
+        {
+            msi_free(path);
+            path = build_directory_name(2, p, file->LongName);
+        }
+
+        file->SourcePath = path;
+        msi_free(p);
+    }
+
     load_file_hash(package, file);
 
     TRACE("File Loaded (%s)\n",debugstr_w(file->File));  
@@ -1601,10 +1645,10 @@
     MSI_SetPropertyW(package, szCosting, szZero);
     MSI_SetPropertyW(package, cszRootDrive, c_colon);
 
+    load_all_folders( package );
     load_all_components( package );
     load_all_features( package );
     load_all_files( package );
-    load_all_folders( package );
 
     return ERROR_SUCCESS;
 }
@@ -1780,9 +1824,6 @@
      * 9) FILEADDLOCAL
      * 10) FILEADDSOURCE
      * 11) FILEADDDEFAULT
-     * I have confirmed that if ADDLOCAL is stated then the INSTALLLEVEL is
-     * ignored for all the features. seems strange, especially since it is not
-     * documented anywhere, but it is how it works.
      *
      * I am still ignoring a lot of these. But that is ok for now, ADDLOCAL and
      * REMOVE are the big ones, since we don't handle administrative installs
@@ -1840,8 +1881,11 @@
     {
         ComponentList *cl;
 
-        TRACE("Examining Feature %s (Installed %i, Action %i)\n",
-              debugstr_w(feature->Feature), feature->Installed, feature->Action);
+        TRACE("Examining Feature %s (Level %i, Installed %i, Action %i)\n",
+              debugstr_w(feature->Feature), feature->Level, feature->Installed, feature->Action);
+
+        if (!feature->Level)
+            continue;
 
         /* features with components that have compressed files are made local */
         LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry )
@@ -2003,7 +2047,7 @@
 {
     static const WCHAR name_fmt[] =
         {'%','u','.','%','u','.','%','u','.','%','u',0};
-    static WCHAR name[] = {'\\',0};
+    static const WCHAR name[] = {'\\',0};
     VS_FIXEDFILEINFO *lpVer;
     WCHAR filever[0x100];
     LPVOID version;
@@ -2803,15 +2847,11 @@
     WCHAR squished_cc[GUID_SIZE];
     UINT rc;
     MSICOMPONENT *comp;
-    HKEY hkey=0,hkey2=0;
+    HKEY hkey;
 
     TRACE("\n");
 
-    /* writes the Component and Features values to the registry */
-
-    rc = MSIREG_OpenComponents(&hkey);
-    if (rc != ERROR_SUCCESS)
-        return rc;
+    /* writes the Component values to the registry */
 
     squash_guid(package->ProductCode,squished_pc);
     ui_progress(package,1,COMPONENT_PROGRESS_VALUE,1,0);
@@ -2843,14 +2883,16 @@
          */
         if (ACTION_VerifyComponentForAction( comp, INSTALLSTATE_LOCAL))
         {
-            rc = RegCreateKeyW(hkey,squished_cc,&hkey2);
+            if (!comp->FullKeypath)
+                continue;
+
+            if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+                rc = MSIREG_OpenLocalUserDataComponentKey(comp->ComponentId, &hkey, TRUE);
+            else
+                rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, &hkey, TRUE);
+
             if (rc != ERROR_SUCCESS)
                 continue;
-
-            if (!comp->FullKeypath)
-                continue;
-
-            msi_reg_set_val_str( hkey2, squished_pc, comp->FullKeypath );
 
             if (comp->Attributes & msidbComponentAttributesPermanent)
             {
@@ -2859,35 +2901,18 @@
                       '0','0','0','0','0','0','0','0','0','0','0','0',
                       '0','0','0','0','0','0','0','0',0 };
 
-                msi_reg_set_val_str( hkey2, szPermKey, comp->FullKeypath );
+                msi_reg_set_val_str(hkey, szPermKey, comp->FullKeypath);
             }
 
-            RegCloseKey(hkey2);
-
-            rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, &hkey2, TRUE);
-            if (rc != ERROR_SUCCESS)
-                continue;
-
-            msi_reg_set_val_str(hkey2, squished_pc, comp->FullKeypath);
-            RegCloseKey(hkey2);
-        }
-        else if (ACTION_VerifyComponentForAction( comp, INSTALLSTATE_ABSENT))
-        {
-            DWORD res;
-
-            rc = RegOpenKeyW(hkey,squished_cc,&hkey2);
-            if (rc != ERROR_SUCCESS)
-                continue;
-
-            RegDeleteValueW(hkey2,squished_pc);
-
-            /* if the key is empty delete it */
-            res = RegEnumKeyExW(hkey2,0,NULL,0,0,NULL,0,NULL);
-            RegCloseKey(hkey2);
-            if (res == ERROR_NO_MORE_ITEMS)
-                RegDeleteKeyW(hkey,squished_cc);
-
-            MSIREG_DeleteUserDataComponentKey(comp->ComponentId);
+            msi_reg_set_val_str(hkey, squished_pc, comp->FullKeypath);
+            RegCloseKey(hkey);
+        }
+        else if (ACTION_VerifyComponentForAction(comp, INSTALLSTATE_ABSENT))
+        {
+            if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+                MSIREG_DeleteLocalUserDataComponentKey(comp->ComponentId);
+            else
+                MSIREG_DeleteUserDataComponentKey(comp->ComponentId);
         }
 
         /* UI stuff */
@@ -2898,8 +2923,8 @@
         ui_actiondata(package,szProcessComponents,uirow);
         msiobj_release( &uirow->hdr );
     }
-    RegCloseKey(hkey);
-    return rc;
+
+    return ERROR_SUCCESS;
 }
 
 typedef struct {
@@ -3236,7 +3261,7 @@
     return rc;
 }
 
-static UINT ITERATE_PublishProduct(MSIRECORD *row, LPVOID param)
+static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param)
 {
     MSIPACKAGE* package = (MSIPACKAGE*)param;
     HANDLE the_file;
@@ -3295,6 +3320,204 @@
     return ERROR_SUCCESS;
 }
 
+static UINT msi_publish_icons(MSIPACKAGE *package)
+{
+    UINT r;
+    MSIQUERY *view;
+
+    static const WCHAR query[]= {
+        'S','E','L','E','C','T',' ','*',' ',
+        'F','R','O','M',' ','`','I','c','o','n','`',0};
+
+    r = MSI_DatabaseOpenViewW(package->db, query, &view);
+    if (r == ERROR_SUCCESS)
+    {
+        MSI_IterateRecords(view, NULL, ITERATE_PublishIcon, package);
+        msiobj_release(&view->hdr);
+    }
+
+    return ERROR_SUCCESS;
+}
+
+static UINT msi_publish_sourcelist(MSIPACKAGE *package, HKEY hkey)
+{
+    UINT r;
+    HKEY source;
+    LPWSTR buffer;
+    MSIMEDIADISK *disk;
+    MSISOURCELISTINFO *info;
+
+    static const WCHAR szEmpty[] = {0};
+    static const WCHAR szSourceList[] = {'S','o','u','r','c','e','L','i','s','t',0};
+
+    r = RegCreateKeyW(hkey, szSourceList, &source);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    RegCloseKey(source);
+
+    buffer = strrchrW(package->PackagePath, '\\') + 1;
+    r = MsiSourceListSetInfoW(package->ProductCode, NULL,
+                              package->Context, MSICODE_PRODUCT,
+                              INSTALLPROPERTY_PACKAGENAMEW, buffer);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    r = MsiSourceListSetInfoW(package->ProductCode, NULL,
+                              package->Context, MSICODE_PRODUCT,
+                              INSTALLPROPERTY_MEDIAPACKAGEPATHW, szEmpty);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    r = MsiSourceListSetInfoW(package->ProductCode, NULL,
+                              package->Context, MSICODE_PRODUCT,
+                              INSTALLPROPERTY_DISKPROMPTW, szEmpty);
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    LIST_FOR_EACH_ENTRY(info, &package->sourcelist_info, MSISOURCELISTINFO, entry)
+    {
+        if (!lstrcmpW(info->property, INSTALLPROPERTY_LASTUSEDSOURCEW))
+            msi_set_last_used_source(package->ProductCode, NULL, info->context,
+                                     info->options, info->value);
+        else
+            MsiSourceListSetInfoW(package->ProductCode, NULL,
+                                  info->context, info->options,
+                                  info->property, info->value);
+    }
+
+    LIST_FOR_EACH_ENTRY(disk, &package->sourcelist_media, MSIMEDIADISK, entry)
+    {
+        MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
+                                   disk->context, disk->options,
+                                   disk->disk_id, disk->volume_label, disk->disk_prompt);
+    }
+
+    return ERROR_SUCCESS;
+}
+
+static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
+{
+    MSIHANDLE hdb, suminfo;
+    WCHAR guids[MAX_PATH];
+    WCHAR packcode[SQUISH_GUID_SIZE];
+    LPWSTR buffer;
+    LPWSTR ptr;
+    DWORD langid;
+    DWORD size;
+    UINT r;
+
+    static const WCHAR szProductLanguage[] =
+        {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
+    static const WCHAR szARPProductIcon[] =
+        {'A','R','P','P','R','O','D','U','C','T','I','C','O','N',0};
+    static const WCHAR szProductVersion[] =
+        {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
+    static const WCHAR szAssignment[] =
+        {'A','s','s','i','g','n','m','e','n','t',0};
+    static const WCHAR szAdvertiseFlags[] =
+        {'A','d','v','e','r','t','i','s','e','F','l','a','g','s',0};
+    static const WCHAR szClients[] =
+        {'C','l','i','e','n','t','s',0};
+    static const WCHAR szColon[] = {':',0};
+
+    buffer = msi_dup_property(package, INSTALLPROPERTY_PRODUCTNAMEW);
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTNAMEW, buffer);
+    msi_free(buffer);
+
+    langid = msi_get_property_int(package, szProductLanguage, 0);
+    msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
+
+    ptr = strrchrW(package->PackagePath, '\\' ) + 1;
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_PACKAGENAMEW, ptr);
+
+    /* FIXME */
+    msi_reg_set_val_dword(hkey, INSTALLPROPERTY_AUTHORIZED_LUA_APPW, 0);
+
+    buffer = msi_dup_property(package, szARPProductIcon);
+    if (buffer)
+    {
+        LPWSTR path = build_icon_path(package,buffer);
+        msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTICONW, path);
+        msi_free(path);
+        msi_free(buffer);
+    }
+
+    buffer = msi_dup_property(package, szProductVersion);
+    if (buffer)
+    {
+        DWORD verdword = msi_version_str_to_dword(buffer);
+        msi_reg_set_val_dword(hkey, INSTALLPROPERTY_VERSIONW, verdword);
+        msi_free(buffer);
+    }
+
+    msi_reg_set_val_dword(hkey, szAssignment, 0);
+    msi_reg_set_val_dword(hkey, szAdvertiseFlags, 0x184);
+    msi_reg_set_val_dword(hkey, INSTALLPROPERTY_INSTANCETYPEW, 0);
+    msi_reg_set_val_str(hkey, szClients, szColon);
+
+    hdb = alloc_msihandle(&package->db->hdr);
+    if (!hdb)
+        return ERROR_NOT_ENOUGH_MEMORY;
+
+    r = MsiGetSummaryInformationW(hdb, NULL, 0, &suminfo);
+    MsiCloseHandle(hdb);
+    if (r != ERROR_SUCCESS)
+        goto done;
+
+    size = MAX_PATH;
+    r = MsiSummaryInfoGetPropertyW(suminfo, PID_REVNUMBER, NULL, NULL,
+                                   NULL, guids, &size);
+    if (r != ERROR_SUCCESS)
+        goto done;
+
+    ptr = strchrW(guids, ';');
+    if (ptr) *ptr = 0;
+    squash_guid(guids, packcode);
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_PACKAGECODEW, packcode);
+
+done:
+    MsiCloseHandle(suminfo);
+    return ERROR_SUCCESS;
+}
+
+static UINT msi_publish_upgrade_code(MSIPACKAGE *package)
+{
+    UINT r;
+    HKEY hkey;
+    LPWSTR upgrade;
+    WCHAR squashed_pc[SQUISH_GUID_SIZE];
+
+    static const WCHAR szUpgradeCode[] =
+        {'U','p','g','r','a','d','e','C','o','d','e',0};
+
+    upgrade = msi_dup_property(package, szUpgradeCode);
+    if (!upgrade)
+        return ERROR_SUCCESS;
+
+    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+    {
+        r = MSIREG_OpenClassesUpgradeCodesKey(upgrade, &hkey, TRUE);
+        if (r != ERROR_SUCCESS)
+            goto done;
+    }
+    else
+    {
+        r = MSIREG_OpenUserUpgradeCodesKey(upgrade, &hkey, TRUE);
+        if (r != ERROR_SUCCESS)
+            goto done;
+    }
+
+    squash_guid(package->ProductCode, squashed_pc);
+    msi_reg_set_val_str(hkey, squashed_pc, NULL);
+
+    RegCloseKey(hkey);
+
+done:
+    msi_free(upgrade);
+    return r;
+}
+
 static BOOL msi_check_publish(MSIPACKAGE *package)
 {
     MSIFEATURE *feature;
@@ -3306,6 +3529,19 @@
     }
 
     return FALSE;
+}
+
+static BOOL msi_check_unpublish(MSIPACKAGE *package)
+{
+    MSIFEATURE *feature;
+
+    LIST_FOR_EACH_ENTRY(feature, &package->features, MSIFEATURE, entry)
+    {
+        if (feature->ActionRequest != INSTALLSTATE_ABSENT)
+            return FALSE;
+    }
+
+    return TRUE;
 }
 
 /*
@@ -3317,46 +3553,12 @@
 static UINT ACTION_PublishProduct(MSIPACKAGE *package)
 {
     UINT rc;
-    LPWSTR packname;
-    MSIQUERY * view;
-    MSISOURCELISTINFO *info;
-    MSIMEDIADISK *disk;
-    static const WCHAR Query[]=
-        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
-         '`','I','c','o','n','`',0};
-    /* for registry stuff */
-    HKEY hkey=0;
     HKEY hukey=0;
-    HKEY hudkey=0, props=0;
-    HKEY source;
-    static const WCHAR szProductLanguage[] =
-        {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
-    static const WCHAR szARPProductIcon[] =
-        {'A','R','P','P','R','O','D','U','C','T','I','C','O','N',0};
-    static const WCHAR szProductVersion[] =
-        {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
-    static const WCHAR szSourceList[] =
-        {'S','o','u','r','c','e','L','i','s','t',0};
-    static const WCHAR szEmpty[] = {0};
-    DWORD langid;
-    LPWSTR buffer;
-    DWORD size;
-    MSIHANDLE hDb, hSumInfo;
+    HKEY hudkey=0;
 
     /* FIXME: also need to publish if the product is in advertise mode */
     if (!msi_check_publish(package))
         return ERROR_SUCCESS;
-
-    /* write out icon files */
-
-    rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
-    if (rc == ERROR_SUCCESS)
-    {
-        MSI_IterateRecords(view, NULL, ITERATE_PublishProduct, package);
-        msiobj_release(&view->hdr);
-    }
-
-    /* ok there is a lot more done here but i need to figure out what */
 
     if (package->Context == MSIINSTALLCONTEXT_MACHINE)
     {
@@ -3364,144 +3566,38 @@
         if (rc != ERROR_SUCCESS)
             goto end;
 
-        rc = MSIREG_OpenLocalSystemInstallProps(package->ProductCode, &props, TRUE);
+        rc = MSIREG_OpenLocalUserDataProductKey(package->ProductCode, &hudkey, TRUE);
         if (rc != ERROR_SUCCESS)
             goto end;
     }
     else
     {
-        rc = MSIREG_OpenProductsKey(package->ProductCode,&hkey,TRUE);
+        rc = MSIREG_OpenUserProductsKey(package->ProductCode, &hukey, TRUE);
         if (rc != ERROR_SUCCESS)
             goto end;
 
-        rc = MSIREG_OpenUserProductsKey(package->ProductCode,&hukey,TRUE);
+        rc = MSIREG_OpenUserDataProductKey(package->ProductCode, &hudkey, 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);
+    }
+
+    rc = msi_publish_upgrade_code(package);
     if (rc != ERROR_SUCCESS)
         goto end;
 
-    RegCloseKey(source);
-
-    rc = MSIREG_OpenUserDataProductKey(package->ProductCode,&hudkey,TRUE);
+    rc = msi_publish_product_properties(package, hukey);
     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);
-
-    langid = msi_get_property_int( package, szProductLanguage, 0 );
-    msi_reg_set_val_dword( hukey, INSTALLPROPERTY_LANGUAGEW, langid );
-
-    packname = strrchrW( package->PackagePath, '\\' ) + 1;
-    msi_reg_set_val_str( hukey, INSTALLPROPERTY_PACKAGENAMEW, packname );
-
-    /* FIXME */
-    msi_reg_set_val_dword( hukey, INSTALLPROPERTY_AUTHORIZED_LUA_APPW, 0 );
-    msi_reg_set_val_dword( props, INSTALLPROPERTY_INSTANCETYPEW, 0 );
-
-    buffer = msi_dup_property( package, szARPProductIcon );
-    if (buffer)
-    {
-        LPWSTR path = build_icon_path(package,buffer);
-        msi_reg_set_val_str( hukey, INSTALLPROPERTY_PRODUCTICONW, path );
-        msi_free( path );
-    }
-    msi_free(buffer);
-
-    buffer = msi_dup_property( package, szProductVersion );
-    if (buffer)
-    {
-        DWORD verdword = msi_version_str_to_dword(buffer);
-        msi_reg_set_val_dword( hukey, INSTALLPROPERTY_VERSIONW, verdword );
-    }
-    msi_free(buffer);
-
-    buffer = strrchrW( package->PackagePath, '\\') + 1;
-    rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                package->Context, MSICODE_PRODUCT,
-                                INSTALLPROPERTY_PACKAGENAMEW, buffer );
+    rc = msi_publish_sourcelist(package, hukey);
     if (rc != ERROR_SUCCESS)
         goto end;
 
-    rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                package->Context, MSICODE_PRODUCT,
-                                INSTALLPROPERTY_MEDIAPACKAGEPATHW, szEmpty );
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    rc = MsiSourceListSetInfoW( package->ProductCode, NULL,
-                                package->Context, MSICODE_PRODUCT,
-                                INSTALLPROPERTY_DISKPROMPTW, szEmpty );
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    /* FIXME: Need to write more keys to the user registry */
-  
-    hDb= alloc_msihandle( &package->db->hdr );
-    if (!hDb) {
-        rc = ERROR_NOT_ENOUGH_MEMORY;
-        goto end;
-    }
-    rc = MsiGetSummaryInformationW(hDb, NULL, 0, &hSumInfo); 
-    MsiCloseHandle(hDb);
-    if (rc == ERROR_SUCCESS)
-    {
-        WCHAR guidbuffer[0x200];
-        size = 0x200;
-        rc = MsiSummaryInfoGetPropertyW(hSumInfo, 9, NULL, NULL, NULL,
-                                        guidbuffer, &size);
-        if (rc == ERROR_SUCCESS)
-        {
-            /* for now we only care about the first guid */
-            LPWSTR ptr = strchrW(guidbuffer,';');
-            if (ptr) *ptr = 0;
-            msi_reg_set_val_str( hukey, INSTALLPROPERTY_PACKAGECODEW, guidbuffer );
-        }
-        else
-        {
-            ERR("Unable to query Revision_Number...\n");
-            rc = ERROR_SUCCESS;
-        }
-        MsiCloseHandle(hSumInfo);
-    }
-    else
-    {
-        ERR("Unable to open Summary Information\n");
-        rc = ERROR_SUCCESS;
-    }
-
-    /* publish the SourceList info */
-    LIST_FOR_EACH_ENTRY(info, &package->sourcelist_info, MSISOURCELISTINFO, entry)
-    {
-        if (!lstrcmpW(info->property, INSTALLPROPERTY_LASTUSEDSOURCEW))
-            msi_set_last_used_source(package->ProductCode, NULL, info->context,
-                                     info->options, info->value);
-        else
-            MsiSourceListSetInfoW(package->ProductCode, NULL,
-                                  info->context, info->options,
-                                  info->property, info->value);
-    }
-
-    LIST_FOR_EACH_ENTRY(disk, &package->sourcelist_media, MSIMEDIADISK, entry)
-    {
-        MsiSourceListAddMediaDiskW(package->ProductCode, NULL,
-                                   disk->context, disk->options,
-                                   disk->disk_id, disk->volume_label, disk->disk_prompt);
-    }
+    rc = msi_publish_icons(package);
 
 end:
-    RegCloseKey(hkey);
     RegCloseKey(hukey);
     RegCloseKey(hudkey);
-    RegCloseKey(props);
 
     return rc;
 }
@@ -3708,24 +3804,35 @@
 {
     MSIFEATURE *feature;
     UINT rc;
-    HKEY hkey=0;
-    HKEY hukey=0;
-    HKEY userdata=0;
+    HKEY hkey;
+    HKEY userdata;
 
     if (!msi_check_publish(package))
         return ERROR_SUCCESS;
 
-    rc = MSIREG_OpenFeaturesKey(package->ProductCode,&hkey,TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    rc = MSIREG_OpenUserFeaturesKey(package->ProductCode,&hukey,TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
-
-    rc = MSIREG_OpenUserDataFeaturesKey(package->ProductCode, &userdata, TRUE);
-    if (rc != ERROR_SUCCESS)
-        goto end;
+    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+    {
+        rc = MSIREG_OpenLocalClassesFeaturesKey(package->ProductCode,
+                                                &hkey, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+
+        rc = MSIREG_OpenLocalUserDataFeaturesKey(package->ProductCode,
+                                                 &userdata, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+    }
+    else
+    {
+        rc = MSIREG_OpenUserFeaturesKey(package->ProductCode, &hkey, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+
+        rc = MSIREG_OpenUserDataFeaturesKey(package->ProductCode,
+                                            &userdata, TRUE);
+        if (rc != ERROR_SUCCESS)
+            goto end;
+    }
 
     /* here the guids are base 85 encoded */
     LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
@@ -3776,7 +3883,6 @@
             strcatW(data,feature->Feature_Parent);
         }
 
-        msi_reg_set_val_str( hkey, feature->Feature, data );
         msi_reg_set_val_str( userdata, feature->Feature, data );
         msi_free(data);
 
@@ -3787,7 +3893,7 @@
         {
             static const WCHAR emptyW[] = {0};
             size += sizeof(WCHAR);
-            RegSetValueExW(hukey,feature->Feature,0,REG_SZ,
+            RegSetValueExW(hkey,feature->Feature,0,REG_SZ,
                            (LPBYTE)(feature->Feature_Parent ? feature->Feature_Parent : emptyW),size);
         }
         else
@@ -3798,7 +3904,7 @@
             data[1] = 0;
             if (feature->Feature_Parent)
                 strcpyW( &data[1], feature->Feature_Parent );
-            RegSetValueExW(hukey,feature->Feature,0,REG_SZ,
+            RegSetValueExW(hkey,feature->Feature,0,REG_SZ,
                        (LPBYTE)data,size);
             msi_free(data);
         }
@@ -3813,7 +3919,7 @@
 
 end:
     RegCloseKey(hkey);
-    RegCloseKey(hukey);
+    RegCloseKey(userdata);
     return rc;
 }
 
@@ -3839,19 +3945,6 @@
     }
 
     return ERROR_SUCCESS;
-}
-
-static BOOL msi_check_unpublish(MSIPACKAGE *package)
-{
-    MSIFEATURE *feature;
-
-    LIST_FOR_EACH_ENTRY(feature, &package->features, MSIFEATURE, entry)
-    {
-        if (feature->ActionRequest != INSTALLSTATE_ABSENT)
-            return FALSE;
-    }
-
-    return TRUE;
 }
 
 static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
@@ -3904,7 +3997,6 @@
 static UINT msi_make_package_local( MSIPACKAGE *package, HKEY hkey )
 {
     WCHAR packagefile[MAX_PATH];
-    HKEY props;
     UINT r;
 
     r = msi_get_local_package_name( packagefile );
@@ -3924,18 +4016,42 @@
 
     msi_reg_set_val_str( hkey, INSTALLPROPERTY_LOCALPACKAGEW, packagefile );
 
-    r = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &props, TRUE);
-    if (r != ERROR_SUCCESS)
-        return r;
-
-    msi_reg_set_val_str(props, INSTALLPROPERTY_LOCALPACKAGEW, packagefile);
-    RegCloseKey(props);
     return ERROR_SUCCESS;
 }
 
-static UINT msi_write_uninstall_property_vals( MSIPACKAGE *package, HKEY hkey )
+static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
 {
     LPWSTR prop, val, key;
+    SYSTEMTIME systime;
+    DWORD size, langid;
+    WCHAR date[9];
+    LPWSTR buffer;
+
+    static const WCHAR date_fmt[] = {'%','i','%','0','2','i','%','0','2','i',0};
+    static const WCHAR szWindowsInstaller[] =
+        {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0};
+    static const WCHAR modpath_fmt[] =
+        {'M','s','i','E','x','e','c','.','e','x','e',' ',
+         '/','I','[','P','r','o','d','u','c','t','C','o','d','e',']',0};
+    static const WCHAR szModifyPath[] =
+        {'M','o','d','i','f','y','P','a','t','h',0};
+    static const WCHAR szUninstallString[] =
+        {'U','n','i','n','s','t','a','l','l','S','t','r','i','n','g',0};
+    static const WCHAR szEstimatedSize[] =
+        {'E','s','t','i','m','a','t','e','d','S','i','z','e',0};
+    static const WCHAR szProductLanguage[] =
+        {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
+    static const WCHAR szProductVersion[] =
+        {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
+    static const WCHAR szProductName[] =
+        {'P','r','o','d','u','c','t','N','a','m','e',0};
+    static const WCHAR szDisplayName[] =
+        {'D','i','s','p','l','a','y','N','a','m','e',0};
+    static const WCHAR szDisplayVersion[] =
+        {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
+    static const WCHAR szManufacturer[] =
+        {'M','a','n','u','f','a','c','t','u','r','e','r',0};
+
     static const LPCSTR propval[] = {
         "ARPAUTHORIZEDCDFPREFIX", "AuthorizedCDFPrefix",
         "ARPCONTACT",             "Contact",
@@ -3955,62 +4071,77 @@
     };
     const LPCSTR *p = propval;
 
-    while( *p )
-    {
-        prop = strdupAtoW( *p++ );
-        key = strdupAtoW( *p++ );
-        val = msi_dup_property( package, prop );
-        msi_reg_set_val_str( hkey, key, val );
+    while (*p)
+    {
+        prop = strdupAtoW(*p++);
+        key = strdupAtoW(*p++);
+        val = msi_dup_property(package, prop);
+        msi_reg_set_val_str(hkey, key, val);
         msi_free(val);
         msi_free(key);
         msi_free(prop);
     }
+
+    msi_reg_set_val_dword(hkey, szWindowsInstaller, 1);
+
+    size = deformat_string(package, modpath_fmt, &buffer);
+    RegSetValueExW(hkey, szModifyPath, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
+    RegSetValueExW(hkey, szUninstallString, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size);
+    msi_free(buffer);
+
+    /* FIXME: Write real Estimated Size when we have it */
+    msi_reg_set_val_dword(hkey, szEstimatedSize, 0);
+
+    buffer = msi_dup_property(package, szProductName);
+    msi_reg_set_val_str(hkey, szDisplayName, buffer);
+    msi_free(buffer);
+
+    buffer = msi_dup_property(package, cszSourceDir);
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLSOURCEW, buffer);
+    msi_free(buffer);
+
+    buffer = msi_dup_property(package, szManufacturer);
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_PUBLISHERW, buffer);
+    msi_free(buffer);
+
+    GetLocalTime(&systime);
+    sprintfW(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
+    msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLDATEW, date);
+
+    langid = msi_get_property_int(package, szProductLanguage, 0);
+    msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
+
+    buffer = msi_dup_property(package, szProductVersion);
+    msi_reg_set_val_str(hkey, szDisplayVersion, buffer);
+    if (buffer)
+    {
+        DWORD verdword = msi_version_str_to_dword(buffer);
+
+        msi_reg_set_val_dword(hkey, INSTALLPROPERTY_VERSIONW, verdword);
+        msi_reg_set_val_dword(hkey, INSTALLPROPERTY_VERSIONMAJORW, verdword >> 24);
+        msi_reg_set_val_dword(hkey, INSTALLPROPERTY_VERSIONMINORW, (verdword >> 16) & 0xFF);
+        msi_free(buffer);
+    }
+
     return ERROR_SUCCESS;
 }
 
 static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
 {
-    HKEY hkey=0;
-    HKEY hudkey=0, props=0;
-    LPWSTR buffer = NULL;
+    WCHAR squashed_pc[SQUISH_GUID_SIZE];
+    LPWSTR upgrade_code;
+    HKEY hkey, props;
+    HKEY upgrade;
     UINT rc;
-    DWORD size, langid;
-    static const WCHAR szWindowsInstaller[] = 
-        {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0};
-    static const WCHAR szUpgradeCode[] = 
-        {'U','p','g','r','a','d','e','C','o','d','e',0};
-    static const WCHAR modpath_fmt[] = 
-        {'M','s','i','E','x','e','c','.','e','x','e',' ',
-         '/','I','[','P','r','o','d','u','c','t','C','o','d','e',']',0};
-    static const WCHAR szModifyPath[] = 
-        {'M','o','d','i','f','y','P','a','t','h',0};
-    static const WCHAR szUninstallString[] = 
-        {'U','n','i','n','s','t','a','l','l','S','t','r','i','n','g',0};
-    static const WCHAR szEstimatedSize[] = 
-        {'E','s','t','i','m','a','t','e','d','S','i','z','e',0};
-    static const WCHAR szProductLanguage[] =
-        {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
-    static const WCHAR szProductVersion[] =
-        {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
-    static const WCHAR szProductName[] =
-        {'P','r','o','d','u','c','t','N','a','m','e',0};
-    static const WCHAR szDisplayName[] =
-        {'D','i','s','p','l','a','y','N','a','m','e',0};
-    static const WCHAR szDisplayVersion[] =
-        {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
-    static const WCHAR szManufacturer[] =
-        {'M','a','n','u','f','a','c','t','u','r','e','r',0};
-
-    SYSTEMTIME systime;
-    static const WCHAR date_fmt[] = {'%','i','%','0','2','i','%','0','2','i',0};
-    LPWSTR upgrade_code;
-    WCHAR szDate[9];
+
+    static const WCHAR szUpgradeCode[] = {
+        'U','p','g','r','a','d','e','C','o','d','e',0};
 
     /* FIXME: also need to publish if the product is in advertise mode */
     if (!msi_check_publish(package))
         return ERROR_SUCCESS;
 
-    rc = MSIREG_OpenUninstallKey(package->ProductCode,&hkey,TRUE);
+    rc = MSIREG_OpenUninstallKey(package->ProductCode, &hkey, TRUE);
     if (rc != ERROR_SUCCESS)
         return rc;
 
@@ -4018,97 +4149,38 @@
     {
         rc = MSIREG_OpenLocalSystemInstallProps(package->ProductCode, &props, TRUE);
         if (rc != ERROR_SUCCESS)
-            return rc;
+            goto done;
     }
     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 */
-
-    msi_write_uninstall_property_vals( package, hkey );
-
-    msi_reg_set_val_dword( hkey, szWindowsInstaller, 1 );
-    
-    msi_make_package_local( package, hkey );
-
-    /* do ModifyPath and UninstallString */
-    size = deformat_string(package,modpath_fmt,&buffer);
-    RegSetValueExW(hkey,szModifyPath,0,REG_EXPAND_SZ,(LPBYTE)buffer,size);
-    RegSetValueExW(hkey,szUninstallString,0,REG_EXPAND_SZ,(LPBYTE)buffer,size);
-    msi_free(buffer);
-
-    /* FIXME: Write real Estimated Size when we have it */
-    msi_reg_set_val_dword( hkey, szEstimatedSize, 0 );
-
-    buffer = msi_dup_property( package, szProductName );
-    msi_reg_set_val_str( props, szDisplayName, buffer );
-    msi_free(buffer);
-
-    buffer = msi_dup_property( package, cszSourceDir );
-    msi_reg_set_val_str( props, INSTALLPROPERTY_INSTALLSOURCEW, buffer);
-    msi_free(buffer);
-
-    buffer = msi_dup_property( package, szManufacturer );
-    msi_reg_set_val_str( props, INSTALLPROPERTY_PUBLISHERW, buffer);
-    msi_free(buffer);
-   
-    GetLocalTime(&systime);
-    sprintfW(szDate,date_fmt,systime.wYear,systime.wMonth,systime.wDay);
-    msi_reg_set_val_str( hkey, INSTALLPROPERTY_INSTALLDATEW, szDate );
-    msi_reg_set_val_str( props, INSTALLPROPERTY_INSTALLDATEW, szDate );
-   
-    langid = msi_get_property_int( package, szProductLanguage, 0 );
-    msi_reg_set_val_dword( hkey, INSTALLPROPERTY_LANGUAGEW, langid );
-
-    buffer = msi_dup_property( package, szProductVersion );
-    msi_reg_set_val_str( props, szDisplayVersion, buffer );
-    if (buffer)
-    {
-        DWORD verdword = msi_version_str_to_dword(buffer);
-
-        msi_reg_set_val_dword( hkey, INSTALLPROPERTY_VERSIONW, verdword );
-        msi_reg_set_val_dword( props, INSTALLPROPERTY_VERSIONW, verdword );
-        msi_reg_set_val_dword( hkey, INSTALLPROPERTY_VERSIONMAJORW, verdword>>24 );
-        msi_reg_set_val_dword( props, INSTALLPROPERTY_VERSIONMAJORW, verdword>>24 );
-        msi_reg_set_val_dword( hkey, INSTALLPROPERTY_VERSIONMINORW, (verdword>>16)&0x00FF );
-        msi_reg_set_val_dword( props, INSTALLPROPERTY_VERSIONMINORW, (verdword>>16)&0x00FF );
-    }
-    msi_free(buffer);
-    
-    /* Handle Upgrade Codes */
-    upgrade_code = msi_dup_property( package, szUpgradeCode );
+            goto done;
+    }
+
+    msi_make_package_local(package, props);
+
+    rc = msi_publish_install_properties(package, hkey);
+    if (rc != ERROR_SUCCESS)
+        goto done;
+
+    rc = msi_publish_install_properties(package, props);
+    if (rc != ERROR_SUCCESS)
+        goto done;
+
+    upgrade_code = msi_dup_property(package, szUpgradeCode);
     if (upgrade_code)
     {
-        HKEY hkey2;
-        WCHAR squashed[33];
-        MSIREG_OpenUpgradeCodesKey(upgrade_code, &hkey2, TRUE);
-        squash_guid(package->ProductCode,squashed);
-        msi_reg_set_val_str( hkey2, squashed, NULL );
-        RegCloseKey(hkey2);
-        MSIREG_OpenUserUpgradeCodesKey(upgrade_code, &hkey2, TRUE);
-        squash_guid(package->ProductCode,squashed);
-        msi_reg_set_val_str( hkey2, squashed, NULL );
-        RegCloseKey(hkey2);
-
+        MSIREG_OpenUpgradeCodesKey(upgrade_code, &upgrade, TRUE);
+        squash_guid(package->ProductCode, squashed_pc);
+        msi_reg_set_val_str(upgrade, squashed_pc, NULL);
+        RegCloseKey(upgrade);
         msi_free(upgrade_code);
     }
 
+done:
     RegCloseKey(hkey);
 
-    rc = MSIREG_OpenUserDataProductKey(package->ProductCode, &hudkey, TRUE);
-    if (rc != ERROR_SUCCESS)
-        return rc;
-
-    RegCloseKey(hudkey);
-
-    msi_reg_set_val_dword( props, szWindowsInstaller, 1 );
-    RegCloseKey(props);
-
     return ERROR_SUCCESS;
 }
 
@@ -4119,6 +4191,7 @@
 
 static UINT msi_unpublish_product(MSIPACKAGE *package)
 {
+    LPWSTR upgrade;
     LPWSTR remove = NULL;
     LPWSTR *features = NULL;
     BOOL full_uninstall = TRUE;
@@ -4126,6 +4199,8 @@
 
     static const WCHAR szRemove[] = {'R','E','M','O','V','E',0};
     static const WCHAR szAll[] = {'A','L','L',0};
+    static const WCHAR szUpgradeCode[] =
+        {'U','p','g','r','a','d','e','C','o','d','e',0};
 
     remove = msi_dup_property(package, szRemove);
     if (!remove)
@@ -4158,6 +4233,13 @@
     MSIREG_DeleteUserDataProductKey(package->ProductCode);
     MSIREG_DeleteUserFeaturesKey(package->ProductCode);
     MSIREG_DeleteUninstallKey(package->ProductCode);
+
+    upgrade = msi_dup_property(package, szUpgradeCode);
+    if (upgrade)
+    {
+        MSIREG_DeleteUserUpgradeCodesKey(upgrade);
+        msi_free(upgrade);
+    }
 
 done:
     msi_free(remove);
@@ -4323,7 +4405,11 @@
     if (!productid)
         return ERROR_SUCCESS;
 
-    rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &hkey, TRUE);
+    if (package->Context == MSIINSTALLCONTEXT_MACHINE)
+        rc = MSIREG_OpenLocalSystemInstallProps(package->ProductCode, &hkey, TRUE);
+    else
+        rc = MSIREG_OpenCurrentUserInstallProps(package->ProductCode, &hkey, TRUE);
+
     if (rc != ERROR_SUCCESS)
         goto end;
 
@@ -5663,6 +5749,11 @@
 
     /* FIXME: extract all files belonging to this component */
     file = msi_find_file(package, comp->KeyPath);
+    if (!file)
+    {
+        ERR("File %s not found\n", debugstr_w(comp->KeyPath));
+        return ERROR_FUNCTION_FAILED;
+    }
 
     GetTempPathW(MAX_PATH, path);
 

Modified: trunk/reactos/dll/win32/msi/automation.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/automation.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/automation.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/automation.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -405,7 +405,7 @@
              (hr == DISP_E_PARAMNOTFOUND ||
               hr == DISP_E_EXCEPTION)) {
         static const WCHAR szComma[] = { ',',0 };
-        static WCHAR szExceptionSource[] = {'M','s','i',' ','A','P','I',' ','E','r','r','o','r',0};
+        static const WCHAR szExceptionSource[] = {'M','s','i',' ','A','P','I',' ','E','r','r','o','r',0};
         WCHAR szExceptionDescription[MAX_PATH];
         BSTR bstrParamNames[MAX_FUNC_PARAMS];
         unsigned namesNo, i;

Modified: trunk/reactos/dll/win32/msi/database.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/database.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/database.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/database.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -83,7 +83,7 @@
     WCHAR path[MAX_PATH];
 
     static const WCHAR backslash[] = {'\\',0};
-    static WCHAR szTables[]  = { '_','T','a','b','l','e','s',0 };
+    static const WCHAR szTables[]  = { '_','T','a','b','l','e','s',0 };
 
     TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) );
 

Modified: trunk/reactos/dll/win32/msi/files.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/files.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/files.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/files.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -459,24 +459,22 @@
     return ret;
 }
 
-static VOID set_file_source(MSIPACKAGE* package, MSIFILE* file, LPCWSTR path)
-{
-    if (!file->IsCompressed)
-    {
-        LPWSTR p, path;
-        p = resolve_folder(package, file->Component->Directory, TRUE, FALSE, TRUE, NULL);
-        path = build_directory_name(2, p, file->ShortName);
-        if (file->LongName &&
-            INVALID_FILE_ATTRIBUTES == GetFileAttributesW( path ))
-        {
-            msi_free(path);
-            path = build_directory_name(2, p, file->LongName);
-        }
-        file->SourcePath = path;
-        msi_free(p);
-    }
-    else
-        file->SourcePath = build_directory_name(2, path, file->File);
+/* compares the version of a file read from the filesystem and
+ * the version specified in the File table
+ */
+static int msi_compare_file_version(MSIFILE *file)
+{
+    WCHAR version[MAX_PATH];
+    DWORD size;
+    UINT r;
+
+    size = MAX_PATH;
+    version[0] = '\0';
+    r = MsiGetFileVersionW(file->TargetPath, version, &size, NULL, NULL);
+    if (r != ERROR_SUCCESS)
+        return 0;
+
+    return lstrcmpW(version, file->Version);
 }
 
 void msi_free_media_info( MSIMEDIAINFO *mi )
@@ -564,10 +562,9 @@
         options |= MSISOURCETYPE_NETWORK;
     }
 
-    if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
-        msi_package_add_media_disk(package, package->Context,
-                                   MSICODE_PRODUCT, mi->disk_id,
-                                   mi->volume_label, mi->disk_prompt);
+    msi_package_add_media_disk(package, package->Context,
+                               MSICODE_PRODUCT, mi->disk_id,
+                               mi->volume_label, mi->disk_prompt);
 
     msi_package_add_info(package, package->Context,
                          options, INSTALLPROPERTY_LASTUSEDSOURCEW, source);
@@ -577,7 +574,7 @@
 }
 
 /* FIXME: search NETWORK and URL sources as well */
-static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
+UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
 {
     WCHAR source[MAX_PATH];
     WCHAR volume[MAX_PATH];
@@ -586,6 +583,7 @@
     DWORD index, size, id;
     UINT r;
 
+    size = MAX_PATH;
     r = MsiSourceListGetInfoW(package->ProductCode, NULL,
                               package->Context, MSICODE_PRODUCT,
                               INSTALLPROPERTY_LASTUSEDSOURCEW, source, &size);
@@ -822,6 +820,13 @@
             continue;
         }
 
+        if (MsiGetFileVersionW(file->TargetPath, NULL, NULL, NULL, NULL) == ERROR_SUCCESS &&
+            msi_compare_file_version(file) >= 0)
+        {
+            TRACE("Destination file version greater, not overwriting\n");
+            continue;
+        }
+
         if (file->Sequence > mi->last_sequence || mi->is_continuous ||
             (file->IsCompressed && !mi->is_extracted))
         {
@@ -846,13 +851,11 @@
             }
         }
 
-        set_file_source(package, file, mi->source);
-
-        TRACE("file paths %s to %s\n",debugstr_w(file->SourcePath),
-              debugstr_w(file->TargetPath));
-
         if (!file->IsCompressed)
         {
+            TRACE("file paths %s to %s\n", debugstr_w(file->SourcePath),
+                  debugstr_w(file->TargetPath));
+
             msi_file_update_ui(package, file, szInstallFiles);
             rc = copy_install_file(file);
             if (rc != ERROR_SUCCESS)
@@ -992,24 +995,6 @@
     msiobj_release(&view->hdr);
 
     return rc;
-}
-
-/* compares the version of a file read from the filesystem and
- * the version specified in the File table
- */
-static int msi_compare_file_version( MSIFILE *file )
-{
-    WCHAR version[MAX_PATH];
-    DWORD size;
-    UINT r;
-
-    size = MAX_PATH;
-    version[0] = '\0';
-    r = MsiGetFileVersionW( file->TargetPath, version, &size, NULL, NULL );
-    if ( r != ERROR_SUCCESS )
-        return 0;
-
-    return lstrcmpW( version, file->Version );
 }
 
 UINT ACTION_RemoveFiles( MSIPACKAGE *package )

Modified: trunk/reactos/dll/win32/msi/helpers.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/helpers.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/helpers.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/helpers.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -921,6 +921,8 @@
             ComponentList *clist;
             MSIFEATURE *f;
 
+            component->hasLocalFeature = FALSE;
+
             msi_component_set_state( component, newstate );
 
             /*if any other feature wants is local we need to set it local*/
@@ -939,6 +941,7 @@
                           f->ActionRequest == INSTALLSTATE_SOURCE) )
                     {
                         TRACE("Saved by %s\n", debugstr_w(f->Feature));
+                        component->hasLocalFeature = TRUE;
 
                         if (component->Attributes & msidbComponentAttributesOptional)
                         {
@@ -1160,6 +1163,16 @@
     if (r != ERROR_SUCCESS)
         goto done;
 
+    if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+    {
+        r = find_published_source(package, mi);
+        if (r != ERROR_SUCCESS)
+        {
+            ERR("Cabinet not found: %s\n", debugstr_w(mi->source));
+            return ERROR_INSTALL_FAILURE;
+        }
+    }
+
     data.package = package;
     data.mi = mi;
     data.file = file;

Modified: trunk/reactos/dll/win32/msi/msi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -1812,6 +1812,7 @@
     HKEY hkey;
     INSTALLSTATE r;
     BOOL missing = FALSE;
+    BOOL machine = FALSE;
 
     TRACE("%s %s\n", debugstr_w(szProduct), debugstr_w(szFeature));
 
@@ -1821,10 +1822,15 @@
     if (!squash_guid( szProduct, squishProduct ))
         return INSTALLSTATE_INVALIDARG;
 
-    /* check that it's installed at all */
-    rc = MSIREG_OpenUserFeaturesKey(szProduct, &hkey, FALSE);
-    if (rc != ERROR_SUCCESS)
-        return INSTALLSTATE_UNKNOWN;
+    if (MSIREG_OpenManagedFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenUserFeaturesKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS)
+    {
+        rc = MSIREG_OpenLocalClassesFeaturesKey(szProduct, &hkey, FALSE);
+        if (rc != ERROR_SUCCESS)
+            return INSTALLSTATE_UNKNOWN;
+
+        machine = TRUE;
+    }
 
     parent_feature = msi_reg_get_val_str( hkey, szFeature );
     RegCloseKey(hkey);
@@ -1837,8 +1843,11 @@
     if (r == INSTALLSTATE_ABSENT)
         return r;
 
-    /* now check if it's complete or advertised */
-    rc = MSIREG_OpenUserDataFeaturesKey(szProduct, &hkey, FALSE);
+    if (machine)
+        rc = MSIREG_OpenLocalUserDataFeaturesKey(szProduct, &hkey, FALSE);
+    else
+        rc = MSIREG_OpenUserDataFeaturesKey(szProduct, &hkey, FALSE);
+
     if (rc != ERROR_SUCCESS)
         return INSTALLSTATE_ADVERTISED;
 
@@ -1862,7 +1871,12 @@
         }
 
         StringFromGUID2(&guid, comp, GUID_SIZE);
-        rc = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE);
+
+        if (machine)
+            rc = MSIREG_OpenLocalUserDataComponentKey(comp, &hkey, FALSE);
+        else
+            rc = MSIREG_OpenUserDataComponentKey(comp, &hkey, FALSE);
+
         if (rc != ERROR_SUCCESS)
         {
             msi_free(components);
@@ -2281,57 +2295,93 @@
                 awstring *lpOrgNameBuf, LPDWORD pcchOrgNameBuf,
                 awstring *lpSerialBuf, LPDWORD pcchSerialBuf)
 {
-    HKEY hkey;
+    WCHAR squished_pc[SQUISH_GUID_SIZE];
     LPWSTR user, org, serial;
+    USERINFOSTATE state;
+    HKEY hkey, props;
+    LPCWSTR orgptr;
     UINT r;
-    USERINFOSTATE state;
-
-    TRACE("%s %p %p %p %p %p %p\n",debugstr_w(szProduct), lpUserNameBuf,
+
+    static const WCHAR szEmpty[] = {0};
+
+    TRACE("%s %p %p %p %p %p %p\n", debugstr_w(szProduct), lpUserNameBuf,
           pcchUserNameBuf, lpOrgNameBuf, pcchOrgNameBuf, lpSerialBuf,
           pcchSerialBuf);
 
-    if (!szProduct)
+    if (!szProduct || !squash_guid(szProduct, squished_pc))
         return USERINFOSTATE_INVALIDARG;
 
-    r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
-    if (r != ERROR_SUCCESS)
+    if (MSIREG_OpenLocalManagedProductKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenUserProductsKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenLocalClassesProductKey(szProduct, &hkey, FALSE) != ERROR_SUCCESS)
+    {
         return USERINFOSTATE_UNKNOWN;
-
-    user = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGOWNERW );
-    org = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGCOMPANYW );
-    serial = msi_reg_get_val_str( hkey, INSTALLPROPERTY_PRODUCTIDW );
+    }
+
+    if (MSIREG_OpenCurrentUserInstallProps(szProduct, &props, FALSE) != ERROR_SUCCESS &&
+        MSIREG_OpenLocalSystemInstallProps(szProduct, &props, FALSE) != ERROR_SUCCESS)
+    {
+        RegCloseKey(hkey);
+        return USERINFOSTATE_ABSENT;
+    }
+
+    user = msi_reg_get_val_str(props, INSTALLPROPERTY_REGOWNERW);
+    org = msi_reg_get_val_str(props, INSTALLPROPERTY_REGCOMPANYW);
+    serial = msi_reg_get_val_str(props, INSTALLPROPERTY_PRODUCTIDW);
+    state = USERINFOSTATE_ABSENT;
 
     RegCloseKey(hkey);
-
-    state = USERINFOSTATE_PRESENT;
-
-    if (user)
-    {
-        r = msi_strcpy_to_awstring( user, lpUserNameBuf, pcchUserNameBuf );
+    RegCloseKey(props);
+
+    if (user && serial)
+        state = USERINFOSTATE_PRESENT;
+
+    if (pcchUserNameBuf)
+    {
+        if (lpUserNameBuf && !user)
+        {
+            (*pcchUserNameBuf)--;
+            goto done;
+        }
+
+        r = msi_strcpy_to_awstring(user, lpUserNameBuf, pcchUserNameBuf);
+        if (r == ERROR_MORE_DATA)
+        {
+            state = USERINFOSTATE_MOREDATA;
+            goto done;
+        }
+    }
+
+    if (pcchOrgNameBuf)
+    {
+        orgptr = org;
+        if (!orgptr) orgptr = szEmpty;
+
+        r = msi_strcpy_to_awstring(orgptr, lpOrgNameBuf, pcchOrgNameBuf);
+        if (r == ERROR_MORE_DATA)
+        {
+            state = USERINFOSTATE_MOREDATA;
+            goto done;
+        }
+    }
+
+    if (pcchSerialBuf)
+    {
+        if (!serial)
+        {
+            (*pcchSerialBuf)--;
+            goto done;
+        }
+
+        r = msi_strcpy_to_awstring(serial, lpSerialBuf, pcchSerialBuf);
         if (r == ERROR_MORE_DATA)
             state = USERINFOSTATE_MOREDATA;
     }
-    else
-        state = USERINFOSTATE_ABSENT;
-    if (org)
-    {
-        r = msi_strcpy_to_awstring( org, lpOrgNameBuf, pcchOrgNameBuf );
-        if (r == ERROR_MORE_DATA && state == USERINFOSTATE_PRESENT)
-            state = USERINFOSTATE_MOREDATA;
-    }
-    /* msdn states: The user information is considered to be present even in the absence of a company name. */
-    if (serial)
-    {
-        r = msi_strcpy_to_awstring( serial, lpSerialBuf, pcchSerialBuf );
-        if (r == ERROR_MORE_DATA && state == USERINFOSTATE_PRESENT)
-            state = USERINFOSTATE_MOREDATA;
-    }
-    else
-        state = USERINFOSTATE_ABSENT;
-
-    msi_free( user );
-    msi_free( org );
-    msi_free( serial );
+
+done:
+    msi_free(user);
+    msi_free(org);
+    msi_free(serial);
 
     return state;
 }
@@ -2345,6 +2395,11 @@
                 LPWSTR lpSerialBuf, LPDWORD pcchSerialBuf)
 {
     awstring user, org, serial;
+
+    if ((lpUserNameBuf && !pcchUserNameBuf) ||
+        (lpOrgNameBuf && !pcchOrgNameBuf) ||
+        (lpSerialBuf && !pcchSerialBuf))
+        return USERINFOSTATE_INVALIDARG;
 
     user.unicode = TRUE;
     user.str.w = lpUserNameBuf;
@@ -2366,6 +2421,11 @@
     awstring user, org, serial;
     LPWSTR prod;
     UINT r;
+
+    if ((lpUserNameBuf && !pcchUserNameBuf) ||
+        (lpOrgNameBuf && !pcchOrgNameBuf) ||
+        (lpSerialBuf && !pcchSerialBuf))
+        return USERINFOSTATE_INVALIDARG;
 
     prod = strdupAtoW( szProduct );
     if (szProduct && !prod)

Modified: trunk/reactos/dll/win32/msi/msi.spec
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi.spec?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi.spec [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi.spec [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -187,8 +187,8 @@
 191 stub MsiInvalidateFeatureCache
 192 stdcall MsiUseFeatureExA(str str long long)
 193 stdcall MsiUseFeatureExW(wstr wstr long long)
-194 stdcall MsiGetFileVersionA(str str ptr str ptr)
-195 stdcall MsiGetFileVersionW(wstr wstr ptr wstr ptr)
+194 stdcall MsiGetFileVersionA(str ptr ptr ptr ptr)
+195 stdcall MsiGetFileVersionW(wstr ptr ptr ptr ptr)
 196 stdcall MsiLoadStringA(long long long long long)
 197 stdcall MsiLoadStringW(long long long long long)
 198 stdcall MsiMessageBoxA(long long long long long long)

Modified: trunk/reactos/dll/win32/msi/msi_Sv.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msi_Sv.rc?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msi_Sv.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msi_Sv.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -18,7 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
+LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
 
 STRINGTABLE DISCARDABLE
 {

Modified: trunk/reactos/dll/win32/msi/msipriv.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/msipriv.h?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/msipriv.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/msipriv.h [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -767,12 +767,13 @@
 extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
 extern UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create);
-extern UINT MSIREG_OpenComponents(HKEY* key);
 extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create);
+extern UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 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_OpenLocalUserDataProductKey(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);
@@ -785,9 +786,15 @@
 extern UINT MSIREG_OpenLocalSystemProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenLocalSystemComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenLocalClassesProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
+extern UINT MSIREG_OpenLocalClassesFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
 extern UINT MSIREG_OpenLocalManagedProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
+extern UINT MSIREG_OpenManagedFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create);
+extern UINT MSIREG_OpenLocalUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create);
 extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
+extern UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent);
 extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent);
+extern UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode);
+extern UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create);
 
 extern LPWSTR msi_reg_get_val_str( HKEY hkey, LPCWSTR name );
 extern BOOL msi_reg_get_val_dword( HKEY hkey, LPCWSTR name, DWORD *val);
@@ -908,6 +915,7 @@
 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);
+extern UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi);
 
 /* control event stuff */
 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,

Modified: trunk/reactos/dll/win32/msi/package.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/package.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/package.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/package.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -760,30 +760,6 @@
     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 };
@@ -823,8 +799,6 @@
 
         if (package->WordCount & MSIWORDCOUNT_ADMINISTRATIVE)
             msi_load_admin_properties( package );
-
-        msi_set_context( package );
     }
 
     return package;

Modified: trunk/reactos/dll/win32/msi/registry.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/registry.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/registry.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/registry.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -204,6 +204,12 @@
 'I','n','s','t','a','l','l','e','r','\\',
 'P','r','o','d','u','c','t','s','\\','%','s',0};
 
+static const WCHAR szInstaller_LocalClassesFeat_fmt[] = {
+'S','o','f','t','w','a','r','e','\\',
+'C','l','a','s','s','e','s','\\',
+'I','n','s','t','a','l','l','e','r','\\',
+'F','e','a','t','u','r','e','s','\\','%','s',0};
+
 static const WCHAR szInstaller_LocalManagedProd_fmt[] = {
 'S','o','f','t','w','a','r','e','\\',
 'M','i','c','r','o','s','o','f','t','\\',
@@ -213,6 +219,23 @@
 'M','a','n','a','g','e','d','\\','%','s','\\',
 'I','n','s','t','a','l','l','e','r','\\',
 'P','r','o','d','u','c','t','s','\\','%','s',0};
+
+static const WCHAR szInstaller_LocalManagedFeat_fmt[] = {
+'S','o','f','t','w','a','r','e','\\',
+'M','i','c','r','o','s','o','f','t','\\',
+'W','i','n','d','o','w','s','\\',
+'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+'I','n','s','t','a','l','l','e','r','\\',
+'M','a','n','a','g','e','d','\\','%','s','\\',
+'I','n','s','t','a','l','l','e','r','\\',
+'F','e','a','t','u','r','e','s','\\','%','s',0};
+
+static const WCHAR szInstaller_ClassesUpgrade_fmt[] = {
+'I','n','s','t','a','l','l','e','r','\\',
+'U','p','g','r','a','d','e','C','o','d','e','s','\\',
+'%','s',0};
+
+static const WCHAR localsid[] = {'S','-','1','-','5','-','1','8',0};
 
 BOOL unsquash_guid(LPCWSTR in, LPWSTR out)
 {
@@ -645,9 +668,22 @@
     return rc;
 }
 
-UINT MSIREG_OpenComponents(HKEY* key)
-{
-    return RegCreateKeyW(HKEY_LOCAL_MACHINE,szInstaller_Components,key);
+UINT MSIREG_OpenLocalUserDataFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create)
+{
+    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));
+
+    sprintfW(keypath, szUserDataFeatures_fmt, localsid, squished_pc);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
 }
 
 UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create)
@@ -671,6 +707,38 @@
     return rc;
 }
 
+UINT MSIREG_OpenLocalUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create)
+{
+    WCHAR comp[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szComponent));
+    if (!squash_guid(szComponent, comp))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(comp));
+
+    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
+UINT MSIREG_DeleteLocalUserDataComponentKey(LPCWSTR szComponent)
+{
+    WCHAR comp[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szComponent));
+    if (!squash_guid(szComponent, comp))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(comp));
+
+    sprintfW(keypath, szUserDataComp_fmt, localsid, comp);
+    return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
+}
+
 UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, HKEY *key, BOOL create)
 {
     UINT rc;
@@ -756,6 +824,24 @@
     return rc;
 }
 
+UINT MSIREG_OpenLocalUserDataProductKey(LPCWSTR szProduct, HKEY *key, BOOL create)
+{
+    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));
+
+    sprintfW(keypath, szUserDataProd_fmt, localsid, squished_pc);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
 static UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, LPCWSTR szUserSID,
                                     HKEY *key, BOOL create)
 {
@@ -800,8 +886,6 @@
 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);
 }
 
@@ -929,6 +1013,21 @@
     return rc;
 }
 
+UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode)
+{
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n",debugstr_w(szUpgradeCode));
+    if (!squash_guid(szUpgradeCode,squished_pc))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    sprintfW(keypath,szInstaller_UserUpgradeCodes_fmt,squished_pc);
+
+    return RegDeleteTreeW(HKEY_CURRENT_USER, keypath);
+}
+
 UINT MSIREG_OpenLocalSystemProductKey(LPCWSTR szProductCode, HKEY *key, BOOL create)
 {
     WCHAR squished_pc[GUID_SIZE];
@@ -982,6 +1081,26 @@
     TRACE("squished (%s)\n", debugstr_w(squished_pc));
 
     sprintfW(keypath, szInstaller_LocalClassesProd_fmt, squished_pc);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
+UINT MSIREG_OpenLocalClassesFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create)
+{
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szProductCode));
+
+    if (!squash_guid(szProductCode, squished_pc))
+        return ERROR_FUNCTION_FAILED;
+
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    sprintfW(keypath, szInstaller_LocalClassesFeat_fmt, squished_pc);
 
     if (create)
         return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
@@ -1017,6 +1136,54 @@
         return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
 
     return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
+UINT MSIREG_OpenManagedFeaturesKey(LPCWSTR szProductCode, HKEY *key, BOOL create)
+{
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
+    LPWSTR usersid;
+    UINT r;
+
+    TRACE("%s\n", debugstr_w(szProductCode));
+
+    if (!squash_guid(szProductCode, squished_pc))
+        return ERROR_FUNCTION_FAILED;
+
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    r = get_user_sid(&usersid);
+    if (r != ERROR_SUCCESS || !usersid)
+    {
+        ERR("Failed to retrieve user SID: %d\n", r);
+        return r;
+    }
+
+    sprintfW(keypath, szInstaller_LocalManagedFeat_fmt, usersid, squished_pc);
+    LocalFree(usersid);
+
+    if (create)
+        return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+    return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
+UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create)
+{
+    WCHAR squished_pc[GUID_SIZE];
+    WCHAR keypath[0x200];
+
+    TRACE("%s\n", debugstr_w(szUpgradeCode));
+    if (!squash_guid(szUpgradeCode, squished_pc))
+        return ERROR_FUNCTION_FAILED;
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    sprintfW(keypath, szInstaller_ClassesUpgrade_fmt, squished_pc);
+
+    if (create)
+        return RegCreateKeyW(HKEY_CLASSES_ROOT, keypath, key);
+
+    return RegOpenKeyW(HKEY_CLASSES_ROOT, keypath, key);
 }
 
 /*************************************************************************
@@ -1240,7 +1407,7 @@
 
     TRACE("%d %p\n", index, lpguid);
 
-    r = MSIREG_OpenComponents(&hkeyComponents);
+    r = RegCreateKeyW(HKEY_LOCAL_MACHINE, szInstaller_Components, &hkeyComponents);
     if( r != ERROR_SUCCESS )
         return ERROR_NO_MORE_ITEMS;
 

Modified: trunk/reactos/dll/win32/msi/source.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msi/source.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msi/source.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msi/source.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -304,15 +304,14 @@
 
     if (pcchDiskPrompt)
     {
-        data = ptr;
-        if (!*data)
-            data++;
-
-        size = lstrlenW(data);
+        if (!*ptr)
+            ptr++;
+
+        size = lstrlenW(ptr);
         if (size >= *pcchDiskPrompt)
             r = ERROR_MORE_DATA;
         else if (szDiskPrompt)
-            lstrcpyW(szDiskPrompt, data);
+            lstrcpyW(szDiskPrompt, ptr);
 
         *pcchDiskPrompt = size;
     }

Modified: trunk/reactos/dll/win32/msvfw32/drawdib.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/drawdib.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/drawdib.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msvfw32/drawdib.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -458,7 +458,6 @@
 UINT VFWAPI DrawDibRealize(HDRAWDIB hdd, HDC hdc, BOOL fBackground) 
 {
     WINE_HDD *whdd;
-    HPALETTE oldPal;
     UINT ret = 0;
 
     FIXME("(%p, %p, %d), stub\n", hdd, hdc, fBackground);
@@ -475,7 +474,7 @@
     if (!whdd->hpal)
         whdd->hpal = CreateHalftonePalette(hdc);
 
-    oldPal = SelectPalette(hdc, whdd->hpal, fBackground);
+    SelectPalette(hdc, whdd->hpal, fBackground);
     ret = RealizePalette(hdc);
 
  out:

Added: trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc?rev=34375&view=auto
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc (added)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -1,0 +1,53 @@
+/*
+ * 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
+
+ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE  36, 24, 187, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Video komprimering"
+FONT 8, "MS Shell Dlg"
+{
+    DEFPUSHBUTTON "OK",IDOK,129,2,49,14
+    PUSHBUTTON "Annuller",IDCANCEL,129,18,49,14
+
+    LTEXT "&Komprimerer:",-1,9,6,105,8
+    COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
+
+    PUSHBUTTON "&Opsætning...",882,129,36,49,14
+    PUSHBUTTON "O&m...",883,129,52,49,14
+
+    SCROLLBAR 884,9,44,111,9,WS_TABSTOP
+
+    LTEXT "Komprimeringskvalite&t:",886,9,34,80,8
+
+    CONTROL "Keyframe for hvert",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
+    EDITTEXT 888,78,60,22,12
+    LTEXT "billede",889,103,62,26,10
+
+    CONTROL "&Datahastighed",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
+    EDITTEXT 895,78,76,22,12
+    LTEXT "KB/s",896,102,78,26,10
+}
+
+STRINGTABLE DISCARDABLE
+{
+    IDS_FULLFRAMES "Fulde billeder (ukomprimeret)"
+}

Propchange: trunk/reactos/dll/win32/msvfw32/msvfw32_Da.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/msvfw32/msvfw32_Es.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_Es.rc?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_Es.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_Es.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -1,5 +1,6 @@
 /*
  * Copyright 2007 Luis Carlos Busquets Pérez
+ * Copyright 2008 José Manuel Ferrer Ortiz
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -36,11 +37,11 @@
 
     LTEXT "C&alidad de compresión:",886,9,34,80,8
 
-    CONTROL "C&uadro clave cada",887,"Botón",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
+    CONTROL "C&uadro clave cada",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
     EDITTEXT 888,78,60,22,12
     LTEXT "cuadros",889,103,62,26,10
 
-    CONTROL "&Velocidad de datos",894,"Botón",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
+    CONTROL "&Tasa de datos",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
     EDITTEXT 895,78,76,22,12
     LTEXT "KB/s",896,102,78,26,10
 }

Modified: trunk/reactos/dll/win32/msvfw32/msvfw32_No.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_No.rc?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_No.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_No.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -29,8 +29,8 @@
     LTEXT "&Komprimerer:",-1,9,6,105,8
     COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
 
-    PUSHBUTTON "&Oppsett . . .",882,129,36,49,14
-    PUSHBUTTON "O&m . . .",883,129,52,49,14
+    PUSHBUTTON "&Oppsett...",882,129,36,49,14
+    PUSHBUTTON "O&m...",883,129,52,49,14
 
     SCROLLBAR 884,9,44,111,9,WS_TABSTOP
 

Added: trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc?rev=34375&view=auto
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc (added)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -1,0 +1,51 @@
+/*
+ * Copyright 2008 Vitaliy Margolen
+ *
+ * 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_RUSSIAN, SUBLANG_DEFAULT
+
+ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE  36, 24, 187, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Ñæàòèå âèäåî"
+FONT 8, "MS Shell Dlg"
+{
+    DEFPUSHBUTTON "OK",IDOK,129,2,49,14
+    PUSHBUTTON "Îòìåíà",IDCANCEL,129,18,49,14
+
+    LTEXT "&Àëãîðèòì ñæàòèÿ:",-1,9,6,105,8
+    COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
+
+    PUSHBUTTON "&Íàñòðîéêè...",882,129,36,49,14
+    PUSHBUTTON "&Èíôîðìàöèÿ...",883,129,52,49,14
+
+    SCROLLBAR 884,9,44,111,9,WS_TABSTOP
+
+    LTEXT "&Êà÷åñòâî ñæàòèÿ:",886,9,34,80,8
+
+    CONTROL "Êë&þ÷åâîé êàäð êàæäûå",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
+    EDITTEXT 888,78,60,22,12
+    LTEXT "êàäðîâ",889,103,62,26,10
+
+    CONTROL "&Ïîòîê äàííûõ",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
+    EDITTEXT 895,78,76,22,12
+    LTEXT "ÊÁ/ñåê",896,102,78,26,10
+}
+
+STRINGTABLE DISCARDABLE
+{
+    IDS_FULLFRAMES "Êàäðû öåëèêîì (Áåç êîìïðåññèè)"
+}

Propchange: trunk/reactos/dll/win32/msvfw32/msvfw32_Ru.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc?rev=34375&view=auto
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc (added)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -1,0 +1,55 @@
+/*
+ * 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
+
+ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE  36, 24, 187, 95
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+CAPTION "Stiskanje videa"
+FONT 8, "MS Shell Dlg"
+{
+    DEFPUSHBUTTON "V redu",IDOK,129,2,49,14
+    PUSHBUTTON "Prekliči",IDCANCEL,129,18,49,14
+
+    LTEXT "&Kodek za stiskanje:",-1,9,6,105,8
+    COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
+
+    PUSHBUTTON "&Nastavitve ...",882,129,36,49,14
+    PUSHBUTTON "&O ...",883,129,52,49,14
+
+    SCROLLBAR 884,9,44,111,9,WS_TABSTOP
+
+    LTEXT "Kakovost &stiskanja:",886,9,34,80,8
+
+    CONTROL "&Ključna slika na vsakih",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12
+    EDITTEXT 888,78,60,22,12
+    LTEXT "slik",889,103,62,26,10
+
+    CONTROL "&Pretok podatkov",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12
+    EDITTEXT 895,78,76,22,12
+    LTEXT "kb/s",896,102,78,26,10
+}
+
+STRINGTABLE DISCARDABLE
+{
+    IDS_FULLFRAMES "Polne slike (nestisnjeno)"
+}
+
+#pragma code_page(default)

Propchange: trunk/reactos/dll/win32/msvfw32/msvfw32_Si.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/dll/win32/msvfw32/msvfw32_Sv.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/msvfw32_Sv.rc?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/msvfw32_Sv.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msvfw32/msvfw32_Sv.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -16,7 +16,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
+LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
 
 ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE  36, 24, 187, 95
 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

Modified: trunk/reactos/dll/win32/msvfw32/rsrc.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msvfw32/rsrc.rc?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/msvfw32/rsrc.rc [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msvfw32/rsrc.rc [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -20,6 +20,7 @@
 #include "winuser.h"
 #include "msvideo_private.h"
 
+#include "msvfw32_Da.rc"
 #include "msvfw32_De.rc"
 #include "msvfw32_En.rc"
 #include "msvfw32_Es.rc"
@@ -29,5 +30,7 @@
 #include "msvfw32_Nl.rc"
 #include "msvfw32_No.rc"
 #include "msvfw32_Pl.rc"
+#include "msvfw32_Ru.rc"
+#include "msvfw32_Si.rc"
 #include "msvfw32_Sv.rc"
 #include "msvfw32_Tr.rc"

Modified: trunk/reactos/dll/win32/netapi32/access.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/access.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/netapi32/access.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netapi32/access.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -105,6 +105,34 @@
     return NULL;
 }
 
+static BOOL NETAPI_IsCurrentUser(LPCWSTR username)
+{
+    LPWSTR curr_user = NULL;
+    DWORD dwSize;
+    BOOL ret = FALSE;
+
+    dwSize = LM20_UNLEN+1;
+    curr_user = HeapAlloc(GetProcessHeap(), 0, dwSize);
+    if(!curr_user)
+    {
+        ERR("Failed to allocate memory for user name.\n");
+        goto end;
+    }
+    if(!GetUserNameW(curr_user, &dwSize))
+    {
+        ERR("Failed to get current user's user name.\n");
+        goto end;
+    }
+    if (!lstrcmpW(curr_user, username))
+    {
+        ret = TRUE;
+    }
+
+end:
+    HeapFree(GetProcessHeap(), 0, curr_user);
+    return ret;
+}
+
 /************************************************************
  *                NetUserAdd (NETAPI32.@)
  */
@@ -226,7 +254,7 @@
         return NERR_InvalidComputer;
     }
 
-    if(!NETAPI_FindUser(username))
+    if(!NETAPI_FindUser(username) && !NETAPI_IsCurrentUser(username))
     {
         TRACE("User %s is unknown.\n", debugstr_w(username));
         return NERR_UserNotFound;

Modified: trunk/reactos/dll/win32/netapi32/ds.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/ds.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/netapi32/ds.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netapi32/ds.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -77,7 +77,7 @@
  *  DsRoleGetPrimaryDomainInformation  (NETAPI32.@)
  *
  * PARAMS
- *  lpServer  [I] Pointer to UNICODE string with Computername
+ *  lpServer  [I] Pointer to UNICODE string with ComputerName
  *  InfoLevel [I] Type of data to retrieve	
  *  Buffer    [O] Pointer to to the requested data
  *
@@ -99,6 +99,7 @@
     if (!Buffer) return ERROR_INVALID_PARAMETER;
     if ((InfoLevel < DsRolePrimaryDomainInfoBasic) || (InfoLevel > DsRoleOperationState)) return ERROR_INVALID_PARAMETER;
 
+    *Buffer = NULL;
     switch (InfoLevel)
     {
         case DsRolePrimaryDomainInfoBasic:

Modified: trunk/reactos/dll/win32/netapi32/nbnamecache.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/nbnamecache.h?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/netapi32/nbnamecache.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netapi32/nbnamecache.h [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -45,7 +45,7 @@
 
 /* Functions that create, manipulate, and destroy a name cache.  Thread-safe,
  * with the exception of NBNameCacheDestroy--ensure that no other threads are
- * manipulating the cache before destoying it.
+ * manipulating the cache before destroying it.
  */
 
 /* Allocates a new name cache from heap, and sets the expire time on new

Modified: trunk/reactos/dll/win32/netapi32/wksta.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netapi32/wksta.c?rev=34375&r1=34374&r2=34375&view=diff
==============================================================================
--- trunk/reactos/dll/win32/netapi32/wksta.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/netapi32/wksta.c [iso-8859-1] Tue Jul  8 15:52:29 2008
@@ -103,7 +103,7 @@
 
 /* Theoretically this could be too short, except that MS defines
  * MAX_ADAPTER_NAME as 128, and MAX_INTERFACE_NAME_LEN as 256, and both
- * represent a count of WCHARs, so even with an extroardinarily long header
+ * represent a count of WCHARs, so even with an extraordinarily long header
  * this will be plenty
  */
 #define MAX_TRANSPORT_NAME MAX_INTERFACE_NAME_LEN
@@ -348,7 +348,6 @@
     {
         PWKSTA_USER_INFO_1 ui;
         PWKSTA_USER_INFO_0 ui0;
-        DWORD dwSize;
         LSA_OBJECT_ATTRIBUTES ObjectAttributes;
         LSA_HANDLE PolicyHandle;
         PPOLICY_ACCOUNT_DOMAIN_INFO DomainInfo;
@@ -405,7 +404,6 @@
             oth_domains_sz * sizeof(WCHAR));
 
         /* get data */
-        dwSize = username_sz;
         lstrcpyW(ui->wkui1_username, ui0->wkui0_username);
         NetApiBufferFree(ui0);
 



More information about the Ros-diffs mailing list