updater: Check if awaited instance matches current install

Also replaces any secondary usages of GetCurrentDirectory with cached
static variable.

Co-Authored-By: Richard Stanway <r1ch@r1ch.net>
This commit is contained in:
derrod
2023-01-25 07:45:42 +01:00
committed by Ryan Foster
parent 0516371823
commit 8ba646c842

View File

@@ -48,6 +48,7 @@ int completedFileSize = 0;
static int completedUpdates = 0;
static wchar_t tempPath[MAX_PATH];
static wchar_t obs_base_directory[MAX_PATH];
struct LastError {
DWORD code;
@@ -516,6 +517,8 @@ static inline DWORD WaitIfOBS(DWORD id, const wchar_t *expected)
{
wchar_t path[MAX_PATH];
wchar_t *name;
DWORD path_len = _countof(path);
*path = 0;
WinHandle proc = OpenProcess(PROCESS_QUERY_INFORMATION |
@@ -524,7 +527,12 @@ static inline DWORD WaitIfOBS(DWORD id, const wchar_t *expected)
if (!proc.Valid())
return WAITIFOBS_WRONG_PROCESS;
if (!GetProcessImageFileName(proc, path, _countof(path)))
if (!QueryFullProcessImageNameW(proc, 0, path, &path_len))
return WAITIFOBS_WRONG_PROCESS;
// check it's actually our exe that's running
size_t len = wcslen(obs_base_directory);
if (wcsncmp(path, obs_base_directory, len))
return WAITIFOBS_WRONG_PROCESS;
name = wcsrchr(path, L'\\');
@@ -1386,7 +1394,8 @@ static bool Update(wchar_t *cmdLine)
lpAppDataPath[0] = 0;
if (bIsPortable) {
GetCurrentDirectory(_countof(lpAppDataPath), lpAppDataPath);
StringCbCopy(lpAppDataPath, sizeof(lpAppDataPath),
obs_base_directory);
StringCbCat(lpAppDataPath, sizeof(lpAppDataPath), L"\\config");
} else {
if (!appdata.empty()) {
@@ -1712,7 +1721,7 @@ static bool Update(wchar_t *cmdLine)
SHGFP_TYPE_CURRENT, regsvr);
StringCbCat(regsvr, sizeof(regsvr), L"\\regsvr32.exe");
GetCurrentDirectoryW(_countof(src), src);
StringCbCopy(src, sizeof(src), obs_base_directory);
StringCbCat(src, sizeof(src),
L"\\data\\obs-plugins\\win-dshow\\");
@@ -1811,13 +1820,10 @@ static void CancelUpdate(bool quit)
static void LaunchOBS(bool portable)
{
wchar_t cwd[MAX_PATH];
wchar_t newCwd[MAX_PATH];
wchar_t obsPath[MAX_PATH];
GetCurrentDirectory(_countof(cwd) - 1, cwd);
StringCbCopy(obsPath, sizeof(obsPath), cwd);
StringCbCopy(obsPath, sizeof(obsPath), obs_base_directory);
StringCbCat(obsPath, sizeof(obsPath), L"\\bin\\64bit");
SetCurrentDirectory(obsPath);
StringCbCopy(newCwd, sizeof(newCwd), obsPath);
@@ -1955,7 +1961,6 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int)
INITCOMMONCONTROLSEX icce;
wchar_t cwd[MAX_PATH];
wchar_t newPath[MAX_PATH];
GetCurrentDirectoryW(_countof(cwd) - 1, cwd);
bool isPortable = wcsstr(lpCmdLine, L"Portable") != nullptr ||
@@ -1991,9 +1996,9 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int)
/* return code 1 = user wanted to launch OBS */
if (RestartAsAdmin(lpCmdLine, cwd) == 1) {
StringCbCat(cwd, sizeof(cwd), L"\\..\\..");
GetFullPathName(cwd, _countof(newPath), newPath,
nullptr);
SetCurrentDirectory(newPath);
GetFullPathName(cwd, _countof(obs_base_directory),
obs_base_directory, nullptr);
SetCurrentDirectory(obs_base_directory);
LaunchOBS(isPortable);
}
@@ -2006,8 +2011,9 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int)
return 0;
} else {
StringCbCat(cwd, sizeof(cwd), L"\\..\\..");
GetFullPathName(cwd, _countof(newPath), newPath, nullptr);
SetCurrentDirectory(newPath);
GetFullPathName(cwd, _countof(obs_base_directory),
obs_base_directory, nullptr);
SetCurrentDirectory(obs_base_directory);
hinstMain = hInstance;