aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2021-05-16 02:03:49 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2021-05-16 02:11:38 +0300
commita1a531212aa1b73e5cfbf503e59cd5ae28370ccc (patch)
tree3eb1d92c9816b7bf492f9b9d69d38a6bbe906ac7 /src
parentexport pdb::file to winapi-common's File (diff)
downloadwinapi-debug-a1a531212aa1b73e5cfbf503e59cd5ae28370ccc.tar.gz
winapi-debug-a1a531212aa1b73e5cfbf503e59cd5ae28370ccc.zip
export Process to winapi-common
Diffstat (limited to 'src')
-rw-r--r--src/process.cpp130
1 files changed, 0 insertions, 130 deletions
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