From d4640328aa764ec8a182f1fe7ebdfd46a19fff0c Mon Sep 17 00:00:00 2001 From: cake Date: Thu, 22 Jan 2026 02:03:39 +0100 Subject: [PATCH] Updated ptr guard so windows have max on 4gb again. --- .../PlayerData/Factories/PlayerDataFactory.cs | 6 +-- .../PlayerData/Handlers/GameObjectHandler.cs | 10 ++-- LightlessSync/Utils/PtrGuard.cs | 47 ++++++++++--------- LightlessSync/Utils/PtrGuardMemory.cs | 4 +- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/LightlessSync/PlayerData/Factories/PlayerDataFactory.cs b/LightlessSync/PlayerData/Factories/PlayerDataFactory.cs index d960e2e..64dc820 100644 --- a/LightlessSync/PlayerData/Factories/PlayerDataFactory.cs +++ b/LightlessSync/PlayerData/Factories/PlayerDataFactory.cs @@ -127,7 +127,7 @@ public class PlayerDataFactory { nint basePtr = playerPointer; - if (!PtrGuard.LooksLikePtr(basePtr)) + if (!PtrGuard.LooksLikePtr(basePtr, _dalamudUtil.IsWine)) return true; nint drawObjAddr = basePtr + _drawObjectOffset; @@ -135,10 +135,10 @@ public class PlayerDataFactory if (!PtrGuard.IsReadable(drawObjAddr, (nuint)IntPtr.Size)) return true; - if (!PtrGuard.TryReadIntPtr(drawObjAddr, out var drawObj)) + if (!PtrGuard.TryReadIntPtr(drawObjAddr, _dalamudUtil.IsWine, out var drawObj)) return true; - if (drawObj != 0 && !PtrGuard.LooksLikePtr(drawObj)) + if (drawObj != 0 && !PtrGuard.LooksLikePtr(drawObj, _dalamudUtil.IsWine)) return true; return drawObj == 0; diff --git a/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs b/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs index 359ec20..189b3ac 100644 --- a/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs +++ b/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs @@ -180,16 +180,14 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP var nextAddr = _getAddress(); - if (nextAddr != IntPtr.Zero && !PtrGuard.LooksLikePtr(nextAddr)) + if (nextAddr != IntPtr.Zero && !PtrGuard.LooksLikePtr(nextAddr, _dalamudUtil.IsWine)) { - Logger.LogWarning("[{this}] _getAddress returned non-pointer: 0x{addr:X}", this, (ulong)nextAddr); nextAddr = IntPtr.Zero; } if (nextAddr != IntPtr.Zero && !PtrGuard.IsReadable(nextAddr, (nuint)sizeof(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject))) { - Logger.LogWarning("[{this}] Address not readable: 0x{addr:X}", this, (ulong)nextAddr); nextAddr = IntPtr.Zero; } @@ -201,7 +199,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP var draw = (nint)gameObject->DrawObject; - if (!PtrGuard.LooksLikePtr(draw) || !PtrGuard.IsReadable(draw, (nuint)sizeof(DrawObject))) + if (!PtrGuard.LooksLikePtr(draw, _dalamudUtil.IsWine) || !PtrGuard.IsReadable(draw, (nuint)sizeof(DrawObject))) draw = 0; DrawObjectAddress = draw; @@ -363,7 +361,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP private unsafe bool CompareAndUpdateMainHand(Weapon* weapon) { var p = (nint)weapon; - if (!PtrGuard.LooksLikePtr(p) || !PtrGuard.IsReadable(p, (nuint)sizeof(Weapon))) + if (!PtrGuard.LooksLikePtr(p, _dalamudUtil.IsWine) || !PtrGuard.IsReadable(p, (nuint)sizeof(Weapon))) return false; bool hasChanges = false; @@ -379,7 +377,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP private unsafe bool CompareAndUpdateOffHand(Weapon* weapon) { var p = (nint)weapon; - if (!PtrGuard.LooksLikePtr(p) || !PtrGuard.IsReadable(p, (nuint)sizeof(Weapon))) + if (!PtrGuard.LooksLikePtr(p, _dalamudUtil.IsWine) || !PtrGuard.IsReadable(p, (nuint)sizeof(Weapon))) return false; bool hasChanges = false; diff --git a/LightlessSync/Utils/PtrGuard.cs b/LightlessSync/Utils/PtrGuard.cs index 430a317..d42c093 100644 --- a/LightlessSync/Utils/PtrGuard.cs +++ b/LightlessSync/Utils/PtrGuard.cs @@ -5,40 +5,41 @@ namespace LightlessSync.Utils { public static partial class PtrGuard { - private const ulong _aligmentPtr = 0x7UL; - private static readonly nuint _minAppAddr = (nuint)GetMinAppAddr(); - private static readonly nuint _maxAppAddr = (nuint)GetMaxAppAddr(); + private static readonly nuint _hardMinWindows = + (nuint)(IntPtr.Size == 8 ? 0x0000000100000000UL : 0x0000000000010000UL); + private static readonly nuint _hardMaxWindows = + (nuint)(IntPtr.Size == 8 ? 0x00007FFFFFFFFFFFUL : 0x7FFFFFFFUL); + private const nuint _alignmentPtr = 0x7; - private static nint GetMinAppAddr() + private static readonly (nuint min, nuint max) _sysRange = GetSysRange(); + + private static (nuint min, nuint max) GetSysRange() { GetSystemInfo(out var si); - return si.lpMinimumApplicationAddress; + return ((nuint)si.lpMinimumApplicationAddress, (nuint)si.lpMaximumApplicationAddress); } - private static nint GetMaxAppAddr() + private static nuint GetMinAppAddr(bool isWine) => isWine ? _sysRange.min : _hardMinWindows; + private static nuint GetMaxAppAddr(bool isWine) => isWine ? _sysRange.max : _hardMaxWindows; + + public static bool LooksLikePtr(nint p, bool isWine = false) { - GetSystemInfo(out var si); - return si.lpMaximumApplicationAddress; + if (p == 0) return false; + nuint u = (nuint)p; + + if (u < GetMinAppAddr(isWine)) return false; + if (u > GetMaxAppAddr(isWine)) return false; + if ((u & _alignmentPtr) != 0) return false; + if ((uint)u == 0x12345679u) return false; + + return true; } - public static bool LooksLikePtr(nint p) - { - if (p == 0) return false; - nuint u = (nuint)p; - - if (u < _minAppAddr) return false; - if (u > _maxAppAddr) return false; - if ((u & _aligmentPtr) != 0) return false; - if ((uint)u == 0x12345679u) return false; - - return true; - } - - public static bool TryReadIntPtr(nint addr, out nint value) + public static bool TryReadIntPtr(nint addr, bool isWine, out nint value) { value = 0; - if (!LooksLikePtr(addr)) + if (!LooksLikePtr(addr, isWine)) return false; return ReadProcessMemory(GetCurrentProcess(), addr, out value, (nuint)IntPtr.Size, out nuint bytesRead) diff --git a/LightlessSync/Utils/PtrGuardMemory.cs b/LightlessSync/Utils/PtrGuardMemory.cs index ccb5b79..0ea6eae 100644 --- a/LightlessSync/Utils/PtrGuardMemory.cs +++ b/LightlessSync/Utils/PtrGuardMemory.cs @@ -34,10 +34,10 @@ namespace LightlessSync.Utils internal static extern nint GetCurrentProcess(); [DllImport("kernel32.dll")] - internal static extern void GetSystemInfo(out SYSTEM_INFO lpSystemInfo); + internal static extern void GetSystemInfo(out SystemInfo lpSystemInfo); [StructLayout(LayoutKind.Sequential)] - internal struct SYSTEM_INFO + internal struct SystemInfo { public ushort wProcessorArchitecture; public ushort wReserved;