Signed-off-by: Mohamad Al-Jaf mohamadaljaf@gmail.com --- This is a lot more readable and easily allows for additional expressions to be supported if needed in the future. It also conforms to the general code style in wusa. --- programs/wusa/main.c | 60 ++++++++++++++++++++++++-------------------- programs/wusa/wusa.h | 8 ++++++ 2 files changed, 41 insertions(+), 27 deletions(-)
diff --git a/programs/wusa/main.c b/programs/wusa/main.c index 74dfeb68d5f..f43e86c0019 100644 --- a/programs/wusa/main.c +++ b/programs/wusa/main.c @@ -52,6 +52,31 @@ struct installer_state struct list updates; };
+static const struct expression expression_table[] = +{ + {L"runtime.system32", L"amd64", CSIDL_SYSTEM, NULL}, + {L"runtime.system32", L"x86", CSIDL_SYSTEMX86, NULL}, + {L"runtime.system32", L"wow64", CSIDL_SYSTEMX86, NULL}, + {L"runtime.windows", NULL, CSIDL_WINDOWS, NULL}, + {L"runtime.programfiles", L"amd64", CSIDL_PROGRAM_FILES, NULL}, + {L"runtime.programfiles", L"x86", CSIDL_PROGRAM_FILESX86, NULL}, + {L"runtime.programfiles", L"wow64", CSIDL_PROGRAM_FILESX86, NULL}, + {L"runtime.programfilesX86", L"x86", CSIDL_PROGRAM_FILESX86, NULL}, + {L"runtime.commonfiles", L"amd64", CSIDL_PROGRAM_FILES_COMMON, NULL}, + {L"runtime.commonfiles", L"x86", CSIDL_PROGRAM_FILES_COMMONX86, NULL}, + {L"runtime.commonfiles", L"wow64", CSIDL_PROGRAM_FILES_COMMONX86, NULL}, + {L"runtime.commonfilesX86", L"x86", CSIDL_PROGRAM_FILES_COMMONX86, NULL}, + {L"runtime.programdata", NULL, CSIDL_COMMON_APPDATA, NULL}, + {L"runtime.drivers", L"amd64", CSIDL_SYSTEM, L"\drivers"}, + {L"runtime.drivers", L"x86", CSIDL_SYSTEMX86, L"\drivers"}, + {L"runtime.drivers", L"wow64", CSIDL_SYSTEMX86, L"\drivers"}, + {L"runtime.wbem", L"amd64", CSIDL_SYSTEM, L"\wbem"}, + {L"runtime.wbem", L"x86", CSIDL_SYSTEMX86, L"\wbem"}, + {L"runtime.wbem", L"wow64", CSIDL_SYSTEMX86, L"\wbem"}, + {L"runtime.inf", NULL, CSIDL_WINDOWS, L"\inf"}, + {L"runtime.fonts", NULL, CSIDL_FONTS, NULL}, +}; + static void * CDECL cabinet_alloc(ULONG cb) { return malloc(cb); @@ -480,36 +505,19 @@ 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]; + unsigned int i; int csidl = 0;
- 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")) 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")) + for (i = 0; i < ARRAY_SIZE(expression_table); ++i) { + if (wcsicmp(key, expression_table[i].key)) continue; #ifdef __x86_64__ - if (!wcsicmp(assembly->identity.architecture, L"x86")) csidl = CSIDL_PROGRAM_FILESX86; + if (expression_table[i].architecture) + if (wcsicmp(assembly->identity.architecture, expression_table[i].architecture)) continue; #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 - if (!csidl) csidl = CSIDL_PROGRAM_FILES_COMMON; + csidl = expression_table[i].csidl; + break; } -#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) { @@ -522,9 +530,7 @@ static WCHAR *lookup_expression(struct assembly_entry *assembly, const WCHAR *ke 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"); + if (expression_table[i].append) wcscat(path, expression_table[i].append); return strdupW(path); }
diff --git a/programs/wusa/wusa.h b/programs/wusa/wusa.h index da679a27f07..fa8e37979e2 100644 --- a/programs/wusa/wusa.h +++ b/programs/wusa/wusa.h @@ -33,6 +33,14 @@ struct assembly_identity WCHAR *pubkey_token; };
+struct expression +{ + const WCHAR *key; + const WCHAR *architecture; + int csidl; + const WCHAR *append; +}; + struct dependency_entry { struct list entry;