Mohamad Al-Jaf : wusa: Support additional expressions.
Alexandre Julliard
julliard at winehq.org
Mon Feb 28 15:50:34 CST 2022
Module: wine
Branch: master
Commit: 0720b4be854dcfd16201a3dcb7882d40e4f9b20c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0720b4be854dcfd16201a3dcb7882d40e4f9b20c
Author: Mohamad Al-Jaf <mohamadaljaf at gmail.com>
Date: Mon Feb 28 13:55:34 2022 +0100
wusa: Support additional expressions.
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf at gmail.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/wusa/Makefile.in | 2 +-
programs/wusa/main.c | 52 +++++++++++++++++++++++++++++++++++------------
2 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/programs/wusa/Makefile.in b/programs/wusa/Makefile.in
index c512d3e63db..9f220fca277 100644
--- a/programs/wusa/Makefile.in
+++ b/programs/wusa/Makefile.in
@@ -1,5 +1,5 @@
MODULE = wusa.exe
-IMPORTS = cabinet shlwapi ole32 oleaut32 advapi32
+IMPORTS = cabinet shlwapi ole32 oleaut32 advapi32 shell32
EXTRADLLFLAGS = -mwindows -municode
diff --git a/programs/wusa/main.c b/programs/wusa/main.c
index de8387cd575..b3ab6ac523c 100644
--- a/programs/wusa/main.c
+++ b/programs/wusa/main.c
@@ -23,6 +23,7 @@
#include <fdi.h>
#include <shlwapi.h>
+#include "shlobj.h"
#include "wine/debug.h"
#include "wine/list.h"
#include "wusa.h"
@@ -479,27 +480,52 @@ static BOOL strbuf_append(struct strbuf *buf, const WCHAR *str, DWORD len)
static WCHAR *lookup_expression(struct assembly_entry *assembly, const WCHAR *key)
{
WCHAR path[MAX_PATH];
+ int csidl = 0;
- if (!wcsicmp(key, L"runtime.system32"))
+ if (!wcsicmp(key, L"runtime.system32") || !wcsicmp(key, L"runtime.drivers") || !wcsicmp(key, L"runtime.wbem"))
{
#ifdef __x86_64__
- if (!wcsicmp(assembly->identity.architecture, L"x86"))
- {
- GetSystemWow64DirectoryW(path, ARRAY_SIZE(path));
- return strdupW(path);
- }
+ if (!wcsicmp(assembly->identity.architecture, L"x86")) csidl = CSIDL_SYSTEMX86;
+#endif
+ if (!csidl) csidl = CSIDL_SYSTEM;
+ }
+ else if (!wcsicmp(key, L"runtime.windows") || !wcsicmp(key, L"runtime.inf")) csidl = CSIDL_WINDOWS;
+ else if (!wcsicmp(key, L"runtime.programfiles"))
+ {
+#ifdef __x86_64__
+ if (!wcsicmp(assembly->identity.architecture, L"x86")) csidl = CSIDL_PROGRAM_FILESX86;
+#endif
+ if (!csidl) csidl = CSIDL_PROGRAM_FILES;
+ }
+ else if (!wcsicmp(key, L"runtime.commonfiles"))
+ {
+#ifdef __x86_64__
+ if (!wcsicmp(assembly->identity.architecture, L"x86")) csidl = CSIDL_PROGRAM_FILES_COMMONX86;
#endif
- GetSystemDirectoryW(path, ARRAY_SIZE(path));
- return strdupW(path);
+ if (!csidl) csidl = CSIDL_PROGRAM_FILES_COMMON;
}
- if (!wcsicmp(key, L"runtime.windows"))
+#ifdef __x86_64__
+ else if (!wcsicmp(key, L"runtime.programfilesx86")) csidl = CSIDL_PROGRAM_FILESX86;
+ else if (!wcsicmp(key, L"runtime.commonfilesx86")) csidl = CSIDL_PROGRAM_FILES_COMMONX86;
+#endif
+ else if (!wcsicmp(key, L"runtime.programdata")) csidl = CSIDL_COMMON_APPDATA;
+ else if (!wcsicmp(key, L"runtime.fonts")) csidl = CSIDL_FONTS;
+
+ if (!csidl)
{
- GetWindowsDirectoryW(path, ARRAY_SIZE(path));
- return strdupW(path);
+ FIXME("Unknown expression %s\n", debugstr_w(key));
+ return NULL;
+ }
+ if (!SHGetSpecialFolderPathW(NULL, path, csidl, TRUE))
+ {
+ ERR("Failed to get folder path for %s\n", debugstr_w(key));
+ return NULL;
}
- FIXME("Unknown expression %s\n", debugstr_w(key));
- return NULL;
+ if (!wcsicmp(key, L"runtime.inf")) wcscat(path, L"\\inf");
+ else if (!wcsicmp(key, L"runtime.drivers")) wcscat(path, L"\\drivers");
+ else if (!wcsicmp(key, L"runtime.wbem")) wcscat(path, L"\\wbem");
+ return strdupW(path);
}
static WCHAR *expand_expression(struct assembly_entry *assembly, const WCHAR *expression)
More information about the wine-cvs
mailing list