Module: wine Branch: master Commit: 2f541542991a82fb2d169e6470af0b90f997bf0d URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f541542991a82fb2d169e6470...
Author: Owen Rudge owen@owenrudge.net Date: Tue Jul 14 17:24:29 2009 -0300
appwiz.cpl: Read modification path from registry.
---
dlls/appwiz.cpl/appwiz.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/dlls/appwiz.cpl/appwiz.c b/dlls/appwiz.cpl/appwiz.c index daf3e82..5ad4863 100644 --- a/dlls/appwiz.cpl/appwiz.c +++ b/dlls/appwiz.cpl/appwiz.c @@ -56,6 +56,7 @@ typedef struct APPINFO {
LPWSTR title; LPWSTR path; + LPWSTR path_modify;
LPWSTR icon; int iconIdx; @@ -85,6 +86,8 @@ static const WCHAR ContactW[] = {'C','o','n','t','a','c','t',0}; static const WCHAR HelpLinkW[] = {'H','e','l','p','L','i','n','k',0}; static const WCHAR HelpTelephoneW[] = {'H','e','l','p','T','e','l','e','p','h', 'o','n','e',0}; +static const WCHAR ModifyPathW[] = {'M','o','d','i','f','y','P','a','t','h',0}; +static const WCHAR NoModifyW[] = {'N','o','M','o','d','i','f','y',0}; static const WCHAR ReadmeW[] = {'R','e','a','d','m','e',0}; static const WCHAR URLUpdateInfoW[] = {'U','R','L','U','p','d','a','t','e','I', 'n','f','o',0}; @@ -129,6 +132,7 @@ static void FreeAppInfo(APPINFO *info)
HeapFree(GetProcessHeap(), 0, info->title); HeapFree(GetProcessHeap(), 0, info->path); + HeapFree(GetProcessHeap(), 0, info->path_modify); HeapFree(GetProcessHeap(), 0, info->icon); HeapFree(GetProcessHeap(), 0, info->publisher); HeapFree(GetProcessHeap(), 0, info->version); @@ -149,6 +153,7 @@ static BOOL ReadApplicationsFromRegistry(HKEY root) HKEY hkeyUninst, hkeyApp; int i, id = 0; DWORD sizeOfSubKeyName, displen, uninstlen; + DWORD dwNoModify, dwType; WCHAR subKeyName[256]; WCHAR key_app[MAX_STRING_LEN]; WCHAR *p; @@ -273,6 +278,34 @@ static BOOL ReadApplicationsFromRegistry(HKEY root) &displen); }
+ /* Check if NoModify is set */ + dwType = REG_DWORD; + dwNoModify = 0; + displen = sizeof(DWORD); + + if (RegQueryValueExW(hkeyApp, NoModifyW, NULL, &dwType, (LPBYTE)&dwNoModify, &displen) + != ERROR_SUCCESS) + { + dwNoModify = 0; + } + + /* Some installers incorrectly create a REG_SZ instead of a REG_DWORD - check for + ASCII 49, which equals 1 */ + if (dwType == REG_SZ) + dwNoModify = (dwNoModify == 49) ? 1 : 0; + + /* Fetch the modify path */ + if ((dwNoModify == 0) && (RegQueryValueExW(hkeyApp, ModifyPathW, 0, 0, NULL, &displen) + == ERROR_SUCCESS)) + { + iter->path_modify = HeapAlloc(GetProcessHeap(), 0, displen); + + if (!iter->path_modify) + goto err; + + RegQueryValueExW(hkeyApp, ModifyPathW, 0, 0, (LPBYTE)iter->path_modify, &displen); + } + /* registry key */ iter->regroot = root; lstrcpyW(iter->regkey, subKeyName);