mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-09 21:00:42 +02:00
Differential Revision: https://phabricator.services.mozilla.com/D15756 --HG-- rename : browser/app/winlauncher/NativeNt.h => mozglue/misc/NativeNt.h rename : browser/app/winlauncher/test/TestNativeNt.cpp => mozglue/tests/TestNativeNt.cpp rename : browser/app/winlauncher/LauncherResult.h => toolkit/xre/LauncherResult.h extra : moz-landing-system : lando
64 lines
2.2 KiB
C++
64 lines
2.2 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef mozilla_SameBinary_h
|
|
#define mozilla_SameBinary_h
|
|
|
|
#include "mozilla/LauncherResult.h"
|
|
#include "mozilla/NativeNt.h"
|
|
#include "nsWindowsHelpers.h"
|
|
|
|
namespace mozilla {
|
|
|
|
static inline mozilla::LauncherResult<bool> IsSameBinaryAsParentProcess() {
|
|
mozilla::LauncherResult<DWORD> parentPid = mozilla::nt::GetParentProcessId();
|
|
if (parentPid.isErr()) {
|
|
return LAUNCHER_ERROR_FROM_RESULT(parentPid);
|
|
}
|
|
|
|
nsAutoHandle parentProcess(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
|
|
FALSE, parentPid.unwrap()));
|
|
if (!parentProcess.get()) {
|
|
DWORD err = ::GetLastError();
|
|
if (err == ERROR_INVALID_PARAMETER) {
|
|
// The process identified by parentPid has already exited. This is a
|
|
// common case when the parent process is not Firefox, thus we should
|
|
// return false instead of erroring out.
|
|
return false;
|
|
}
|
|
|
|
return LAUNCHER_ERROR_FROM_WIN32(err);
|
|
}
|
|
|
|
// Using a larger buffer for this call because we're asking for the native NT
|
|
// path, which may exceed MAX_PATH.
|
|
WCHAR parentExe[(MAX_PATH * 2) + 1] = {};
|
|
DWORD parentExeLen = mozilla::ArrayLength(parentExe);
|
|
if (!::QueryFullProcessImageNameW(parentProcess.get(), PROCESS_NAME_NATIVE,
|
|
parentExe, &parentExeLen)) {
|
|
return LAUNCHER_ERROR_FROM_LAST();
|
|
}
|
|
|
|
WCHAR ourExe[MAX_PATH + 1] = {};
|
|
DWORD ourExeOk =
|
|
::GetModuleFileNameW(nullptr, ourExe, mozilla::ArrayLength(ourExe));
|
|
if (!ourExeOk || ourExeOk == mozilla::ArrayLength(ourExe)) {
|
|
return LAUNCHER_ERROR_FROM_LAST();
|
|
}
|
|
|
|
mozilla::WindowsErrorResult<bool> isSame =
|
|
mozilla::DoPathsPointToIdenticalFile(parentExe, ourExe,
|
|
mozilla::PathType::eNtPath);
|
|
if (isSame.isErr()) {
|
|
return LAUNCHER_ERROR_FROM_MOZ_WINDOWS_ERROR(isSame.unwrapErr());
|
|
}
|
|
|
|
return isSame.unwrap();
|
|
}
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_SameBinary_h
|