diff options
Diffstat (limited to 'Source/Memory.h')
-rw-r--r-- | Source/Memory.h | 36 |
1 files changed, 11 insertions, 25 deletions
diff --git a/Source/Memory.h b/Source/Memory.h index 5332cc3..803a5f1 100644 --- a/Source/Memory.h +++ b/Source/Memory.h | |||
@@ -4,11 +4,12 @@ | |||
4 | #include <thread> | 4 | #include <thread> |
5 | #include <vector> | 5 | #include <vector> |
6 | #include <windows.h> | 6 | #include <windows.h> |
7 | #include <cassert> | ||
8 | #include "MemoryException.h" | ||
7 | 9 | ||
8 | // #define GLOBALS 0x5B28C0 | 10 | // #define GLOBALS 0x5B28C0 |
9 | #define GLOBALS 0x62D0A0 | 11 | #define GLOBALS 0x62D0A0 |
10 | 12 | ||
11 | #define HEARTBEAT 0x401 | ||
12 | enum class ProcStatus { | 13 | enum class ProcStatus { |
13 | NotRunning, | 14 | NotRunning, |
14 | Running, | 15 | Running, |
@@ -24,7 +25,7 @@ class Memory final : public std::enable_shared_from_this<Memory> { | |||
24 | public: | 25 | public: |
25 | Memory(const std::wstring& processName); | 26 | Memory(const std::wstring& processName); |
26 | ~Memory(); | 27 | ~Memory(); |
27 | void StartHeartbeat(HWND window, std::chrono::milliseconds beat = std::chrono::milliseconds(1000)); | 28 | void StartHeartbeat(HWND window, WPARAM wParam, std::chrono::milliseconds beat = std::chrono::milliseconds(1000)); |
28 | 29 | ||
29 | Memory(const Memory& memory) = delete; | 30 | Memory(const Memory& memory) = delete; |
30 | Memory& operator=(const Memory& other) = delete; | 31 | Memory& operator=(const Memory& other) = delete; |
@@ -63,40 +64,25 @@ public: | |||
63 | private: | 64 | private: |
64 | template<class T> | 65 | template<class T> |
65 | std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) { | 66 | std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) { |
66 | if (numItems == 0) return {}; | 67 | assert(numItems); |
67 | std::vector<T> data; | 68 | std::vector<T> data; |
68 | data.resize(numItems); | 69 | data.resize(numItems); |
69 | void* computedOffset = ComputeOffset(offsets); | 70 | if (!ReadProcessMemory(_handle, ComputeOffset(offsets), &data[0], sizeof(T) * numItems, nullptr)) { |
70 | for (int i=0; i<5; i++) { | 71 | MEMORY_THROW("Failed to read data.", offsets, numItems); |
71 | if (ReadProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * numItems, nullptr)) { | ||
72 | if (i != 0) { | ||
73 | int k = 0; | ||
74 | } | ||
75 | return data; | ||
76 | } | ||
77 | } | 72 | } |
78 | ThrowError(); | 73 | return data; |
79 | return {}; | ||
80 | } | 74 | } |
81 | 75 | ||
82 | template <class T> | 76 | template <class T> |
83 | void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) { | 77 | void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) { |
84 | if (data.empty()) return; | 78 | assert(data.size()); |
85 | void* computedOffset = ComputeOffset(offsets); | 79 | if (!WriteProcessMemory(_handle, ComputeOffset(offsets), &data[0], sizeof(T) * data.size(), nullptr)) { |
86 | for (int i=0; i<5; i++) { | 80 | MEMORY_THROW("Failed to write data.", offsets, data.size()); |
87 | if (WriteProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * data.size(), nullptr)) { | ||
88 | if (i != 0) { | ||
89 | int k = 0; | ||
90 | } | ||
91 | return; | ||
92 | } | ||
93 | } | 81 | } |
94 | ThrowError(); | ||
95 | } | 82 | } |
96 | 83 | ||
97 | void Heartbeat(HWND window); | 84 | void Heartbeat(HWND window, WPARAM wParam); |
98 | bool Initialize(); | 85 | bool Initialize(); |
99 | void ThrowError(); | ||
100 | void* ComputeOffset(std::vector<int> offsets); | 86 | void* ComputeOffset(std::vector<int> offsets); |
101 | 87 | ||
102 | int _previousFrame = 0; | 88 | int _previousFrame = 0; |