mirror of
https://github.com/reactos/wine.git
synced 2024-11-29 14:40:56 +00:00
msi: Reimplement MsiEnumProducts on top of MsiEnumProductsEx.
This commit is contained in:
parent
a4c20dc437
commit
0f40d2624d
@ -1139,101 +1139,13 @@ UINT WINAPI MsiEnumProductsA(DWORD index, LPSTR lpguid)
|
|||||||
|
|
||||||
UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
|
UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
|
||||||
{
|
{
|
||||||
static const WCHAR pathW[] = {
|
|
||||||
'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
|
|
||||||
'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0};
|
|
||||||
UINT r;
|
|
||||||
WCHAR szKeyName[SQUISH_GUID_SIZE];
|
|
||||||
HKEY key;
|
|
||||||
REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS;
|
|
||||||
DWORD machine_count, managed_count, unmanaged_count;
|
|
||||||
WCHAR keypath[MAX_PATH];
|
|
||||||
LPWSTR usersid = NULL;
|
|
||||||
|
|
||||||
static DWORD last_index;
|
|
||||||
|
|
||||||
TRACE("%d %p\n", index, lpguid);
|
TRACE("%d %p\n", index, lpguid);
|
||||||
|
|
||||||
if (NULL == lpguid)
|
if (NULL == lpguid)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (index && index - last_index != 1)
|
return MsiEnumProductsExW( NULL, szAllSid, MSIINSTALLCONTEXT_ALL, index, lpguid,
|
||||||
return ERROR_INVALID_PARAMETER;
|
NULL, NULL, NULL );
|
||||||
|
|
||||||
key = 0;
|
|
||||||
r = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProducts, 0, NULL, 0, access, NULL, &key, NULL);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &machine_count, NULL, NULL,
|
|
||||||
NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
if (machine_count && index <= machine_count)
|
|
||||||
{
|
|
||||||
r = RegEnumKeyW(key, index, szKeyName, SQUISH_GUID_SIZE);
|
|
||||||
if( r == ERROR_SUCCESS )
|
|
||||||
{
|
|
||||||
unsquash_guid(szKeyName, lpguid);
|
|
||||||
last_index = index;
|
|
||||||
RegCloseKey(key);
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RegCloseKey(key);
|
|
||||||
|
|
||||||
key = 0;
|
|
||||||
if (!(usersid = get_user_sid()))
|
|
||||||
{
|
|
||||||
ERR("Failed to retrieve user SID\n");
|
|
||||||
last_index = 0;
|
|
||||||
return ERROR_FUNCTION_FAILED;
|
|
||||||
}
|
|
||||||
sprintfW(keypath, szInstaller_LocalManaged_fmt, usersid);
|
|
||||||
LocalFree(usersid);
|
|
||||||
|
|
||||||
r = RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &key, NULL);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &managed_count, NULL, NULL,
|
|
||||||
NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
if (managed_count && index <= machine_count + managed_count)
|
|
||||||
{
|
|
||||||
r = RegEnumKeyW(key, index - machine_count, szKeyName, SQUISH_GUID_SIZE);
|
|
||||||
if( r == ERROR_SUCCESS )
|
|
||||||
{
|
|
||||||
unsquash_guid(szKeyName, lpguid);
|
|
||||||
last_index = index;
|
|
||||||
RegCloseKey(key);
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RegCloseKey(key);
|
|
||||||
|
|
||||||
key = 0;
|
|
||||||
r = RegCreateKeyW(HKEY_CURRENT_USER, pathW, &key);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &unmanaged_count, NULL, NULL,
|
|
||||||
NULL, NULL, NULL, NULL, NULL);
|
|
||||||
if( r != ERROR_SUCCESS ) goto failed;
|
|
||||||
|
|
||||||
if (unmanaged_count && index <= machine_count + managed_count + unmanaged_count)
|
|
||||||
{
|
|
||||||
r = RegEnumKeyW(key, index - machine_count - managed_count, szKeyName, SQUISH_GUID_SIZE);
|
|
||||||
if( r == ERROR_SUCCESS )
|
|
||||||
{
|
|
||||||
unsquash_guid(szKeyName, lpguid);
|
|
||||||
last_index = index;
|
|
||||||
RegCloseKey(key);
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
failed:
|
|
||||||
RegCloseKey(key);
|
|
||||||
last_index = 0;
|
|
||||||
return ERROR_NO_MORE_ITEMS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT WINAPI MsiEnumFeaturesA(LPCSTR szProduct, DWORD index,
|
UINT WINAPI MsiEnumFeaturesA(LPCSTR szProduct, DWORD index,
|
||||||
|
Loading…
Reference in New Issue
Block a user