diff --git a/reactos/base/applications/rapps/available.cpp b/reactos/base/applications/rapps/available.cpp index 7e483345e94..279029c5937 100644 --- a/reactos/base/applications/rapps/available.cpp +++ b/reactos/base/applications/rapps/available.cpp @@ -40,11 +40,14 @@ inline void _GetStringNullFailure(LPCWSTR a, T(&b)[N], T (&cFileName)[N2]) { } } -//App is "installed" if the RegName is in the registry -inline bool _AppInstallCheckKey(PAPPLICATION_INFO Info, REGSAM key) { - return *Info->szRegName - && (IsInstalledApplicationEx(Info->szRegName, TRUE, key) - || IsInstalledApplicationEx(Info->szRegName, FALSE, key)); +//App is "installed" if the RegName or Name is in the registry +inline bool _AppInstallCheckKey(PAPPLICATION_INFO Info, REGSAM key) +{ + return (*Info->szRegName + && (IsInstalledApplication(Info->szRegName, TRUE, key) + || IsInstalledApplication(Info->szRegName, FALSE, key))) + || (*Info->szName && (IsInstalledApplication(Info->szName, TRUE, key) + || IsInstalledApplication(Info->szName, FALSE, key))); } diff --git a/reactos/base/applications/rapps/installed.cpp b/reactos/base/applications/rapps/installed.cpp index f0c7e55eef3..9f07a922f30 100644 --- a/reactos/base/applications/rapps/installed.cpp +++ b/reactos/base/applications/rapps/installed.cpp @@ -28,50 +28,59 @@ GetApplicationString(HKEY hKey, LPCWSTR lpKeyName, LPWSTR lpString) return FALSE; } + + BOOL -IsInstalledApplicationEx(LPWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow) +IsInstalledApplication(LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow) { - DWORD dwSize = MAX_PATH, dwType; - WCHAR szName[MAX_PATH]; - WCHAR szDisplayName[MAX_PATH]; + HKEY hKey = NULL; + BOOL IsInstalled = FALSE; + + if ((RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE, + L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS, + &hKey) == ERROR_SUCCESS) \ + && FindRegistryKeyByName(hKey, keyWow, lpRegName, NULL)) + { + IsInstalled = TRUE; + } + RegCloseKey(hKey); + return IsInstalled; +} + +BOOL +InstalledVersion(LPWSTR szVersionResult, UINT iVersionResultSize, LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow) +{ + DWORD dwSize = MAX_PATH; + DWORD dwType = REG_SZ; + WCHAR szVersion[MAX_PATH]; HKEY hKey, hSubKey; - INT ItemIndex = 0; + BOOL HasVersion = FALSE; + iVersionResultSize = 0; if (RegOpenKeyExW(IsUserKey ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE, - L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS, - &hKey) != ERROR_SUCCESS) + L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, keyWow | KEY_ENUMERATE_SUB_KEYS, + &hKey) == ERROR_SUCCESS) { - return FALSE; - } - - while (RegEnumKeyExW(hKey, ItemIndex, szName, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) - { - if (RegOpenKeyExW(hKey, szName, 0, keyWow | KEY_READ, &hSubKey) == ERROR_SUCCESS) + if (FindRegistryKeyByName(hKey, keyWow, lpRegName, &hSubKey)) { - - dwType = REG_SZ; - dwSize = sizeof(szDisplayName); + dwSize = sizeof(szVersion); if (RegQueryValueExW(hSubKey, - L"DisplayName", - NULL, - &dwType, - (LPBYTE)szDisplayName, - &dwSize) == ERROR_SUCCESS) + L"DisplayVersion", + NULL, + &dwType, + (LPBYTE) szVersion, + &dwSize) == ERROR_SUCCESS) { - if (wcscmp(szDisplayName, lpRegName) == 0) - { - RegCloseKey(hSubKey); - RegCloseKey(hKey); - return TRUE; - } + szVersionResult = szVersion; + iVersionResultSize = dwSize; + HasVersion = TRUE; } } RegCloseKey(hSubKey); - dwSize = MAX_PATH; - ItemIndex++; } + RegCloseKey(hKey); - return FALSE; + return HasVersion; } diff --git a/reactos/base/applications/rapps/misc.cpp b/reactos/base/applications/rapps/misc.cpp index 26e548af642..499f74eac15 100644 --- a/reactos/base/applications/rapps/misc.cpp +++ b/reactos/base/applications/rapps/misc.cpp @@ -496,4 +496,28 @@ UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName) RtlUnicodeStringToInteger(&BufferW, 0, &Result); return Result; -} \ No newline at end of file +} + + +BOOL +ParseVersion(LPWSTR szVersion, INT* version) +{ + return TRUE; +} + + +//Finds subkey in key by name or path and returns it +BOOL +FindRegistryKeyByName(_In_ HKEY hKeyBase, _In_ REGSAM keyWow, _In_ LPCWSTR lpcKey, _Out_opt_ PHKEY hKeyResult) +{ + HKEY hSubKey; + if (RegOpenKeyExW(hKeyBase, lpcKey, 0, keyWow | KEY_READ, &hSubKey) == ERROR_SUCCESS) + { + hKeyResult = &hSubKey; + return TRUE; + } + hKeyResult = NULL; + RegCloseKey(hSubKey); + return FALSE; +} + diff --git a/reactos/base/applications/rapps/rapps.h b/reactos/base/applications/rapps/rapps.h index 15c152ea85b..1ed84b2628c 100644 --- a/reactos/base/applications/rapps/rapps.h +++ b/reactos/base/applications/rapps/rapps.h @@ -1,3 +1,5 @@ +#pragma once + #ifndef _RAPPS_H #define _RAPPS_H @@ -71,6 +73,7 @@ #define IS_INSTALLED_ENUM(a) (a >= ENUM_INSTALLED_MIN && a <= ENUM_INSTALLED_MAX) #define IS_AVAILABLE_ENUM(a) (a >= ENUM_AVAILABLE_MIN && a <= ENUM_AVAILABLE_MAX) + /* aboutdlg.c */ VOID ShowAboutDialog(VOID); @@ -142,9 +145,11 @@ BOOL EnumInstalledApplications(INT EnumType, BOOL IsUserKey, APPENUMPROC lpEnumP BOOL GetApplicationString(HKEY hKey, LPCWSTR lpKeyName, LPWSTR lpString); BOOL ShowInstalledAppInfo(INT Index); BOOL UninstallApplication(INT Index, BOOL bModify); -BOOL IsInstalledApplicationEx(LPWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow); +BOOL IsInstalledApplication(LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow); VOID RemoveAppFromRegistry(INT Index); +BOOL InstalledVersion(LPWSTR szVersionResult, UINT iVersionResultSize, LPCWSTR lpRegName, BOOL IsUserKey, REGSAM keyWow); + /* winmain.c */ extern HWND hMainWnd; extern HINSTANCE hInst; @@ -176,6 +181,8 @@ BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg); UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName); UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName); +BOOL FindRegistryKeyByName(_In_ HKEY hKeyBase, _In_ REGSAM keyWow, _In_ LPCWSTR lpcKey, _Out_opt_ PHKEY hKeyResult); + /* settingsdlg.c */ VOID CreateSettingsDlg(HWND hwnd);