From 308e358d3f37394e8515162b1abd6e7d5f56c442 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 16 Aug 2010 18:34:30 +0000 Subject: [PATCH] Fix Auto-Shutdown feature on Windows --- src/bittorrent.cpp | 2 ++ src/misc.cpp | 28 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 8571ad3a6..8d0fee847 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -2035,6 +2035,8 @@ void Bittorrent::addConsoleMessage(QString msg, QString) { saveFastResumeData(); delete s; misc::shutdownComputer(); + exiting = true; + qApp->exit(); } } } diff --git a/src/misc.cpp b/src/misc.cpp index 43dcff322..4b53bf7ff 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -234,7 +234,33 @@ void misc::shutdownComputer() { AEDisposeDesc(&eventReply); #endif #ifdef Q_WS_WIN - InitiateSystemShutdownA(0, qPrintable(tr("qBittorrent will shutdown the computer now because all downloads are complete.")), 10, true, false); + HANDLE hToken; // handle to process token + TOKEN_PRIVILEGES tkp; // pointer to token structure + if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) + return; + // Get the LUID for shutdown privilege. + LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, + &tkp.Privileges[0].Luid); + + tkp.PrivilegeCount = 1; // one privilege to set + tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + // Get shutdown privilege for this process. + + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, + (PTOKEN_PRIVILEGES) NULL, 0); + + // Cannot test the return value of AdjustTokenPrivileges. + + if (GetLastError() != ERROR_SUCCESS) + return; + bool ret = InitiateSystemShutdownA(0, tr("qBittorrent will shutdown the computer now because all downloads are complete.").toLocal8Bit().data(), 10, true, false); + qDebug("ret: %d", (int)ret); + + // Disable shutdown privilege. + tkp.Privileges[0].Attributes = 0; + AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, + (PTOKEN_PRIVILEGES) NULL, 0); #endif }