diff options
Diffstat (limited to 'src/burn/engine/cache.cpp')
| -rw-r--r-- | src/burn/engine/cache.cpp | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/src/burn/engine/cache.cpp b/src/burn/engine/cache.cpp index 0c5266a0..5d81e1ba 100644 --- a/src/burn/engine/cache.cpp +++ b/src/burn/engine/cache.cpp | |||
| @@ -16,9 +16,10 @@ static HRESULT CacheVerifyPayloadSignature( | |||
| 16 | ); | 16 | ); |
| 17 | static HRESULT CalculateBaseWorkingFolder( | 17 | static HRESULT CalculateBaseWorkingFolder( |
| 18 | __in BURN_ENGINE_COMMAND* pInternalCommand, | 18 | __in BURN_ENGINE_COMMAND* pInternalCommand, |
| 19 | __in LPCWSTR wzAcquisitionFolder, | ||
| 19 | __inout_z LPWSTR* psczBaseWorkingFolder | 20 | __inout_z LPWSTR* psczBaseWorkingFolder |
| 20 | ); | 21 | ); |
| 21 | static HRESULT CalculateWorkingFolder( | 22 | static HRESULT CalculateWorkingFolders( |
| 22 | __in BURN_CACHE* pCache, | 23 | __in BURN_CACHE* pCache, |
| 23 | __in BURN_ENGINE_COMMAND* pInternalCommand | 24 | __in BURN_ENGINE_COMMAND* pInternalCommand |
| 24 | ); | 25 | ); |
| @@ -214,7 +215,7 @@ extern "C" HRESULT CacheInitialize( | |||
| 214 | ExitOnFailure(hr, "Failed to backslash terminate default %hs package cache directory name.", "per-user"); | 215 | ExitOnFailure(hr, "Failed to backslash terminate default %hs package cache directory name.", "per-user"); |
| 215 | 216 | ||
| 216 | 217 | ||
| 217 | hr = CalculateWorkingFolder(pCache, pInternalCommand); | 218 | hr = CalculateWorkingFolders(pCache, pInternalCommand); |
| 218 | 219 | ||
| 219 | pCache->fInitializedCache = TRUE; | 220 | pCache->fInitializedCache = TRUE; |
| 220 | 221 | ||
| @@ -309,24 +310,42 @@ LExit: | |||
| 309 | return hr; | 310 | return hr; |
| 310 | } | 311 | } |
| 311 | 312 | ||
| 312 | extern "C" HRESULT CacheEnsureWorkingFolder( | 313 | extern "C" HRESULT CacheEnsureAcquisitionFolder( |
| 314 | __in BURN_CACHE* pCache | ||
| 315 | ) | ||
| 316 | { | ||
| 317 | Assert(pCache->fInitializedCache); | ||
| 318 | |||
| 319 | HRESULT hr = S_OK; | ||
| 320 | |||
| 321 | hr = DirEnsureExists(pCache->sczAcquisitionFolder, NULL); | ||
| 322 | ExitOnFailure(hr, "Failed create acquisition folder."); | ||
| 323 | |||
| 324 | // Best effort to ensure our working folder is not encrypted. | ||
| 325 | ::DecryptFileW(pCache->sczBaseWorkingFolder, 0); | ||
| 326 | |||
| 327 | LExit: | ||
| 328 | return hr; | ||
| 329 | } | ||
| 330 | |||
| 331 | extern "C" HRESULT CacheEnsureBaseWorkingFolder( | ||
| 313 | __in BURN_CACHE* pCache, | 332 | __in BURN_CACHE* pCache, |
| 314 | __deref_out_z_opt LPWSTR* psczWorkingFolder | 333 | __deref_out_z_opt LPWSTR* psczBaseWorkingFolder |
| 315 | ) | 334 | ) |
| 316 | { | 335 | { |
| 317 | Assert(pCache->fInitializedCache); | 336 | Assert(pCache->fInitializedCache); |
| 318 | 337 | ||
| 319 | HRESULT hr = S_OK; | 338 | HRESULT hr = S_OK; |
| 320 | 339 | ||
| 321 | hr = DirEnsureExists(pCache->sczWorkingFolder, NULL); | 340 | hr = DirEnsureExists(pCache->sczBaseWorkingFolder, NULL); |
| 322 | ExitOnFailure(hr, "Failed create working folder."); | 341 | ExitOnFailure(hr, "Failed create working folder."); |
| 323 | 342 | ||
| 324 | // Best effort to ensure our working folder is not encrypted. | 343 | // Best effort to ensure our working folder is not encrypted. |
| 325 | ::DecryptFileW(pCache->sczWorkingFolder, 0); | 344 | ::DecryptFileW(pCache->sczBaseWorkingFolder, 0); |
| 326 | 345 | ||
| 327 | if (psczWorkingFolder) | 346 | if (psczBaseWorkingFolder) |
| 328 | { | 347 | { |
| 329 | hr = StrAllocString(psczWorkingFolder, pCache->sczWorkingFolder, 0); | 348 | hr = StrAllocString(psczBaseWorkingFolder, pCache->sczBaseWorkingFolder, 0); |
| 330 | ExitOnFailure(hr, "Failed to copy working folder."); | 349 | ExitOnFailure(hr, "Failed to copy working folder."); |
| 331 | } | 350 | } |
| 332 | 351 | ||
| @@ -353,7 +372,7 @@ extern "C" HRESULT CacheCalculateBundleWorkingPath( | |||
| 353 | } | 372 | } |
| 354 | else // Otherwise, use the real working folder. | 373 | else // Otherwise, use the real working folder. |
| 355 | { | 374 | { |
| 356 | hr = StrAllocFormatted(psczWorkingPath, L"%ls%ls\\%ls", pCache->sczWorkingFolder, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName); | 375 | hr = StrAllocFormatted(psczWorkingPath, L"%ls%ls\\%ls", pCache->sczBaseWorkingFolder, BUNDLE_WORKING_FOLDER_NAME, wzExecutableName); |
| 357 | ExitOnFailure(hr, "Failed to calculate the bundle working path."); | 376 | ExitOnFailure(hr, "Failed to calculate the bundle working path."); |
| 358 | } | 377 | } |
| 359 | 378 | ||
| @@ -371,7 +390,7 @@ extern "C" HRESULT CacheCalculateBundleLayoutWorkingPath( | |||
| 371 | 390 | ||
| 372 | HRESULT hr = S_OK; | 391 | HRESULT hr = S_OK; |
| 373 | 392 | ||
| 374 | hr = PathConcat(pCache->sczWorkingFolder, wzBundleId, psczWorkingPath); | 393 | hr = PathConcat(pCache->sczAcquisitionFolder, wzBundleId, psczWorkingPath); |
| 375 | ExitOnFailure(hr, "Failed to append bundle id for bundle layout working path."); | 394 | ExitOnFailure(hr, "Failed to append bundle id for bundle layout working path."); |
| 376 | 395 | ||
| 377 | LExit: | 396 | LExit: |
| @@ -388,7 +407,7 @@ extern "C" HRESULT CacheCalculatePayloadWorkingPath( | |||
| 388 | 407 | ||
| 389 | HRESULT hr = S_OK; | 408 | HRESULT hr = S_OK; |
| 390 | 409 | ||
| 391 | hr = PathConcat(pCache->sczWorkingFolder, pPayload->sczKey, psczWorkingPath); | 410 | hr = PathConcat(pCache->sczAcquisitionFolder, pPayload->sczKey, psczWorkingPath); |
| 392 | ExitOnFailure(hr, "Failed to append Id as payload unverified path."); | 411 | ExitOnFailure(hr, "Failed to append Id as payload unverified path."); |
| 393 | 412 | ||
| 394 | LExit: | 413 | LExit: |
| @@ -405,7 +424,7 @@ extern "C" HRESULT CacheCalculateContainerWorkingPath( | |||
| 405 | 424 | ||
| 406 | HRESULT hr = S_OK; | 425 | HRESULT hr = S_OK; |
| 407 | 426 | ||
| 408 | hr = PathConcat(pCache->sczWorkingFolder, pContainer->sczHash, psczWorkingPath); | 427 | hr = PathConcat(pCache->sczAcquisitionFolder, pContainer->sczHash, psczWorkingPath); |
| 409 | ExitOnFailure(hr, "Failed to append hash as container unverified path."); | 428 | ExitOnFailure(hr, "Failed to append hash as container unverified path."); |
| 410 | 429 | ||
| 411 | LExit: | 430 | LExit: |
| @@ -1155,7 +1174,7 @@ LExit: | |||
| 1155 | return hr; | 1174 | return hr; |
| 1156 | } | 1175 | } |
| 1157 | 1176 | ||
| 1158 | extern "C" HRESULT CacheRemoveWorkingFolder( | 1177 | extern "C" HRESULT CacheRemoveBaseWorkingFolder( |
| 1159 | __in BURN_CACHE* pCache | 1178 | __in BURN_CACHE* pCache |
| 1160 | ) | 1179 | ) |
| 1161 | { | 1180 | { |
| @@ -1164,7 +1183,7 @@ extern "C" HRESULT CacheRemoveWorkingFolder( | |||
| 1164 | if (pCache->fInitializedCacheSources) | 1183 | if (pCache->fInitializedCacheSources) |
| 1165 | { | 1184 | { |
| 1166 | // Try to clean out everything in the working folder. | 1185 | // Try to clean out everything in the working folder. |
| 1167 | hr = DirEnsureDeleteEx(pCache->sczWorkingFolder, DIR_DELETE_FILES | DIR_DELETE_RECURSE | DIR_DELETE_SCHEDULE); | 1186 | hr = DirEnsureDeleteEx(pCache->sczBaseWorkingFolder, DIR_DELETE_FILES | DIR_DELETE_RECURSE | DIR_DELETE_SCHEDULE); |
| 1168 | TraceError(hr, "Could not delete bundle engine working folder."); | 1187 | TraceError(hr, "Could not delete bundle engine working folder."); |
| 1169 | } | 1188 | } |
| 1170 | 1189 | ||
| @@ -1275,9 +1294,9 @@ extern "C" void CacheCleanup( | |||
| 1275 | 1294 | ||
| 1276 | if (!fPerMachine) | 1295 | if (!fPerMachine) |
| 1277 | { | 1296 | { |
| 1278 | if (pCache->sczWorkingFolder) | 1297 | if (pCache->sczAcquisitionFolder) |
| 1279 | { | 1298 | { |
| 1280 | hr = PathConcat(pCache->sczWorkingFolder, L"*.*", &sczFiles); | 1299 | hr = PathConcat(pCache->sczAcquisitionFolder, L"*.*", &sczFiles); |
| 1281 | if (SUCCEEDED(hr)) | 1300 | if (SUCCEEDED(hr)) |
| 1282 | { | 1301 | { |
| 1283 | hFind = ::FindFirstFileW(sczFiles, &wfd); | 1302 | hFind = ::FindFirstFileW(sczFiles, &wfd); |
| @@ -1299,7 +1318,7 @@ extern "C" void CacheCleanup( | |||
| 1299 | continue; | 1318 | continue; |
| 1300 | } | 1319 | } |
| 1301 | 1320 | ||
| 1302 | hr = PathConcatCch(pCache->sczWorkingFolder, 0, wfd.cFileName, cchFileName, &sczDelete); | 1321 | hr = PathConcatCch(pCache->sczAcquisitionFolder, 0, wfd.cFileName, cchFileName, &sczDelete); |
| 1303 | if (SUCCEEDED(hr)) | 1322 | if (SUCCEEDED(hr)) |
| 1304 | { | 1323 | { |
| 1305 | hr = FileEnsureDelete(sczDelete); | 1324 | hr = FileEnsureDelete(sczDelete); |
| @@ -1327,7 +1346,8 @@ extern "C" void CacheUninitialize( | |||
| 1327 | ReleaseNullStr(pCache->sczCurrentMachinePackageCache); | 1346 | ReleaseNullStr(pCache->sczCurrentMachinePackageCache); |
| 1328 | ReleaseNullStr(pCache->sczDefaultMachinePackageCache); | 1347 | ReleaseNullStr(pCache->sczDefaultMachinePackageCache); |
| 1329 | ReleaseNullStr(pCache->sczDefaultUserPackageCache); | 1348 | ReleaseNullStr(pCache->sczDefaultUserPackageCache); |
| 1330 | ReleaseNullStr(pCache->sczWorkingFolder); | 1349 | ReleaseNullStr(pCache->sczBaseWorkingFolder); |
| 1350 | ReleaseNullStr(pCache->sczAcquisitionFolder); | ||
| 1331 | ReleaseNullStr(pCache->sczSourceProcessFolder); | 1351 | ReleaseNullStr(pCache->sczSourceProcessFolder); |
| 1332 | 1352 | ||
| 1333 | pCache->fRunningFromCache = FALSE; | 1353 | pCache->fRunningFromCache = FALSE; |
| @@ -1343,6 +1363,7 @@ extern "C" void CacheUninitialize( | |||
| 1343 | 1363 | ||
| 1344 | static HRESULT CalculateBaseWorkingFolder( | 1364 | static HRESULT CalculateBaseWorkingFolder( |
| 1345 | __in BURN_ENGINE_COMMAND* pInternalCommand, | 1365 | __in BURN_ENGINE_COMMAND* pInternalCommand, |
| 1366 | __in LPCWSTR wzAcquisitionFolder, | ||
| 1346 | __inout_z LPWSTR* psczBaseWorkingFolder | 1367 | __inout_z LPWSTR* psczBaseWorkingFolder |
| 1347 | ) | 1368 | ) |
| 1348 | { | 1369 | { |
| @@ -1351,10 +1372,10 @@ static HRESULT CalculateBaseWorkingFolder( | |||
| 1351 | ReleaseNullStr(*psczBaseWorkingFolder); | 1372 | ReleaseNullStr(*psczBaseWorkingFolder); |
| 1352 | 1373 | ||
| 1353 | // The value from the command line takes precedence. | 1374 | // The value from the command line takes precedence. |
| 1354 | if (pInternalCommand->sczWorkingDirectory) | 1375 | if (pInternalCommand->sczEngineWorkingDirectory) |
| 1355 | { | 1376 | { |
| 1356 | hr = PathExpand(psczBaseWorkingFolder, pInternalCommand->sczWorkingDirectory, PATH_EXPAND_FULLPATH); | 1377 | hr = PathExpand(psczBaseWorkingFolder, pInternalCommand->sczEngineWorkingDirectory, PATH_EXPAND_FULLPATH); |
| 1357 | ExitOnFailure(hr, "Failed to expand engine working directory from command-line: '%ls'", pInternalCommand->sczWorkingDirectory); | 1378 | ExitOnFailure(hr, "Failed to expand engine working directory from command-line: '%ls'", pInternalCommand->sczEngineWorkingDirectory); |
| 1358 | 1379 | ||
| 1359 | ExitFunction(); | 1380 | ExitFunction(); |
| 1360 | } | 1381 | } |
| @@ -1373,34 +1394,41 @@ static HRESULT CalculateBaseWorkingFolder( | |||
| 1373 | } | 1394 | } |
| 1374 | } | 1395 | } |
| 1375 | 1396 | ||
| 1376 | // Default to the temp path specified in environment variables, but need to use system temp path for security reasons if running elevated. | 1397 | // Default to the acquisition folder, but need to use system temp path for security reasons if running elevated. |
| 1377 | if (pInternalCommand->fInitiallyElevated) | 1398 | if (pInternalCommand->fInitiallyElevated) |
| 1378 | { | 1399 | { |
| 1379 | hr = PathGetSystemTempPath(psczBaseWorkingFolder); | 1400 | hr = PathGetSystemTempPath(psczBaseWorkingFolder); |
| 1380 | ExitOnFailure(hr, "Failed to get system temp folder path for working folder."); | 1401 | ExitOnFailure(hr, "Failed to get system temp folder path for base working folder."); |
| 1381 | } | 1402 | } |
| 1382 | else | 1403 | else |
| 1383 | { | 1404 | { |
| 1384 | hr = PathGetTempPath(psczBaseWorkingFolder); | 1405 | hr = StrAllocString(psczBaseWorkingFolder, wzAcquisitionFolder, 0); |
| 1385 | ExitOnFailure(hr, "Failed to get temp folder path for working folder."); | 1406 | ExitOnFailure(hr, "Failed to copy acquisition folder path for base working folder."); |
| 1386 | } | 1407 | } |
| 1387 | 1408 | ||
| 1388 | LExit: | 1409 | LExit: |
| 1389 | return hr; | 1410 | return hr; |
| 1390 | } | 1411 | } |
| 1391 | 1412 | ||
| 1392 | static HRESULT CalculateWorkingFolder( | 1413 | static HRESULT CalculateWorkingFolders( |
| 1393 | __in BURN_CACHE* pCache, | 1414 | __in BURN_CACHE* pCache, |
| 1394 | __in BURN_ENGINE_COMMAND* pInternalCommand | 1415 | __in BURN_ENGINE_COMMAND* pInternalCommand |
| 1395 | ) | 1416 | ) |
| 1396 | { | 1417 | { |
| 1397 | HRESULT hr = S_OK; | 1418 | HRESULT hr = S_OK; |
| 1398 | RPC_STATUS rs = RPC_S_OK; | 1419 | RPC_STATUS rs = RPC_S_OK; |
| 1420 | LPWSTR sczBaseAcquisitionPath = NULL; | ||
| 1399 | LPWSTR sczTempPath = NULL; | 1421 | LPWSTR sczTempPath = NULL; |
| 1400 | UUID guid = {}; | 1422 | UUID guid = {}; |
| 1401 | WCHAR wzGuid[39]; | 1423 | WCHAR wzGuid[39]; |
| 1402 | 1424 | ||
| 1403 | hr = CalculateBaseWorkingFolder(pInternalCommand, &sczTempPath); | 1425 | hr = PathGetTempPath(&sczBaseAcquisitionPath); |
| 1426 | ExitOnFailure(hr, "Failed to get temp folder path for acquisition folder base."); | ||
| 1427 | |||
| 1428 | hr = PathBackslashTerminate(&sczBaseAcquisitionPath); | ||
| 1429 | ExitOnFailure(hr, "Failed to backslashify base engine working directory."); | ||
| 1430 | |||
| 1431 | hr = CalculateBaseWorkingFolder(pInternalCommand, sczBaseAcquisitionPath, &sczTempPath); | ||
| 1404 | ExitOnFailure(hr, "Failed to get base engine working directory."); | 1432 | ExitOnFailure(hr, "Failed to get base engine working directory."); |
| 1405 | 1433 | ||
| 1406 | hr = PathBackslashTerminate(&sczTempPath); | 1434 | hr = PathBackslashTerminate(&sczTempPath); |
| @@ -1416,10 +1444,14 @@ static HRESULT CalculateWorkingFolder( | |||
| 1416 | ExitOnRootFailure(hr, "Failed to convert working folder guid into string."); | 1444 | ExitOnRootFailure(hr, "Failed to convert working folder guid into string."); |
| 1417 | } | 1445 | } |
| 1418 | 1446 | ||
| 1419 | hr = StrAllocFormatted(&pCache->sczWorkingFolder, L"%ls%ls\\", sczTempPath, wzGuid); | 1447 | hr = StrAllocFormatted(&pCache->sczAcquisitionFolder, L"%ls%ls\\", sczBaseAcquisitionPath, wzGuid); |
| 1448 | ExitOnFailure(hr, "Failed to append random guid on to temp path for acquisition folder."); | ||
| 1449 | |||
| 1450 | hr = StrAllocFormatted(&pCache->sczBaseWorkingFolder, L"%ls%ls\\", sczTempPath, wzGuid); | ||
| 1420 | ExitOnFailure(hr, "Failed to append random guid on to temp path for working folder."); | 1451 | ExitOnFailure(hr, "Failed to append random guid on to temp path for working folder."); |
| 1421 | 1452 | ||
| 1422 | LExit: | 1453 | LExit: |
| 1454 | ReleaseStr(sczBaseAcquisitionPath); | ||
| 1423 | ReleaseStr(sczTempPath); | 1455 | ReleaseStr(sczTempPath); |
| 1424 | 1456 | ||
| 1425 | return hr; | 1457 | return hr; |
| @@ -2020,7 +2052,7 @@ static HRESULT CopyEngineToWorkingFolder( | |||
| 2020 | LPWSTR sczPayloadSourcePath = NULL; | 2052 | LPWSTR sczPayloadSourcePath = NULL; |
| 2021 | LPWSTR sczPayloadTargetPath = NULL; | 2053 | LPWSTR sczPayloadTargetPath = NULL; |
| 2022 | 2054 | ||
| 2023 | hr = CacheEnsureWorkingFolder(pCache, &sczWorkingFolder); | 2055 | hr = CacheEnsureBaseWorkingFolder(pCache, &sczWorkingFolder); |
| 2024 | ExitOnFailure(hr, "Failed to create working path to copy engine."); | 2056 | ExitOnFailure(hr, "Failed to create working path to copy engine."); |
| 2025 | 2057 | ||
| 2026 | hr = PathConcat(sczWorkingFolder, wzWorkingFolderName, &sczTargetDirectory); | 2058 | hr = PathConcat(sczWorkingFolder, wzWorkingFolderName, &sczTargetDirectory); |
