appwiz.cpl: List 32-bit applications on 64-bit platforms.

Hans Leidekker hans at codeweavers.com
Tue Feb 22 06:23:19 CST 2011


---
 dlls/appwiz.cpl/appwiz.c |   50 +++++++++++++++++++++++-----------------------
 1 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/dlls/appwiz.cpl/appwiz.c b/dlls/appwiz.cpl/appwiz.c
index 83da7d9..957b8bf 100644
--- a/dlls/appwiz.cpl/appwiz.c
+++ b/dlls/appwiz.cpl/appwiz.c
@@ -145,37 +145,26 @@ static void FreeAppInfo(APPINFO *info)
  * Name       : ReadApplicationsFromRegistry
  * Description: Creates a linked list of uninstallable applications from the
  *              registry.
- * Parameters : root    - Which registry root to read from (HKCU/HKLM)
+ * Parameters : root    - Which registry root to read from
  * Returns    : TRUE if successful, FALSE otherwise
  */
 static BOOL ReadApplicationsFromRegistry(HKEY root)
 {
-    HKEY hkeyUninst, hkeyApp;
+    HKEY hkeyApp;
     int i, id = 0;
     DWORD sizeOfSubKeyName, displen, uninstlen;
     DWORD dwNoModify, dwType, value;
     WCHAR subKeyName[256];
-    WCHAR key_app[MAX_STRING_LEN];
-    WCHAR *p, *command;
+    WCHAR *command;
     APPINFO *info = NULL;
     LPWSTR iconPtr;
-    BOOL ret = FALSE;
-
-    if (RegOpenKeyExW(root, PathUninstallW, 0, KEY_READ, &hkeyUninst) !=
-      ERROR_SUCCESS)
-        return FALSE;
-
-    lstrcpyW(key_app, PathUninstallW);
-    lstrcatW(key_app, BackSlashW);
-    p = key_app+lstrlenW(PathUninstallW)+1;
 
     sizeOfSubKeyName = sizeof(subKeyName) / sizeof(subKeyName[0]);
 
-    for (i = 0; RegEnumKeyExW(hkeyUninst, i, subKeyName, &sizeOfSubKeyName, NULL,
+    for (i = 0; RegEnumKeyExW(root, i, subKeyName, &sizeOfSubKeyName, NULL,
         NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS; ++i)
     {
-        lstrcpyW(p, subKeyName);
-        RegOpenKeyExW(root, key_app, 0, KEY_READ, &hkeyApp);
+        RegOpenKeyExW(root, subKeyName, 0, KEY_READ, &hkeyApp);
 
         displen = 0;
         uninstlen = 0;
@@ -313,16 +302,11 @@ static BOOL ReadApplicationsFromRegistry(HKEY root)
         sizeOfSubKeyName = sizeof(subKeyName) / sizeof(subKeyName[0]);
     }
 
-    ret = TRUE;
-    goto end;
-
+    return TRUE;
 err:
     RegCloseKey(hkeyApp);
     if (info) FreeAppInfo(info);
-
-end:
-    RegCloseKey(hkeyUninst);
-    return ret;
+    return FALSE;
 }
 

@@ -773,7 +757,9 @@ static HIMAGELIST AddListViewImageList(HWND hWnd)
  */
 static HIMAGELIST ResetApplicationList(BOOL bFirstRun, HWND hWnd, HIMAGELIST hImageList)
 {
+    static const BOOL is_64bit = sizeof(void *) > sizeof(int);
     HWND hWndListView;
+    HKEY hkey;
 
     hWndListView = GetDlgItem(hWnd, IDL_PROGRAMS);
 
@@ -796,8 +782,22 @@ static HIMAGELIST ResetApplicationList(BOOL bFirstRun, HWND hWnd, HIMAGELIST hIm
     /* now create the image list and add the applications to the listview */
     hImageList = AddListViewImageList(hWndListView);
 
-    ReadApplicationsFromRegistry(HKEY_LOCAL_MACHINE);
-    ReadApplicationsFromRegistry(HKEY_CURRENT_USER);
+    if (!RegOpenKeyExW(HKEY_LOCAL_MACHINE, PathUninstallW, 0, KEY_READ, &hkey))
+    {
+        ReadApplicationsFromRegistry(hkey);
+        RegCloseKey(hkey);
+    }
+    if (is_64bit &&
+        !RegOpenKeyExW(HKEY_LOCAL_MACHINE, PathUninstallW, 0, KEY_READ|KEY_WOW64_32KEY, &hkey))
+    {
+        ReadApplicationsFromRegistry(hkey);
+        RegCloseKey(hkey);
+    }
+    if (!RegOpenKeyExW(HKEY_CURRENT_USER, PathUninstallW, 0, KEY_READ, &hkey))
+    {
+        ReadApplicationsFromRegistry(hkey);
+        RegCloseKey(hkey);
+    }
 
     AddApplicationsToList(hWndListView, hImageList);
     UpdateButtons(hWnd);
-- 
1.7.1







More information about the wine-patches mailing list