#include <windows.h>
#include <iostream>
#include <vector>
#include <iomanip>

int main() {
    const DWORD pid = 39484;
    HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, pid);
    if (!hProc) {
        std::cerr << "OpenProcess failed\n";
        return 1;
    }

    const uintptr_t base = 0x7FF6AFC20000;
    const uintptr_t textStart = base + 0x1000;
    const size_t textSize = 0x2E85000;

    struct Target {
        uintptr_t addr;
        const char* name;
    } targets[] = {
        {0x7FF6B2D88E10, "MinimapTilesRender"},
        {0x7FF6B2DA9200, "Minimap_Visibility"},
        {0x7FF6B2DA9240, "explored_tile"},
        {0x7FF6B2DAD670, "FogOfWar"},
        {0x7FF6B31CD070, "FogOfWar_2"},
        {0x7FF6B31CD2B8, "FogOfWarAdd"},
    };

    std::vector<uint8_t> textBuf(textSize);
    SIZE_T bytesRead = 0;
    std::cout << "Reading .text (size=" << (textSize >> 20) << " MB)...\n";
    if (!ReadProcessMemory(hProc, reinterpret_cast<LPCVOID>(textStart), textBuf.data(), textSize, &bytesRead)) {
        std::cerr << "ReadProcessMemory failed: " << GetLastError() << "\n";
        CloseHandle(hProc);
        return 1;
    }

    std::cout << "Scanning " << bytesRead << " bytes for xrefs...\n";
    for (size_t i = 0; i + 7 <= bytesRead; ++i) {
        // Look for 48 8D (lea reg, [rip+disp32]) or similar RIP relative
        // Disp offset is at i + 3
        const uintptr_t curInsn = textStart + i;
        const uintptr_t ripNext = curInsn + 7;
        const int32_t disp = *reinterpret_cast<const int32_t*>(&textBuf[i + 3]);
        const uintptr_t target = ripNext + disp;

        for (const auto& t : targets) {
            if (target == t.addr) {
                std::cout << "Hit at 0x" << std::hex << std::uppercase << curInsn
                          << " (Opcode: " << std::hex
                          << (int)textBuf[i] << " " << (int)textBuf[i+1] << " " << (int)textBuf[i+2]
                          << ") -> " << t.name << " @ 0x" << t.addr << std::dec << "\n";
            }
        }
    }

    CloseHandle(hProc);
    return 0;
}
