Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Beatrici <git@davidebeatrici.dev>2020-10-28 21:26:53 +0300
committerDavide Beatrici <git@davidebeatrici.dev>2020-10-28 21:26:56 +0300
commit253b814ba56dbfe22927428857e3db3a1c92dc5d (patch)
treed28055d22aad1b81bc19492efd1d88b001d73df1 /plugins/ProcessWindows.cpp
parent5debd105e33835d5e7f8681cecae5ccf225c19a7 (diff)
FEAT(plugins): Add classes for process-related functions
Since most of the functions are already using C++, why not use classes as well? This commit introduces the following classes: - HostLinux: can only be compiled on Linux. Implements peek() and module(). - HostWindows: can only be compiled on Windows. Implements peek() and module(). - Process: abstract (cannot be instantiated directly). Inherits from HostLinux on Linux and from HostWindows on Windows. Provides functions that can be used with both Linux and Windows processes. Pure virtual functions are implemented in the following classes: - ProcessLinux: meant to be used with Linux processes, inherits from Process. Only implements exportedSymbol(), due to the other functions being universal. The constructor detects the architecture through the ELF header. - ProcessWindows: meant to be used with Windows processes, inherits from Process. Only implements exportedSymbol(), due to the other functions being universal. The constructor detects the architecture through the NT header.
Diffstat (limited to 'plugins/ProcessWindows.cpp')
-rw-r--r--plugins/ProcessWindows.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/plugins/ProcessWindows.cpp b/plugins/ProcessWindows.cpp
new file mode 100644
index 000000000..d94a9157a
--- /dev/null
+++ b/plugins/ProcessWindows.cpp
@@ -0,0 +1,88 @@
+// Copyright 2020 The Mumble Developers. All rights reserved.
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file at the root of the
+// Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+#include "ProcessWindows.h"
+
+#include "mumble_plugin_win32_internals.h"
+
+ProcessWindows::ProcessWindows(const procid_t id, const std::string &name) : Process(id, name) {
+ if (!m_ok) {
+ return;
+ }
+
+ m_ok = false;
+
+ const auto address = module(name);
+ if (!address) {
+ return;
+ }
+
+ const auto dos = peek< ImageDosHeader >(address);
+ if (!(dos.magic[0] == 'M' && dos.magic[1] == 'Z')) {
+ return;
+ }
+
+ const auto nt = peek< ImageNtHeadersNoOptional >(address + dos.addressOfNtHeader);
+ if (!(nt.signature[0] == 'P' && nt.signature[1] == 'E' && nt.signature[2] == '\0' && nt.signature[3] == '\0')) {
+ return;
+ }
+
+ switch (nt.fileHeader.machine) {
+ case 0x14c: // IMAGE_FILE_MACHINE_I386
+ m_pointerSize = 4;
+ break;
+ default:
+ m_pointerSize = 8;
+ }
+
+ m_ok = true;
+}
+
+ProcessWindows::~ProcessWindows() {
+}
+
+template< typename ImageNtHeaders >
+static procptr_t exportedSymbol(const Process &proc, const std::string &symbol, const procptr_t module) {
+ const auto dos = proc.peek< ImageDosHeader >(module);
+ if (!(dos.magic[0] == 'M' && dos.magic[1] == 'Z')) {
+ return 0;
+ }
+
+ const auto nt = proc.peek< ImageNtHeaders >(module + dos.addressOfNtHeader);
+ if (!(nt.signature[0] == 'P' && nt.signature[1] == 'E' && nt.signature[2] == '\0' && nt.signature[3] == '\0')) {
+ return 0;
+ }
+
+ const auto dataAddress = nt.optionalHeader.dataDirectory[0].virtualAddress;
+ if (!dataAddress) {
+ return 0;
+ }
+
+ const auto exportDir = proc.peek< ImageExportDirectory >(module + dataAddress);
+
+ const auto funcs = proc.peekVector< uint32_t >(module + exportDir.addressOfFunctions, exportDir.numberOfFunctions);
+ const auto names = proc.peekVector< uint32_t >(module + exportDir.addressOfNames, exportDir.numberOfNames);
+ const auto ords = proc.peekVector< uint16_t >(module + exportDir.addressOfNameOrdinals, exportDir.numberOfNames);
+
+ for (uint32_t i = 0; i < exportDir.numberOfNames; ++i) {
+ if (names[i]) {
+ const auto name = proc.peekString(module + names[i], symbol.size());
+
+ if (name == symbol) {
+ return module + funcs[ords[i]];
+ }
+ }
+ }
+
+ return 0;
+}
+
+procptr_t ProcessWindows::exportedSymbol(const std::string &symbol, const procptr_t module) const {
+ if (m_pointerSize > 4) {
+ return ::exportedSymbol< ImageNtHeaders64 >(*this, symbol, module);
+ } else {
+ return ::exportedSymbol< ImageNtHeaders32 >(*this, symbol, module);
+ }
+}