Repository.mk                                                      |    1 
 RepositoryExternal.mk                                              |    4 
 avmedia/source/framework/soundhandler.cxx                          |   62 
 avmedia/source/framework/soundhandler.hxx                          |   22 
 config_host.mk.in                                                  |    1 
 configure.ac                                                       |   46 
 external/Module_external.mk                                        |    4 
 external/msc-externals/Makefile                                    |    7 
 external/msc-externals/Module_msc-externals.mk                     |   29 
 external/msc-externals/Package_msvc_dlls.mk                        |   16 
 external/msc-externals/Package_ucrt.mk                             |   21 
 external/msc-externals/README                                      |    1 
 instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf |    2 
 instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt |    1 
 instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt |    1 
 instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt |    3 
 instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt |    3 
 instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt |    4 
 postprocess/signing/no_signing.txt                                 |    6 
 scp2/InstallModule_windows.mk                                      |    1 
 scp2/source/ooo/ucrt.scp                                           |  157 --
 setup_native/Library_inst_msu_msi.mk                               |   41 
 setup_native/Module_setup_native.mk                                |    1 
 setup_native/source/win32/customactions/inst_msu/inst_msu.cxx      |  678 
----------
 setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def  |    5 
 solenv/bin/modules/installer/windows/property.pm                   |    8 
 26 files changed, 14 insertions(+), 1111 deletions(-)

New commits:
commit ec0a49ecc7ea8449d90c1e69857d62728af19829
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sat Dec 7 22:20:03 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sat Dec 7 20:06:46 2024 +0100

    Windows 7-8.1 support was removed, prevent install on these old systems
    
    There is no simple "Windows is 10 or newer" check in MSI, with the
    Microsoft policy of "you don't need to know real Windows version".
    See also 
https://developercommunity.visualstudio.com/t/detect-a-windows-version-from-msi/412198
    
    The values that MSI sees (e.g. on my Win11) are:
    
    Property(C): VersionNT = 603
    Property(C): VersionNT64 = 603
    Property(C): WindowsBuild = 9600
    
    So those can't be used for the check. I use the WINMAJORVER that is
    read from registry (Software\Microsoft\Windows NT\CurrentVersion).
    
    There is no more need to check and install UCRT; it was dropped.
    
    Change-Id: Ic02d6aeb965e9684bafd4357f969980f77000e73
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178049
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/Repository.mk b/Repository.mk
index fc2e071ccc26..70e2cf6eee51 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -745,7 +745,6 @@ $(eval $(call 
gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,spsuppfiles
 $(eval $(call 
gb_Helper_register_libraries_for_install,PLAINLIBS_OOO,ooobinarytable, \
        $(if $(WINDOWS_SDK_HOME),\
                instooofiltmsi \
-               inst_msu_msi \
                qslnkmsi \
                reg_dlls \
                reg4allmsdoc \
diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
index 23e397263254..fd5c02d29287 100644
--- a/RepositoryExternal.mk
+++ b/RepositoryExternal.mk
@@ -4310,10 +4310,6 @@ $(call gb_ExternalProject_use_static_libraries,$(1),dtoa)
 
 endef
 
-$(eval $(call gb_Helper_register_packages_for_install,ucrt_binarytable,\
-       $(if $(UCRT_REDISTDIR),ucrt) \
-))
-
 ifneq ($(SYSTEM_BOX2D),)
 
 define gb_LinkTarget__use_box2d
diff --git a/config_host.mk.in b/config_host.mk.in
index 7ce742cf3987..8baece8fb531 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -744,7 +744,6 @@ export TMPDIR=@TEMP_DIRECTORY@
 export TOUCH=@TOUCH@
 export UCRTSDKDIR=@UCRTSDKDIR@
 export UCRTVERSION=@UCRTVERSION@
-export UCRT_REDISTDIR=@UCRT_REDISTDIR@
 export UNIQ=@UNIQ@
 export UNIX_DLAPI_LIBS=@UNIX_DLAPI_LIBS@
 export USE_HEADLESS_CODE=@USE_HEADLESS_CODE@
diff --git a/configure.ac b/configure.ac
index 370cedc91c29..db7a8e901626 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4158,7 +4158,6 @@ cygwin*|wsl*)
         SCPDEFS="$SCPDEFS -DWINDOWS_AARCH64"
         WIN_HOST_ARCH="arm64"
         WIN_HOST_BITS=64
-        with_ucrt_dir=no
         ;;
     *)
         AC_MSG_ERROR([Unsupported host_cpu $host_cpu for host_os $host_os])
@@ -8945,23 +8944,6 @@ if test "$_os" = "Linux" -a "$host_cpu" = "powerpc"; then
 fi
 AC_SUBST([JITC_PROCESSOR_TYPE])
 
-# Misc Windows Stuff
-AC_ARG_WITH(ucrt-dir,
-    AS_HELP_STRING([--with-ucrt-dir],
-        [path to the directory with the arch-specific MSU packages of the 
Windows Universal CRT redistributables
-        (MS KB 2999226) for packaging into the installsets (without those the 
target system needs to install
-        the UCRT or Visual C++ Runtimes manually). The directory must contain 
the following 6 files:
-            Windows6.1-KB2999226-x64.msu
-            Windows6.1-KB2999226-x86.msu
-            Windows8.1-KB2999226-x64.msu
-            Windows8.1-KB2999226-x86.msu
-            Windows8-RT-KB2999226-x64.msu
-            Windows8-RT-KB2999226-x86.msu
-        A zip archive including those files is available from Microsoft site:
-        https://www.microsoft.com/en-us/download/details.aspx?id=48234]),
-,)
-
-UCRT_REDISTDIR="$with_ucrt_dir"
 if test $_os = "WINNT"; then
     find_msvc_x64_dlls
     MSVC_DLL_PATH=`win_short_path_for_make "$msvcdllpath"`
@@ -8983,36 +8965,8 @@ if test $_os = "WINNT"; then
             break
         fi
     done
-
-    if test "$UCRT_REDISTDIR" = "no"; then
-        dnl explicitly disabled
-        UCRT_REDISTDIR=""
-    else
-        PathFormat "$UCRT_REDISTDIR"
-        UCRT_REDISTDIR="$formatted_path"
-        UCRT_REDISTDIR_unix="$formatted_path_unix"
-        if ! test -f "$UCRT_REDISTDIR_unix/Windows6.1-KB2999226-x64.msu" -a \
-                  -f "$UCRT_REDISTDIR_unix/Windows6.1-KB2999226-x86.msu" -a \
-                  -f "$UCRT_REDISTDIR_unix/Windows8.1-KB2999226-x64.msu" -a \
-                  -f "$UCRT_REDISTDIR_unix/Windows8.1-KB2999226-x86.msu" -a \
-                  -f "$UCRT_REDISTDIR_unix/Windows8-RT-KB2999226-x64.msu" -a \
-                  -f "$UCRT_REDISTDIR_unix/Windows8-RT-KB2999226-x86.msu"; then
-            UCRT_REDISTDIR=""
-            if test -n "$PKGFORMAT"; then
-               for i in $PKGFORMAT; do
-                   case "$i" in
-                   msi)
-                       AC_MSG_WARN([--without-ucrt-dir not specified or MSUs 
not found - installer will have runtime dependency])
-                       add_warning "--without-ucrt-dir not specified or MSUs 
not found - installer will have runtime dependency"
-                       ;;
-                   esac
-               done
-            fi
-        fi
-    fi
 fi
 
-AC_SUBST(UCRT_REDISTDIR)
 AC_SUBST(MSVC_DLL_PATH)
 AC_SUBST(MSVC_DLLS)
 AC_SUBST(MSM_PATH)
diff --git a/external/Module_external.mk b/external/Module_external.mk
index e60765634ab5..8742fe3b37a4 100644
--- a/external/Module_external.mk
+++ b/external/Module_external.mk
@@ -9,10 +9,6 @@
 
 $(eval $(call gb_Module_Module,external))
 
-ifeq ($(COM),MSC)
-$(eval $(call gb_Module_add_moduledir,external,msc-externals))
-endif
-
 $(eval $(call gb_Module_add_moduledirs,external,\
        $(call gb_Helper_optional,XMLSEC,xmlsec) \
        $(call gb_Helper_optional,ABW,libabw) \
diff --git a/external/msc-externals/Makefile b/external/msc-externals/Makefile
deleted file mode 100644
index e4968cf85fb6..000000000000
--- a/external/msc-externals/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-
-module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST))))
-
-include $(module_directory)/../../solenv/gbuild/partial_build.mk
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/msc-externals/Module_msc-externals.mk 
b/external/msc-externals/Module_msc-externals.mk
deleted file mode 100644
index 07ea3878a106..000000000000
--- a/external/msc-externals/Module_msc-externals.mk
+++ /dev/null
@@ -1,29 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Module_Module,msc-externals))
-
-ifneq ($(BUILD_X64),)
-
-$(eval $(call gb_Module_add_targets,msc-externals,\
-       Package_msvc_dlls \
-))
-
-endif
-
-# Install the universal crts (tdf#108580)
-ifneq ($(UCRT_REDISTDIR),)
-
-$(eval $(call gb_Module_add_targets,msc-externals,\
-       Package_ucrt \
-))
-
-endif
-
-# vim: set noet sw=4 ts=4:
diff --git a/external/msc-externals/Package_msvc_dlls.mk 
b/external/msc-externals/Package_msvc_dlls.mk
deleted file mode 100644
index d82dd06c3cec..000000000000
--- a/external/msc-externals/Package_msvc_dlls.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Package_Package,msvc_dlls,$(MSVC_DLL_PATH)))
-
-$(eval $(call gb_Package_add_files,msvc_dlls,program/shlxthdl,\
-       $(MSVC_DLLS) \
-))
-
-# vim:set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/external/msc-externals/Package_ucrt.mk 
b/external/msc-externals/Package_ucrt.mk
deleted file mode 100644
index 52e6f0cbae97..000000000000
--- a/external/msc-externals/Package_ucrt.mk
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Package_Package,ucrt,$(UCRT_REDISTDIR)))
-
-$(eval $(call gb_Package_add_files,ucrt,$(LIBO_ETC_FOLDER),\
-    Windows6.1-KB2999226-x64.msu \
-    Windows6.1-KB2999226-x86.msu \
-    Windows8.1-KB2999226-x64.msu \
-    Windows8.1-KB2999226-x86.msu \
-    Windows8-RT-KB2999226-x64.msu \
-    Windows8-RT-KB2999226-x86.msu \
-))
-
-# vim:set shiftwidth=4 tabstop=4 noexpandtab:
diff --git a/external/msc-externals/README b/external/msc-externals/README
deleted file mode 100644
index 9ffb415c36e4..000000000000
--- a/external/msc-externals/README
+++ /dev/null
@@ -1 +0,0 @@
-module msc-externals copies the bundled MSVC runtime DLLs into instdir
diff --git a/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf 
b/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf
index 5e57eb1c3c0e..8f4fa841aac6 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf
+++ b/instsetoo_native/inc_openoffice/windows/msi_languages/LaunchCo.ulf
@@ -2,5 +2,3 @@
 en-US = "The Installation Wizard cannot be run properly because you are logged 
in as a user without sufficient administrator rights for this system."
 [OOO_LAUNCH_2]
 en-US = "[ProductName] cannot be installed on this Windows version. 
[WindowsMinVersionText] or newer is required."
-[OOO_LAUNCH_3]
-en-US = "To install [ProductName] on Windows 8.1, at least April 2014 update 
rollup (MS KB 2919355) must be installed."
diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt 
b/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt
index 0a5b68ed4186..569132a50bae 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt
+++ b/instsetoo_native/inc_openoffice/windows/msi_templates/AppSearc.idt
@@ -1,5 +1,4 @@
 Property       Signature_
 s72    s72
 AppSearch      Property        Signature_
-WIN81S14       win81s14
 WINMAJORVER    WinMajorVer
diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt 
b/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt
index 589ab7c52806..dfdbe78c60ec 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt
+++ b/instsetoo_native/inc_openoffice/windows/msi_templates/DrLocato.idt
@@ -1,4 +1,3 @@
 Signature_     Parent  Path    Depth
 s72    S72     S255    I2
 DrLocator      Signature_      Parent  Path
-win81s14               [SystemFolder]  
diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt 
b/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt
index 629c3c5582e1..4d064b92ed0a 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt
+++ b/instsetoo_native/inc_openoffice/windows/msi_templates/LaunchCo.idt
@@ -2,5 +2,4 @@ Condition       Description
 s255   l255
 65001  LaunchCondition Condition
 Privileged     OOO_LAUNCH_1
-Installed Or VersionNT > WindowsMinVersionNumber Or (VersionNT = 
WindowsMinVersionNumber And ServicePackLevel >= WindowsMinSPNumber)   
OOO_LAUNCH_2
-Installed Or VersionNT <> 603 Or WIN81S14      OOO_LAUNCH_3
+Installed Or (WINMAJORVER >= WinMajorVerMin)   OOO_LAUNCH_2
diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt 
b/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt
index e528cac384ec..c066aa162c7f 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt
+++ b/instsetoo_native/inc_openoffice/windows/msi_templates/Property.idt
@@ -63,5 +63,4 @@ STR_INSTALLATION_WIZARD       OOO_STR_INSTALLATION_WIZARD
 UpgradeCode    UPGRADECODETEMPLATE
 VC_REDIST      1
 WindowsMinVersionText  WINDOWSMINVERSIONTEXTTEMPLATE
-WindowsMinVersionNumber        WINDOWSMINVERSIONNUMBERTEMPLATE
-WindowsMinSPNumber     WINDOWSMINSPNUMBERTEMPLATE
+WinMajorVerMin WINMAJORVERMINTEMPLATE
diff --git a/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt 
b/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt
index d5abd9769125..5004a55863ba 100644
--- a/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt
+++ b/instsetoo_native/inc_openoffice/windows/msi_templates/Signatur.idt
@@ -1,7 +1,3 @@
 Signature      FileName        MinVersion      MaxVersion      MinSize MaxSize 
MinDate MaxDate Languages
 s72    s255    S20     S20     I4      I4      I4      I4      S255
 Signature      Signature
-# Since it's impossible to match minimal version in Signature table 
independent of
-# language, and we need language-independent comparison, we use a value that 
is at
-# least 1 less (see note at https://msdn.microsoft.com/en-us/library/aa371853).
-win81s14       kernel32.dll    6.3.9600.17030                                  
        
diff --git a/postprocess/signing/no_signing.txt 
b/postprocess/signing/no_signing.txt
index 6de68e2e8cc2..53aaac652c2b 100644
--- a/postprocess/signing/no_signing.txt
+++ b/postprocess/signing/no_signing.txt
@@ -8,9 +8,3 @@ policy.1.0.cli_oootypes.dll
 policy.1.0.cli_ure.dll
 policy.1.0.cli_cppuhelper.dll
 policy.1.0.cli_basetypes.dll
-Windows6.1-KB2999226-x64.msu
-Windows6.1-KB2999226-x86.msu
-Windows8.1-KB2999226-x64.msu
-Windows8.1-KB2999226-x86.msu
-Windows8-RT-KB2999226-x64.msu
-Windows8-RT-KB2999226-x86.msu
diff --git a/scp2/InstallModule_windows.mk b/scp2/InstallModule_windows.mk
index bd6e478e7785..296f7fccfa5b 100644
--- a/scp2/InstallModule_windows.mk
+++ b/scp2/InstallModule_windows.mk
@@ -22,7 +22,6 @@ $(eval $(call gb_InstallModule_add_defs,scp2/windows,\
 $(eval $(call gb_InstallModule_add_scpfiles,scp2/windows,\
     scp2/source/ooo/folder_ooo \
     $(if $(MSM_PATH),scp2/source/ooo/vc_redist) \
-    $(if $(UCRT_REDISTDIR),scp2/source/ooo/ucrt) \
     scp2/source/ooo/windowscustomaction_ooo \
 ))
 
diff --git a/scp2/source/ooo/ucrt.scp b/scp2/source/ooo/ucrt.scp
deleted file mode 100644
index 7f4ec8195870..000000000000
--- a/scp2/source/ooo/ucrt.scp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include "macros.inc"
-
-File gid_File_Windows6_1_KB2999226_x64_msu
-    Name = "Windows6.1-KB2999226-x64.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-File gid_File_Windows8_RT_KB2999226_x64_msu
-    Name = "Windows8-RT-KB2999226-x64.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-File gid_File_Windows8_1_KB2999226_x64_msu
-    Name = "Windows8.1-KB2999226-x64.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-#ifndef WINDOWS_X64
-
-File gid_File_Windows6_1_KB2999226_x86_msu
-    Name = "Windows6.1-KB2999226-x86.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-File gid_File_Windows8_RT_KB2999226_x86_msu
-    Name = "Windows8-RT-KB2999226-x86.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-File gid_File_Windows8_1_KB2999226_x86_msu
-    Name = "Windows8.1-KB2999226-x86.msu";
-    Dir = gid_Brand_Dir_Program;
-    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
-End
-
-#endif /* WINDOWS_X64 */
-
-/* A deferred not-impersonated action that will call wusa.exe to actually 
install
-   msu. Since deferred actions don't have access to current DB, the action 
depends
-   on immediate-executed action inst_ucrt (see below) that precedes it, unpacks
-   the binary to a temp file, and sets this action's CustomActionData property.
-*/
-WindowsCustomAction gid_Customaction_inst_msu
-       Name = "inst_msu";
-       Typ = "3073";
-       Source = "inst_msu_msi.dll";
-       Target = "InstallMSU";
-       Inbinarytable = 1;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And inst_msu", 
"InstallFiles");
-End
-
-/* An immediately-executed action that will unpack a binary, which name in 
binary table is set
-   in "InstMSUBinary" property, to a temporary file, and sets "inst_msu" and 
"cleanup_msu" props.
-*/
-WindowsCustomAction gid_Customaction_unpack_msu
-       Name = "unpack_msu";
-       Typ = "1";
-       Source = "inst_msu_msi.dll";
-       Target = "UnpackMSUForInstall";
-       Inbinarytable = 1;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And 
InstMSUBinary", "cleanup_msu");
-End
-
-/* A rollback action that removes temp file. It must precede inst_msu.
-*/
-WindowsCustomAction gid_Customaction_cleanup_msu
-       Name = "cleanup_msu";
-       Typ = "1345";
-       Source = "inst_msu_msi.dll";
-       Target = "CleanupMSU";
-       Inbinarytable = 1;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And 
cleanup_msu", "inst_msu");
-End
-
-/* The "InstMSUBinary" property contains an error message number and a binary 
name, separated by "|".
-   The former is used when installing the MSU fails.
-*/
-WindowsCustomAction gid_Customaction_check_win7x64_ucrt
-       Name = "check_win7x64_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows61_KB2999226_x64msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
601 And VersionNT64", "FileCost");
-       Styles = "NO_FILE";
-End
-
-WindowsCustomAction gid_Customaction_check_win8x64_ucrt
-       Name = "check_win8x64_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows8_RT_KB2999226_x64msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
602 And VersionNT64", "check_win7x64_ucrt");
-       Styles = "NO_FILE";
-End
-
-WindowsCustomAction gid_Customaction_check_win81x64_ucrt
-       Name = "check_win81x64_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows81_KB2999226_x64msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
603 And (Not WINMAJORVER Or WINMAJORVER = \"#6\") And VersionNT64", 
"check_win8x64_ucrt");
-       Styles = "NO_FILE";
-End
-
-#ifndef WINDOWS_X64
-
-/* 32-bit installer must be prepared to run on both 32- and 64-bit Windows. 
So, it might need to
-   install either 32-bit or 64-bit UCRT package, depending on OS bitness.
-*/
-
-WindowsCustomAction gid_Customaction_check_win7x32_ucrt
-       Name = "check_win7x32_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows61_KB2999226_x86msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
601 And Not VersionNT64", "check_win81x64_ucrt");
-       Styles = "NO_FILE";
-End
-
-WindowsCustomAction gid_Customaction_check_win8x32_ucrt
-       Name = "check_win8x32_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows8_RT_KB2999226_x86msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
602 And Not VersionNT64", "check_win7x32_ucrt");
-       Styles = "NO_FILE";
-End
-
-WindowsCustomAction gid_Customaction_check_win81x32_ucrt
-       Name = "check_win81x32_ucrt";
-       Typ = "51";
-       Source = "InstMSUBinary";
-       Target = "KB2999226|Windows81_KB2999226_x86msu";
-       Inbinarytable = 0;
-       Assignment1 = ("InstallExecuteSequence", "Not Installed And VersionNT = 
603 And (Not WINMAJORVER Or WINMAJORVER = \"#6\") And Not VersionNT64", 
"check_win8x32_ucrt");
-       Styles = "NO_FILE";
-End
-
-#endif /* WINDOWS_X64 */
diff --git a/setup_native/Library_inst_msu_msi.mk 
b/setup_native/Library_inst_msu_msi.mk
deleted file mode 100644
index 1a6646f2fa30..000000000000
--- a/setup_native/Library_inst_msu_msi.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-$(eval $(call gb_Library_Library,inst_msu_msi))
-
-$(eval $(call gb_Library_add_defs,inst_msu_msi,\
-       -U_DLL \
-))
-
-$(eval $(call gb_Library_add_cxxflags,inst_msu_msi,\
-       $(if $(MSVC_USE_DEBUG_RUNTIME),/MTd,/MT) \
-    $(if $(filter -fsanitize=%,$(CC)),,/fno-sanitize-address-vcasan-lib) \
-))
-
-$(eval $(call gb_Library_add_ldflags,inst_msu_msi,\
-       
/DEF:$(SRCDIR)/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def
 \
-       /NODEFAULTLIB \
-))
-
-$(eval $(call gb_Library_add_exception_objects,inst_msu_msi,\
-       setup_native/source/win32/customactions/inst_msu/inst_msu \
-))
-
-$(eval $(call gb_Library_use_system_win32_libs,inst_msu_msi,\
-       libcmt \
-       libcpmt \
-       libucrt \
-       libvcruntime \
-       kernel32 \
-       Ole32 \
-       Shell32 \
-       Msi \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/setup_native/Module_setup_native.mk 
b/setup_native/Module_setup_native.mk
index 42fa1421786d..12a6b7cc837d 100644
--- a/setup_native/Module_setup_native.mk
+++ b/setup_native/Module_setup_native.mk
@@ -23,7 +23,6 @@ $(eval $(call gb_Module_add_targets,setup_native,\
 ifeq ($(OS),WNT)
 $(eval $(call gb_Module_add_targets,setup_native,\
        Library_instooofiltmsi \
-       Library_inst_msu_msi \
        Library_qslnkmsi \
        Library_reg_dlls \
        Library_reg4allmsdoc \
diff --git a/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx 
b/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx
deleted file mode 100644
index d890f2628193..000000000000
--- a/setup_native/source/win32/customactions/inst_msu/inst_msu.cxx
+++ /dev/null
@@ -1,678 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-#include <memory>
-#include <string>
-#include <sstream>
-#include <iomanip>
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <Shlobj.h>
-#include <Wuerror.h>
-#include <msiquery.h>
-
-namespace
-{
-template <typename IntType> std::string Num2Hex(IntType n)
-{
-    std::stringstream sMsg;
-    sMsg << "0x" << std::uppercase << std::setfill('0') << std::setw(sizeof(n) 
* 2) << std::hex
-         << n;
-    return sMsg.str();
-}
-
-template <typename IntType> std::string Num2Dec(IntType n)
-{
-    std::stringstream sMsg;
-    sMsg << n;
-    return sMsg.str();
-}
-
-std::string Win32ErrorMessage(const char* sFunc, DWORD nWin32Error)
-{
-    std::stringstream sMsg;
-    sMsg << sFunc << " failed with Win32 error code " << Num2Hex(nWin32Error) 
<< "!";
-
-    return sMsg.str();
-}
-
-void ThrowHResult(const char* sFunc, HRESULT hr)
-{
-    std::stringstream sMsg;
-    sMsg << sFunc << " failed (HRESULT = " << Num2Hex(hr) << ")!";
-
-    throw std::exception(sMsg.str().c_str());
-}
-
-void CheckHResult(const char* sFunc, HRESULT hr)
-{
-    if (FAILED(hr))
-        ThrowHResult(sFunc, hr);
-}
-
-void ThrowWin32Error(const char* sFunc, DWORD nWin32Error)
-{
-    throw std::exception(Win32ErrorMessage(sFunc, nWin32Error).c_str());
-}
-
-void ThrowLastError(const char* sFunc) { ThrowWin32Error(sFunc, 
GetLastError()); }
-
-void CheckWin32Error(const char* sFunc, DWORD nWin32Error)
-{
-    if (nWin32Error != ERROR_SUCCESS)
-        ThrowWin32Error(sFunc, nWin32Error);
-}
-
-std::wstring GetKnownFolder(const KNOWNFOLDERID& rfid)
-{
-    PWSTR sPath = nullptr;
-    HRESULT hr = SHGetKnownFolderPath(rfid, KF_FLAG_DEFAULT, nullptr, &sPath);
-    CheckHResult("SHGetKnownFolderPath", hr);
-    std::wstring sResult(sPath);
-    CoTaskMemFree(sPath);
-    return sResult;
-}
-
-void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRecord, std::ostringstream& 
sTmpl, UINT)
-{
-    MsiRecordSetStringA(hRecord, 0, sTmpl.str().c_str());
-    MsiProcessMessage(hInst, INSTALLMESSAGE_INFO, hRecord);
-}
-
-void RecSetString(MSIHANDLE hRec, UINT nField, LPCSTR sVal)
-{
-    MsiRecordSetStringA(hRec, nField, sVal);
-}
-
-void RecSetString(MSIHANDLE hRec, UINT nField, LPCWSTR sVal)
-{
-    MsiRecordSetStringW(hRec, nField, sVal);
-}
-
-template <class S1, class... SOther>
-void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, 
UINT nField,
-                  const S1& elem, const SOther&... others);
-
-template <class Ch, class... SOther>
-void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, 
UINT nField,
-                  const Ch* elem, const SOther&... others)
-{
-    sTmpl << " [" << nField << "]";
-    RecSetString(hRec, nField, elem);
-    WriteLogElem(hInst, hRec, sTmpl, nField + 1, others...);
-}
-
-template <class S1, class... SOther>
-void WriteLogElem(MSIHANDLE hInst, MSIHANDLE hRec, std::ostringstream& sTmpl, 
UINT nField,
-                  const S1& elem, const SOther&... others)
-{
-    WriteLogElem(hInst, hRec, sTmpl, nField, elem.c_str(), others...);
-}
-
-std::string sLogPrefix;
-
-template <class... StrType> void WriteLog(MSIHANDLE hInst, const StrType&... 
elements)
-{
-    PMSIHANDLE hRec = MsiCreateRecord(sizeof...(elements));
-    if (!hRec)
-        return;
-
-    std::ostringstream sTemplate;
-    sTemplate << sLogPrefix;
-    WriteLogElem(hInst, hRec, sTemplate, 1, elements...);
-}
-
-// Show a warning message box. This will be automatically suppressed in 
unattended installation.
-void ShowWarning(MSIHANDLE hInst, const std::wstring& sKBNo, const char* 
sMessage)
-{
-    // Error table's message #25000: "Installing a pre-requisite [2] failed.
-    // You might need to manually install it from Microsoft site to be able to 
run the product.[3]"
-    PMSIHANDLE hRec = MsiCreateRecord(3);
-    // To show a message from Error table, record's Field 0 must be null
-    MsiRecordSetInteger(hRec, 1, 25000);
-    MsiRecordSetStringW(hRec, 2, sKBNo.c_str());
-    std::string s("
");
-    s += sMessage;
-    MsiRecordSetStringA(hRec, 3, s.c_str());
-    MsiProcessMessage(hInst, INSTALLMESSAGE_WARNING, hRec);
-}
-
-// Set custom action description visible in progress dialog
-void SetStatusText(MSIHANDLE hInst, const std::wstring& actName, const 
std::wstring& actDesc)
-{
-    PMSIHANDLE hRec = MsiCreateRecord(3);
-    // For INSTALLMESSAGE_ACTIONSTART, record's Field 0 must be null
-    // Field 1: Action name - must be non-null
-    MsiRecordSetStringW(hRec, 1, actName.c_str());
-    // Field 2: Action description - displayed in dialog
-    MsiRecordSetStringW(hRec, 2, actDesc.c_str());
-    // Let Field 3 stay null - no action template
-    MsiProcessMessage(hInst, INSTALLMESSAGE_ACTIONSTART, hRec);
-}
-
-typedef std::unique_ptr<void, decltype(&CloseHandle)> CloseHandleGuard;
-CloseHandleGuard Guard(HANDLE h) { return CloseHandleGuard(h, CloseHandle); }
-
-typedef std::unique_ptr<const wchar_t, decltype(&DeleteFileW)> DeleteFileGuard;
-DeleteFileGuard Guard(const wchar_t* sFileName) { return 
DeleteFileGuard(sFileName, DeleteFileW); }
-
-typedef std::unique_ptr<SC_HANDLE__, decltype(&CloseServiceHandle)> 
CloseServiceHandleGuard;
-CloseServiceHandleGuard Guard(SC_HANDLE h)
-{
-    return CloseServiceHandleGuard(h, CloseServiceHandle);
-}
-
-std::wstring GetTempFile()
-{
-    wchar_t sPath[MAX_PATH + 1];
-    DWORD nResult = GetTempPathW(sizeof(sPath) / sizeof(*sPath), sPath);
-    if (!nResult)
-        ThrowLastError("GetTempPathW");
-
-    wchar_t sFile[MAX_PATH + 1];
-    nResult = GetTempFileNameW(sPath, L"TMP", 0, sFile);
-    if (!nResult)
-        ThrowLastError("GetTempFileNameW");
-    return sFile;
-}
-
-bool IsWow64Process()
-{
-#if !defined _WIN64
-    BOOL bResult = FALSE;
-    typedef BOOL(WINAPI * LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
-    LPFN_ISWOW64PROCESS fnIsWow64Process = 
reinterpret_cast<LPFN_ISWOW64PROCESS>(
-        GetProcAddress(GetModuleHandleW(L"kernel32"), "IsWow64Process"));
-
-    if (fnIsWow64Process)
-    {
-        if (!fnIsWow64Process(GetCurrentProcess(), &bResult))
-            ThrowLastError("IsWow64Process");
-    }
-
-    return bResult;
-#else
-    return false;
-#endif
-}
-
-// This class uses MsiProcessMessage to check for user input: it returns 
IDCANCEL when user cancels
-// installation. It throws a special exception, to be intercepted in main 
action function to return
-// corresponding exit code.
-class UserInputChecker
-{
-public:
-    class eUserCancelled
-    {
-    };
-
-    UserInputChecker(MSIHANDLE hInstall)
-        : m_hInstall(hInstall)
-        , m_hProgressRec(MsiCreateRecord(3))
-    {
-        // Use explicit progress messages
-        MsiRecordSetInteger(m_hProgressRec, 1, 1);
-        MsiRecordSetInteger(m_hProgressRec, 2, 1);
-        MsiRecordSetInteger(m_hProgressRec, 3, 0);
-        int nResult = MsiProcessMessage(m_hInstall, INSTALLMESSAGE_PROGRESS, 
m_hProgressRec);
-        if (nResult == IDCANCEL)
-            throw eUserCancelled();
-        // Prepare the record to following progress update calls
-        MsiRecordSetInteger(m_hProgressRec, 1, 2);
-        MsiRecordSetInteger(m_hProgressRec, 2, 0); // step by 0 - don't move 
progress
-        MsiRecordSetInteger(m_hProgressRec, 3, 0);
-    }
-
-    void ThrowIfUserCancelled()
-    {
-        // Check if user has cancelled
-        int nResult = MsiProcessMessage(m_hInstall, INSTALLMESSAGE_PROGRESS, 
m_hProgressRec);
-        if (nResult == IDCANCEL)
-            throw eUserCancelled();
-    }
-
-private:
-    MSIHANDLE m_hInstall;
-    PMSIHANDLE m_hProgressRec;
-};
-
-// Checks if Windows Update service is disabled, and if it is, enables it 
temporarily.
-// Also stops the service if it's currently running, because it seems that 
wusa.exe
-// does not freeze when it starts the service itself.
-class WUServiceEnabler
-{
-public:
-    WUServiceEnabler(MSIHANDLE hInstall)
-        : mhInstall(hInstall)
-        , mhService(EnableWUService(hInstall))
-    {
-    }
-
-    ~WUServiceEnabler()
-    {
-        try
-        {
-            if (mhService)
-            {
-                EnsureServiceEnabled(mhInstall, mhService.get(), false);
-                StopService(mhInstall, mhService.get(), false);
-            }
-        }
-        catch (std::exception& e)
-        {
-            WriteLog(mhInstall, e.what());
-        }
-    }
-
-private:
-    static CloseServiceHandleGuard EnableWUService(MSIHANDLE hInstall)
-    {
-        auto hSCM = Guard(OpenSCManagerW(nullptr, nullptr, 
SC_MANAGER_ALL_ACCESS));
-        if (!hSCM)
-            ThrowLastError("OpenSCManagerW");
-        WriteLog(hInstall, "Opened service control manager");
-
-        auto hService = Guard(OpenServiceW(hSCM.get(), L"wuauserv",
-                                           SERVICE_QUERY_CONFIG | 
SERVICE_CHANGE_CONFIG
-                                               | SERVICE_QUERY_STATUS | 
SERVICE_STOP));
-        if (!hService)
-            ThrowLastError("OpenServiceW");
-        WriteLog(hInstall, "Obtained WU service handle");
-
-        const DWORD nCurrentStatus = ServiceStatus(hInstall, hService.get());
-        // Stop currently running service to prevent wusa.exe from hanging 
trying to detect if the
-        // update is applicable (sometimes this freezes it ~indefinitely; it 
seems that it doesn't
-        // happen if wusa.exe starts the service itself: 
https://superuser.com/questions/1044528/).
-        // tdf#124794: Wait for service to stop.
-        if (nCurrentStatus == SERVICE_RUNNING)
-            StopService(hInstall, hService.get(), true);
-
-        if (nCurrentStatus == SERVICE_RUNNING
-            || !EnsureServiceEnabled(hInstall, hService.get(), true))
-        {
-            // No need to restore anything back, since we didn't change config
-            hService.reset();
-            WriteLog(hInstall, "Service configuration is unchanged");
-        }
-
-        return hService;
-    }
-
-    // Returns if the service configuration was actually changed
-    static bool EnsureServiceEnabled(MSIHANDLE hInstall, SC_HANDLE hService, 
bool bEnabled)
-    {
-        bool bConfigChanged = false;
-
-        DWORD nCbRequired = 0;
-        if (!QueryServiceConfigW(hService, nullptr, 0, &nCbRequired))
-        {
-            if (DWORD nError = GetLastError(); nError != 
ERROR_INSUFFICIENT_BUFFER)
-                ThrowWin32Error("QueryServiceConfigW", nError);
-        }
-        std::unique_ptr<char[]> pBuf(new char[nCbRequired]);
-        LPQUERY_SERVICE_CONFIGW pConfig = 
reinterpret_cast<LPQUERY_SERVICE_CONFIGW>(pBuf.get());
-        if (!QueryServiceConfigW(hService, pConfig, nCbRequired, &nCbRequired))
-            ThrowLastError("QueryServiceConfigW");
-        WriteLog(hInstall, "Obtained service config");
-
-        DWORD eNewStartType = 0;
-        if (bEnabled && pConfig->dwStartType == SERVICE_DISABLED)
-        {
-            bConfigChanged = true;
-            eNewStartType = SERVICE_DEMAND_START;
-            WriteLog(hInstall, "Service is disabled, and requested to enable");
-        }
-        else if (!bEnabled && pConfig->dwStartType != SERVICE_DISABLED)
-        {
-            bConfigChanged = true;
-            eNewStartType = SERVICE_DISABLED;
-            WriteLog(hInstall, "Service is enabled, and requested to disable");
-        }
-
-        if (bConfigChanged)
-        {
-            if (!ChangeServiceConfigW(hService, SERVICE_NO_CHANGE, 
eNewStartType, SERVICE_NO_CHANGE,
-                                      nullptr, nullptr, nullptr, nullptr, 
nullptr, nullptr,
-                                      nullptr))
-                ThrowLastError("ChangeServiceConfigW");
-            WriteLog(hInstall, "WU service config successfully changed");
-        }
-        else
-            WriteLog(hInstall, "No need to modify service config");
-
-        return bConfigChanged;
-    }
-
-    static DWORD ServiceStatus(MSIHANDLE hInstall, SC_HANDLE hService)
-    {
-        SERVICE_STATUS aServiceStatus{};
-        if (!QueryServiceStatus(hService, &aServiceStatus))
-            ThrowLastError("QueryServiceStatus");
-
-        std::string sStatus;
-        switch (aServiceStatus.dwCurrentState)
-        {
-            case SERVICE_STOPPED:
-                sStatus = "SERVICE_STOPPED";
-                break;
-            case SERVICE_START_PENDING:
-                sStatus = "SERVICE_START_PENDING";
-                break;
-            case SERVICE_STOP_PENDING:
-                sStatus = "SERVICE_STOP_PENDING";
-                break;
-            case SERVICE_RUNNING:
-                sStatus = "SERVICE_RUNNING";
-                break;
-            case SERVICE_CONTINUE_PENDING:
-                sStatus = "SERVICE_CONTINUE_PENDING";
-                break;
-            case SERVICE_PAUSE_PENDING:
-                sStatus = "SERVICE_PAUSE_PENDING";
-                break;
-            case SERVICE_PAUSED:
-                sStatus = "SERVICE_PAUSED";
-                break;
-            default:
-                sStatus = Num2Hex(aServiceStatus.dwCurrentState);
-        }
-        WriteLog(hInstall, "Service status is", sStatus);
-
-        return aServiceStatus.dwCurrentState;
-    }
-
-    static void StopService(MSIHANDLE hInstall, SC_HANDLE hService, bool bWait)
-    {
-        try
-        {
-            if (ServiceStatus(hInstall, hService) != SERVICE_STOPPED)
-            {
-                SERVICE_STATUS aServiceStatus{};
-                if (!ControlService(hService, SERVICE_CONTROL_STOP, 
&aServiceStatus))
-                    ThrowLastError("ControlService");
-                WriteLog(hInstall,
-                         "Successfully sent SERVICE_CONTROL_STOP code to 
Windows Update service");
-                if (aServiceStatus.dwCurrentState != SERVICE_STOPPED && bWait)
-                {
-                    // Let user cancel too long wait
-                    UserInputChecker aInputChecker(hInstall);
-                    // aServiceStatus.dwWaitHint is unreasonably high for 
Windows Update (30000),
-                    // so don't use it, but simply poll service status each 
second
-                    for (int nWait = 0; nWait < 30; ++nWait) // arbitrary 
limit of 30 s
-                    {
-                        for (int i = 0; i < 2; ++i) // check user input twice 
a second
-                        {
-                            Sleep(500);
-                            aInputChecker.ThrowIfUserCancelled();
-                        }
-
-                        if (!QueryServiceStatus(hService, &aServiceStatus))
-                            ThrowLastError("QueryServiceStatus");
-
-                        if (aServiceStatus.dwCurrentState == SERVICE_STOPPED)
-                            break;
-                    }
-                }
-                if (aServiceStatus.dwCurrentState == SERVICE_STOPPED)
-                    WriteLog(hInstall, "Successfully stopped Windows Update 
service");
-                else if (bWait)
-                    WriteLog(hInstall, "Wait for Windows Update stop timed out 
- proceeding");
-            }
-            else
-                WriteLog(hInstall, "Windows Update service is not running");
-        }
-        catch (std::exception& e)
-        {
-            WriteLog(hInstall, e.what());
-        }
-    }
-
-    MSIHANDLE mhInstall;
-    CloseServiceHandleGuard mhService;
-};
-}
-
-// Immediate action "unpack_msu" that has access to installation database and 
properties; checks
-// "InstMSUBinary" property and unpacks the binary with that name to a 
temporary file; sets
-// "cleanup_msu" and "inst_msu" properties to the full name of the extracted 
temporary file. These
-// properties will become "CustomActionData" property inside relevant deferred 
actions.
-extern "C" __declspec(dllexport) UINT __stdcall UnpackMSUForInstall(MSIHANDLE 
hInstall)
-{
-    try
-    {
-        sLogPrefix = "UnpackMSUForInstall:";
-        WriteLog(hInstall, "started");
-
-        WriteLog(hInstall, "Checking value of InstMSUBinary");
-        wchar_t sInstMSUBinary[MAX_PATH + 10];
-        DWORD nCCh = sizeof(sInstMSUBinary) / sizeof(*sInstMSUBinary);
-        CheckWin32Error("MsiGetPropertyW",
-                        MsiGetPropertyW(hInstall, L"InstMSUBinary", 
sInstMSUBinary, &nCCh));
-        WriteLog(hInstall, "Got InstMSUBinary value:",
-                 sInstMSUBinary); // KB2999226|Windows61_KB2999226_x64msu
-        const wchar_t* sBinaryName = wcschr(sInstMSUBinary, L'|');
-        if (!sBinaryName)
-            throw std::exception("No KB number in InstMSUBinary!");
-        // "KB2999226"
-        const std::wstring sKBNo(sInstMSUBinary, sBinaryName - sInstMSUBinary);
-        ++sBinaryName;
-
-        PMSIHANDLE hDatabase = MsiGetActiveDatabase(hInstall);
-        if (!hDatabase)
-            ThrowLastError("MsiGetActiveDatabase");
-        WriteLog(hInstall, "MsiGetActiveDatabase succeeded");
-
-        std::wstringstream sQuery;
-        sQuery << "SELECT `Data` FROM `Binary` WHERE `Name`='" << sBinaryName 
<< "'";
-
-        PMSIHANDLE hBinaryView;
-        CheckWin32Error("MsiDatabaseOpenViewW",
-                        MsiDatabaseOpenViewW(hDatabase, sQuery.str().c_str(), 
&hBinaryView));
-        WriteLog(hInstall, "MsiDatabaseOpenViewW succeeded");
-
-        CheckWin32Error("MsiViewExecute", MsiViewExecute(hBinaryView, 0));
-        WriteLog(hInstall, "MsiViewExecute succeeded");
-
-        PMSIHANDLE hBinaryRecord;
-        CheckWin32Error("MsiViewFetch", MsiViewFetch(hBinaryView, 
&hBinaryRecord));
-        WriteLog(hInstall, "MsiViewFetch succeeded");
-
-        const std::wstring sBinary = GetTempFile();
-        auto aDeleteFileGuard(Guard(sBinary.c_str()));
-        WriteLog(hInstall, "Temp file path:", sBinary.c_str());
-
-        CheckWin32Error("MsiSetPropertyW",
-                        MsiSetPropertyW(hInstall, L"cleanup_msu", 
sBinary.c_str()));
-
-        {
-            HANDLE hFile = CreateFileW(sBinary.c_str(), GENERIC_WRITE, 0, 
nullptr, CREATE_ALWAYS,
-                                       FILE_ATTRIBUTE_NORMAL, nullptr);
-            if (hFile == INVALID_HANDLE_VALUE)
-                ThrowLastError("CreateFileW");
-            auto aFileHandleGuard(Guard(hFile));
-
-            const DWORD nBufSize = 1024 * 1024;
-            std::unique_ptr<char[]> buf(new char[nBufSize]);
-            DWORD nTotal = 0;
-            DWORD nRead;
-            do
-            {
-                nRead = nBufSize;
-                CheckWin32Error("MsiRecordReadStream",
-                                MsiRecordReadStream(hBinaryRecord, 1, 
buf.get(), &nRead));
-
-                if (nRead > 0)
-                {
-                    DWORD nWritten;
-                    if (!WriteFile(hFile, buf.get(), nRead, &nWritten, 
nullptr))
-                        ThrowLastError("WriteFile");
-                    nTotal += nWritten;
-                }
-            } while (nRead == nBufSize);
-
-            WriteLog(hInstall, "Successfully wrote", Num2Dec(nTotal), "bytes");
-        }
-        const std::wstring s_inst_msu = sKBNo + L"|" + sBinary;
-        CheckWin32Error("MsiSetPropertyW",
-                        MsiSetPropertyW(hInstall, L"inst_msu", 
s_inst_msu.c_str()));
-
-        // Don't delete the file: it will be done by following actions 
(inst_msu or cleanup_msu)
-        (void)aDeleteFileGuard.release();
-        return ERROR_SUCCESS;
-    }
-    catch (std::exception& e)
-    {
-        WriteLog(hInstall, e.what());
-    }
-    return ERROR_INSTALL_FAILURE;
-}
-
-// Deferred action "inst_msu" that must be run from system account. Receives 
the tempfile name from
-// "CustomActionData" property, and runs wusa.exe to install it. Waits for it 
and checks exit code.
-extern "C" __declspec(dllexport) UINT __stdcall InstallMSU(MSIHANDLE hInstall)
-{
-    std::wstring sKBNo; // "KB2999226"
-    try
-    {
-        sLogPrefix = "InstallMSU:";
-        WriteLog(hInstall, "started");
-
-        WriteLog(hInstall, "Checking value of CustomActionData");
-        wchar_t sCustomActionData[MAX_PATH + 10]; // 
"KB2999226|C:\Tempinary.tmp"
-        DWORD nCCh = sizeof(sCustomActionData) / sizeof(*sCustomActionData);
-        CheckWin32Error("MsiGetPropertyW",
-                        MsiGetPropertyW(hInstall, L"CustomActionData", 
sCustomActionData, &nCCh));
-        WriteLog(hInstall, "Got CustomActionData value:", sCustomActionData);
-        const wchar_t* sBinaryName = wcschr(sCustomActionData, L'|');
-        if (!sBinaryName)
-            throw std::exception("No KB number in CustomActionData!");
-        sKBNo = std::wstring(sCustomActionData, sBinaryName - 
sCustomActionData);
-        ++sBinaryName;
-        auto aDeleteFileGuard(Guard(sBinaryName));
-
-        SetStatusText(hInstall, L"WU service state check",
-                      L"Checking Windows Update service state");
-
-        // In case the Windows Update service is disabled, we temporarily 
enable it here. We also
-        // stop running WU service, to avoid wusa.exe freeze (see comment in 
EnableWUService).
-        WUServiceEnabler aWUServiceEnabler(hInstall);
-
-        SetStatusText(hInstall, sKBNo + L" installation", L"Installing " + 
sKBNo);
-
-        const bool bWow64Process = IsWow64Process();
-        WriteLog(hInstall, "Is Wow64 Process:", bWow64Process ? "YES" : "NO");
-        std::wstring sWUSAPath = bWow64Process ? 
GetKnownFolder(FOLDERID_Windows) + L"\SysNative"
-                                               : 
GetKnownFolder(FOLDERID_System);
-        sWUSAPath += L"\wusa.exe";
-        WriteLog(hInstall, "Prepared wusa path:", sWUSAPath);
-
-        std::wstring sWUSACmd
-            = L"\"" + sWUSAPath + L"\" \"" + sBinaryName + L"\" /quiet 
/norestart";
-        WriteLog(hInstall, "Prepared wusa command:", sWUSACmd);
-
-        STARTUPINFOW si{};
-        si.cb = sizeof(si);
-        PROCESS_INFORMATION pi{};
-        if (!CreateProcessW(sWUSAPath.c_str(), 
const_cast<LPWSTR>(sWUSACmd.c_str()), nullptr,
-                            nullptr, FALSE, CREATE_NO_WINDOW, nullptr, 
nullptr, &si, &pi))
-            ThrowLastError("CreateProcessW");
-        CloseHandle(pi.hThread);
-        auto aCloseProcHandleGuard(Guard(pi.hProcess));
-        WriteLog(hInstall, "CreateProcessW succeeded");
-
-        {
-            // This block waits when the started wusa.exe process finishes. 
Since it's possible
-            // for wusa.exe in some circumstances to wait really long 
(indefinitely?), we check
-            // for user input here.
-            UserInputChecker aInputChecker(hInstall);
-            for (;;)
-            {
-                DWORD nWaitResult = WaitForSingleObject(pi.hProcess, 500);
-                if (nWaitResult == WAIT_OBJECT_0)
-                    break; // wusa.exe finished
-                else if (nWaitResult == WAIT_TIMEOUT)
-                    aInputChecker.ThrowIfUserCancelled();
-                else
-                    ThrowWin32Error("WaitForSingleObject", nWaitResult);
-            }
-        }
-
-        DWORD nExitCode = 0;
-        if (!GetExitCodeProcess(pi.hProcess, &nExitCode))
-            ThrowLastError("GetExitCodeProcess");
-
-        HRESULT hr = static_cast<HRESULT>(nExitCode);
-
-        // HRESULT_FROM_WIN32 is defined as an inline function in SDK 8.1 
without the constexpr
-        // And it won't work to place it inside the switch statement.
-        if (HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED) == hr)
-        {
-            hr = ERROR_SUCCESS_REBOOT_REQUIRED;
-        }
-
-        switch (hr)
-        {
-            case S_OK:
-            case WU_S_ALREADY_INSTALLED:
-            case WU_E_NOT_APPLICABLE: // Windows could lie us about its 
version, etc.
-            case ERROR_SUCCESS_REBOOT_REQUIRED:
-            case WU_S_REBOOT_REQUIRED:
-                WriteLog(hInstall, "wusa.exe succeeded with exit code", 
Num2Hex(nExitCode));
-                return ERROR_SUCCESS;
-
-            default:
-                ThrowHResult("Execution of wusa.exe", hr);
-        }
-    }
-    catch (const UserInputChecker::eUserCancelled&)
-    {
-        return ERROR_INSTALL_USEREXIT;
-    }
-    catch (std::exception& e)
-    {
-        WriteLog(hInstall, e.what());
-        ShowWarning(hInstall, sKBNo, e.what());
-    }
-    return ERROR_SUCCESS; // Do not break on MSU installation errors
-}
-
-// Rollback deferred action "cleanup_msu" that is executed on error or cancel.
-// It removes the temporary file created by UnpackMSUForInstall action.
-// MUST be placed IMMEDIATELY AFTER "unpack_msu" in execute sequence.
-extern "C" __declspec(dllexport) UINT __stdcall CleanupMSU(MSIHANDLE hInstall)
-{
-    try
-    {
-        sLogPrefix = "CleanupMSU:";
-        WriteLog(hInstall, "started");
-
-        WriteLog(hInstall, "Checking value of CustomActionData");
-        wchar_t sBinaryName[MAX_PATH + 1];
-        DWORD nCCh = sizeof(sBinaryName) / sizeof(*sBinaryName);
-        CheckWin32Error("MsiGetPropertyW",
-                        MsiGetPropertyW(hInstall, L"CustomActionData", 
sBinaryName, &nCCh));
-        WriteLog(hInstall, "Got CustomActionData value:", sBinaryName);
-
-        if (!DeleteFileW(sBinaryName))
-        {
-            if (DWORD nError = GetLastError(); nError != ERROR_FILE_NOT_FOUND)
-                ThrowWin32Error("DeleteFileW", nError);
-        }
-        WriteLog(hInstall, "File successfully removed");
-    }
-    catch (std::exception& e)
-    {
-        WriteLog(hInstall, e.what());
-    }
-    // Always return success - we don't want rollback to fail.
-    return ERROR_SUCCESS;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def 
b/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def
deleted file mode 100644
index 49ade9c0169e..000000000000
--- a/setup_native/source/win32/customactions/inst_msu/inst_msu_msi.def
+++ /dev/null
@@ -1,5 +0,0 @@
-LIBRARY                "inst_msu_msi.dll"
-EXPORTS
-                       UnpackMSUForInstall
-                       InstallMSU
-                       CleanupMSU
\ No newline at end of file
diff --git a/solenv/bin/modules/installer/windows/property.pm 
b/solenv/bin/modules/installer/windows/property.pm
index fe8e94d44aae..90d39ff86cb2 100644
--- a/solenv/bin/modules/installer/windows/property.pm
+++ b/solenv/bin/modules/installer/windows/property.pm
@@ -411,9 +411,8 @@ sub update_property_table
     my $productname = get_productname_for_property_table($language, 
$allvariables);
     my $productversion = get_productversion_for_property_table();
     my $quickstarterlinkname = 
get_quickstarterlinkname_for_property_table($language, $allvariables);
-    my $windowsminversiontext = "Windows 7 SP1";
-    my $windowsminversionnumber = "601";
-    my $windowsminspnumber = "1";
+    my $windowsminversiontext = "Windows 10";
+    my $winmajorvermin = "#10";
 
     # Updating the values
 
@@ -428,8 +427,7 @@ sub update_property_table
         ${$propertyfile}[$i] =~ s/PRODUCTVERSIONTEMPLATE/$productversion/;
         ${$propertyfile}[$i] =~ 
s/QUICKSTARTERLINKNAMETEMPLATE/$quickstarterlinkname/;
         ${$propertyfile}[$i] =~ 
s/WINDOWSMINVERSIONTEXTTEMPLATE/$windowsminversiontext/;
-        ${$propertyfile}[$i] =~ 
s/WINDOWSMINVERSIONNUMBERTEMPLATE/$windowsminversionnumber/;
-        ${$propertyfile}[$i] =~ 
s/WINDOWSMINSPNUMBERTEMPLATE/$windowsminspnumber/;
+        ${$propertyfile}[$i] =~ s/WINMAJORVERMINTEMPLATE/$winmajorvermin/;
         if ( ${$propertyfile}[$i] =~ m/ARPNOMODIFY/ ) { $hasarpnomodify = 1; 
}
     }
 
commit 762d76d9a44704af45b4989f900a906f8f7aa3a3
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Sat Dec 7 22:12:08 2024 +0500
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Sat Dec 7 20:06:37 2024 +0100

    Simplify avmedia::SoundHandler
    
    Change-Id: I253d6eda265e3e93d4b85ac35376a96676a68553
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178050
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/avmedia/source/framework/soundhandler.cxx 
b/avmedia/source/framework/soundhandler.cxx
index d3cc8b724d39..5af9aca90594 100644
--- a/avmedia/source/framework/soundhandler.cxx
+++ b/avmedia/source/framework/soundhandler.cxx
@@ -33,61 +33,7 @@
 namespace avmedia{
 
 
-//  XInterface, XTypeProvider, XServiceInfo
-
-
-void SAL_CALL SoundHandler::acquire() noexcept
-{
-       /* Don't use mutex in methods of XInterface! */
-       OWeakObject::acquire();
-}
-
-void SAL_CALL SoundHandler::release() noexcept
-{
-       /* Don't use mutex in methods of XInterface! */
-       OWeakObject::release();
-}
-
-css::uno::Any SAL_CALL SoundHandler::queryInterface( const css::uno::Type& 
aType )
-{
-       /* Attention: Don't use mutex or guard in this method!!! Is a method of 
XInterface.     */
-        /* Ask for my own supported interfaces ...*/
-       css::uno::Any aReturn( ::cppu::queryInterface( aType,
-               static_cast< css::lang::XTypeProvider* >(this),
-               static_cast< css::lang::XServiceInfo* >(this),
-               static_cast< css::frame::XNotifyingDispatch* >(this),
-               static_cast< css::frame::XDispatch* >(this),
-               static_cast< css::document::XExtendedFilterDetection* >(this)));
-       /* If searched interface not supported by this class ... */
-       if ( !aReturn.hasValue() )
-       {
-               /* ... ask baseclass for interfaces! */
-               aReturn = OWeakObject::queryInterface( aType );
-       }
-        /* Return result of this search. */
-       return aReturn;
-}
-
-css::uno::Sequence< sal_Int8 > SAL_CALL SoundHandler::getImplementationId()
-{
-    return css::uno::Sequence<sal_Int8>();
-}
-
-css::uno::Sequence< css::uno::Type > SAL_CALL SoundHandler::getTypes()
-{
-    static ::cppu::OTypeCollection aTypeCollection(
-        cppu::UnoType<css::lang::XTypeProvider>::get(),
-        cppu::UnoType<css::lang::XServiceInfo>::get(),
-        cppu::UnoType<css::frame::XNotifyingDispatch>::get(),
-        cppu::UnoType<css::frame::XDispatch>::get(),
-        cppu::UnoType<css::document::XExtendedFilterDetection>::get());
-
-    return aTypeCollection.getTypes();
-}
-
-/*===========================================================================================================*/
-/* XServiceInfo */
-/*===========================================================================================================*/
+//  XServiceInfo
 OUString SAL_CALL SoundHandler::getImplementationName()
 {
     return u"com.sun.star.comp.framework.SoundHandler"_ustr;
@@ -162,7 +108,7 @@ void SAL_CALL SoundHandler::dispatchWithNotification(const 
css::util::URL&
                                                      const 
css::uno::Reference< css::frame::XDispatchResultListener >& xListener )
 {
     // SAFE {
-    const ::osl::MutexGuard aLock( m_aMutex );
+    const std::unique_lock aLock(m_aMutex);
 
     utl::MediaDescriptor aDescriptor(lDescriptor);
 
@@ -274,7 +220,7 @@ OUString SAL_CALL SoundHandler::detect( css::uno::Sequence< 
css::beans::Property
 IMPL_LINK_NOARG(SoundHandler, implts_PlayerNotify, Timer *, void)
 {
     // SAFE {
-    ::osl::ClearableMutexGuard aLock( m_aMutex );
+    std::unique_lock aLock(m_aMutex);
 
     if (m_xPlayer.is() && m_xPlayer->isPlaying() && m_xPlayer->getMediaTime() 
< m_xPlayer->getDuration())
     {
@@ -304,7 +250,7 @@ IMPL_LINK_NOARG(SoundHandler, implts_PlayerNotify, Timer *, 
void)
 
     // } SAFE
     //release aLock before end of method at which point xOperationHold goes 
out of scope and pThis dies
-    aLock.clear();
+    aLock.unlock();
 }
 
 } // namespace framework
diff --git a/avmedia/source/framework/soundhandler.hxx 
b/avmedia/source/framework/soundhandler.hxx
index 648cbe59dd4b..a143fcb87eaa 100644
--- a/avmedia/source/framework/soundhandler.hxx
+++ b/avmedia/source/framework/soundhandler.hxx
@@ -29,6 +29,7 @@
 
 #include <com/sun/star/lang/XServiceInfo.hpp>
 
+#include <comphelper/compbase.hxx>
 #include <cppuhelper/basemutex.hxx>
 #include <cppuhelper/weak.hxx>
 
@@ -49,15 +50,9 @@ namespace avmedia{
     @devstatus      ready
     @threadsafe     yes
 
*//*-*************************************************************************************************************/
-class SoundHandler  :   // interfaces
-                        public  css::lang::XTypeProvider
-                    ,   public  css::lang::XServiceInfo
-                    ,   public  css::frame::XNotifyingDispatch // => XDispatch
-                    ,   public  css::document::XExtendedFilterDetection
-                        // baseclasses
-                        // Order is necessary for right initialization!
-                    ,   private cppu::BaseMutex
-                    ,   public  ::cppu::OWeakObject
+class SoundHandler : public comphelper::WeakImplHelper<css::lang::XServiceInfo,
+                                                       
css::frame::XNotifyingDispatch, // => XDispatch
+                                                       
css::document::XExtendedFilterDetection>
 {
     // public methods
     public:
@@ -66,14 +61,7 @@ class SoundHandler  :   // interfaces
                  SoundHandler();
         virtual ~SoundHandler(                                                 
                       ) override;
 
-        //  XInterface, XTypeProvider, XServiceInfo
-        virtual css::uno::Any  SAL_CALL queryInterface( const css::uno::Type& 
aType   ) override;
-        virtual void SAL_CALL acquire() noexcept override;
-        virtual void SAL_CALL release() noexcept override;
-        virtual css::uno::Sequence< css::uno::Type >  SAL_CALL getTypes () 
override;
-        virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() 
override;
-
-    /* interface XServiceInfo */
+        //  XServiceInfo
        virtual OUString                                               SAL_CALL 
getImplementationName              (                                            
                                   ) override;
        virtual sal_Bool                                               SAL_CALL 
supportsService                    ( const OUString&                            
                   sServiceName    ) override;
        virtual css::uno::Sequence< OUString >                         SAL_CALL 
getSupportedServiceNames           (                                            
                                   ) override;

Reply via email to