diff options
Diffstat (limited to 'src/burn/engine/registration.cpp')
-rw-r--r-- | src/burn/engine/registration.cpp | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/src/burn/engine/registration.cpp b/src/burn/engine/registration.cpp index a1b1b607..fcefe5e0 100644 --- a/src/burn/engine/registration.cpp +++ b/src/burn/engine/registration.cpp | |||
@@ -69,6 +69,7 @@ static HRESULT UpdateResumeMode( | |||
69 | __in BURN_REGISTRATION* pRegistration, | 69 | __in BURN_REGISTRATION* pRegistration, |
70 | __in HKEY hkRegistration, | 70 | __in HKEY hkRegistration, |
71 | __in BURN_RESUME_MODE resumeMode, | 71 | __in BURN_RESUME_MODE resumeMode, |
72 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, | ||
72 | __in BOOL fRestartInitiated | 73 | __in BOOL fRestartInitiated |
73 | ); | 74 | ); |
74 | static HRESULT ParseRelatedCodes( | 75 | static HRESULT ParseRelatedCodes( |
@@ -444,11 +445,8 @@ extern "C" HRESULT RegistrationSetVariables( | |||
444 | HRESULT hr = S_OK; | 445 | HRESULT hr = S_OK; |
445 | LPWSTR scz = NULL; | 446 | LPWSTR scz = NULL; |
446 | 447 | ||
447 | if (pRegistration->fInstalled) | 448 | hr = RegistrationSetDynamicVariables(pRegistration, pVariables); |
448 | { | 449 | ExitOnFailure(hr, "Failed to set the dynamic registration variables."); |
449 | hr = VariableSetNumeric(pVariables, BURN_BUNDLE_INSTALLED, 1, TRUE); | ||
450 | ExitOnFailure(hr, "Failed to set the bundle installed built-in variable."); | ||
451 | } | ||
452 | 450 | ||
453 | // Ensure the registration bundle name is updated. | 451 | // Ensure the registration bundle name is updated. |
454 | hr = GetBundleInProgressName(pRegistration, pVariables, &scz); | 452 | hr = GetBundleInProgressName(pRegistration, pVariables, &scz); |
@@ -469,12 +467,32 @@ extern "C" HRESULT RegistrationSetVariables( | |||
469 | hr = VariableSetVersion(pVariables, BURN_BUNDLE_VERSION, pRegistration->pVersion, TRUE); | 467 | hr = VariableSetVersion(pVariables, BURN_BUNDLE_VERSION, pRegistration->pVersion, TRUE); |
470 | ExitOnFailure(hr, "Failed to overwrite the bundle version built-in variable."); | 468 | ExitOnFailure(hr, "Failed to overwrite the bundle version built-in variable."); |
471 | 469 | ||
470 | LExit: | ||
471 | ReleaseStr(scz); | ||
472 | |||
473 | return hr; | ||
474 | } | ||
475 | |||
476 | /******************************************************************* | ||
477 | RegistrationSetDynamicVariables - Initializes bundle variables that | ||
478 | map to registration entities that can change during execution. | ||
479 | |||
480 | *******************************************************************/ | ||
481 | extern "C" HRESULT RegistrationSetDynamicVariables( | ||
482 | __in BURN_REGISTRATION* pRegistration, | ||
483 | __in BURN_VARIABLES* pVariables | ||
484 | ) | ||
485 | { | ||
486 | HRESULT hr = S_OK; | ||
487 | LONGLONG llInstalled = BOOTSTRAPPER_REGISTRATION_TYPE_FULL == pRegistration->detectedRegistrationType ? 1 : 0; | ||
488 | |||
489 | hr = VariableSetNumeric(pVariables, BURN_BUNDLE_INSTALLED, llInstalled, TRUE); | ||
490 | ExitOnFailure(hr, "Failed to set the bundle installed built-in variable."); | ||
491 | |||
472 | hr = VariableSetNumeric(pVariables, BURN_REBOOT_PENDING, IsWuRebootPending() || IsRegistryRebootPending(), TRUE); | 492 | hr = VariableSetNumeric(pVariables, BURN_REBOOT_PENDING, IsWuRebootPending() || IsRegistryRebootPending(), TRUE); |
473 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); | 493 | ExitOnFailure(hr, "Failed to overwrite the bundle reboot-pending built-in variable."); |
474 | 494 | ||
475 | LExit: | 495 | LExit: |
476 | ReleaseStr(scz); | ||
477 | |||
478 | return hr; | 496 | return hr; |
479 | } | 497 | } |
480 | 498 | ||
@@ -487,12 +505,15 @@ extern "C" HRESULT RegistrationDetectInstalled( | |||
487 | DWORD dwInstalled = 0; | 505 | DWORD dwInstalled = 0; |
488 | 506 | ||
489 | pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); | 507 | pRegistration->fCached = FileExistsEx(pRegistration->sczCacheExecutablePath, NULL); |
508 | pRegistration->detectedRegistrationType = BOOTSTRAPPER_REGISTRATION_TYPE_NONE; | ||
490 | 509 | ||
491 | // open registration key | 510 | // open registration key |
492 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration); | 511 | hr = RegOpen(pRegistration->hkRoot, pRegistration->sczRegistrationKey, KEY_QUERY_VALUE, &hkRegistration); |
493 | if (SUCCEEDED(hr)) | 512 | if (SUCCEEDED(hr)) |
494 | { | 513 | { |
495 | hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled); | 514 | hr = RegReadNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, &dwInstalled); |
515 | |||
516 | pRegistration->detectedRegistrationType = (1 == dwInstalled) ? BOOTSTRAPPER_REGISTRATION_TYPE_FULL : BOOTSTRAPPER_REGISTRATION_TYPE_INPROGRESS; | ||
496 | } | 517 | } |
497 | 518 | ||
498 | // Not finding the key or value is okay. | 519 | // Not finding the key or value is okay. |
@@ -501,8 +522,6 @@ extern "C" HRESULT RegistrationDetectInstalled( | |||
501 | hr = S_OK; | 522 | hr = S_OK; |
502 | } | 523 | } |
503 | 524 | ||
504 | pRegistration->fInstalled = (1 == dwInstalled); | ||
505 | |||
506 | ReleaseRegKey(hkRegistration); | 525 | ReleaseRegKey(hkRegistration); |
507 | return hr; | 526 | return hr; |
508 | } | 527 | } |
@@ -833,7 +852,7 @@ extern "C" HRESULT RegistrationSessionBegin( | |||
833 | } | 852 | } |
834 | 853 | ||
835 | // update resume mode | 854 | // update resume mode |
836 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, FALSE); | 855 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, registrationType, FALSE); |
837 | ExitOnFailure(hr, "Failed to update resume mode."); | 856 | ExitOnFailure(hr, "Failed to update resume mode."); |
838 | 857 | ||
839 | LExit: | 858 | LExit: |
@@ -864,7 +883,7 @@ extern "C" HRESULT RegistrationSessionResume( | |||
864 | ExitOnFailure(hr, "Failed to open registration key."); | 883 | ExitOnFailure(hr, "Failed to open registration key."); |
865 | 884 | ||
866 | // update resume mode | 885 | // update resume mode |
867 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, FALSE); | 886 | hr = UpdateResumeMode(pRegistration, hkRegistration, BURN_RESUME_MODE_ACTIVE, registrationType, FALSE); |
868 | ExitOnFailure(hr, "Failed to update resume mode."); | 887 | ExitOnFailure(hr, "Failed to update resume mode."); |
869 | 888 | ||
870 | // update display name | 889 | // update display name |
@@ -934,7 +953,7 @@ extern "C" HRESULT RegistrationSessionEnd( | |||
934 | } | 953 | } |
935 | 954 | ||
936 | // Update resume mode. | 955 | // Update resume mode. |
937 | hr = UpdateResumeMode(pRegistration, hkRegistration, resumeMode, BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart); | 956 | hr = UpdateResumeMode(pRegistration, hkRegistration, resumeMode, registrationType, BOOTSTRAPPER_APPLY_RESTART_INITIATED == restart); |
938 | ExitOnFailure(hr, "Failed to update resume mode."); | 957 | ExitOnFailure(hr, "Failed to update resume mode."); |
939 | 958 | ||
940 | LExit: | 959 | LExit: |
@@ -1271,6 +1290,7 @@ static HRESULT UpdateResumeMode( | |||
1271 | __in BURN_REGISTRATION* pRegistration, | 1290 | __in BURN_REGISTRATION* pRegistration, |
1272 | __in HKEY hkRegistration, | 1291 | __in HKEY hkRegistration, |
1273 | __in BURN_RESUME_MODE resumeMode, | 1292 | __in BURN_RESUME_MODE resumeMode, |
1293 | __in BOOTSTRAPPER_REGISTRATION_TYPE registrationType, | ||
1274 | __in BOOL fRestartInitiated | 1294 | __in BOOL fRestartInitiated |
1275 | ) | 1295 | ) |
1276 | { | 1296 | { |
@@ -1289,16 +1309,9 @@ static HRESULT UpdateResumeMode( | |||
1289 | hr = RegWriteNumber(hkRegistration, L"Resume", (DWORD)resumeMode); | 1309 | hr = RegWriteNumber(hkRegistration, L"Resume", (DWORD)resumeMode); |
1290 | ExitOnFailure(hr, "Failed to write Resume value."); | 1310 | ExitOnFailure(hr, "Failed to write Resume value."); |
1291 | 1311 | ||
1292 | // Write the Installed value *only* when the mode is ARP. This will tell us | 1312 | // Write Installed value. |
1293 | // that the bundle considers itself "installed" on the machine. Note that we | 1313 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, BOOTSTRAPPER_REGISTRATION_TYPE_FULL == registrationType ? 1 : 0); |
1294 | // never change the value to "0" after that. The bundle will be considered | 1314 | ExitOnFailure(hr, "Failed to write Installed value."); |
1295 | // "uninstalled" when all of the registration is removed. | ||
1296 | if (BURN_RESUME_MODE_ARP == resumeMode) | ||
1297 | { | ||
1298 | // Write Installed value. | ||
1299 | hr = RegWriteNumber(hkRegistration, REGISTRY_BUNDLE_INSTALLED, 1); | ||
1300 | ExitOnFailure(hr, "Failed to write Installed value."); | ||
1301 | } | ||
1302 | } | 1315 | } |
1303 | 1316 | ||
1304 | // If the engine is active write the run key so we resume if there is an unexpected | 1317 | // If the engine is active write the run key so we resume if there is an unexpected |