Updated wusa-MSU_Package_Installer patchset

This commit is contained in:
Alistair Leslie-Hughes 2019-08-16 19:59:49 +10:00
parent 523d4ac996
commit 924665da6f
7 changed files with 138 additions and 139 deletions

View File

@ -1,26 +1,25 @@
From ad50a50937dc367abb6a0cb08cd88be2b293b75d Mon Sep 17 00:00:00 2001
From 1fdf0ca43f4530d1303362b3f8b20b0af06588d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 14 Dec 2015 00:39:54 +0100
Subject: wusa: Implement basic installation logic.
Subject: [PATCH 1/7] wusa: Implement basic installation logic.
---
programs/wusa/Makefile.in | 6 +-
programs/wusa/main.c | 1044 ++++++++++++++++++++++++++++++++++++-
programs/wusa/Makefile.in | 4 +-
programs/wusa/main.c | 1043 ++++++++++++++++++++++++++++++++++++-
programs/wusa/manifest.c | 704 +++++++++++++++++++++++++
programs/wusa/wusa.h | 160 ++++++
4 files changed, 1907 insertions(+), 7 deletions(-)
programs/wusa/wusa.h | 159 ++++++
4 files changed, 1904 insertions(+), 6 deletions(-)
create mode 100644 programs/wusa/manifest.c
create mode 100644 programs/wusa/wusa.h
diff --git a/programs/wusa/Makefile.in b/programs/wusa/Makefile.in
index 3042e86bf..67060d7b4 100644
index 3042e86bf8..bf90273411 100644
--- a/programs/wusa/Makefile.in
+++ b/programs/wusa/Makefile.in
@@ -1,6 +1,8 @@
MODULE = wusa.exe
-EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
+EXTRADLLFLAGS = -mconsole -municode
EXTRADLLFLAGS = -mconsole -municode -mno-cygwin
+IMPORTS = cabinet shlwapi ole32 oleaut32 advapi32
C_SRCS = \
@ -28,7 +27,7 @@ index 3042e86bf..67060d7b4 100644
+ main.c \
+ manifest.c
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index aa7a38fe1..7c1dfef7a 100644
index aa7a38fe17..0d6e5c345c 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -1,5 +1,7 @@
@ -39,7 +38,7 @@ index aa7a38fe1..7c1dfef7a 100644
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -16,18 +18,1050 @@
@@ -16,18 +18,1049 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
@ -48,7 +47,6 @@ index aa7a38fe1..7c1dfef7a 100644
+#include "fdi.h"
+#include "wusa.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(wusa);
@ -113,7 +111,7 @@ index aa7a38fe1..7c1dfef7a 100644
+ if (!buf->buf) return FALSE;
+ if (!str) return TRUE;
+
+ if (len == ~0U) len = strlenW(str);
+ if (len == ~0U) len = lstrlenW(str);
+ if (buf->pos + len + 1 > buf->len)
+ {
+ new_len = max(buf->pos + len + 1, buf->len * 2);
@ -135,9 +133,9 @@ index aa7a38fe1..7c1dfef7a 100644
+
+static BOOL str_ends_with(const WCHAR *str, const WCHAR *suffix)
+{
+ DWORD str_len = strlenW(str), suffix_len = strlenW(suffix);
+ DWORD str_len = lstrlenW(str), suffix_len = lstrlenW(suffix);
+ if (suffix_len > str_len) return FALSE;
+ return !strcmpiW(str + str_len - suffix_len, suffix);
+ return !_wcsicmp(str + str_len - suffix_len, suffix);
+}
+
+static WCHAR *path_combine(const WCHAR *path, const WCHAR *filename)
@ -147,13 +145,13 @@ index aa7a38fe1..7c1dfef7a 100644
+ DWORD length;
+
+ if (!path || !filename) return NULL;
+ length = strlenW(path) + strlenW(filename) + 2;
+ length = lstrlenW(path) + lstrlenW(filename) + 2;
+ if (!(result = heap_alloc(length * sizeof(WCHAR)))) return NULL;
+
+ strcpyW(result, path);
+ if (result[0] && result[strlenW(result) - 1] != '\\')
+ strcatW(result, backslashW);
+ strcatW(result, filename);
+ lstrcpyW(result, path);
+ if (result[0] && result[lstrlenW(result) - 1] != '\\')
+ lstrcatW(result, backslashW);
+ lstrcatW(result, filename);
+ return result;
+}
+
@ -215,8 +213,8 @@ index aa7a38fe1..7c1dfef7a 100644
+ {
+ do
+ {
+ if (!strcmpW(data.cFileName, dotW)) continue;
+ if (!strcmpW(data.cFileName, dotdotW)) continue;
+ if (!lstrcmpW(data.cFileName, dotW)) continue;
+ if (!lstrcmpW(data.cFileName, dotdotW)) continue;
+ if (!(full_path = path_combine(path, data.cFileName))) continue;
+ if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ delete_directory(full_path);
@ -398,12 +396,12 @@ index aa7a38fe1..7c1dfef7a 100644
+ static const WCHAR runtime_windows[] = {'r','u','n','t','i','m','e','.','w','i','n','d','o','w','s',0};
+ WCHAR path[MAX_PATH];
+
+ if (!strcmpW(key, runtime_system32))
+ if (!lstrcmpW(key, runtime_system32))
+ {
+ GetSystemDirectoryW(path, sizeof(path)/sizeof(path[0]));
+ return strdupW(path);
+ }
+ if (!strcmpW(key, runtime_windows))
+ if (!lstrcmpW(key, runtime_windows))
+ {
+ GetWindowsDirectoryW(path, sizeof(path)/sizeof(path[0]));
+ return strdupW(path);
@ -423,11 +421,11 @@ index aa7a38fe1..7c1dfef7a 100644
+
+ if (!expression || !strbuf_init(&buf)) return NULL;
+
+ for (pos = expression; (next = strstrW(pos, beginW)); pos = next + 1)
+ for (pos = expression; (next = wcsstr(pos, beginW)); pos = next + 1)
+ {
+ strbuf_append(&buf, pos, next - pos);
+ pos = next + 2;
+ if (!(next = strstrW(pos, endW)))
+ if (!(next = wcsstr(pos, endW)))
+ {
+ strbuf_append(&buf, beginW, 2);
+ break;
@ -453,7 +451,7 @@ index aa7a38fe1..7c1dfef7a 100644
+static WCHAR *get_assembly_source(struct assembly_entry *assembly)
+{
+ WCHAR *p, *path = strdupW(assembly->filename);
+ if (path && (p = strrchrW(path, '.'))) *p = 0;
+ if (path && (p = wcsrchr(path, '.'))) *p = 0;
+ return path;
+}
+
@ -527,20 +525,20 @@ index aa7a38fe1..7c1dfef7a 100644
+ DWORD size;
+ WCHAR *p;
+
+ p = strchrW(key, '\\');
+ p = wcschr(key, '\\');
+ if (!p) return NULL;
+
+ size = p - key;
+
+ if (strlenW(hkey_classes_rootW) == size && !strncmpW(key, hkey_classes_rootW, size))
+ if (lstrlenW(hkey_classes_rootW) == size && !wcsncmp(key, hkey_classes_rootW, size))
+ *root = HKEY_CLASSES_ROOT;
+ else if (strlenW(hkey_current_configW) == size && !strncmpW(key, hkey_current_configW, size))
+ else if (lstrlenW(hkey_current_configW) == size && !wcsncmp(key, hkey_current_configW, size))
+ *root = HKEY_CURRENT_CONFIG;
+ else if (strlenW(hkey_current_userW) == size && !strncmpW(key, hkey_current_userW, size))
+ else if (lstrlenW(hkey_current_userW) == size && !wcsncmp(key, hkey_current_userW, size))
+ *root = HKEY_CURRENT_USER;
+ else if (strlenW(hkey_local_machineW) == size && !strncmpW(key, hkey_local_machineW, size))
+ else if (lstrlenW(hkey_local_machineW) == size && !wcsncmp(key, hkey_local_machineW, size))
+ *root = HKEY_LOCAL_MACHINE;
+ else if (strlenW(hkey_usersW) == size && !strncmpW(key, hkey_usersW, size))
+ else if (lstrlenW(hkey_usersW) == size && !wcsncmp(key, hkey_usersW, size))
+ *root = HKEY_USERS;
+ else
+ {
@ -560,7 +558,7 @@ index aa7a38fe1..7c1dfef7a 100644
+ if (registrykv->value && !value)
+ return FALSE;
+
+ value_size = value ? (strlenW(value) + 1) * sizeof(WCHAR) : 0;
+ value_size = value ? (lstrlenW(value) + 1) * sizeof(WCHAR) : 0;
+ if (!dryrun && RegSetValueExW(key, registrykv->name, 0, type, (void *)value, value_size))
+ {
+ WINE_ERR("Failed to set registry key %s\n", debugstr_w(registrykv->name));
@ -584,7 +582,7 @@ index aa7a38fe1..7c1dfef7a 100644
+ for (pos = input; pos[0] == '"'; pos++)
+ {
+ pos++;
+ if (!(next = strstrW(pos, quoteW))) goto error;
+ if (!(next = wcsstr(pos, quoteW))) goto error;
+ strbuf_append(&buf, pos, next - pos);
+ strbuf_append(&buf, emptyW, sizeof(emptyW)/sizeof(emptyW[0]));
+
@ -633,7 +631,7 @@ index aa7a38fe1..7c1dfef7a 100644
+
+static BOOL install_registry_dword(struct assembly_entry *assembly, HKEY key, struct registrykv_entry *registrykv, BOOL dryrun)
+{
+ DWORD value = registrykv->value_type ? strtoulW(registrykv->value_type, NULL, 16) : 0;
+ DWORD value = registrykv->value_type ? wcstoul(registrykv->value_type, NULL, 16) : 0;
+ BOOL ret = TRUE;
+
+ if (!dryrun && RegSetValueExW(key, registrykv->name, 0, REG_DWORD, (void *)&value, sizeof(value)))
@ -653,7 +651,7 @@ index aa7a38fe1..7c1dfef7a 100644
+
+ *size = 0;
+ if (!input) return NULL;
+ length = strlenW(input);
+ length = lstrlenW(input);
+ if (length & 1) return NULL;
+ length >>= 1;
+
@ -662,7 +660,7 @@ index aa7a38fe1..7c1dfef7a 100644
+ {
+ number[0] = input[0];
+ number[1] = input[1];
+ *p++ = strtoulW(number, 0, 16);
+ *p++ = wcstoul(number, 0, 16);
+ }
+ *size = length;
+ return output;
@ -695,15 +693,15 @@ index aa7a38fe1..7c1dfef7a 100644
+ static const WCHAR reg_dwordW[] = {'R','E','G','_','D','W','O','R','D',0};
+ static const WCHAR reg_binaryW[] = {'R','E','G','_','B','I','N','A','R','Y',0};
+
+ if (!strcmpW(registrykv->value_type, reg_szW))
+ if (!lstrcmpW(registrykv->value_type, reg_szW))
+ return install_registry_string(assembly, key, registrykv, REG_SZ, dryrun);
+ if (!strcmpW(registrykv->value_type, reg_expand_szW))
+ if (!lstrcmpW(registrykv->value_type, reg_expand_szW))
+ return install_registry_string(assembly, key, registrykv, REG_EXPAND_SZ, dryrun);
+ if (!strcmpW(registrykv->value_type, reg_multi_szW))
+ if (!lstrcmpW(registrykv->value_type, reg_multi_szW))
+ return install_registry_multisz(assembly, key, registrykv, dryrun);
+ if (!strcmpW(registrykv->value_type, reg_dwordW))
+ if (!lstrcmpW(registrykv->value_type, reg_dwordW))
+ return install_registry_dword(assembly, key, registrykv, dryrun);
+ if (!strcmpW(registrykv->value_type, reg_binaryW))
+ if (!lstrcmpW(registrykv->value_type, reg_binaryW))
+ return install_registry_binary(assembly, key, registrykv, dryrun);
+
+ WINE_FIXME("Unsupported registry value type %s\n", debugstr_w(registrykv->value_type));
@ -748,7 +746,7 @@ index aa7a38fe1..7c1dfef7a 100644
+static BOOL compare_assembly_string(const WCHAR *str1, const WCHAR *str2)
+{
+ static const WCHAR placeholderW[] = {'*',0};
+ return !strcmpW(str1, str2) || !strcmpW(str1, placeholderW) || !strcmpW(str2, placeholderW);
+ return !lstrcmpW(str1, str2) || !lstrcmpW(str1, placeholderW) || !lstrcmpW(str2, placeholderW);
+}
+
+static struct assembly_entry *lookup_assembly(struct list *manifest_list, struct assembly_identity *identity)
@ -757,7 +755,7 @@ index aa7a38fe1..7c1dfef7a 100644
+
+ LIST_FOR_EACH_ENTRY(assembly, manifest_list, struct assembly_entry, entry)
+ {
+ if (strcmpiW(assembly->identity.name, identity->name)) continue;
+ if (_wcsicmp(assembly->identity.name, identity->name)) continue;
+ if (!compare_assembly_string(assembly->identity.architecture, identity->architecture)) continue;
+ if (!compare_assembly_string(assembly->identity.language, identity->language)) continue;
+ if (!compare_assembly_string(assembly->identity.pubkey_token, identity->pubkey_token)) continue;
@ -975,7 +973,7 @@ index aa7a38fe1..7c1dfef7a 100644
+ do
+ {
+ if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
+ if (!strcmpiW(data.cFileName, wsusscanW)) continue;
+ if (!_wcsicmp(data.cFileName, wsusscanW)) continue;
+ if (!(path = path_combine(temp_path, data.cFileName))) continue;
+ if (!load_assemblies_from_cab(path, state))
+ WINE_ERR("Failed to load all manifests from %s, ignoring\n", debugstr_w(path));
@ -1074,9 +1072,9 @@ index aa7a38fe1..7c1dfef7a 100644
+ {
+ if (argv[i][0] == '/')
+ {
+ if (!strcmpW(argv[i], norestartW))
+ if (!lstrcmpW(argv[i], norestartW))
+ state.norestart = TRUE;
+ else if (!strcmpW(argv[i], quietW))
+ else if (!lstrcmpW(argv[i], quietW))
+ state.quiet = TRUE;
+ else
+ WINE_FIXME("Unknown option: %s\n", wine_dbgstr_w(argv[i]));
@ -1097,7 +1095,7 @@ index aa7a38fe1..7c1dfef7a 100644
}
diff --git a/programs/wusa/manifest.c b/programs/wusa/manifest.c
new file mode 100644
index 000000000..fc1f65b02
index 0000000000..d88b5f98a9
--- /dev/null
+++ b/programs/wusa/manifest.c
@@ -0,0 +1,704 @@
@ -1128,7 +1126,7 @@ index 000000000..fc1f65b02
+#include "msxml.h"
+#include "wusa.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+
+WINE_DEFAULT_DEBUG_CHANNEL(wusa);
+
@ -1278,7 +1276,7 @@ index 000000000..fc1f65b02
+
+ if (SUCCEEDED(IXMLDOMElement_get_tagName(root, &bstr)))
+ {
+ ret = !strcmpW(bstr, tagname);
+ ret = !lstrcmpW(bstr, tagname);
+ SysFreeString(bstr);
+ }
+
@ -1401,7 +1399,7 @@ index 000000000..fc1f65b02
+ WINE_ERR("Failed to get dependency type\n");
+ return FALSE;
+ }
+ if (strcmpW(dependency_type, installW))
+ if (lstrcmpW(dependency_type, installW))
+ {
+ WINE_FIXME("Unimplemented dependency type %s\n", debugstr_w(dependency_type));
+ goto error;
@ -1427,7 +1425,7 @@ index 000000000..fc1f65b02
+ struct assembly_entry *assembly = context;
+ struct dependency_entry *entry;
+
+ if (strcmpW(tagname, dependentAssemblyW))
+ if (lstrcmpW(tagname, dependentAssemblyW))
+ {
+ WINE_FIXME("Don't know how to handle dependency tag %s\n", debugstr_w(tagname));
+ return FALSE;
@ -1459,7 +1457,7 @@ index 000000000..fc1f65b02
+ struct assembly_entry *assembly = context;
+ struct dependency_entry *entry;
+
+ if (strcmpW(tagname, assemblyIdentityW))
+ if (lstrcmpW(tagname, assemblyIdentityW))
+ {
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1491,11 +1489,11 @@ index 000000000..fc1f65b02
+ static const WCHAR packageW[] = {'p','a','c','k','a','g','e',0};
+ struct assembly_entry *assembly = context;
+
+ if (!strcmpW(tagname, componentW))
+ if (!lstrcmpW(tagname, componentW))
+ return iter_components(child, assembly);
+ if (!strcmpW(tagname, packageW))
+ if (!lstrcmpW(tagname, packageW))
+ return iter_components(child, assembly);
+ if (!strcmpW(tagname, applicableW))
+ if (!lstrcmpW(tagname, applicableW))
+ return TRUE;
+
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
@ -1513,9 +1511,9 @@ index 000000000..fc1f65b02
+ static const WCHAR parentW[] = {'p','a','r','e','n','t',0};
+ struct assembly_entry *assembly = context;
+
+ if (!strcmpW(tagname, updateW))
+ if (!lstrcmpW(tagname, updateW))
+ return iter_update(child, assembly);
+ if (!strcmpW(tagname, parentW))
+ if (!lstrcmpW(tagname, parentW))
+ return TRUE;
+
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
@ -1559,8 +1557,8 @@ index 000000000..fc1f65b02
+ struct registryop_entry *registryop = context;
+ struct registrykv_entry *entry;
+
+ if (!strcmpW(tagname, securityDescriptorW)) return TRUE;
+ if (strcmpW(tagname, registryValueW))
+ if (!lstrcmpW(tagname, securityDescriptorW)) return TRUE;
+ if (lstrcmpW(tagname, registryValueW))
+ {
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1595,7 +1593,7 @@ index 000000000..fc1f65b02
+ struct registryop_entry *entry;
+ WCHAR *keyname;
+
+ if (strcmpW(tagname, registryKeyW))
+ if (lstrcmpW(tagname, registryKeyW))
+ {
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1641,21 +1639,21 @@ index 000000000..fc1f65b02
+ static const WCHAR deploymentW[] = {'d','e','p','l','o','y','m','e','n','t',0};
+ struct assembly_entry *assembly = context;
+
+ if (!strcmpW(tagname, assemblyIdentityW) && !assembly->identity.name)
+ if (!lstrcmpW(tagname, assemblyIdentityW) && !assembly->identity.name)
+ return read_identity(child, &assembly->identity);
+ if (!strcmpW(tagname, dependencyW))
+ if (!lstrcmpW(tagname, dependencyW))
+ return iter_dependency(child, assembly);
+ if (!strcmpW(tagname, packageW))
+ if (!lstrcmpW(tagname, packageW))
+ return iter_package(child, assembly);
+ if (!strcmpW(tagname, fileW))
+ if (!lstrcmpW(tagname, fileW))
+ return read_file(child, assembly);
+ if (!strcmpW(tagname, registryKeysW))
+ if (!lstrcmpW(tagname, registryKeysW))
+ return iter_registry_keys(child, assembly);
+ if (!strcmpW(tagname, trustInfoW))
+ if (!lstrcmpW(tagname, trustInfoW))
+ return TRUE;
+ if (!strcmpW(tagname, configurationW))
+ if (!lstrcmpW(tagname, configurationW))
+ return TRUE;
+ if (!strcmpW(tagname, deploymentW))
+ if (!lstrcmpW(tagname, deploymentW))
+ return TRUE;
+
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
@ -1704,8 +1702,8 @@ index 000000000..fc1f65b02
+ struct dependency_entry *entry;
+ struct list *update_list = context;
+
+ if (!strcmpW(tagname, sourceW)) return TRUE;
+ if (strcmpW(tagname, assemblyIdentityW))
+ if (!lstrcmpW(tagname, sourceW)) return TRUE;
+ if (lstrcmpW(tagname, assemblyIdentityW))
+ {
+ WINE_TRACE("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1739,7 +1737,7 @@ index 000000000..fc1f65b02
+ WCHAR *action;
+ BOOL ret = TRUE;
+
+ if (strcmpW(tagname, packageW))
+ if (lstrcmpW(tagname, packageW))
+ {
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1751,7 +1749,7 @@ index 000000000..fc1f65b02
+ return FALSE;
+ }
+
+ if (!strcmpW(action, installW))
+ if (!lstrcmpW(action, installW))
+ ret = iter_update_package(child, update_list);
+ else
+ WINE_FIXME("action %s not supported\n", debugstr_w(action));
@ -1770,7 +1768,7 @@ index 000000000..fc1f65b02
+ static const WCHAR servicingW[] = {'s','e','r','v','i','c','i','n','g',0};
+ struct list *update_list = context;
+
+ if (strcmpW(tagname, servicingW))
+ if (lstrcmpW(tagname, servicingW))
+ {
+ WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
+ return TRUE;
@ -1807,10 +1805,10 @@ index 000000000..fc1f65b02
+}
diff --git a/programs/wusa/wusa.h b/programs/wusa/wusa.h
new file mode 100644
index 000000000..eada6d9b2
index 0000000000..0b2b616a7c
--- /dev/null
+++ b/programs/wusa/wusa.h
@@ -0,0 +1,160 @@
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2015 Michael Müller
+ * Copyright 2015 Sebastian Lackner
@ -1830,7 +1828,6 @@ index 000000000..eada6d9b2
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/unicode.h"
+#include "wine/list.h"
+#include <windows.h>
+
@ -1953,9 +1950,9 @@ index 000000000..eada6d9b2
+{
+ WCHAR *ret;
+ if (!str) return NULL;
+ ret = heap_alloc((strlenW(str) + 1) * sizeof(WCHAR));
+ ret = heap_alloc((lstrlenW(str) + 1) * sizeof(WCHAR));
+ if (ret)
+ strcpyW(ret, str);
+ lstrcpyW(ret, str);
+ return ret;
+}
+
@ -1972,5 +1969,5 @@ index 000000000..eada6d9b2
+ return ret;
+}
--
2.21.0
2.23.0.rc1

View File

@ -1,14 +1,14 @@
From f4415437d092f621e2cb292cf290a7910165d05f Mon Sep 17 00:00:00 2001
From 117b12b0bda9b2a5dd4e9e70bfe7807bcb20ce26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 21 Dec 2015 01:45:07 +0100
Subject: wusa: Ignore systemProtection subkey of registry key.
Subject: [PATCH 2/7] wusa: Ignore systemProtection subkey of registry key.
---
programs/wusa/manifest.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/programs/wusa/manifest.c b/programs/wusa/manifest.c
index fc1f65b..63e56e0 100644
index d88b5f98a9..9b43d5e246 100644
--- a/programs/wusa/manifest.c
+++ b/programs/wusa/manifest.c
@@ -449,6 +449,7 @@ error:
@ -22,11 +22,11 @@ index fc1f65b..63e56e0 100644
@@ -457,6 +458,7 @@ static BOOL read_registry_key(IXMLDOMElement *child, WCHAR *tagname, void *conte
struct registrykv_entry *entry;
if (!strcmpW(tagname, securityDescriptorW)) return TRUE;
+ if (!strcmpW(tagname, systemProtectionW)) return TRUE;
if (strcmpW(tagname, registryValueW))
if (!lstrcmpW(tagname, securityDescriptorW)) return TRUE;
+ if (!lstrcmpW(tagname, systemProtectionW)) return TRUE;
if (lstrcmpW(tagname, registryValueW))
{
WINE_FIXME("Ignoring unexpected tag %s\n", debugstr_w(tagname));
--
2.6.4
2.23.0.rc1

View File

@ -1,17 +1,17 @@
From e489fac14e207ba0973c145ede43587457cc0be1 Mon Sep 17 00:00:00 2001
From ae3350ac731b45fd0b47d50f0e64525ec48803f9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 21 Dec 2015 01:46:34 +0100
Subject: wusa: Treat empty update list as error.
Subject: [PATCH 3/7] wusa: Treat empty update list as error.
---
programs/wusa/main.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index 7c1dfef..9cd8a2d 100644
index 0d6e5c345c..837729554f 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -998,6 +998,12 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
@@ -997,6 +997,12 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
}
}
@ -25,5 +25,5 @@ index 7c1dfef..9cd8a2d 100644
set_assembly_status(&state->assemblies, ASSEMBLY_STATUS_NONE);
if (!install_updates(state, TRUE))
--
2.6.4
2.23.0.rc1

View File

@ -1,17 +1,17 @@
From 924e4649bcc67c6b61191d6f0653c12c742e374a Mon Sep 17 00:00:00 2001
From 3469408e1493cc2836c2ec38cf820bc52449c02a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 21 Dec 2015 01:47:59 +0100
Subject: wusa: Implement WOW64 support.
Subject: [PATCH 4/7] wusa: Implement WOW64 support.
---
programs/wusa/main.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++-
programs/wusa/main.c | 62 +++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 61 insertions(+), 1 deletion(-)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index 9cd8a2d..36e0013 100644
index 837729554f..3598c39660 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -66,6 +66,12 @@ struct installer_state
@@ -65,6 +65,12 @@ struct installer_state
struct list updates;
};
@ -24,12 +24,12 @@ index 9cd8a2d..36e0013 100644
static BOOL strbuf_init(struct strbuf *buf)
{
buf->pos = 0;
@@ -375,6 +381,14 @@ static WCHAR *lookup_expression(struct assembly_entry *assembly, const WCHAR *ke
@@ -374,6 +380,14 @@ static WCHAR *lookup_expression(struct assembly_entry *assembly, const WCHAR *ke
if (!strcmpW(key, runtime_system32))
if (!lstrcmpW(key, runtime_system32))
{
+ #if defined(__x86_64__)
+ if (!strcmpW(assembly->identity.architecture, x86W))
+ if (!lstrcmpW(assembly->identity.architecture, x86W))
+ {
+ GetSystemWow64DirectoryW(path, sizeof(path)/sizeof(path[0]));
+ return strdupW(path);
@ -39,7 +39,7 @@ index 9cd8a2d..36e0013 100644
GetSystemDirectoryW(path, sizeof(path)/sizeof(path[0]));
return strdupW(path);
}
@@ -691,8 +705,13 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
@@ -690,8 +704,13 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
struct registrykv_entry *registrykv;
HKEY root, subkey;
WCHAR *path;
@ -47,13 +47,13 @@ index 9cd8a2d..36e0013 100644
BOOL ret = TRUE;
+#if defined(__x86_64__)
+ if (!strcmpW(assembly->identity.architecture, x86W)) sam |= KEY_WOW64_32KEY;
+ if (!lstrcmpW(assembly->identity.architecture, x86W)) sam |= KEY_WOW64_32KEY;
+#endif
+
LIST_FOR_EACH_ENTRY(registryop, &assembly->registryops, struct registryop_entry, entry)
{
if (!(path = split_registry_key(registryop->key, &root)))
@@ -701,7 +720,7 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
@@ -700,7 +719,7 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
break;
}
@ -62,12 +62,12 @@ index 9cd8a2d..36e0013 100644
{
WINE_ERR("Failed to open registry key %s\n", debugstr_w(registryop->key));
ret = FALSE;
@@ -772,6 +791,14 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
@@ -771,6 +790,14 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
return FALSE;
}
+#if defined(__i386__)
+ if (!strcmpW(assembly->identity.architecture, amd64W))
+ if (!lstrcmpW(assembly->identity.architecture, amd64W))
+ {
+ WINE_ERR("Can not install amd64 assembly in 32 bit prefix\n");
+ return FALSE;
@ -77,7 +77,7 @@ index 9cd8a2d..36e0013 100644
assembly->status = ASSEMBLY_STATUS_IN_PROGRESS;
LIST_FOR_EACH_ENTRY(dependency, &assembly->dependencies, struct dependency_entry, entry)
@@ -1027,6 +1054,37 @@ done:
@@ -1026,6 +1053,37 @@ done:
return ret;
}
@ -115,7 +115,7 @@ index 9cd8a2d..36e0013 100644
int wmain(int argc, WCHAR *argv[])
{
static const WCHAR norestartW[] = {'/','n','o','r','e','s','t','a','r','t',0};
@@ -1035,6 +1093,8 @@ int wmain(int argc, WCHAR *argv[])
@@ -1034,6 +1092,8 @@ int wmain(int argc, WCHAR *argv[])
WCHAR *filename = NULL;
int i;
@ -125,5 +125,5 @@ index 9cd8a2d..36e0013 100644
state.quiet = FALSE;
--
2.9.0
2.23.0.rc1

View File

@ -1,7 +1,8 @@
From c848126e160493a7baa717c96e663ef5ebddb542 Mon Sep 17 00:00:00 2001
From 47c2670271bfb03dd6cfac0febb16bdf1d894600 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 21 Dec 2015 03:01:05 +0100
Subject: wusa: Add workaround to be compatible with Vista packages.
Subject: [PATCH 5/7] wusa: Add workaround to be compatible with Vista
packages.
---
programs/wusa/main.c | 21 +++++++++++++++++++++
@ -10,24 +11,24 @@ Subject: wusa: Add workaround to be compatible with Vista packages.
3 files changed, 44 insertions(+)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index 5dae802..834da33 100644
index 3598c39660..b612828855 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -111,6 +111,13 @@ static BOOL strbuf_append(struct strbuf *buf, const WCHAR *str, DWORD len)
@@ -113,6 +113,13 @@ static BOOL strbuf_append(struct strbuf *buf, const WCHAR *str, DWORD len)
return TRUE;
}
+static BOOL str_starts_with(const WCHAR *str, const WCHAR *prefix)
+{
+ DWORD str_len = strlenW(str), prefix_len = strlenW(prefix);
+ DWORD str_len = lstrlenW(str), prefix_len = lstrlenW(prefix);
+ if (prefix_len > str_len) return FALSE;
+ return !strncmpiW(str, prefix, prefix_len);
+ return !wcsnicmp(str, prefix, prefix_len);
+}
+
static BOOL str_ends_with(const WCHAR *str, const WCHAR *suffix)
{
DWORD str_len = strlenW(str), suffix_len = strlenW(suffix);
@@ -1003,6 +1010,20 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
DWORD str_len = lstrlenW(str), suffix_len = lstrlenW(suffix);
@@ -1005,6 +1012,20 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
FindClose(search);
}
@ -49,7 +50,7 @@ index 5dae802..834da33 100644
if (WINE_TRACE_ON(wusa))
{
diff --git a/programs/wusa/manifest.c b/programs/wusa/manifest.c
index 63e56e0..0d6fae6 100644
index 9b43d5e246..2ca92c2a17 100644
--- a/programs/wusa/manifest.c
+++ b/programs/wusa/manifest.c
@@ -704,3 +704,25 @@ done:
@ -79,10 +80,10 @@ index 63e56e0..0d6fae6 100644
+ return FALSE;
+}
diff --git a/programs/wusa/wusa.h b/programs/wusa/wusa.h
index eada6d9..ef5793b 100644
index 0b2b616a7c..d7f1a471b4 100644
--- a/programs/wusa/wusa.h
+++ b/programs/wusa/wusa.h
@@ -82,6 +82,7 @@ void free_assembly(struct assembly_entry *entry) DECLSPEC_HIDDEN;
@@ -81,6 +81,7 @@ void free_assembly(struct assembly_entry *entry) DECLSPEC_HIDDEN;
void free_dependency(struct dependency_entry *entry) DECLSPEC_HIDDEN;
struct assembly_entry *load_manifest(const WCHAR *filename) DECLSPEC_HIDDEN;
BOOL load_update(const WCHAR *filename, struct list *update_list) DECLSPEC_HIDDEN;
@ -91,5 +92,5 @@ index eada6d9..ef5793b 100644
static void *heap_alloc(size_t len) __WINE_ALLOC_SIZE(1);
static inline void *heap_alloc(size_t len)
--
2.6.4
2.23.0.rc1

View File

@ -1,17 +1,17 @@
From 2038bc924b8e3a3b1d5a1e989e9d2a74570c0dc1 Mon Sep 17 00:00:00 2001
From 72d2b2df1ec557664d5266b5b05e160e4d565993 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Mon, 21 Dec 2015 04:27:02 +0100
Subject: wusa: Improve tracing of installation process.
Subject: [PATCH 6/7] wusa: Improve tracing of installation process.
---
programs/wusa/main.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index 834da33..6a893ec 100644
index b612828855..847fd8b2ce 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -469,6 +469,8 @@ static BOOL install_files_copy(struct assembly_entry *assembly, const WCHAR *sou
@@ -471,6 +471,8 @@ static BOOL install_files_copy(struct assembly_entry *assembly, const WCHAR *sou
}
else
{
@ -20,16 +20,16 @@ index 834da33..6a893ec 100644
if (!create_parent_directory(target))
{
WINE_ERR("Failed to create parent directory for %s\n", debugstr_w(target));
@@ -688,6 +690,8 @@ static BOOL install_registry_value(struct assembly_entry *assembly, HKEY key, st
@@ -690,6 +692,8 @@ static BOOL install_registry_value(struct assembly_entry *assembly, HKEY key, st
static const WCHAR reg_dwordW[] = {'R','E','G','_','D','W','O','R','D',0};
static const WCHAR reg_binaryW[] = {'R','E','G','_','B','I','N','A','R','Y',0};
+ WINE_TRACE("Setting registry key %s = %s\n", debugstr_w(registrykv->name), debugstr_w(registrykv->value));
+
if (!strcmpW(registrykv->value_type, reg_szW))
if (!lstrcmpW(registrykv->value_type, reg_szW))
return install_registry_string(assembly, key, registrykv, REG_SZ, dryrun);
if (!strcmpW(registrykv->value_type, reg_expand_szW))
@@ -724,6 +728,8 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
if (!lstrcmpW(registrykv->value_type, reg_expand_szW))
@@ -726,6 +730,8 @@ static BOOL install_registry(struct assembly_entry *assembly, BOOL dryrun)
break;
}
@ -38,7 +38,7 @@ index 834da33..6a893ec 100644
if (!dryrun && RegCreateKeyExW(root, path, 0, NULL, REG_OPTION_NON_VOLATILE, sam, NULL, &subkey, NULL))
{
WINE_ERR("Failed to open registry key %s\n", debugstr_w(registryop->key));
@@ -810,6 +816,8 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
@@ -812,6 +818,8 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
if (!install_assembly(manifest_list, &dependency->identity, dryrun)) return FALSE;
}
@ -47,7 +47,7 @@ index 834da33..6a893ec 100644
if (!install_files(assembly, dryrun))
{
WINE_ERR("Failed to install all files for %s\n", debugstr_w(name));
@@ -822,6 +830,8 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
@@ -824,6 +832,8 @@ static BOOL install_assembly(struct list *manifest_list, struct assembly_identit
return FALSE;
}
@ -56,7 +56,7 @@ index 834da33..6a893ec 100644
assembly->status = ASSEMBLY_STATUS_INSTALLED;
return TRUE;
}
@@ -1065,6 +1075,7 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
@@ -1067,6 +1077,7 @@ static BOOL install_msu(WCHAR *filename, struct installer_state *state)
goto done;
}
@ -65,5 +65,5 @@ index 834da33..6a893ec 100644
done:
--
2.6.4
2.23.0.rc1

View File

@ -1,17 +1,18 @@
From b1dbdbafa126589fdaf8f92eb0706eab0ff85f56 Mon Sep 17 00:00:00 2001
From 63ac22a0ee910f8d56bcca6f4ef1b6618b07a888 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Mon, 21 Dec 2015 04:09:11 +0100
Subject: wusa: Print warning when encountering msdelta compressed files.
Subject: [PATCH 7/7] wusa: Print warning when encountering msdelta compressed
files.
---
programs/wusa/main.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index 6a893ec..299aff2 100644
index 847fd8b2ce..e9c04387fa 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -892,6 +892,7 @@ static void installer_cleanup(struct installer_state *state)
@@ -894,6 +894,7 @@ static void installer_cleanup(struct installer_state *state)
static BOOL load_assemblies_from_cab(const WCHAR *filename, struct installer_state *state)
{
@ -19,7 +20,7 @@ index 6a893ec..299aff2 100644
static const WCHAR manifestW[] = {'.','m','a','n','i','f','e','s','t',0};
static const WCHAR mumW[] = {'.','m','u','m',0};
static const WCHAR starW[] = {'*',0};
@@ -910,6 +911,14 @@ static BOOL load_assemblies_from_cab(const WCHAR *filename, struct installer_sta
@@ -912,6 +913,14 @@ static BOOL load_assemblies_from_cab(const WCHAR *filename, struct installer_sta
return FALSE;
}
@ -35,5 +36,5 @@ index 6a893ec..299aff2 100644
search = FindFirstFileW(path, &data);
heap_free(path);
--
2.6.4
2.23.0.rc1