diff options
| author | Bob Arnson <bob@firegiant.com> | 2022-01-09 23:23:51 -0500 |
|---|---|---|
| committer | Bob Arnson <github@bobs.org> | 2022-01-10 00:47:18 -0500 |
| commit | a96db4a508f1d1774500ab89f2c57e581fb5a13a (patch) | |
| tree | 40de5d2904e564e28c04c5816fd7528f8f090e2c /src/libs/dutil/WixToolset.DUtil/regutil.cpp | |
| parent | bae756f4354fed4de6097c931590ccafc907fdb2 (diff) | |
| download | wix-a96db4a508f1d1774500ab89f2c57e581fb5a13a.tar.gz wix-a96db4a508f1d1774500ab89f2c57e581fb5a13a.tar.bz2 wix-a96db4a508f1d1774500ab89f2c57e581fb5a13a.zip | |
Add registry bitness to RegUtil and BUtil.
Fixes https://github.com/wixtoolset/issues/issues/6669.
Fixes https://github.com/wixtoolset/issues/issues/6670.
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/regutil.cpp')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/regutil.cpp | 69 |
1 files changed, 46 insertions, 23 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/regutil.cpp b/src/libs/dutil/WixToolset.DUtil/regutil.cpp index 57093f97..f4719466 100644 --- a/src/libs/dutil/WixToolset.DUtil/regutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/regutil.cpp | |||
| @@ -32,6 +32,9 @@ static PFN_REGDELETEVALUEW vpfnRegDeleteValueW = ::RegDeleteValueW; | |||
| 32 | static HMODULE vhAdvApi32Dll = NULL; | 32 | static HMODULE vhAdvApi32Dll = NULL; |
| 33 | static BOOL vfRegInitialized = FALSE; | 33 | static BOOL vfRegInitialized = FALSE; |
| 34 | 34 | ||
| 35 | static REGSAM TranslateKeyBitness( | ||
| 36 | __in REG_KEY_BITNESS kbKeyBitness | ||
| 37 | ); | ||
| 35 | static HRESULT WriteStringToRegistry( | 38 | static HRESULT WriteStringToRegistry( |
| 36 | __in HKEY hk, | 39 | __in HKEY hk, |
| 37 | __in_z_opt LPCWSTR wzName, | 40 | __in_z_opt LPCWSTR wzName, |
| @@ -121,6 +124,7 @@ DAPI_(HRESULT) RegCreateEx( | |||
| 121 | __in HKEY hkRoot, | 124 | __in HKEY hkRoot, |
| 122 | __in_z LPCWSTR wzSubKey, | 125 | __in_z LPCWSTR wzSubKey, |
| 123 | __in DWORD dwAccess, | 126 | __in DWORD dwAccess, |
| 127 | __in REG_KEY_BITNESS kbKeyBitness, | ||
| 124 | __in BOOL fVolatile, | 128 | __in BOOL fVolatile, |
| 125 | __in_opt SECURITY_ATTRIBUTES* pSecurityAttributes, | 129 | __in_opt SECURITY_ATTRIBUTES* pSecurityAttributes, |
| 126 | __out HKEY* phk, | 130 | __out HKEY* phk, |
| @@ -131,7 +135,8 @@ DAPI_(HRESULT) RegCreateEx( | |||
| 131 | DWORD er = ERROR_SUCCESS; | 135 | DWORD er = ERROR_SUCCESS; |
| 132 | DWORD dwDisposition; | 136 | DWORD dwDisposition; |
| 133 | 137 | ||
| 134 | er = vpfnRegCreateKeyExW(hkRoot, wzSubKey, 0, NULL, fVolatile ? REG_OPTION_VOLATILE : REG_OPTION_NON_VOLATILE, dwAccess, pSecurityAttributes, phk, &dwDisposition); | 138 | REGSAM samDesired = TranslateKeyBitness(kbKeyBitness); |
| 139 | er = vpfnRegCreateKeyExW(hkRoot, wzSubKey, 0, NULL, fVolatile ? REG_OPTION_VOLATILE : REG_OPTION_NON_VOLATILE, dwAccess | samDesired, pSecurityAttributes, phk, &dwDisposition); | ||
| 135 | RegExitOnWin32Error(er, hr, "Failed to create registry key."); | 140 | RegExitOnWin32Error(er, hr, "Failed to create registry key."); |
| 136 | 141 | ||
| 137 | if (pfCreated) | 142 | if (pfCreated) |
| @@ -149,12 +154,25 @@ DAPI_(HRESULT) RegOpen( | |||
| 149 | __in_z LPCWSTR wzSubKey, | 154 | __in_z LPCWSTR wzSubKey, |
| 150 | __in DWORD dwAccess, | 155 | __in DWORD dwAccess, |
| 151 | __out HKEY* phk | 156 | __out HKEY* phk |
| 152 | ) | 157 | ) |
| 158 | { | ||
| 159 | return RegOpenEx(hkRoot, wzSubKey, dwAccess, REG_KEY_DEFAULT, phk); | ||
| 160 | } | ||
| 161 | |||
| 162 | |||
| 163 | DAPI_(HRESULT) RegOpenEx( | ||
| 164 | __in HKEY hkRoot, | ||
| 165 | __in_z LPCWSTR wzSubKey, | ||
| 166 | __in DWORD dwAccess, | ||
| 167 | __in REG_KEY_BITNESS kbKeyBitness, | ||
| 168 | __out HKEY* phk | ||
| 169 | ) | ||
| 153 | { | 170 | { |
| 154 | HRESULT hr = S_OK; | 171 | HRESULT hr = S_OK; |
| 155 | DWORD er = ERROR_SUCCESS; | 172 | DWORD er = ERROR_SUCCESS; |
| 156 | 173 | ||
| 157 | er = vpfnRegOpenKeyExW(hkRoot, wzSubKey, 0, dwAccess, phk); | 174 | REGSAM samDesired = TranslateKeyBitness(kbKeyBitness); |
| 175 | er = vpfnRegOpenKeyExW(hkRoot, wzSubKey, 0, dwAccess | samDesired, phk); | ||
| 158 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 176 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) |
| 159 | { | 177 | { |
| 160 | ExitFunction1(hr = E_FILENOTFOUND); | 178 | ExitFunction1(hr = E_FILENOTFOUND); |
| @@ -178,7 +196,6 @@ DAPI_(HRESULT) RegDelete( | |||
| 178 | LPWSTR pszEnumeratedSubKey = NULL; | 196 | LPWSTR pszEnumeratedSubKey = NULL; |
| 179 | LPWSTR pszRecursiveSubKey = NULL; | 197 | LPWSTR pszRecursiveSubKey = NULL; |
| 180 | HKEY hkKey = NULL; | 198 | HKEY hkKey = NULL; |
| 181 | REGSAM samDesired = 0; | ||
| 182 | 199 | ||
| 183 | if (!vfRegInitialized && REG_KEY_DEFAULT != kbKeyBitness) | 200 | if (!vfRegInitialized && REG_KEY_DEFAULT != kbKeyBitness) |
| 184 | { | 201 | { |
| @@ -186,22 +203,9 @@ DAPI_(HRESULT) RegDelete( | |||
| 186 | RegExitOnFailure(hr, "RegInitialize must be called first in order to RegDelete() a key with non-default bit attributes!"); | 203 | RegExitOnFailure(hr, "RegInitialize must be called first in order to RegDelete() a key with non-default bit attributes!"); |
| 187 | } | 204 | } |
| 188 | 205 | ||
| 189 | switch (kbKeyBitness) | ||
| 190 | { | ||
| 191 | case REG_KEY_32BIT: | ||
| 192 | samDesired = KEY_WOW64_32KEY; | ||
| 193 | break; | ||
| 194 | case REG_KEY_64BIT: | ||
| 195 | samDesired = KEY_WOW64_64KEY; | ||
| 196 | break; | ||
| 197 | case REG_KEY_DEFAULT: | ||
| 198 | // Nothing to do | ||
| 199 | break; | ||
| 200 | } | ||
| 201 | |||
| 202 | if (fDeleteTree) | 206 | if (fDeleteTree) |
| 203 | { | 207 | { |
| 204 | hr = RegOpen(hkRoot, wzSubKey, KEY_READ | samDesired, &hkKey); | 208 | hr = RegOpenEx(hkRoot, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 205 | if (E_FILENOTFOUND == hr) | 209 | if (E_FILENOTFOUND == hr) |
| 206 | { | 210 | { |
| 207 | ExitFunction1(hr = S_OK); | 211 | ExitFunction1(hr = S_OK); |
| @@ -225,6 +229,7 @@ DAPI_(HRESULT) RegDelete( | |||
| 225 | 229 | ||
| 226 | if (NULL != vpfnRegDeleteKeyExW) | 230 | if (NULL != vpfnRegDeleteKeyExW) |
| 227 | { | 231 | { |
| 232 | REGSAM samDesired = TranslateKeyBitness(kbKeyBitness); | ||
| 228 | er = vpfnRegDeleteKeyExW(hkRoot, wzSubKey, samDesired, 0); | 233 | er = vpfnRegDeleteKeyExW(hkRoot, wzSubKey, samDesired, 0); |
| 229 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) | 234 | if (E_FILENOTFOUND == HRESULT_FROM_WIN32(er)) |
| 230 | { | 235 | { |
| @@ -250,7 +255,6 @@ LExit: | |||
| 250 | return hr; | 255 | return hr; |
| 251 | } | 256 | } |
| 252 | 257 | ||
| 253 | |||
| 254 | DAPI_(HRESULT) RegKeyEnum( | 258 | DAPI_(HRESULT) RegKeyEnum( |
| 255 | __in HKEY hk, | 259 | __in HKEY hk, |
| 256 | __in DWORD dwIndex, | 260 | __in DWORD dwIndex, |
| @@ -889,14 +893,14 @@ DAPI_(HRESULT) RegKeyReadNumber( | |||
| 889 | __in HKEY hk, | 893 | __in HKEY hk, |
| 890 | __in_z LPCWSTR wzSubKey, | 894 | __in_z LPCWSTR wzSubKey, |
| 891 | __in_z_opt LPCWSTR wzName, | 895 | __in_z_opt LPCWSTR wzName, |
| 892 | __in BOOL f64Bit, | 896 | __in REG_KEY_BITNESS kbKeyBitness, |
| 893 | __out DWORD* pdwValue | 897 | __out DWORD* pdwValue |
| 894 | ) | 898 | ) |
| 895 | { | 899 | { |
| 896 | HRESULT hr = S_OK; | 900 | HRESULT hr = S_OK; |
| 897 | HKEY hkKey = NULL; | 901 | HKEY hkKey = NULL; |
| 898 | 902 | ||
| 899 | hr = RegOpen(hk, wzSubKey, KEY_READ | f64Bit ? KEY_WOW64_64KEY : 0, &hkKey); | 903 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 900 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); | 904 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); |
| 901 | 905 | ||
| 902 | hr = RegReadNumber(hkKey, wzName, pdwValue); | 906 | hr = RegReadNumber(hkKey, wzName, pdwValue); |
| @@ -917,14 +921,14 @@ DAPI_(BOOL) RegValueExists( | |||
| 917 | __in HKEY hk, | 921 | __in HKEY hk, |
| 918 | __in_z LPCWSTR wzSubKey, | 922 | __in_z LPCWSTR wzSubKey, |
| 919 | __in_z_opt LPCWSTR wzName, | 923 | __in_z_opt LPCWSTR wzName, |
| 920 | __in BOOL f64Bit | 924 | __in REG_KEY_BITNESS kbKeyBitness |
| 921 | ) | 925 | ) |
| 922 | { | 926 | { |
| 923 | HRESULT hr = S_OK; | 927 | HRESULT hr = S_OK; |
| 924 | HKEY hkKey = NULL; | 928 | HKEY hkKey = NULL; |
| 925 | DWORD dwType = 0; | 929 | DWORD dwType = 0; |
| 926 | 930 | ||
| 927 | hr = RegOpen(hk, wzSubKey, KEY_READ | f64Bit ? KEY_WOW64_64KEY : 0, &hkKey); | 931 | hr = RegOpenEx(hk, wzSubKey, KEY_READ, kbKeyBitness, &hkKey); |
| 928 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); | 932 | RegExitOnFailure(hr, "Failed to open key: %ls", wzSubKey); |
| 929 | 933 | ||
| 930 | hr = RegGetType(hkKey, wzName, &dwType); | 934 | hr = RegGetType(hkKey, wzName, &dwType); |
| @@ -936,6 +940,25 @@ LExit: | |||
| 936 | return SUCCEEDED(hr); | 940 | return SUCCEEDED(hr); |
| 937 | } | 941 | } |
| 938 | 942 | ||
| 943 | static REGSAM TranslateKeyBitness( | ||
| 944 | __in REG_KEY_BITNESS kbKeyBitness | ||
| 945 | ) | ||
| 946 | { | ||
| 947 | switch (kbKeyBitness) | ||
| 948 | { | ||
| 949 | case REG_KEY_32BIT: | ||
| 950 | return KEY_WOW64_32KEY; | ||
| 951 | break; | ||
| 952 | case REG_KEY_64BIT: | ||
| 953 | return KEY_WOW64_64KEY; | ||
| 954 | break; | ||
| 955 | case REG_KEY_DEFAULT: | ||
| 956 | default: | ||
| 957 | return 0; | ||
| 958 | break; | ||
| 959 | } | ||
| 960 | } | ||
| 961 | |||
| 939 | static HRESULT WriteStringToRegistry( | 962 | static HRESULT WriteStringToRegistry( |
| 940 | __in HKEY hk, | 963 | __in HKEY hk, |
| 941 | __in_z_opt LPCWSTR wzName, | 964 | __in_z_opt LPCWSTR wzName, |
