From a72f1e2c788aab498e3d74287e6020c76740b13c Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Wed, 9 Jan 2013 22:24:36 +0000 Subject: [PATCH] =?UTF-8?q?Na=20Windows=20XP=20zdaj=20namestitev=20spet=20?= =?UTF-8?q?doda=20fiksen=20"naklju=C4=8Den"=20=C4=8Dasovni=20zamik=20izvaj?= =?UTF-8?q?anja=20opravila.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pri zakasnjenih akcijah sem moral dodati zastavico msidbCustomActionTypeNoImpersonate, sicer se je na Windows Vista namestitev razporejenih opravil ni izvedla kot SYSTEM ampak kot uporabnik, ki je pognal namestitev. In to brez dvignjenih privilegijev. Usposobil in preizkusil sem namestitev na Windows XP, Vista in 7. Projekt je s tem uradno uspešno končan! :))) --- MSICALib/MSI/Makefile | 6 +++--- MSICALib/MSITSCAOp.cpp | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/MSICALib/MSI/Makefile b/MSICALib/MSI/Makefile index 27c8ca7..726dd22 100644 --- a/MSICALib/MSI/Makefile +++ b/MSICALib/MSI/Makefile @@ -115,9 +115,9 @@ Action Type Source Target s$(MSI_TIP_ID) i2 S$(MSI_TIP_ID) S255 CustomAction Action EvaluateScheduledTasks 1 binMSITSCA.dll EvaluateScheduledTasks -InstallScheduledTasks 1025 binMSITSCA.dll InstallScheduledTasks -RollbackScheduledTasks 1281 binMSITSCA.dll InstallScheduledTasks -CommitScheduledTasks 1537 binMSITSCA.dll InstallScheduledTasks +InstallScheduledTasks 3073 binMSITSCA.dll InstallScheduledTasks +RollbackScheduledTasks 3329 binMSITSCA.dll InstallScheduledTasks +CommitScheduledTasks 3585 binMSITSCA.dll InstallScheduledTasks < pTrigger; - TASK_TRIGGER &ttData = m_lTriggers.GetNext(pos); + TASK_TRIGGER ttData = m_lTriggers.GetNext(pos); // Don't use reference! We don't want to modify original trigger data by adding random startup delay. hr = pTask->CreateTrigger(&wTriggerIdx, &pTrigger); if (FAILED(hr)) goto finish; + if (ttData.wRandomMinutesInterval) { + // Windows XP doesn't support random startup delay. However, we can add fixed "random" delay when creating the trigger. + WORD wStartTime = ttData.wStartHour * 60 + ttData.wStartMinute + (WORD)::MulDiv(rand(), ttData.wRandomMinutesInterval, RAND_MAX); + FILETIME ftValue; + SYSTEMTIME stValue; + ULONGLONG ullValue; + + // Convert MDY date to numerical date (SYSTEMTIME -> FILETIME -> ULONGLONG). + memset(&stValue, 0, sizeof(SYSTEMTIME)); + stValue.wYear = ttData.wBeginYear; + stValue.wMonth = ttData.wBeginMonth; + stValue.wDay = ttData.wBeginDay; + verify(::SystemTimeToFileTime(&stValue, &ftValue)); + ullValue = ((ULONGLONG)(ftValue.dwHighDateTime) << 32) | ftValue.dwLowDateTime; + + // Wrap days. + while (wStartTime >= 1440) { + ullValue += (ULONGLONG)864000000000; + wStartTime -= 1440; + } + + // Convert numerical date to DMY (ULONGLONG -> FILETIME -> SYSTEMTIME). + ftValue.dwHighDateTime = ullValue >> 32; + ftValue.dwLowDateTime = ullValue & 0xffffffff; + verify(::FileTimeToSystemTime(&ftValue, &stValue)); + + // Set new trigger date and time. + ttData.wBeginYear = stValue.wYear; + ttData.wBeginMonth = stValue.wMonth; + ttData.wBeginDay = stValue.wDay; + ttData.wStartHour = wStartTime / 60; + ttData.wStartMinute = wStartTime % 60; + } + hr = pTrigger->SetTrigger(&ttData); if (FAILED(hr)) goto finish; }