/app/views/admin/blogs/

value='88bdc2502a29b37b900d25612dec835e008189f1'>this commit Mod for The Witness that makes every puzzle into a straight line
about summary refs log blame commit diff stats
path: root/Source/Memory.h
blob: b7edb282642e722065cf98c41b7392de50aa30db (plain) (tree)
1
2
3
4
5
6
7
8
9
            
                     
              
                 
                 

                    

                           
 
                       





                       



                                                           
                                                                                            
                                                                  
       

                                            
                                                                                                       
 

                                                    
 



                                                                   
 



                                                                     
 

                                                                        
                                                                                                                                        
                                        
                                                       

                                     
 



                                                                    
 



                                                                          
 

                                                                                                        
 
        

                                                                               
                                     

                              
                                                      

                                                                                                      


                              








                                                                                 
                                 
                                                      

                                                                                                          


                              




                       
 
                                


                                                  
 



                               












                                                      


                       

                        


































































                                         

                        


































































                                         
#pragma once
#include <functional>
#include <map>
#include <thread>
#include <vector>
#include <windows.h>

#define GLOBALS 0x5B28C0
// #define GLOBALS 0x62D0A0

#define HEARTBEAT 0x401
enum class ProcStatus {
    NotRunning,
    Running,
    NewGame
};

// https://github.com/erayarslan/WriteProcessMemory-Example
// http://stackoverflow.com/q/32798185
// http://stackoverflow.com/q/36018838
// http://stackoverflow.com/q/1387064
// https://github.com/fkloiber/witness-trainer/blob/master/source/foreign_process_memory.cpp
class Memory final : public std::enable_shared_from_this<Memory> {
public:
    Memory(const std::wstring& processName);
    ~Memory();
    void StartHeartbeat(HWND window, std::chrono::milliseconds beat = std::chrono::milliseconds(1000));

    Memory(const Memory& memory) = delete;
    Memory& operator=(const Memory& other) = delete;

    template <class T>
    std::vector<T> ReadArray(int id, int offset, int size) {
        return ReadData<T>({GLOBALS, 0x18, id*8, offset, 0}, size);
    }

    template <class T>
    void WriteArray(int id, int offset, const std::vector<T>& data) {
        WriteData({GLOBALS, 0x18, id*8, offset, 0}, data);
    }

    template <class T>
    void WriteNewArray(int id, int offset, const std::vector<T>& data) {
        uintptr_t addr = (uintptr_t)VirtualAllocEx(_handle, nullptr, data.size() * sizeof(T), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
        _allocations.emplace_back(addr);
        WriteEntityData<uintptr_t>(id, offset, {addr});
        WriteArray(id, offset, data);
    }

    template <class T>
    std::vector<T> ReadEntityData(int id, int offset, size_t size) {
        return ReadData<T>({GLOBALS, 0x18, id*8, offset}, size);
    }

    template <class T>
    void WriteEntityData(int id, int offset, const std::vector<T>& data) {
        WriteData({GLOBALS, 0x18, id*8, offset}, data);
    }

    void AddSigScan(const std::vector<byte>& scanBytes, const std::function<void(int index)>& scanFunc);
    int ExecuteSigScans();

private:
    template<class T>
    std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) {
        if (numItems == 0) return {};
        std::vector<T> data;
        data.resize(numItems);
        void* computedOffset = ComputeOffset(offsets);
        for (int i=0; i<5; i++) {
            if (ReadProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * numItems, nullptr)) {
                if (i != 0) {
                    int k = 0;
                }
                return data;
            }
        }
        ThrowError();
        return {};
    }

    template <class T>
    void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) {
        if (data.empty()) return;
        void* computedOffset = ComputeOffset(offsets);
        for (int i=0; i<5; i++) {
            if (WriteProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * data.size(), nullptr)) {
                if (i != 0) {
                    int k = 0;
                }
                return;
            }
        }
        ThrowError();
    }

    void Heartbeat(HWND window);
    bool Initialize();
    void ThrowError();
    void* ComputeOffset(std::vector<int> offsets);

    int _previousFrame = 0;
    bool _threadActive = false;
    std::thread _thread;
    std::wstring _processName;
    std::map<uintptr_t, uintptr_t> _computedAddresses;
    uintptr_t _baseAddress = 0;
    HANDLE _handle = nullptr;
    std::vector<uintptr_t> _allocations;
    struct SigScan {
        std::function<void(int)> scanFunc;
        bool found;
    };
    std::map<std::vector<byte>, SigScan> _sigScans;

    friend class Temp;
    friend class ChallengeRandomizer;
    friend class Randomizer;
};

#if GLOBALS == 0x5B28C0
#define POSITION 0x24
#define ORIENTATION 0x34
#define PATH_COLOR 0xC8
#define REFLECTION_PATH_COLOR 0xD8
#define DOT_COLOR 0xF8
#define ACTIVE_COLOR 0x108
#define BACKGROUND_REGION_COLOR 0x118
#define SUCCESS_COLOR_A 0x128
#define SUCCESS_COLOR_B 0x138
#define STROBE_COLOR_A 0x148
#define STROBE_COLOR_B 0x158
#define ERROR_COLOR 0x168
#define PATTERN_POINT_COLOR 0x188
#define PATTERN_POINT_COLOR_A 0x198
#define PATTERN_POINT_COLOR_B 0x1A8
#define SYMBOL_A 0x1B8
#define SYMBOL_B 0x1C8
#define SYMBOL_C 0x1D8
#define SYMBOL_D 0x1E8
#define SYMBOL_E 0x1F8
#define PUSH_SYMBOL_COLORS 0x208
#define OUTER_BACKGROUND 0x20C
#define OUTER_BACKGROUND_MODE 0x21C
#define TRACED_EDGES 0x230
#define AUDIO_PREFIX 0x278
#define POWER 0x2A8
#define TARGET 0x2BC
#define POWER_OFF_ON_FAIL 0x2C0
#define IS_CYLINDER 0x2FC
#define CYLINDER_Z0 0x300
#define CYLINDER_Z1 0x304
#define CYLINDER_RADIUS 0x308
#define CURSOR_SPEED_SCALE 0x358
#define NEEDS_REDRAW 0x384
#define SPECULAR_ADD 0x398
#define SPECULAR_POWER 0x39C
#define PATH_WIDTH_SCALE 0x3A4
#define STARTPOINT_SCALE 0x3A8
#define NUM_DOTS 0x3B8
#define NUM_CONNECTIONS 0x3BC
#define MAX_BROADCAST_DISTANCE 0x3C0
#define DOT_POSITIONS 0x3C8
#define DOT_FLAGS 0x3D0
#define DOT_CONNECTION_A 0x3D8
#define DOT_CONNECTION_B 0x3E0
#define DECORATIONS 0x420
#define DECORATION_FLAGS 0x428
#define DECORATION_COLORS 0x430
#define NUM_DECORATIONS 0x438
#define REFLECTION_DATA 0x440
#define GRID_SIZE_X 0x448
#define GRID_SIZE_Y 0x44C
#define STYLE_FLAGS 0x450
#define SEQUENCE_LEN 0x45C
#define SEQUENCE 0x460
#define DOT_SEQUENCE_LEN 0x468
#define DOT_SEQUENCE 0x470
#define DOT_SEQUENCE_LEN_REFLECTION 0x478
#define DOT_SEQUENCE_REFLECTION 0x480
#define NUM_COLORED_REGIONS 0x4A0
#define COLORED_REGIONS 0x4A8
#define PANEL_TARGET 0x4B0
#define SPECULAR_TEXTURE 0x4D8
#define CABLE_TARGET_2 0xD8
#define AUDIO_LOG_NAME 0xC8
#define OPEN_RATE 0xE8
#define METADATA 0xF2 // sizeof(short)
#define HOTEL_EP_NAME 0x4BC640
#elif GLOBALS == 0x62D0A0
#define POSITION 0x24
#define ORIENTATION 0x34
#define PATH_COLOR 0xC0
#define REFLECTION_PATH_COLOR 0xD0
#define DOT_COLOR 0xF0
#define ACTIVE_COLOR 0x100
#define BACKGROUND_REGION_COLOR 0x110
#define SUCCESS_COLOR_A 0x120
#define SUCCESS_COLOR_B 0x130
#define STROBE_COLOR_A 0x140
#define STROBE_COLOR_B 0x150
#define ERROR_COLOR 0x160
#define PATTERN_POINT_COLOR 0x180
#define PATTERN_POINT_COLOR_A 0x190
#define PATTERN_POINT_COLOR_B 0x1A0
#define SYMBOL_A 0x1B0
#define SYMBOL_B 0x1C0
#define SYMBOL_C 0x1D0
#define SYMBOL_D 0x1E0
#define SYMBOL_E 0x1F0
#define PUSH_SYMBOL_COLORS 0x200
#define OUTER_BACKGROUND 0x204
#define OUTER_BACKGROUND_MODE 0x214
#define TRACED_EDGES 0x228
#define AUDIO_PREFIX 0x270
#define POWER 0x2A0
#define TARGET 0x2B4
#define POWER_OFF_ON_FAIL 0x2B8
#define IS_CYLINDER 0x2F4
#define CYLINDER_Z0 0x2F8
#define CYLINDER_Z1 0x2FC
#define CYLINDER_RADIUS 0x300
#define CURSOR_SPEED_SCALE 0x350
#define NEEDS_REDRAW 0x37C
#define SPECULAR_ADD 0x38C
#define SPECULAR_POWER 0x390
#define PATH_WIDTH_SCALE 0x39C
#define STARTPOINT_SCALE 0x3A0
#define NUM_DOTS 0x3B4
#define NUM_CONNECTIONS 0x3B8
#define MAX_BROADCAST_DISTANCE 0x3BC
#define DOT_POSITIONS 0x3C0
#define DOT_FLAGS 0x3C8
#define DOT_CONNECTION_A 0x3D0
#define DOT_CONNECTION_B 0x3D8
#define DECORATIONS 0x418
#define DECORATION_FLAGS 0x420
#define DECORATION_COLORS 0x428
#define NUM_DECORATIONS 0x430
#define REFLECTION_DATA 0x438
#define GRID_SIZE_X 0x440
#define GRID_SIZE_Y 0x444
#define STYLE_FLAGS 0x448
#define SEQUENCE_LEN 0x454
#define SEQUENCE 0x458
#define DOT_SEQUENCE_LEN 0x460
#define DOT_SEQUENCE 0x468
#define DOT_SEQUENCE_LEN_REFLECTION 0x470
#define DOT_SEQUENCE_REFLECTION 0x478
#define NUM_COLORED_REGIONS 0x498
#define COLORED_REGIONS 0x4A0
#define PANEL_TARGET 0x4A8
#define SPECULAR_TEXTURE 0x4D0
#define CABLE_TARGET_2 0xD0
#define AUDIO_LOG_NAME 0x0
#define OPEN_RATE 0xE0
#define METADATA 0x13A // sizeof(short)
#define HOTEL_EP_NAME 0x51E340
#endif