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 --- 3rdparty/winapi/common | 2 +- include/pdb/all.hpp | 2 - include/pdb/handle.hpp | 29 ----------- include/pdb/process.hpp | 38 -------------- src/process.cpp | 130 ------------------------------------------------ 5 files changed, 1 insertion(+), 200 deletions(-) delete mode 100644 include/pdb/handle.hpp delete mode 100644 include/pdb/process.hpp delete mode 100644 src/process.cpp diff --git a/3rdparty/winapi/common b/3rdparty/winapi/common index 23aa1a5..bfdf541 160000 --- a/3rdparty/winapi/common +++ b/3rdparty/winapi/common @@ -1 +1 @@ -Subproject commit 23aa1a5c37677a38873dc627f4b8077e0390f420 +Subproject commit bfdf5415b5e025d795a1a7ee89946b00708f50b2 diff --git a/include/pdb/all.hpp b/include/pdb/all.hpp index 3e6c3e8..968e85d 100644 --- a/include/pdb/all.hpp +++ b/include/pdb/all.hpp @@ -8,8 +8,6 @@ #include "address.hpp" #include "call_stack.hpp" #include "dbghelp.hpp" -#include "handle.hpp" #include "module.hpp" -#include "process.hpp" #include "repo.hpp" #include "symbol.hpp" diff --git a/include/pdb/handle.hpp b/include/pdb/handle.hpp deleted file mode 100644 index 319a581..0000000 --- a/include/pdb/handle.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2017 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. - -#pragma once - -#include "workarounds.hpp" - -#include - -#include -#include - -namespace pdb { - -struct CloseHandle { - void operator()(HANDLE raw) const { - if (raw == NULL || raw == INVALID_HANDLE_VALUE) - return; - const auto ret = ::CloseHandle(raw); - assert(ret); - PDB_UNUSED_PARAMETER(ret); - } -}; - -typedef std::unique_ptr Handle; - -} // namespace pdb diff --git a/include/pdb/process.hpp b/include/pdb/process.hpp deleted file mode 100644 index 7639536..0000000 --- a/include/pdb/process.hpp +++ /dev/null @@ -1,38 +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. - -#pragma once - -#include "handle.hpp" - -#include - -#include - -namespace pdb { - -class Process { -public: - using ID = DWORD; - - static Process current(); - static Process open(ID); - - ID get_id() const { return id; } - - const Handle& get_handle() const { return handle; } - - std::string get_executable_path() const; - static std::string get_executable_path(const Handle&); - -private: - explicit Process(Handle&&); - Process(ID, Handle&&); - - ID id; - Handle handle; -}; - -} // namespace pdb 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