From e263e6bca03d783ece2f2dc86345dcdfc4b9776d Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Fri, 2 Sep 2022 16:08:29 -0500 Subject: Delay closing the bundle log so that restart failures will be logged. --- src/burn/engine/engine.cpp | 68 ++++++++++++++------------- src/burn/engine/engine.mc | 7 +++ src/libs/dutil/WixToolset.DUtil/inc/logutil.h | 8 +++- src/libs/dutil/WixToolset.DUtil/logutil.cpp | 50 ++++++++++++++++++-- 4 files changed, 95 insertions(+), 38 deletions(-) diff --git a/src/burn/engine/engine.cpp b/src/burn/engine/engine.cpp index 628708f5..13d23ecd 100644 --- a/src/burn/engine/engine.cpp +++ b/src/burn/engine/engine.cpp @@ -297,6 +297,41 @@ LExit: hr = SUCCEEDED(hr) ? HRESULT_FROM_WIN32(ERROR_SUCCESS_REBOOT_REQUIRED) : HRESULT_FROM_WIN32(ERROR_FAIL_REBOOT_REQUIRED); } + if (fRunNormal) + { + LogId(REPORT_STANDARD, MSG_EXITING, FAILED(hr) ? (int)hr : *pdwExitCode, LoggingBoolToString(fRestart)); + } + else if (fRunUntrusted) + { + LogId(REPORT_STANDARD, MSG_EXITING_CLEAN_ROOM, FAILED(hr) ? (int)hr : *pdwExitCode); + } + else if (fRunRunOnce) + { + LogId(REPORT_STANDARD, MSG_EXITING_RUN_ONCE, FAILED(hr) ? (int)hr : *pdwExitCode); + } + else if (fRunElevated) + { + LogId(REPORT_STANDARD, MSG_EXITING_ELEVATED, FAILED(hr) ? (int)hr : *pdwExitCode); + } + + if (fLogInitialized) + { + // Leave the log open before calling restart so messages can be logged from there. + // Best effort to make sure all previous messages are written to disk in case the restart causes messages to be lost in buffers. + LogFlush(); + } + + if (fRestart) + { + LogId(REPORT_STANDARD, MSG_RESTARTING); + + HRESULT hrRestart = Restart(); + if (FAILED(hrRestart)) + { + LogErrorId(hrRestart, MSG_RESTART_FAILED); + } + } + UninitializeEngineState(&engineState); if (fXmlInitialized) @@ -329,42 +364,9 @@ LExit: ::CoUninitialize(); } - if (fRunNormal) - { - LogId(REPORT_STANDARD, MSG_EXITING, FAILED(hr) ? (int)hr : *pdwExitCode, LoggingBoolToString(fRestart)); - - if (fRestart) - { - LogId(REPORT_STANDARD, MSG_RESTARTING); - } - } - else if (fRunUntrusted) - { - LogId(REPORT_STANDARD, MSG_EXITING_CLEAN_ROOM, FAILED(hr) ? (int)hr : *pdwExitCode); - } - else if (fRunRunOnce) - { - LogId(REPORT_STANDARD, MSG_EXITING_RUN_ONCE, FAILED(hr) ? (int)hr : *pdwExitCode); - } - else if (fRunElevated) - { - LogId(REPORT_STANDARD, MSG_EXITING_ELEVATED, FAILED(hr) ? (int)hr : *pdwExitCode); - } - - if (fLogInitialized) { DutilUninitialize(); - LogClose(FALSE); - } - - if (fRestart) - { - Restart(); - } - - if (fLogInitialized) - { LogUninitialize(FALSE); } diff --git a/src/burn/engine/engine.mc b/src/burn/engine/engine.mc index 32616721..dab1a504 100644 --- a/src/burn/engine/engine.mc +++ b/src/burn/engine/engine.mc @@ -184,6 +184,13 @@ Language=English Elevated engine process is not running with elevated privileges. Either run the bundle as a privileged user or reconfigure Windows to allow standard users to request elevation. . +MessageId=23 +Severity=Error +SymbolicName=MSG_RESTART_FAILED +Language=English +The restart request failed, error: %1!ls!. The machine will need to be manually restarted. +. + MessageId=51 Severity=Error SymbolicName=MSG_FAILED_PARSE_CONDITION diff --git a/src/libs/dutil/WixToolset.DUtil/inc/logutil.h b/src/libs/dutil/WixToolset.DUtil/inc/logutil.h index 0ad8510a..fba1e81e 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/logutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/logutil.h @@ -81,6 +81,12 @@ HRESULT DAPI LogRename( __in_z LPCWSTR wzNewPath ); +/******************************************************************** + LogFlush - calls ::FlushFileBuffers with the log file handle. + +********************************************************************/ +HRESULT DAPI LogFlush(); + void DAPI LogClose( __in BOOL fFooter ); @@ -344,7 +350,7 @@ HRESULT DAPI LogFooter(); LogStringWorkRaw - Write a raw, unformatted string to the log ********************************************************************/ -HRESULT LogStringWorkRaw( +HRESULT DAPI LogStringWorkRaw( __in_z LPCSTR szLogData ); diff --git a/src/libs/dutil/WixToolset.DUtil/logutil.cpp b/src/libs/dutil/WixToolset.DUtil/logutil.cpp index 606279c7..0a77a468 100644 --- a/src/libs/dutil/WixToolset.DUtil/logutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/logutil.cpp @@ -40,6 +40,9 @@ static LPCSTR LOGUTIL_DEBUG = "debug"; static LPCSTR LOGUTIL_NONE = "none"; // prototypes +static HRESULT LogStringWorkRawUnsynchronized( + __in_z LPCSTR szLogData + ); static HRESULT LogIdWork( __in REPORT_LEVEL rl, __in_opt HMODULE hModule, @@ -245,6 +248,29 @@ LExit: } +extern "C" HRESULT DAPI LogFlush() +{ + HRESULT hr = S_OK; + + ::EnterCriticalSection(&LogUtil_csLog); + + if (INVALID_HANDLE_VALUE == LogUtil_hLog) + { + ExitFunction1(hr = S_FALSE); + } + + if (!::FlushFileBuffers(LogUtil_hLog)) + { + LoguExitWithLastError(hr, "Failed to flush log file buffers."); + } + +LExit: + ::LeaveCriticalSection(&LogUtil_csLog); + + return hr; +} + + extern "C" void DAPI LogClose( __in BOOL fFooter ) @@ -630,7 +656,26 @@ extern "C" HRESULT DAPI LogFooter() return hr; } -extern "C" HRESULT LogStringWorkRaw( +extern "C" HRESULT DAPI LogStringWorkRaw( + __in_z LPCSTR szLogData + ) +{ + HRESULT hr = S_OK; + + ::EnterCriticalSection(&LogUtil_csLog); + + hr = LogStringWorkRawUnsynchronized(szLogData); + + ::LeaveCriticalSection(&LogUtil_csLog); + + return hr; +} + +// +// private worker functions +// + +static HRESULT LogStringWorkRawUnsynchronized( __in_z LPCSTR szLogData ) { @@ -671,9 +716,6 @@ LExit: return hr; } -// -// private worker functions -// static HRESULT LogIdWork( __in REPORT_LEVEL rl, __in_opt HMODULE hModule, -- cgit v1.2.3-55-g6feb