Changeset 106321 in vbox for trunk/src/VBox/Installer
- Timestamp:
- Oct 15, 2024 1:06:30 PM (6 months ago)
- svn:sync-xref-src-repo-rev:
- 165131
- Location:
- trunk/src/VBox/Installer/win
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Installer/win/InstallHelper/Makefile.kmk
r106061 r106321 50 50 VBoxInstallHelper.def \ 51 51 VBoxInstallHelper.rc \ 52 VBoxCommon.cpp 52 VBoxCommon.cpp \ 53 $(PATH_ROOT)/src/VBox/GuestHost/Installation/VBoxWinDrvCommon.cpp \ 54 $(PATH_ROOT)/src/VBox/GuestHost/Installation/VBoxWinDrvInst.cpp \ 55 $(PATH_ROOT)/src/VBox/GuestHost/Installation/VBoxWinDrvStore.cpp 53 56 ifndef VBOX_OSE 54 57 VBoxInstallHelper_SOURCES += \ -
trunk/src/VBox/Installer/win/InstallHelper/VBoxCommon.cpp
r106061 r106321 42 42 43 43 44 /** 45 * Retrieves a MSI property (in UTF-16), extended version. 46 * 47 * @returns VBox status code. 48 * @param hMsi MSI handle to use. 49 * @param pwszName Name of property to retrieve. 50 * @param pwszVal Where to store the allocated value on success. 51 * @param pcwVal Input and output size (in WCHARs) of \a pwszVal. 52 */ 53 int VBoxMsiQueryPropEx(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszVal, DWORD *pcwVal) 54 { 55 AssertPtrReturn(pwszName, VERR_INVALID_POINTER); 56 AssertPtrReturn(pwszVal, VERR_INVALID_POINTER); 57 AssertPtrReturn(pcwVal, VERR_INVALID_POINTER); 58 AssertReturn(*pcwVal, VERR_INVALID_PARAMETER); 59 60 int rc; 61 62 RT_BZERO(pwszVal, *pcwVal * sizeof(WCHAR)); 63 UINT uRc = MsiGetPropertyW(hMsi, pwszName, pwszVal, pcwVal); 64 if (uRc == ERROR_SUCCESS) 65 { 66 if (*pcwVal > 0) 67 { 68 rc = VINF_SUCCESS; 69 } 70 else /* Indicates value not found. */ 71 rc = VERR_NOT_FOUND; 72 } 73 else 74 rc = RTErrConvertFromWin32(uRc); 75 76 return rc; 77 } 78 44 79 #ifndef TESTCASE 45 80 /** 46 81 * Retrieves a MSI property (in UTF-16). 47 82 * 48 * Convenience function for VBoxGetMsiProp().49 *50 83 * @returns VBox status code. 51 84 * @param hMsi MSI handle to use. 52 85 * @param pwszName Name of property to retrieve. 53 * @param pwszVal ueBufWhere to store the allocated value on success.54 * @param cw cValueBuf Size (in WCHARs) of \a pwszValueBuf.86 * @param pwszVal Where to store the allocated value on success. 87 * @param cwVal Input size (in WCHARs) of \a pwszVal. 55 88 */ 56 UINT VBoxGetMsiProp(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszValueBuf, DWORD cwcValueBuf)89 int VBoxMsiQueryProp(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszVal, DWORD cwVal) 57 90 { 58 RT_BZERO(pwszValueBuf, cwcValueBuf * sizeof(WCHAR)); 59 return MsiGetPropertyW(hMsi, pwszName, pwszValueBuf, &cwcValueBuf); 91 return VBoxMsiQueryPropEx(hMsi, pwszName, pwszVal, &cwVal); 60 92 } 61 #endif 93 #endif /* !TESTCASE */ 62 94 63 95 /** … … 68 100 * @returns VBox status code. 69 101 * @param hMsi MSI handle to use. 70 * @param p cszNameName of property to retrieve.102 * @param pszName Name of property to retrieve. 71 103 * @param ppszValue Where to store the allocated value on success. 72 104 * Must be free'd using RTStrFree() by the caller. 73 105 */ 74 int VBox GetMsiPropUtf8(MSIHANDLE hMsi, const char *pcszName, char **ppszValue)106 int VBoxMsiQueryPropUtf8(MSIHANDLE hMsi, const char *pszName, char **ppszValue) 75 107 { 108 AssertPtrReturn(pszName, VERR_INVALID_POINTER); 109 AssertPtrReturn(ppszValue, VERR_INVALID_POINTER); 110 76 111 PRTUTF16 pwszName; 77 int rc = RTStrToUtf16(p cszName, &pwszName);112 int rc = RTStrToUtf16(pszName, &pwszName); 78 113 if (RT_SUCCESS(rc)) 79 114 { 80 115 WCHAR wszValue[1024]; /* 1024 should be enough for everybody (tm). */ 81 if (VBoxGetMsiProp(hMsi, pwszName, wszValue, RT_ELEMENTS(wszValue)) == ERROR_SUCCESS) 116 rc = VBoxMsiQueryProp(hMsi, pwszName, wszValue, RT_ELEMENTS(wszValue)); 117 if (RT_SUCCESS(rc)) 82 118 rc = RTUtf16ToUtf8(wszValue, ppszValue); 83 else84 rc = VERR_NOT_FOUND;85 119 86 120 RTUtf16Free(pwszName); … … 91 125 92 126 #ifndef TESTCASE 93 UINT VBoxSetMsiProp(MSIHANDLE hMsi, const WCHAR *pwszName, const WCHAR *pwszValue) 127 int VBoxMsiQueryPropInt32(MSIHANDLE hMsi, const char *pszName, DWORD *pdwValue) 128 { 129 AssertPtrReturn(pszName, VERR_INVALID_POINTER); 130 AssertPtrReturn(pdwValue, VERR_INVALID_POINTER); 131 132 PRTUTF16 pwszName; 133 int rc = RTStrToUtf16(pszName, &pwszName); 134 if (RT_SUCCESS(rc)) 135 { 136 char *pszTemp; 137 rc = VBoxMsiQueryPropUtf8(hMsi, pszName, &pszTemp); 138 if (RT_SUCCESS(rc)) 139 { 140 *pdwValue = RTStrToInt32(pszTemp); 141 RTStrFree(pszTemp); 142 } 143 } 144 145 return rc; 146 } 147 148 UINT VBoxMsiSetProp(MSIHANDLE hMsi, const WCHAR *pwszName, const WCHAR *pwszValue) 94 149 { 95 150 return MsiSetPropertyW(hMsi, pwszName, pwszValue); … … 97 152 #endif 98 153 99 UINT VBox SetMsiPropDWORD(MSIHANDLE hMsi, const WCHAR *pwszName, DWORD dwVal)154 UINT VBoxMsiSetPropDWORD(MSIHANDLE hMsi, const WCHAR *pwszName, DWORD dwVal) 100 155 { 101 156 wchar_t wszTemp[32]; 102 157 RTUtf16Printf(wszTemp, RT_ELEMENTS(wszTemp), "%u", dwVal); 103 return VBox SetMsiProp(hMsi, pwszName, wszTemp);158 return VBoxMsiSetProp(hMsi, pwszName, wszTemp); 104 159 } 105 160 -
trunk/src/VBox/Installer/win/InstallHelper/VBoxCommon.h
r106061 r106321 36 36 #endif 37 37 38 UINT VBoxGetMsiProp(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszValueBuf, DWORD cwcValueBuf); 39 int VBoxGetMsiPropUtf8(MSIHANDLE hMsi, const char *pcszName, char **ppszValue); 40 UINT VBoxSetMsiProp(MSIHANDLE hMsi, const WCHAR *pwszName, const WCHAR *pwszValue); 41 UINT VBoxSetMsiPropDWORD(MSIHANDLE hMsi, const WCHAR *pwszName, DWORD dwVal); 38 int VBoxMsiQueryProp(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszVal, DWORD cwVal); 39 int VBoxMsiQueryPropEx(MSIHANDLE hMsi, const WCHAR *pwszName, WCHAR *pwszVal, DWORD *pcwVal); 40 int VBoxMsiQueryPropUtf8(MSIHANDLE hMsi, const char *pszName, char **ppszValue); 41 int VBoxMsiQueryPropInt32(MSIHANDLE hMsi, const char *pszName, DWORD *pdwValue); 42 UINT VBoxMsiSetProp(MSIHANDLE hMsi, const WCHAR *pwszName, const WCHAR *pwszValue); 43 UINT VBoxMsiSetPropDWORD(MSIHANDLE hMsi, const WCHAR *pwszName, DWORD dwVal); 42 44 43 45 #endif /* !VBOX_INCLUDED_SRC_InstallHelper_VBoxCommon_h */ -
trunk/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.cpp
r106061 r106321 60 60 #include <iprt/err.h> 61 61 #include <iprt/file.h> 62 #include <iprt/initterm.h> 62 63 #include <iprt/mem.h> 63 64 #include <iprt/path.h> /* RTPATH_MAX, RTPATH_IS_SLASH */ … … 66 67 #include <iprt/thread.h> 67 68 #include <iprt/utf16.h> 69 70 #include <VBox/GuestHost/VBoxWinDrvInst.h> 68 71 69 72 #include "VBoxCommon.h" … … 134 137 BOOL WINAPI DllMain(HANDLE hInst, ULONG uReason, LPVOID pReserved) 135 138 { 136 RT_NOREF(hInst, uReason,pReserved);139 RT_NOREF(hInst, pReserved); 137 140 138 141 #ifdef DEBUG … … 147 150 case DLL_PROCESS_ATTACH: 148 151 { 152 int rc = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE); 153 if (RT_FAILURE(rc)) 154 return FALSE; 155 149 156 g_cRef++; 150 157 #if 0 … … 157 164 * and 2-3 times during uninstall. 158 165 * 159 * Note! The DIFxApp.DLL will automatically trigger breakpoints when a160 * debugger is attached. Just continue on these.161 166 */ 162 167 RTUtf16Printf(wszMsg, RT_ELEMENTS(wszMsg), "Waiting for debugger to attach: windbg -g -G -p %u\n", GetCurrentProcessId()); … … 174 179 case DLL_PROCESS_DETACH: 175 180 { 181 /** @todo RTR3Term(); */ 182 176 183 g_cRef--; 177 184 break; … … 649 656 char *pszTargetDir; 650 657 651 int vrc = VBoxGetMsiPropUtf8(hModule, "INSTALLDIR", &pszTargetDir); 652 if (RT_SUCCESS(vrc)) 658 int vrc = VBoxMsiQueryPropUtf8(hModule, "INSTALLDIR", &pszTargetDir); 659 if (vrc == VERR_NOT_FOUND) /* Target directory might not set yet. */ 660 { 661 logStringF(hModule, "CheckTargetDir: No INSTALLDIR set (yet), skipping ..."); 662 663 VBoxMsiSetProp(hModule, L"VBox_Target_Dir_Is_Valid", L"1"); 664 vrc = VINF_SUCCESS; 665 } 666 else if (RT_SUCCESS(vrc)) 653 667 { 654 668 logStringF(hModule, "CheckTargetDir: Checking target directory '%s' ...", pszTargetDir); 655 669 656 if (!RTStrNLen(pszTargetDir, RTPATH_MAX)) 657 { 658 logStringF(hModule, "CheckTargetDir: No INSTALLDIR set (yet), skipping ..."); 659 VBoxSetMsiProp(hModule, L"VBox_Target_Dir_Is_Valid", L"1"); 660 } 661 else 662 { 663 union 664 { 665 RTPATHPARSED Parsed; 666 uint8_t ab[RTPATH_MAX]; 667 } u; 668 669 vrc = RTPathParse(pszTargetDir, &u.Parsed, sizeof(u), RTPATH_STR_F_STYLE_DOS); 670 union 671 { 672 RTPATHPARSED Parsed; 673 uint8_t ab[RTPATH_MAX]; 674 } u; 675 676 vrc = RTPathParse(pszTargetDir, &u.Parsed, sizeof(u), RTPATH_STR_F_STYLE_DOS); 677 if (RT_SUCCESS(vrc)) 678 { 679 if (u.Parsed.fProps & RTPATH_PROP_DOTDOT_REFS) 680 vrc = VERR_INVALID_PARAMETER; 670 681 if (RT_SUCCESS(vrc)) 671 682 { 672 if (u.Parsed.fProps & RTPATH_PROP_DOTDOT_REFS) 673 vrc = VERR_INVALID_PARAMETER; 683 vrc = initTargetDirSecurityCtx(&g_TargetDirSecCtx, hModule, pszTargetDir); 674 684 if (RT_SUCCESS(vrc)) 675 685 { 676 vrc = initTargetDirSecurityCtx(&g_TargetDirSecCtx, hModule, pszTargetDir); 677 if (RT_SUCCESS(vrc)) 686 uint16_t idxComp = u.Parsed.cComps; 687 char szPathToCheck[RTPATH_MAX]; 688 while (idxComp > 1) /* We traverse backwards from INSTALLDIR and leave out the root (e.g. C:\"). */ 678 689 { 679 uint16_t idxComp = u.Parsed.cComps; 680 char szPathToCheck[RTPATH_MAX]; 681 while (idxComp > 1) /* We traverse backwards from INSTALLDIR and leave out the root (e.g. C:\"). */ 690 u.Parsed.cComps = idxComp; 691 vrc = RTPathParsedReassemble(pszTargetDir, &u.Parsed, RTPATH_STR_F_STYLE_DOS, 692 szPathToCheck, sizeof(szPathToCheck)); 693 if (RT_FAILURE(vrc)) 694 break; 695 if (RTDirExists(szPathToCheck)) 682 696 { 683 u.Parsed.cComps = idxComp; 684 vrc = RTPathParsedReassemble(pszTargetDir, &u.Parsed, RTPATH_STR_F_STYLE_DOS, 685 szPathToCheck, sizeof(szPathToCheck)); 697 vrc = checkTargetDirOne(hModule, &g_TargetDirSecCtx, szPathToCheck); 686 698 if (RT_FAILURE(vrc)) 687 699 break; 688 if (RTDirExists(szPathToCheck))689 {690 vrc = checkTargetDirOne(hModule, &g_TargetDirSecCtx, szPathToCheck);691 if (RT_FAILURE(vrc))692 break;693 }694 else695 logStringF(hModule, "CheckTargetDir: Path '%s' does not exist (yet)", szPathToCheck);696 idxComp--;697 700 } 698 699 destroyTargetDirSecurityCtx(&g_TargetDirSecCtx); 701 else 702 logStringF(hModule, "CheckTargetDir: Path '%s' does not exist (yet)", szPathToCheck); 703 idxComp--; 700 704 } 701 else 702 logStringF(hModule, "CheckTargetDir: initTargetDirSecurityCtx failed with %Rrc\n", vrc); 703 704 if (RT_SUCCESS(vrc)) 705 VBoxSetMsiProp(hModule, L"VBox_Target_Dir_Is_Valid", L"1"); 705 706 destroyTargetDirSecurityCtx(&g_TargetDirSecCtx); 706 707 } 707 } 708 else 709 logStringF(hModule, "CheckTargetDir: Parsing path failed with %Rrc", vrc); 710 } 708 else 709 logStringF(hModule, "CheckTargetDir: initTargetDirSecurityCtx failed with %Rrc\n", vrc); 710 711 if (RT_SUCCESS(vrc)) 712 VBoxMsiSetProp(hModule, L"VBox_Target_Dir_Is_Valid", L"1"); 713 } 714 } 715 else 716 logStringF(hModule, "CheckTargetDir: Parsing path failed with %Rrc", vrc); 711 717 712 718 RTStrFree(pszTargetDir); … … 716 722 { 717 723 logStringF(hModule, "CheckTargetDir: Checking failed with %Rrc", vrc); 718 VBox SetMsiProp(hModule, L"VBox_Target_Dir_Is_Valid", L"0");724 VBoxMsiSetProp(hModule, L"VBox_Target_Dir_Is_Valid", L"0"); 719 725 } 720 726 … … 988 994 { 989 995 logStringF(hModule, "IsPythonInstalled: Python installation found at \"%ls\"", wszPythonPath); 990 VBox SetMsiProp(hModule, L"VBOX_PYTHON_PATH", wszPythonPath);991 VBox SetMsiProp(hModule, L"VBOX_PYTHON_INSTALLED", L"1");996 VBoxMsiSetProp(hModule, L"VBOX_PYTHON_PATH", wszPythonPath); 997 VBoxMsiSetProp(hModule, L"VBOX_PYTHON_INSTALLED", L"1"); 992 998 } 993 999 else … … 995 1001 logStringF(hModule, "IsPythonInstalled: Error: No suitable Python installation found (%u), skipping installation.", rcWin); 996 1002 logStringF(hModule, "IsPythonInstalled: Python seems not to be installed; please download + install the Python Core package."); 997 VBox SetMsiProp(hModule, L"VBOX_PYTHON_INSTALLED", L"0");1003 VBoxMsiSetProp(hModule, L"VBOX_PYTHON_INSTALLED", L"0"); 998 1004 } 999 1005 … … 1025 1031 logStringF(hModule, "ArePythonAPIDepsInstalled: Failed with dwErr=%u", dwErr); 1026 1032 1027 VBox SetMsiProp(hModule, L"VBOX_PYTHON_DEPS_INSTALLED", dwErr == ERROR_SUCCESS ? L"1" : L"0");1033 VBoxMsiSetProp(hModule, L"VBOX_PYTHON_DEPS_INSTALLED", dwErr == ERROR_SUCCESS ? L"1" : L"0"); 1028 1034 return ERROR_SUCCESS; /* Never return failure. */ 1029 1035 } … … 1064 1070 if (lrc == ERROR_SUCCESS) 1065 1071 { 1066 VBox SetMsiPropDWORD(hModule, L"VBOX_MSCRT_VER_MAJ", dwMaj);1072 VBoxMsiSetPropDWORD(hModule, L"VBOX_MSCRT_VER_MAJ", dwMaj); 1067 1073 1068 1074 DWORD dwMin = 0; … … 1070 1076 if (lrc == ERROR_SUCCESS) 1071 1077 { 1072 VBox SetMsiPropDWORD(hModule, L"VBOX_MSCRT_VER_MIN", dwMin);1078 VBoxMsiSetPropDWORD(hModule, L"VBOX_MSCRT_VER_MIN", dwMin); 1073 1079 1074 1080 logStringF(hModule, "IsMSCRTInstalled: Found v%u.%u\n", dwMaj, dwMin); … … 1076 1082 /* Check for at least 2019. */ 1077 1083 if (dwMaj > 14 || (dwMaj == 14 && dwMin >= 20)) 1078 VBox SetMsiProp(hModule, L"VBOX_MSCRT_INSTALLED", L"1");1084 VBoxMsiSetProp(hModule, L"VBOX_MSCRT_INSTALLED", L"1"); 1079 1085 } 1080 1086 else … … 1129 1135 logStringF(hModule, "IsWindows10/CurrentMajorVersionNumber: %u", dwVal); 1130 1136 1131 VBox SetMsiProp(hModule, L"VBOX_IS_WINDOWS_10", dwVal >= 10 ? L"1" : L"");1137 VBoxMsiSetProp(hModule, L"VBOX_IS_WINDOWS_10", dwVal >= 10 ? L"1" : L""); 1132 1138 } 1133 1139 else … … 1161 1167 if (rcWin != ERROR_SUCCESS) 1162 1168 { 1163 VBox SetMsiProp(hModule, L"VBOX_API_INSTALLED", L"0");1169 VBoxMsiSetProp(hModule, L"VBOX_API_INSTALLED", L"0"); 1164 1170 return ERROR_SUCCESS; 1165 1171 } … … 1170 1176 /* Get the VBox API setup string. */ 1171 1177 WCHAR wszVBoxPythonInstallerPath[RTPATH_MAX]; 1172 rcWin = VBoxGetMsiProp(hModule, L"CustomActionData", wszVBoxPythonInstallerPath, RT_ELEMENTS(wszVBoxPythonInstallerPath));1173 if ( rcWin == ERROR_SUCCESS)1178 int rc = VBoxMsiQueryProp(hModule, L"CustomActionData", wszVBoxPythonInstallerPath, RT_ELEMENTS(wszVBoxPythonInstallerPath)); 1179 if (RT_SUCCESS(rc)) 1174 1180 { 1175 1181 /* Make sure our current working directory is the VBox installation path. */ … … 1199 1205 { 1200 1206 logStringF(hModule, "InstallPythonAPI: VBox API looks good."); 1201 VBox SetMsiProp(hModule, L"VBOX_API_INSTALLED", L"1");1207 VBoxMsiSetProp(hModule, L"VBOX_API_INSTALLED", L"1"); 1202 1208 return ERROR_SUCCESS; 1203 1209 } … … 1218 1224 } 1219 1225 else 1220 logStringF(hModule, "InstallPythonAPI: Unable to retrieve VBox installation directory: rc Win=%u (%#x)", rcWin, rcWin);1221 1222 VBox SetMsiProp(hModule, L"VBOX_API_INSTALLED", L"0");1226 logStringF(hModule, "InstallPythonAPI: Unable to retrieve VBox installation directory: rc=%Rrc", rc); 1227 1228 VBoxMsiSetProp(hModule, L"VBOX_API_INSTALLED", L"0"); 1223 1229 logStringF(hModule, "InstallPythonAPI: Installation failed"); 1224 1230 return ERROR_SUCCESS; /* Do not fail here. */ … … 1373 1379 1374 1380 WCHAR wszPath[RTPATH_MAX]; 1375 UINT rc = VBoxGetMsiProp(hModule, L"CustomActionData", wszPath, RT_ELEMENTS(wszPath));1376 if ( rc == ERROR_SUCCESS)1381 int rc = VBoxMsiQueryProp(hModule, L"CustomActionData", wszPath, RT_ELEMENTS(wszPath)); 1382 if (RT_SUCCESS(rc)) 1377 1383 { 1378 1384 size_t const cwcPath = RTUtf16Len(wszPath); … … 1388 1394 } 1389 1395 1390 logStringF(hModule, "UninstallBranding: Handling done. (rc=% u(ignored))", rc);1396 logStringF(hModule, "UninstallBranding: Handling done. (rc=%Rrc (ignored))", rc); 1391 1397 return ERROR_SUCCESS; /* Do not fail here. */ 1392 1398 } … … 1400 1406 */ 1401 1407 wchar_t wszSrcPath[RTPATH_MAX]; 1402 UINT rc = VBoxGetMsiProp(hModule, L"SOURCEDIR", wszSrcPath, RT_ELEMENTS(wszSrcPath));1403 if ( rc == ERROR_SUCCESS)1408 int rc = VBoxMsiQueryProp(hModule, L"SOURCEDIR", wszSrcPath, RT_ELEMENTS(wszSrcPath)); 1409 if (RT_SUCCESS(rc)) 1404 1410 { 1405 1411 wchar_t wszDstPath[RTPATH_MAX]; 1406 rc = VBox GetMsiProp(hModule, L"CustomActionData", wszDstPath, RT_ELEMENTS(wszDstPath) - 1);1407 if ( rc == ERROR_SUCCESS)1412 rc = VBoxMsiQueryProp(hModule, L"CustomActionData", wszDstPath, RT_ELEMENTS(wszDstPath)); 1413 if (RT_SUCCESS(rc)) 1408 1414 { 1409 1415 /* 1410 1416 * First we copy the src\.custom dir to the target. 1411 1417 */ 1412 rc= AppendToPath(wszSrcPath, RT_ELEMENTS(wszSrcPath) - 1, L".custom", true /*fDoubleTerm*/);1413 if (rc == ERROR_SUCCESS)1414 { 1415 rc = CopyDir(hModule, wszDstPath, wszSrcPath);1416 if (rc == ERROR_SUCCESS)1418 UINT rcWin = AppendToPath(wszSrcPath, RT_ELEMENTS(wszSrcPath) - 1, L".custom", true /*fDoubleTerm*/); 1419 if (rcWin == ERROR_SUCCESS) 1420 { 1421 rcWin = CopyDir(hModule, wszDstPath, wszSrcPath); 1422 if (rcWin == ERROR_SUCCESS) 1417 1423 { 1418 1424 /* 1419 1425 * The rename the '.custom' directory we now got in the target area to 'custom'. 1420 1426 */ 1421 rc = JoinPaths(wszSrcPath, RT_ELEMENTS(wszSrcPath), wszDstPath, L".custom", true /*fDoubleTerm*/);1427 rcWin = JoinPaths(wszSrcPath, RT_ELEMENTS(wszSrcPath), wszDstPath, L".custom", true /*fDoubleTerm*/); 1422 1428 if (rc == ERROR_SUCCESS) 1423 1429 { 1424 rc = AppendToPath(wszDstPath, RT_ELEMENTS(wszDstPath), L"custom", true /*fDoubleTerm*/);1430 rcWin = AppendToPath(wszDstPath, RT_ELEMENTS(wszDstPath), L"custom", true /*fDoubleTerm*/); 1425 1431 if (rc == ERROR_SUCCESS) 1426 rc = RenameDir(hModule, wszDstPath, wszSrcPath);1432 rcWin = RenameDir(hModule, wszDstPath, wszSrcPath); 1427 1433 } 1428 1434 } 1429 1435 } 1430 } 1431 } 1432 1433 logStringF(hModule, "InstallBranding: Handling done. (rc=%u (ignored))", rc); 1436 1437 logStringF(hModule, "InstallBranding: Handling done. (rc=%Rrc (ignored))", rc); 1438 } 1439 } 1440 1441 logStringF(hModule, "InstallBranding: Handling done. (rc=%Rrc (ignored))", rc); 1442 return ERROR_SUCCESS; /* Do not fail here. */ 1443 } 1444 1445 static DECLCALLBACK(void) vboxWinDrvInstLogCallback(VBOXWINDRIVERLOGTYPE enmType, const char *pszMsg, void *pvUser) 1446 { 1447 MSIHANDLE *phModule = (MSIHANDLE *)pvUser; 1448 1449 switch (enmType) 1450 { 1451 case VBOXWINDRIVERLOGTYPE_ERROR: 1452 logStringF(*phModule, "*** Error: %s", pszMsg); 1453 break; 1454 1455 default: 1456 logStringF(*phModule, "%s", pszMsg); 1457 break; 1458 } 1459 } 1460 1461 UINT __stdcall DriverInstall(MSIHANDLE hModule) 1462 { 1463 logStringF(hModule, "Installing driver ..."); 1464 1465 char *pszInfFile = NULL; 1466 int rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvInstInfFile", &pszInfFile); 1467 if (RT_SUCCESS(rc)) 1468 { 1469 char *pszInfSection = NULL; 1470 rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvInstInfSection", &pszInfSection); 1471 if ( RT_SUCCESS(rc) 1472 || rc == VERR_NOT_FOUND) /* VBoxDrvInstInfSection is optional. */ 1473 { 1474 char *pszPnpId = NULL; 1475 rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvInstPnpId", &pszPnpId); 1476 if ( RT_SUCCESS(rc) 1477 || rc == VERR_NOT_FOUND) /* VBoxDrvInstHwId is optional. */ 1478 { 1479 uint32_t fFlags = VBOX_WIN_DRIVERINSTALL_F_NONE; 1480 1481 DWORD dwVal; 1482 rc = VBoxMsiQueryPropInt32(hModule, "VBoxDrvInstFlagForce", &dwVal); 1483 if (RT_SUCCESS(rc)) 1484 fFlags |= VBOX_WIN_DRIVERINSTALL_F_FORCE; 1485 rc = VBoxMsiQueryPropInt32(hModule, "VBoxDrvInstFlagSilent", &dwVal); 1486 if (RT_SUCCESS(rc)) 1487 fFlags |= VBOX_WIN_DRIVERINSTALL_F_SILENT; 1488 1489 VBOXWINDRVINST hWinDrvInst; 1490 rc = VBoxWinDrvInstCreateEx(&hWinDrvInst, 1 /* uVerbostiy */, &vboxWinDrvInstLogCallback, &hModule /* pvUser */); 1491 if (RT_SUCCESS(rc)) 1492 { 1493 if (pszInfSection && *pszInfSection) 1494 rc = VBoxWinDrvInstInstallExecuteInf(hWinDrvInst, pszInfFile, pszInfSection, fFlags); 1495 else 1496 rc = VBoxWinDrvInstInstall(hWinDrvInst, pszInfFile, pszPnpId, fFlags); 1497 1498 VBoxWinDrvInstDestroy(hWinDrvInst); 1499 } 1500 1501 RTStrFree(pszPnpId); 1502 } 1503 1504 RTStrFree(pszInfSection); 1505 } 1506 1507 RTStrFree(pszInfFile); 1508 } 1509 else 1510 { 1511 logStringF(hModule, "DriverInstall: No INF or invalid file to install specified!"); 1512 if (rc == VERR_NOT_FOUND) /* Give a better clue. */ 1513 rc = VERR_INVALID_PARAMETER; 1514 } 1515 1516 logStringF(hModule, "DriverInstall: Handling done. rc=%Rrc (ignored)", rc); 1517 return ERROR_SUCCESS; /* Do not fail here. */ 1518 } 1519 1520 UINT __stdcall DriverUninstall(MSIHANDLE hModule) 1521 { 1522 char *pszInfFile = NULL; 1523 int rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvUninstInfFile", &pszInfFile); 1524 if ( RT_SUCCESS(rc) 1525 || rc == VERR_NOT_FOUND) /* VBoxDrvUninstInfFile is optional. */ 1526 { 1527 char *pszInfSection = NULL; 1528 rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvUninstInfSection", &pszInfSection); 1529 if ( RT_SUCCESS(rc) 1530 || rc == VERR_NOT_FOUND) /* VBoxDrvUninstInfSection is optional. */ 1531 { 1532 char *pszModel = NULL; 1533 rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvUninstModel", &pszModel); 1534 if ( RT_SUCCESS(rc) 1535 || rc == VERR_NOT_FOUND) /* VBoxDrvUninstModel is optional. */ 1536 { 1537 char *pszPnpId = NULL; 1538 rc = VBoxMsiQueryPropUtf8(hModule, "VBoxDrvUninstPnpId", &pszPnpId); 1539 if ( RT_SUCCESS(rc) 1540 || rc == VERR_NOT_FOUND) /* VBoxDrvUninstPnpId is optional. */ 1541 { 1542 VBOXWINDRVINST hWinDrvInst; 1543 rc = VBoxWinDrvInstCreateEx(&hWinDrvInst, 1 /* uVerbostiy */, 1544 &vboxWinDrvInstLogCallback, &hModule /* pvUser */); 1545 if (RT_SUCCESS(rc)) 1546 { 1547 if (pszInfSection && *pszInfSection) 1548 rc = VBoxWinDrvInstUninstallExecuteInf(hWinDrvInst, pszInfFile, pszInfSection, 1549 VBOX_WIN_DRIVERINSTALL_F_NONE); 1550 else 1551 rc = VBoxWinDrvInstUninstall(hWinDrvInst, pszInfFile, pszModel, pszPnpId, 1552 VBOX_WIN_DRIVERINSTALL_F_NONE); 1553 1554 VBoxWinDrvInstDestroy(hWinDrvInst); 1555 } 1556 1557 RTStrFree(pszPnpId); 1558 } 1559 1560 RTStrFree(pszModel); 1561 } 1562 1563 RTStrFree(pszInfSection); 1564 } 1565 1566 RTStrFree(pszInfFile); 1567 } 1568 1569 logStringF(hModule, "DriverUninstall: Handling done. rc=%Rrc (ignored)", rc); 1434 1570 return ERROR_SUCCESS; /* Do not fail here. */ 1435 1571 } -
trunk/src/VBox/Installer/win/InstallHelper/VBoxInstallHelper.def
r106061 r106321 45 45 UninstallTAPInstances 46 46 UninstallVBoxDrv 47 DriverInstall 48 DriverUninstall 47 49 CreateHostOnlyInterface 48 50 StopHostOnlyInterfaces -
trunk/src/VBox/Installer/win/Makefile.kmk
r106061 r106321 75 75 VBOX_WITH_DOCS_PACKING := 76 76 VBOX_WITH_QTGUI := 77 VBOX_WITH_USB := 77 VBOX_WITH_USB := 1 78 78 VBOX_WITH_VBOX_IMG := 79 79 VBOX_WITH_VBOXSDL := … … 310 310 # 311 311 VBOX_TOOLS_WIN_WIX_EXT := \ 312 -lib $(VBOX_TOOLS_WIN_WIXEXT_DIR)/difxapp_$(if-expr "$(KBUILD_TARGET_ARCH)" == "x86",x86,x64).wixlib \313 312 $(if-expr defined(VBOX_WITH_MSI_HACK),-ext $(MsiHack_0_OUTDIR)/MsiHackExtension.dll,) \ 314 313 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.Ui.wixext.dll \ 315 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.DifxApp.wixext.dll \316 314 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.Util.wixext.dll 317 315 … … 578 576 -loc $(VBOX_WIN_INST_OUT_DIR)/NLS/License_$(lang).wxl \ 579 577 -lib $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_$(lang).wixlib \ 580 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.DifxApp.wixext.dll \581 578 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.Util.wixext.dll \ 582 579 -pdbtype none \ … … 596 593 ' files-VirtualBox_$(lang)/License_$(lang).wxl ^' \ 597 594 ' -lib VirtualBox_en_US.wixlib ^' \ 598 ' -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.DifxApp.wixext.dll ^' \599 595 ' -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.Util.wixext.dll ^' \ 600 596 ' -pdbtype none ^' \ … … 1059 1055 -lib $(VBOX_WIN_INST_OUT_DIR)/VirtualBox_en_US.wixlib \ 1060 1056 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.Util.wixext.dll \ 1061 -ext $(VBOX_TOOLS_WIN_WIXEXT_DIR)/WixToolset.DifxApp.wixext.dll \1062 1057 -pdbtype none \ 1063 1058 -out $$(@D)/$(PACKAGE_NAME_LANG)_$(lang).msi -
trunk/src/VBox/Installer/win/Scripts/Combined-3-RepackAdditions.cmd
r106061 r106321 237 237 -E "PATH_TARGET_X86=%_MY_REPACK_DIR_X86%\resources" ^ 238 238 -E "VBOX_PATH_ADDITIONS_WIN_X86=%_MY_REPACK_DIR_AMD64%\..\bin\additions" ^ 239 -E "VBOX_PATH_DIFX=%KBUILD_DEVTOOLS%\win.amd64\DIFx\v2.1-r3" ^240 239 -E "VBOX_VENDOR=Oracle Corporation" -E "VBOX_VENDOR_SHORT=Oracle" -E "VBOX_PRODUCT=Oracle VirtualBox" ^ 241 240 -E "VBOX_C_YEAR=@VBOX_C_YEAR@" -E "VBOX_VERSION_STRING=@VBOX_VERSION_STRING@" -E "VBOX_VERSION_STRING_RAW=@VBOX_VERSION_STRING_RAW@" ^ … … 268 267 -E "PATH_TARGET_X86=%_MY_REPACK_DIR_X86%\resources" ^ 269 268 -E "VBOX_PATH_ADDITIONS_WIN_X86=%_MY_REPACK_DIR_X86%\..\bin\additions" ^ 270 -E "VBOX_PATH_DIFX=%KBUILD_DEVTOOLS%\win.x86\DIFx\v2.1-r3" ^271 269 -E "VBOX_VENDOR=Oracle Corporation" -E "VBOX_VENDOR_SHORT=Oracle" -E "VBOX_PRODUCT=Oracle VirtualBox" ^ 272 270 -E "VBOX_C_YEAR=@VBOX_C_YEAR@" -E "VBOX_VERSION_STRING=@VBOX_VERSION_STRING@" -E "VBOX_VERSION_STRING_RAW=@VBOX_VERSION_STRING_RAW@" ^ -
trunk/src/VBox/Installer/win/VBoxMergeApp.wxi
r106061 r106321 24 24 --> 25 25 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:difxapp="http://wixtoolset.org/schemas/v4/wxs/difxapp">26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 28 <?ifdef env.VBOX_QT_INFIX ?> … … 51 51 <?if $(env.VBOX_SIGNING_MODE) != none ?> 52 52 <Component Id="cp_VBoxSupCat_PreW10" Guid="673195c2-f315-42e7-ff00-5acbd91ea0bd" Bitness="$(var.Property_Bitness)" Condition="(NOT VBOX_IS_WINDOWS_10)"> 53 54 53 <File Id="file_VBoxSup_PreW10.cat" Name="VBoxSup.cat" Source="$(env.PATH_OUT)\bin\VBoxSup-PreW10.cat" /> 55 54 </Component> 56 55 <Component Id="cp_VBoxSupCat_W10" Guid="589be90d-0286-4684-503d-a1681f9587bc" Bitness="$(var.Property_Bitness)" Condition="(VBOX_IS_WINDOWS_10)"> 57 58 56 <File Id="file_VBoxSup.cat" Name="VBoxSup.cat" Source="$(env.PATH_OUT)\bin\VBoxSup.cat" /> 59 57 </Component> 60 58 <?endif?> 61 59 <Component Id="cp_VBoxSup" Guid="D3E2F2BB-569F-46A2-836C-BDF30FF1EDF8" Bitness="$(var.Property_Bitness)"> 62 < difxapp:Driver AddRemovePrograms="no" ForceInstall="yes" DeleteFiles="yes" Legacy="$(var.Property_DriverLegacy)" Sequence="2" PlugAndPlayPrompt="no" />60 <!-- Note: Driver gets installed via custom action via VBoxInstallHelper. --> 63 61 <File Id="file_VBoxSup.sys" Name="VBoxSup.sys" KeyPath="yes" Source="$(env.PATH_OUT)\bin\VBoxSup.sys" /> 64 62 <File Id="file_VBoxSup.inf" Name="VBoxSup.inf" Source="$(env.PATH_OUT)\bin\VBoxSup.inf" /> -
trunk/src/VBox/Installer/win/VBoxMergeAppCA.wxi
r106061 r106321 26 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 <CustomAction Id="ca_VBoxSupDrvInst" DllEntry="DriverInstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 29 <CustomAction Id="ca_VBoxSupDrvInstArgInfFile" Property="VBoxDrvInstInfFile" Value="[#file_VBoxSup.inf]" Execute="immediate" /> 30 <CustomAction Id="ca_VBoxSupDrvInstArgModel" Property="VBoxDrvInstModel" Value="VBoxSup" Execute="immediate" /> 31 <CustomAction Id="ca_VBoxSupDrvInstArgFlagForce" Property="VBoxDrvInstFlagForce" Value="1" Execute="immediate" /> 32 <CustomAction Id="ca_VBoxSupDrvInstArgFlagSilent" Property="VBoxDrvInstFlagSilent" Value="1" Execute="immediate" /> 33 34 <CustomAction Id="ca_VBoxSupDrvUninst" DllEntry="DriverUninstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 35 <CustomAction Id="ca_VBoxSupDrvUninstArgModel" Property="VBoxDrvUninstModel" Value="VBoxSup*" Execute="immediate" /> 36 28 37 <?if $(env.VBOX_WITH_CRT_PACKING) = "no" ?> 29 38 <CustomAction Id="ca_IsMSCRTInstalled" DllEntry="IsMSCRTInstalled" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> -
trunk/src/VBox/Installer/win/VBoxMergeAppSeq.wxi
r106061 r106321 26 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 <Custom Action="ca_VBoxSupDrvInstArgFlagSilent" Before="ca_VBoxSupDrvInstArgFlagForce" Condition="NOT REMOVE" /> 29 <Custom Action="ca_VBoxSupDrvInstArgFlagForce" Before="ca_VBoxSupDrvInstArgModel" Condition="NOT REMOVE" /> 30 <Custom Action="ca_VBoxSupDrvInstArgInfFile" Before="ca_VBoxSupDrvInstArgModel" Condition="NOT REMOVE" /> 31 <Custom Action="ca_VBoxSupDrvInstArgModel" Before="ca_VBoxSupDrvInst" Condition="NOT REMOVE" /> 32 <Custom Action="ca_VBoxSupDrvInst" After="InstallFinalize" Condition="NOT REMOVE" /> 33 34 <Custom Action="ca_VBoxSupDrvUninstArgModel" Before="ca_VBoxSupDrvUninst" 35 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")" /> 36 <Custom Action="ca_VBoxSupDrvUninst" After="InstallInitialize" 37 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")" /> 38 28 39 <?if $(env.VBOX_WITH_CRT_PACKING) = "no" ?> 29 40 <Custom Action="ca_IsMSCRTInstalled" Before="LaunchConditions"/> -
trunk/src/VBox/Installer/win/VBoxMergeUSB.wxi
r106061 r106321 24 24 --> 25 25 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:difxapp="http://wixtoolset.org/schemas/v4/wxs/difxapp">26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 28 <Directory Id="dir_VBoxUSBFilter" Name="filter"> … … 38 38 <?endif?> 39 39 <Component Id="cp_USBFilterDriver" Guid="B7D782D2-96DF-4775-A0E1-A76CF7B04B65" Bitness="$(var.Property_Bitness)"> 40 <difxapp:Driver AddRemovePrograms="no" ForceInstall="yes" DeleteFiles="yes" Legacy="$(var.Property_DriverLegacy)" Sequence="3" PlugAndPlayPrompt="no" />41 40 <File Id="file_VBoxUSBMon.sys" Name="VBoxUSBMon.sys" Source="$(env.PATH_OUT)\bin\VBoxUSBMon.sys" /> 42 41 <File Id="file_VBoxUSBMon.inf" Name="VBoxUSBMon.inf" Source="$(env.PATH_OUT)\bin\VBoxUSBMon.inf" /> … … 56 55 <?endif?> 57 56 <Component Id="cp_USBDeviceDriver" Guid="010FE46A-E358-43E2-8BDC-38BC8BEC82E0" Bitness="$(var.Property_Bitness)"> 58 <difxapp:Driver AddRemovePrograms="no" ForceInstall="yes" DeleteFiles="yes" Legacy="$(var.Property_DriverLegacy)" Sequence="3" PlugAndPlayPrompt="no" />59 57 <File Id="file_VBoxUSB.sys" Name="VBoxUSB.sys" Source="$(env.PATH_OUT)\bin\VBoxUSB.sys" /> 60 58 <File Id="file_VBoxUSB.inf" Name="VBoxUSB.inf" Source="$(env.PATH_OUT)\bin\VBoxUSB.inf" /> -
trunk/src/VBox/Installer/win/VBoxMergeUSBCA.wxi
r106061 r106321 26 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 <CustomAction Id="ca_VBoxUSBDevDrvInst" DllEntry="DriverInstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 29 <CustomAction Id="ca_VBoxUSBDevDrvInstArgInfFile" Property="VBoxDrvInstInfFile" Value="[#file_VBoxUSB.inf]" Execute="immediate" /> 30 <CustomAction Id="ca_VBoxUSBDevDrvInstArgModel" Property="VBoxDrvInstModel" Value="VBoxUSB*" Execute="immediate" /> 31 <CustomAction Id="ca_VBoxUSBDevDrvInstArgFlagForce" Property="VBoxDrvInstFlagForce" Value="1" Execute="immediate" /> 32 <CustomAction Id="ca_VBoxUSBDevDrvInstArgFlagSilent" Property="VBoxDrvInstFlagSilent" Value="1" Execute="immediate" /> 33 34 <CustomAction Id="ca_VBoxUSBDevDrvUninst" DllEntry="DriverUninstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 35 <CustomAction Id="ca_VBoxUSBDevDrvUninstArgModel" Property="VBoxDrvUninstModel" Value="VBoxUSB*" Execute="immediate" /> 36 37 <CustomAction Id="ca_VBoxUSBMonDrvInst" DllEntry="DriverInstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 38 <CustomAction Id="ca_VBoxUSBMonDrvInstArgInfFile" Property="VBoxDrvInstInfFile" Value="[#file_VBoxUSBMon.inf]" Execute="immediate" /> 39 <CustomAction Id="ca_VBoxUSBMonDrvInstArgModel" Property="VBoxDrvInstModel" Value="VBoxUSBMon*" Execute="immediate" /> 40 <CustomAction Id="ca_VBoxUSBMonDrvInstArgFlagForce" Property="VBoxDrvInstFlagForce" Value="1" Execute="immediate" /> 41 <CustomAction Id="ca_VBoxUSBMonDrvInstArgFlagSilent" Property="VBoxDrvInstFlagSilent" Value="1" Execute="immediate" /> 42 43 <CustomAction Id="ca_VBoxUSBMonDrvUninst" DllEntry="DriverUninstall" Execute="immediate" Return="ignore" Impersonate="no" BinaryRef="VBoxInstallHelper" /> 44 <CustomAction Id="ca_VBoxUSBMonDrvUninstArgModel" Property="VBoxDrvUninstModel" Value="VBoxUSBMon*" Execute="immediate" /> 45 28 46 </Include> 47 -
trunk/src/VBox/Installer/win/VBoxMergeUSBSeq.wxi
r106061 r106321 26 26 <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> 27 27 28 <Custom Action="ca_VBoxUSBDevDrvInstArgFlagSilent" Before="ca_VBoxUSBDevDrvInstArgFlagForce" Condition="NOT REMOVE" /> 29 <Custom Action="ca_VBoxUSBDevDrvInstArgFlagForce" Before="ca_VBoxUSBDevDrvInstArgModel" Condition="NOT REMOVE" /> 30 <Custom Action="ca_VBoxUSBDevDrvInstArgModel" Before="ca_VBoxUSBDevDrvInstArgInfFile" Condition="NOT REMOVE" /> 31 <Custom Action="ca_VBoxUSBDevDrvInstArgInfFile" Before="ca_VBoxUSBDevDrvInst" Condition="NOT REMOVE" /> 32 <Custom Action="ca_VBoxUSBDevDrvInst" After="InstallFinalize" Condition="NOT REMOVE" /> 33 34 <Custom Action="ca_VBoxUSBDevDrvUninstArgModel" Before="ca_VBoxUSBDevDrvUninst" 35 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")" /> 36 <Custom Action="ca_VBoxUSBDevDrvUninst" After="InstallInitialize" 37 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")"/> 38 39 <Custom Action="ca_VBoxUSBMonDrvInstArgFlagSilent" Before="ca_VBoxUSBMonDrvInstArgFlagForce" Condition="NOT REMOVE" /> 40 <Custom Action="ca_VBoxUSBMonDrvInstArgFlagForce" Before="ca_VBoxUSBMonDrvInstArgModel" Condition="NOT REMOVE" /> 41 <Custom Action="ca_VBoxUSBMonDrvInstArgModel" Before="ca_VBoxUSBMonDrvInstArgInfFile" Condition="NOT REMOVE" /> 42 <Custom Action="ca_VBoxUSBMonDrvInstArgInfFile" Before="ca_VBoxUSBMonDrvInst" Condition="NOT REMOVE" /> 43 <Custom Action="ca_VBoxUSBMonDrvInst" After="InstallFinalize" Condition="NOT REMOVE" /> 44 45 <Custom Action="ca_VBoxUSBMonDrvUninstArgModel" Before="ca_VBoxUSBMonDrvUninst" 46 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")" /> 47 <Custom Action="ca_VBoxUSBMonDrvUninst" After="InstallInitialize" 48 Condition="NOT (UPGRADINGPRODUCTCODE) AND (Installed) AND (REMOVE="ALL")" /> 49 28 50 </Include> 51
Note:
See TracChangeset
for help on using the changeset viewer.