diff options
| author | Bob Arnson <bob@firegiant.com> | 2022-01-15 21:40:54 -0500 |
|---|---|---|
| committer | Bob Arnson <github@bobs.org> | 2022-01-16 10:28:44 -0500 |
| commit | 47bca2dc51525fcad86f325278b14953ac5b137e (patch) | |
| tree | 80a153833efbe0794be7153c64e712a5799649c4 /src/burn/engine/relatedbundle.cpp | |
| parent | 6d1c4cc83214b65032251c67239b02da59a3e635 (diff) | |
| download | wix-47bca2dc51525fcad86f325278b14953ac5b137e.tar.gz wix-47bca2dc51525fcad86f325278b14953ac5b137e.tar.bz2 wix-47bca2dc51525fcad86f325278b14953ac5b137e.zip | |
Fix 32/64-bit bitness handling in Burn and BUtil.
- Take advantage of RegOpenEx.
- Always look for related bundles in both 32 and 64 hives.
- BundleEnumRelatedBundle requires caller to specify bitness.
Diffstat (limited to 'src/burn/engine/relatedbundle.cpp')
| -rw-r--r-- | src/burn/engine/relatedbundle.cpp | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/src/burn/engine/relatedbundle.cpp b/src/burn/engine/relatedbundle.cpp index 99ed8553..619fa8dd 100644 --- a/src/burn/engine/relatedbundle.cpp +++ b/src/burn/engine/relatedbundle.cpp | |||
| @@ -11,13 +11,13 @@ static __callback int __cdecl CompareRelatedBundles( | |||
| 11 | ); | 11 | ); |
| 12 | static HRESULT InitializeForScopeAndBitness( | 12 | static HRESULT InitializeForScopeAndBitness( |
| 13 | __in BOOL fPerMachine, | 13 | __in BOOL fPerMachine, |
| 14 | __in BOOL fWow6432, | 14 | __in REG_KEY_BITNESS regBitness, |
| 15 | __in BURN_REGISTRATION* pRegistration, | 15 | __in BURN_REGISTRATION* pRegistration, |
| 16 | __in BURN_RELATED_BUNDLES* pRelatedBundles | 16 | __in BURN_RELATED_BUNDLES* pRelatedBundles |
| 17 | ); | 17 | ); |
| 18 | static HRESULT LoadIfRelatedBundle( | 18 | static HRESULT LoadIfRelatedBundle( |
| 19 | __in BOOL fPerMachine, | 19 | __in BOOL fPerMachine, |
| 20 | __in BOOL fWow6432, | 20 | __in REG_KEY_BITNESS regBitness, |
| 21 | __in HKEY hkUninstallKey, | 21 | __in HKEY hkUninstallKey, |
| 22 | __in_z LPCWSTR sczRelatedBundleId, | 22 | __in_z LPCWSTR sczRelatedBundleId, |
| 23 | __in BURN_REGISTRATION* pRegistration, | 23 | __in BURN_REGISTRATION* pRegistration, |
| @@ -47,13 +47,11 @@ extern "C" HRESULT RelatedBundlesInitializeForScope( | |||
| 47 | { | 47 | { |
| 48 | HRESULT hr = S_OK; | 48 | HRESULT hr = S_OK; |
| 49 | 49 | ||
| 50 | hr = InitializeForScopeAndBitness(fPerMachine, /*fWow6432*/FALSE, pRegistration, pRelatedBundles); | 50 | hr = InitializeForScopeAndBitness(fPerMachine, REG_KEY_32BIT, pRegistration, pRelatedBundles); |
| 51 | ExitOnFailure(hr, "Failed to open platform-native uninstall registry key."); | ||
| 52 | |||
| 53 | #if defined(_WIN64) | ||
| 54 | hr = InitializeForScopeAndBitness(fPerMachine, /*fWow6432*/TRUE, pRegistration, pRelatedBundles); | ||
| 55 | ExitOnFailure(hr, "Failed to open 32-bit uninstall registry key."); | 51 | ExitOnFailure(hr, "Failed to open 32-bit uninstall registry key."); |
| 56 | #endif | 52 | |
| 53 | hr = InitializeForScopeAndBitness(fPerMachine, REG_KEY_64BIT, pRegistration, pRelatedBundles); | ||
| 54 | ExitOnFailure(hr, "Failed to open 64-bit uninstall registry key."); | ||
| 57 | 55 | ||
| 58 | LExit: | 56 | LExit: |
| 59 | return hr; | 57 | return hr; |
| @@ -170,7 +168,7 @@ static __callback int __cdecl CompareRelatedBundles( | |||
| 170 | 168 | ||
| 171 | static HRESULT InitializeForScopeAndBitness( | 169 | static HRESULT InitializeForScopeAndBitness( |
| 172 | __in BOOL fPerMachine, | 170 | __in BOOL fPerMachine, |
| 173 | __in BOOL fWow6432, | 171 | __in REG_KEY_BITNESS regBitness, |
| 174 | __in BURN_REGISTRATION * pRegistration, | 172 | __in BURN_REGISTRATION * pRegistration, |
| 175 | __in BURN_RELATED_BUNDLES * pRelatedBundles | 173 | __in BURN_RELATED_BUNDLES * pRelatedBundles |
| 176 | ) | 174 | ) |
| @@ -180,7 +178,7 @@ static HRESULT InitializeForScopeAndBitness( | |||
| 180 | HKEY hkUninstallKey = NULL; | 178 | HKEY hkUninstallKey = NULL; |
| 181 | LPWSTR sczRelatedBundleId = NULL; | 179 | LPWSTR sczRelatedBundleId = NULL; |
| 182 | 180 | ||
| 183 | hr = RegOpen(hkRoot, BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY, KEY_READ | (fWow6432 ? KEY_WOW64_32KEY : 0), &hkUninstallKey); | 181 | hr = RegOpenEx(hkRoot, BURN_REGISTRATION_REGISTRY_UNINSTALL_KEY, KEY_READ, regBitness, &hkUninstallKey); |
| 184 | if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) | 182 | if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) |
| 185 | { | 183 | { |
| 186 | ExitFunction1(hr = S_OK); | 184 | ExitFunction1(hr = S_OK); |
| @@ -202,7 +200,7 @@ static HRESULT InitializeForScopeAndBitness( | |||
| 202 | { | 200 | { |
| 203 | // Ignore failures here since we'll often find products that aren't actually | 201 | // Ignore failures here since we'll often find products that aren't actually |
| 204 | // related bundles (or even bundles at all). | 202 | // related bundles (or even bundles at all). |
| 205 | HRESULT hrRelatedBundle = LoadIfRelatedBundle(fPerMachine, fWow6432, hkUninstallKey, sczRelatedBundleId, pRegistration, pRelatedBundles); | 203 | HRESULT hrRelatedBundle = LoadIfRelatedBundle(fPerMachine, regBitness, hkUninstallKey, sczRelatedBundleId, pRegistration, pRelatedBundles); |
| 206 | UNREFERENCED_PARAMETER(hrRelatedBundle); | 204 | UNREFERENCED_PARAMETER(hrRelatedBundle); |
| 207 | } | 205 | } |
| 208 | } | 206 | } |
| @@ -216,7 +214,7 @@ LExit: | |||
| 216 | 214 | ||
| 217 | static HRESULT LoadIfRelatedBundle( | 215 | static HRESULT LoadIfRelatedBundle( |
| 218 | __in BOOL fPerMachine, | 216 | __in BOOL fPerMachine, |
| 219 | __in BOOL fWow6432, | 217 | __in REG_KEY_BITNESS regBitness, |
| 220 | __in HKEY hkUninstallKey, | 218 | __in HKEY hkUninstallKey, |
| 221 | __in_z LPCWSTR sczRelatedBundleId, | 219 | __in_z LPCWSTR sczRelatedBundleId, |
| 222 | __in BURN_REGISTRATION* pRegistration, | 220 | __in BURN_REGISTRATION* pRegistration, |
| @@ -227,7 +225,7 @@ static HRESULT LoadIfRelatedBundle( | |||
| 227 | HKEY hkBundleId = NULL; | 225 | HKEY hkBundleId = NULL; |
| 228 | BOOTSTRAPPER_RELATION_TYPE relationType = BOOTSTRAPPER_RELATION_NONE; | 226 | BOOTSTRAPPER_RELATION_TYPE relationType = BOOTSTRAPPER_RELATION_NONE; |
| 229 | 227 | ||
| 230 | hr = RegOpen(hkUninstallKey, sczRelatedBundleId, KEY_READ | (fWow6432 ? KEY_WOW64_32KEY : 0), &hkBundleId); | 228 | hr = RegOpenEx(hkUninstallKey, sczRelatedBundleId, KEY_READ, regBitness, &hkBundleId); |
| 231 | ExitOnFailure(hr, "Failed to open uninstall key for potential related bundle: %ls", sczRelatedBundleId); | 229 | ExitOnFailure(hr, "Failed to open uninstall key for potential related bundle: %ls", sczRelatedBundleId); |
| 232 | 230 | ||
| 233 | hr = DetermineRelationType(hkBundleId, pRegistration, &relationType); | 231 | hr = DetermineRelationType(hkBundleId, pRegistration, &relationType); |
