1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #define _WIN32_WINDOWS 0x0410 25 #ifdef _MSC_VER 26 #pragma warning(push, 1) /* disable warnings within system headers */ 27 #endif 28 #define WIN32_LEAN_AND_MEAN 29 #include <windows.h> 30 #include <msiquery.h> 31 #ifdef _MSC_VER 32 #pragma warning(pop) 33 #endif 34 35 #include <malloc.h> 36 37 #ifdef UNICODE 38 #define _UNICODE 39 #define _tstring wstring 40 #else 41 #define _tstring string 42 #endif 43 #include <tchar.h> 44 #include <string> 45 46 using namespace std; 47 48 namespace 49 { 50 std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) 51 { 52 std::_tstring result; 53 TCHAR szDummy[1] = TEXT(""); 54 DWORD nChars = 0; 55 56 if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) 57 { 58 DWORD nBytes = ++nChars * sizeof(TCHAR); 59 LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes)); 60 ZeroMemory( buffer, nBytes ); 61 MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); 62 result = buffer; 63 } 64 65 return result; 66 } 67 } // namespace 68 69 extern "C" UINT __stdcall MigrateInstallPath( MSIHANDLE handle ) 70 { 71 TCHAR szValue[8192]; 72 DWORD nValueSize = sizeof(szValue); 73 HKEY hKey; 74 std::_tstring sInstDir; 75 76 std::_tstring sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") ); 77 std::_tstring sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") ); 78 std::_tstring sUpdateVersion = GetMsiProperty( handle, TEXT("DEFINEDVERSION") ); 79 std::_tstring sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") ); 80 81 std::_tstring sProductKey = "Software\\" + sManufacturer + "\\" + sDefinedName + 82 "\\" + sUpdateVersion + "\\" + sUpgradeCode; 83 84 std::_tstring mystr; 85 mystr = "ProductKey: " + sProductKey; 86 // MessageBox( NULL, mystr.c_str(), "ProductKey", MB_OK ); 87 88 if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey.c_str(), &hKey ) ) 89 { 90 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) 91 { 92 sInstDir = szValue; 93 MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str()); 94 // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_CURRENT_USER", MB_OK ); 95 } 96 97 RegCloseKey( hKey ); 98 } 99 else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey.c_str(), &hKey ) ) 100 { 101 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) 102 { 103 sInstDir = szValue; 104 MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str()); 105 // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_LOCAL_MACHINE", MB_OK ); 106 } 107 108 RegCloseKey( hKey ); 109 } 110 111 return ERROR_SUCCESS; 112 113 } 114