Commit 6312ccca authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

uninstaller: Iterate keys in HKEY_CURRENT_USER also as some programs install…

uninstaller: Iterate keys in HKEY_CURRENT_USER also as some programs install their uninstall information there.
parent 33a05f08
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(uninstaller); WINE_DEFAULT_DEBUG_CHANNEL(uninstaller);
typedef struct { typedef struct {
HKEY root;
WCHAR *key; WCHAR *key;
WCHAR *descr; WCHAR *descr;
WCHAR *command; WCHAR *command;
...@@ -182,7 +183,7 @@ static int cmp_by_name(const void *a, const void *b) ...@@ -182,7 +183,7 @@ static int cmp_by_name(const void *a, const void *b)
/** /**
* Fetch information from the uninstall key. * Fetch information from the uninstall key.
*/ */
static int FetchUninstallInformation(void) static int FetchFromRootKey(HKEY root)
{ {
HKEY hkeyUninst, hkeyApp; HKEY hkeyUninst, hkeyApp;
int i; int i;
...@@ -190,14 +191,9 @@ static int FetchUninstallInformation(void) ...@@ -190,14 +191,9 @@ static int FetchUninstallInformation(void)
WCHAR subKeyName[256]; WCHAR subKeyName[256];
WCHAR key_app[1024]; WCHAR key_app[1024];
WCHAR *p; WCHAR *p;
numentries = 0;
oldsel = -1;
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, PathUninstallW, 0, KEY_READ, &hkeyUninst) != ERROR_SUCCESS)
return 0;
if (!entries) if (RegOpenKeyExW(root, PathUninstallW, 0, KEY_READ, &hkeyUninst) != ERROR_SUCCESS)
entries = HeapAlloc(GetProcessHeap(), 0, sizeof(uninst_entry)); return 0;
lstrcpyW(key_app, PathUninstallW); lstrcpyW(key_app, PathUninstallW);
lstrcatW(key_app, BackSlashW); lstrcatW(key_app, BackSlashW);
...@@ -207,12 +203,13 @@ static int FetchUninstallInformation(void) ...@@ -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) for (i=0; RegEnumKeyExW( hkeyUninst, i, subKeyName, &sizeOfSubKeyName, NULL, NULL, NULL, NULL ) != ERROR_NO_MORE_ITEMS; ++i)
{ {
lstrcpyW(p, subKeyName); 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) if ((RegQueryValueExW(hkeyApp, DisplayNameW, 0, 0, NULL, &displen) == ERROR_SUCCESS)
&& (RegQueryValueExW(hkeyApp, UninstallCommandlineW, 0, 0, NULL, &uninstlen) == ERROR_SUCCESS)) && (RegQueryValueExW(hkeyApp, UninstallCommandlineW, 0, 0, NULL, &uninstlen) == ERROR_SUCCESS))
{ {
numentries++; numentries++;
entries = HeapReAlloc(GetProcessHeap(), 0, entries, numentries*sizeof(uninst_entry)); 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)); entries[numentries-1].key = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(subKeyName)+1)*sizeof(WCHAR));
lstrcpyW(entries[numentries-1].key, subKeyName); lstrcpyW(entries[numentries-1].key, subKeyName);
entries[numentries-1].descr = HeapAlloc(GetProcessHeap(), 0, displen); entries[numentries-1].descr = HeapAlloc(GetProcessHeap(), 0, displen);
...@@ -228,11 +225,26 @@ static int FetchUninstallInformation(void) ...@@ -228,11 +225,26 @@ static int FetchUninstallInformation(void)
RegCloseKey(hkeyApp); RegCloseKey(hkeyApp);
sizeOfSubKeyName = 255; sizeOfSubKeyName = 255;
} }
qsort(entries, numentries, sizeof(uninst_entry), cmp_by_name);
RegCloseKey(hkeyUninst); RegCloseKey(hkeyUninst);
return 1; 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) static void UninstallProgram(void)
{ {
...@@ -264,7 +276,7 @@ static void UninstallProgram(void) ...@@ -264,7 +276,7 @@ static void UninstallProgram(void)
if(MessageBoxW(0, errormsg, sAppName, MB_YESNO | MB_ICONQUESTION)==IDYES) if(MessageBoxW(0, errormsg, sAppName, MB_YESNO | MB_ICONQUESTION)==IDYES)
{ {
/* delete the application's uninstall entry */ /* 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); RegDeleteKeyW(hkey, entries[i].key);
RegCloseKey(hkey); RegCloseKey(hkey);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment