[Bug 35809] New: Avoid deletion of precious (empty) folders such as '%USERPROFILE%\\Application Data' during MSI product upgrades/uninstalls

wine-bugs at winehq.org wine-bugs at winehq.org
Mon Mar 17 17:43:21 CDT 2014


https://bugs.winehq.org/show_bug.cgi?id=35809

            Bug ID: 35809
           Summary: Avoid deletion of precious (empty) folders such as
                    '%USERPROFILE%\\Application Data' during MSI product
                    upgrades/uninstalls
           Product: Wine
           Version: 1.7.14
          Hardware: x86
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: tools
          Assignee: wine-bugs at winehq.org
          Reporter: focht at gmx.net

Hello folks,

found this while investigating some issues with Aeria Game Launcher
(https://www.aeriagames.com/playnow/ignite).

Aeria requires .NET Framework 3.5 installed.
After applying 'wintricks -q dotnet35' recipe to a fresh 32-bit WINEPREFIX the
'Aeria Ignite' installer silently fails.

The reason is that some folders such as '%USERPROFILE%\\Application Data' are
completely missing and the installer fails to put some files below that.

Those folders are created during WINEPREFIX creation (wineboot).
Deletion afterwards won't let them get recreated (prefix update).

Further investigation reveals this happens during .NET Framework service pack
recipe runs where products to be upgraded are uninstalled (expected, by
design).

Example: .NET Framework 2.0 -> .NET Framework 2.0 SP1

--- snip ---
...
0028:Call KERNEL32.CreateProcessW(00000000,0171b210 L"msiexec /i
{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
REMOVE=ALL",00000000,00000000,00000000,00000000,00000000,00000000,0033d0d8,0033d0c8)
ret=7dac3509
...
008d:Call KERNEL32.__wine_kernel_init() ret=7bc5a3aa
0028:Ret  KERNEL32.CreateProcessW() retval=00000001 ret=7dac3509
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"RemoveFiles") 
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"RemoveFolders")
...
<*** attempted removal of lots of folders, even precious ones ***>
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"CreateFolders") 
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"InstallFiles")
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"PublishProduct")
...
008d:trace:msi:ACTION_PerformUIAction Performing action (L"InstallFinalize")
...
008d:Call msi.MsiConfigureProductExW(00139a96
L"{7131646D-CD3C-40F4-97B9-CD9E4E6262EF}",00000000,00000005,00136340 L"
REMOVE=ALL") ret=7edefa60 
008d:Call KERNEL32.DeleteFileW(00159bd0 L"C:\\windows\\Installer\\14bc.msi")
ret=7ed19d6f
008d:Ret  KERNEL32.DeleteFileW() retval=00000001 ret=7ed19d6f
...
008d:Ret  msi.MsiConfigureProductExW() retval=00000000 ret=7edefa60
008d:Call KERNEL32.ExitProcess(00000000) ret=7edf0282
...
--- snip ---

I filtered only the successful deletions (= folder was empty):

--- snip ---
$ grep -B1 "KERNEL32.RemoveDirectoryW() retval=00000001" log.txt
...
0028:Call KERNEL32.RemoveDirectoryW(0066d2e0
L"C:\\users\\focht\\Temp\\testdir.dir") ret=3ab16b39
0028:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=3ab16b39
--
0028:Call KERNEL32.RemoveDirectoryW(00681970
L"C:\\users\\focht\\Temp\\Microsoft .NET Framework 3.5") ret=3ab1709a
0028:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=3ab1709a
--
008d:Call KERNEL32.RemoveDirectoryW(0057e808 L"C:\\users\\focht\\Application
Data\\") ret=7ecfd3d8
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecfd3d8
--
008d:Call KERNEL32.RemoveDirectoryW(00176ee8 L"C:\\users\\focht\\Start
Menu\\Programs\\Administrative Tools\\") ret=7ecfd3d8
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecfd3d8
--
008d:Call KERNEL32.RemoveDirectoryW(005c70e8
L"C:\\windows\\Microsoft.NET\\Framework\\v2.0.50727\\Microsoft .NET Framework
2.0\\") ret=7ecfd3d8
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecfd3d8
--
008d:Call KERNEL32.RemoveDirectoryW(005c5178 L"C:\\users\\focht\\Local
Settings\\Application Data\\") ret=7ecfd3d8
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecfd3d8
--
008d:Call KERNEL32.RemoveDirectoryW(005c4938
L"C:\\windows\\PCHEALTH\\ERRORREP\\QHEADLES\\") ret=7ecbd63d
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecbd63d
008d:Call KERNEL32.RemoveDirectoryW(005c4b50
L"C:\\windows\\PCHEALTH\\ERRORREP\\QSIGNOFF\\") ret=7ecbd63d
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecbd63d
008d:Call KERNEL32.RemoveDirectoryW(005c4ab0
L"C:\\windows\\PCHEALTH\\ERRORREP\\") ret=7ecbd63d
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecbd63d
008d:Call KERNEL32.RemoveDirectoryW(005c42f8 L"C:\\windows\\PCHEALTH\\")
ret=7ecbd63d
008d:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=7ecbd63d
--
0028:Call KERNEL32.RemoveDirectoryW(0033de50
L"C:\\users\\focht\\Temp\\IXP04D49.tmp") ret=3a1047e9
0028:Ret  KERNEL32.RemoveDirectoryW() retval=00000001 ret=3a1047e9
--- snip ---

Some folders are essential for many installers/apps.
Deletion will cause subtle problems on further software installations (the
actual apps) or at run time.

Especially true for:

'%USERPROFILE%\\Application Data'
'%USERPROFILE%\\Local Settings\\Application Data'

Those are precious and need to be preserved.
On Windows this scenario never happens because there always exist dozen of
subfolders below by default.

A quick fix would be the creation of (empty) subfolder below, for example
'Microsoft' which is present on all Windows systems by default.
This prevents the deletion of the parent.

Another option is to fix bugs like bug 34910 which needs
'%USERPROFILE%\\Application Data\\Microsoft\\Windows\\Themes\\' folder present,
which would automatically thwart the folder deletion attempt.

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list