aboutsummaryrefslogtreecommitdiff
path: root/src/burn/engine/payload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/burn/engine/payload.cpp')
-rw-r--r--src/burn/engine/payload.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/burn/engine/payload.cpp b/src/burn/engine/payload.cpp
index 1d8328e3..270da6aa 100644
--- a/src/burn/engine/payload.cpp
+++ b/src/burn/engine/payload.cpp
@@ -239,6 +239,7 @@ extern "C" void PayloadUninitialize(
239 ReleaseMem(pPayload->pbCertificateRootThumbprint); 239 ReleaseMem(pPayload->pbCertificateRootThumbprint);
240 ReleaseMem(pPayload->pbCertificateRootPublicKeyIdentifier); 240 ReleaseMem(pPayload->pbCertificateRootPublicKeyIdentifier);
241 ReleaseStr(pPayload->sczSourcePath); 241 ReleaseStr(pPayload->sczSourcePath);
242 ReleaseFileHandle(pPayload->hLocalFile);
242 ReleaseStr(pPayload->sczLocalFilePath); 243 ReleaseStr(pPayload->sczLocalFilePath);
243 ReleaseStr(pPayload->sczFailedLocalAcquisitionPath); 244 ReleaseStr(pPayload->sczFailedLocalAcquisitionPath);
244 ReleaseStr(pPayload->downloadSource.sczUrl); 245 ReleaseStr(pPayload->downloadSource.sczUrl);
@@ -278,6 +279,7 @@ extern "C" HRESULT PayloadExtractUXContainer(
278 LPWSTR sczStreamName = NULL; 279 LPWSTR sczStreamName = NULL;
279 LPWSTR sczDirectory = NULL; 280 LPWSTR sczDirectory = NULL;
280 BURN_PAYLOAD* pPayload = NULL; 281 BURN_PAYLOAD* pPayload = NULL;
282 HANDLE hTargetFile = INVALID_HANDLE_VALUE;
281 283
282 // extract all payloads 284 // extract all payloads
283 for (;;) 285 for (;;)
@@ -306,9 +308,18 @@ extern "C" HRESULT PayloadExtractUXContainer(
306 hr = DirEnsureExists(sczDirectory, NULL); 308 hr = DirEnsureExists(sczDirectory, NULL);
307 ExitOnFailure(hr, "Failed to ensure directory exists"); 309 ExitOnFailure(hr, "Failed to ensure directory exists");
308 310
309 hr = ContainerStreamToFile(pContainerContext, pPayload->sczLocalFilePath); 311 hTargetFile = ::CreateFileW(pPayload->sczLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
312 ExitOnInvalidHandleWithLastError(hTargetFile, hr, "Failed to create file: %ls", pPayload->sczLocalFilePath);
313
314 hr = ContainerStreamToHandle(pContainerContext, hTargetFile);
310 ExitOnFailure(hr, "Failed to extract file."); 315 ExitOnFailure(hr, "Failed to extract file.");
311 316
317 // Reopen the payload for read-only access to prevent the file from being removed or tampered with while the BA is running.
318 ReleaseFileHandle(hTargetFile);
319
320 hr = FileCreateWithRetry(pPayload->sczLocalFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 30, 100, &pPayload->hLocalFile);
321 ExitOnFailure(hr, "Failed to open file: %ls", pPayload->sczLocalFilePath);
322
312 // flag that the payload has been acquired 323 // flag that the payload has been acquired
313 pPayload->state = BURN_PAYLOAD_STATE_ACQUIRED; 324 pPayload->state = BURN_PAYLOAD_STATE_ACQUIRED;
314 } 325 }
@@ -326,6 +337,7 @@ extern "C" HRESULT PayloadExtractUXContainer(
326 } 337 }
327 338
328LExit: 339LExit:
340 ReleaseFileHandle(hTargetFile);
329 ReleaseStr(sczStreamName); 341 ReleaseStr(sczStreamName);
330 ReleaseStr(sczDirectory); 342 ReleaseStr(sczDirectory);
331 343