UI/updater: Wait for OBS to close before updating

This commit is contained in:
jp9000 2017-03-06 05:30:58 -08:00
parent 86862b672e
commit 5d136b13a7
2 changed files with 77 additions and 0 deletions

View File

@ -44,6 +44,7 @@ target_link_libraries(updater
${STATIC_ZLIB_PATH}
lzma
blake2
psapi
comctl32
shell32
winhttp

View File

@ -18,6 +18,8 @@
#include "updater.hpp"
#include <psapi.h>
#include <util/windows/CoTaskMemPtr.hpp>
#include <future>
@ -472,6 +474,77 @@ try {
/* ----------------------------------------------------------------------- */
#define WAITIFOBS_SUCCESS 0
#define WAITIFOBS_WRONG_PROCESS 1
#define WAITIFOBS_CANCELLED 2
static inline DWORD WaitIfOBS(DWORD id, const wchar_t *expected)
{
wchar_t name[MAX_PATH];
*name = 0;
WinHandle proc = OpenProcess(
PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ |
SYNCHRONIZE,
false, id);
if (!proc.Valid())
return WAITIFOBS_WRONG_PROCESS;
HMODULE mod;
DWORD temp;
if (!EnumProcessModules(proc, &mod, sizeof(mod), &temp))
return WAITIFOBS_WRONG_PROCESS;
GetModuleBaseName(proc, mod, name, _countof(name));
if (_wcsnicmp(name, expected, 5) == 0) {
HANDLE hWait[2];
hWait[0] = proc;
hWait[1] = cancelRequested;
int i = WaitForMultipleObjects(2, hWait, false, INFINITE);
DWORD err = GetLastError();
if (i == WAIT_OBJECT_0 + 1)
return WAITIFOBS_CANCELLED;
return WAITIFOBS_SUCCESS;
}
return WAITIFOBS_WRONG_PROCESS;
}
static bool WaitForOBS()
{
DWORD proc_ids[1024], needed, count;
const wchar_t *name = is32bit ? L"obs32" : L"obs64";
if (!EnumProcesses(proc_ids, sizeof(proc_ids), &needed)) {
return true;
}
count = needed / sizeof(DWORD);
for (DWORD i = 0; i < count; i++) {
DWORD id = proc_ids[i];
if (id != 0) {
switch (WaitIfOBS(id, name)) {
case WAITIFOBS_SUCCESS:
return true;
case WAITIFOBS_WRONG_PROCESS:
break;
case WAITIFOBS_CANCELLED:
return false;
}
}
}
return true;
}
/* ----------------------------------------------------------------------- */
static inline bool UTF8ToWide(wchar_t *wide, int wideSize, const char *utf8)
{
return !!MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wide, wideSize);
@ -837,6 +910,9 @@ static bool Update(wchar_t *cmdLine)
return false;
}
if (!WaitForOBS())
return false;
/* ------------------------------------- *
* Init crypt stuff */