diff options
Diffstat (limited to '')
m--------- | 3rdparty/winapi/common | 0 | ||||
-rw-r--r-- | include/pdb/all.hpp | 2 | ||||
-rw-r--r-- | include/pdb/handle.hpp | 29 | ||||
-rw-r--r-- | include/pdb/process.hpp | 38 | ||||
-rw-r--r-- | src/process.cpp | 130 |
5 files changed, 0 insertions, 199 deletions
diff --git a/3rdparty/winapi/common b/3rdparty/winapi/common -Subproject 23aa1a5c37677a38873dc627f4b8077e0390f42 +Subproject bfdf5415b5e025d795a1a7ee89946b00708f50b 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 <Egor.Tensin@gmail.com> -// 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 <windows.h> - -#include <cassert> -#include <memory> - -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<void, CloseHandle> 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 <Egor.Tensin@gmail.com> -// 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 <windows.h> - -#include <string> - -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 <Egor.Tensin@gmail.com> -// 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 <pdb/all.hpp> - -#include <winapi/error.hpp> -#include <winapi/utf8.hpp> - -#include <windows.h> - -#include <limits> -#include <stdexcept> -#include <string> -#include <utility> -#include <vector> - -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<decltype(size)>::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<wchar_t> 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 |