From a1a531212aa1b73e5cfbf503e59cd5ae28370ccc Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sun, 16 May 2021 02:03:49 +0300 Subject: export Process to winapi-common --- src/process.cpp | 130 -------------------------------------------------------- 1 file changed, 130 deletions(-) delete mode 100644 src/process.cpp (limited to 'src') diff --git a/src/process.cpp b/src/process.cpp deleted file mode 100644 index 7763720..0000000 --- a/src/process.cpp +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2020 Egor Tensin -// This file is part of the "winapi-debug" project. -// For details, see https://github.com/egor-tensin/winapi-debug. -// Distributed under the MIT License. - -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include - -namespace pdb { -namespace { - -// Permissions required for MiniDumpWriteDump. -constexpr DWORD permissions = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ; - -Handle open_process(DWORD id) { - Handle process{OpenProcess(permissions, FALSE, id)}; - if (!process) { - throw winapi::error::windows(GetLastError(), "OpenProcess"); - } - return process; -} - -class PathBuffer { -public: - PathBuffer() : size{min_size} { data.resize(size); } - - DWORD get_size() const { return size; } - - wchar_t* get_data() { return data.data(); } - - void grow() { - if (size < min_size) { - size = min_size; - } else { - // Check if we can still multiply by two. - if (std::numeric_limits::max() - size < size) - throw std::range_error{"couldn't allocate buffer sufficient for a file path"}; - size *= 2; - } - data.resize(size); - } - -private: - static constexpr DWORD min_size = 256; - - DWORD size; - std::vector data; -}; - -std::string get_current_executable_path(PathBuffer& buffer) { - SetLastError(ERROR_SUCCESS); - - const auto ec = ::GetModuleFileNameW(NULL, buffer.get_data(), buffer.get_size()); - - if (ec == 0) { - throw winapi::error::windows(GetLastError(), "GetModuleFileNameW"); - } - - if (ec == buffer.get_size() && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - buffer.grow(); - return get_current_executable_path(buffer); - } - - return winapi::narrow(buffer.get_data()); -} - -std::string get_current_executable_path() { - PathBuffer buffer; - return get_current_executable_path(buffer); -} - -std::string get_executable_path(const Handle& process, PathBuffer& buffer) { - auto size = buffer.get_size(); - - const auto ec = ::QueryFullProcessImageNameW(process.get(), 0, buffer.get_data(), &size); - - if (ec != 0) { - return winapi::narrow(buffer.get_data()); - } - - if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { - buffer.grow(); - return get_executable_path(process, buffer); - } - - throw winapi::error::windows(GetLastError(), "QueryFullProcessImageNameW"); -} - -std::string get_executable_path(const Handle& process) { - PathBuffer buffer; - return get_executable_path(process, buffer); -} - -} // namespace - -Process Process::current() { - return Process{::GetCurrentProcessId(), Handle{::GetCurrentProcess()}}; -} - -Process Process::open(DWORD id) { - return Process{id, open_process(id)}; -} - -Process::Process(Handle&& handle) : Process{::GetProcessId(handle.get()), std::move(handle)} {} - -Process::Process(ID id, Handle&& handle) : id{id}, handle{std::move(handle)} {} - -std::string Process::get_executable_path() const { - return get_executable_path(handle); -} - -std::string Process::get_executable_path(const Handle& handle) { - if (handle.get() == ::GetCurrentProcess()) { - return pdb::get_current_executable_path(); - } else { - return pdb::get_executable_path(handle); - } -} - -} // namespace pdb -- cgit v1.2.3