mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-01-28 22:04:43 -08:00
Updated wusa-MSU_Package_Installer patchset
This commit is contained in:
parent
523d4ac996
commit
924665da6f
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user