Aric Stewart : uninstaller: Iterate keys in HKEY_CURRENT_USER also as some programs install their uninstall information there .
Alexandre Julliard
julliard at winehq.org
Mon Dec 3 09:17:59 CST 2007
Module: wine
Branch: master
Commit: 6312ccca556848baa62a83a1fe4500624503cc5f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6312ccca556848baa62a83a1fe4500624503cc5f
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Dec 3 12:07:31 2007 +0900
uninstaller: Iterate keys in HKEY_CURRENT_USER also as some programs install their uninstall information there.
---
programs/uninstaller/main.c | 34 +++++++++++++++++++++++-----------
1 files changed, 23 insertions(+), 11 deletions(-)
diff --git a/programs/uninstaller/main.c b/programs/uninstaller/main.c
index 09b173c..72d62f0 100644
--- a/programs/uninstaller/main.c
+++ b/programs/uninstaller/main.c
@@ -32,6 +32,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(uninstaller);
typedef struct {
+ HKEY root;
WCHAR *key;
WCHAR *descr;
WCHAR *command;
@@ -182,7 +183,7 @@ static int cmp_by_name(const void *a, const void *b)
/**
* Fetch information from the uninstall key.
*/
-static int FetchUninstallInformation(void)
+static int FetchFromRootKey(HKEY root)
{
HKEY hkeyUninst, hkeyApp;
int i;
@@ -190,14 +191,9 @@ static int FetchUninstallInformation(void)
WCHAR subKeyName[256];
WCHAR key_app[1024];
WCHAR *p;
-
- numentries = 0;
- oldsel = -1;
- if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, PathUninstallW, 0, KEY_READ, &hkeyUninst) != ERROR_SUCCESS)
- return 0;
- if (!entries)
- entries = HeapAlloc(GetProcessHeap(), 0, sizeof(uninst_entry));
+ if (RegOpenKeyExW(root, PathUninstallW, 0, KEY_READ, &hkeyUninst) != ERROR_SUCCESS)
+ return 0;
lstrcpyW(key_app, PathUninstallW);
lstrcatW(key_app, BackSlashW);
@@ -207,12 +203,13 @@ static int FetchUninstallInformation(void)
for (i=0; RegEnumKeyExW( hkeyUninst, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS; ++i)
{
lstrcpyW(p, subKeyName);
- RegOpenKeyExW(HKEY_LOCAL_MACHINE, key_app, 0, KEY_READ, &hkeyApp);
+ RegOpenKeyExW(root, key_app, 0, KEY_READ, &hkeyApp);
if ((RegQueryValueExW(hkeyApp, DisplayNameW, 0, 0, NULL, &displen) == ERROR_SUCCESS)
&& (RegQueryValueExW(hkeyApp, UninstallCommandlineW, 0, 0, NULL, &uninstlen) == ERROR_SUCCESS))
{
numentries++;
entries = HeapReAlloc(GetProcessHeap(), 0, entries, numentries*sizeof(uninst_entry));
+ entries[numentries-1].root = root;
entries[numentries-1].key = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(subKeyName)+1)*sizeof(WCHAR));
lstrcpyW(entries[numentries-1].key, subKeyName);
entries[numentries-1].descr = HeapAlloc(GetProcessHeap(), 0, displen);
@@ -228,11 +225,26 @@ static int FetchUninstallInformation(void)
RegCloseKey(hkeyApp);
sizeOfSubKeyName = 255;
}
- qsort(entries, numentries, sizeof(uninst_entry), cmp_by_name);
RegCloseKey(hkeyUninst);
return 1;
+
}
+static int FetchUninstallInformation(void)
+{
+ int rc;
+
+ numentries = 0;
+ oldsel = -1;
+ if (!entries)
+ entries = HeapAlloc(GetProcessHeap(), 0, sizeof(uninst_entry));
+
+ rc = FetchFromRootKey(HKEY_LOCAL_MACHINE);
+ rc |= FetchFromRootKey(HKEY_CURRENT_USER);
+
+ qsort(entries, numentries, sizeof(uninst_entry), cmp_by_name);
+ return rc;
+}
static void UninstallProgram(void)
{
@@ -264,7 +276,7 @@ static void UninstallProgram(void)
if(MessageBoxW(0, errormsg, sAppName, MB_YESNO | MB_ICONQUESTION)==IDYES)
{
/* delete the application's uninstall entry */
- RegOpenKeyExW(HKEY_LOCAL_MACHINE, PathUninstallW, 0, KEY_READ, &hkey);
+ RegOpenKeyExW(entries[i].root, PathUninstallW, 0, KEY_READ, &hkey);
RegDeleteKeyW(hkey, entries[i].key);
RegCloseKey(hkey);
}
More information about the wine-cvs
mailing list