| 56 | } |
| 57 | |
| 58 | bool TryReadProcessMemory(HANDLE process, const void* address, void* buffer, size_t size, size_t* bytesRead = nullptr) { |
| 59 | SIZE_T read = 0; |
| 60 | const bool ok = ::ReadProcessMemory(process, address, buffer, size, &read) != FALSE; |
| 61 | if (!ok) { |
| 62 | OSTP_LOG_TRACE("ReadProcessMemory(addr={:#x}, size={}) failed (read={}, error={})", |
| 63 | reinterpret_cast<uintptr_t>(address), size, static_cast<size_t>(read), GetLastError()); |
| 64 | } |
| 65 | if (bytesRead) *bytesRead = static_cast<size_t>(read); |
| 66 | return ok; |
| 67 | } |
| 68 | |
| 69 | template <typename T> |
| 70 | std::optional<T> ReadRemoteValue(HANDLE process, const void* address) { |
no outgoing calls
no test coverage detected