XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEEDToolBox.Plugin;

internal static unsafe partial class Navigation
{
    private static int dockingAvailabilityGetterCalls;
    [UnmanagedCallersOnly]
    private static byte MockDockingAvailability(nuint computer)
    { dockingAvailabilityGetterCalls++; return Read<byte>(computer + 0x377); }
    private static uint LocalDockingAvailabilitySelfTest()
    {
        var memory = Platform.Allocate(4096); if (memory == 0) return 0;
        try
        {
            var computer = memory; var table = memory + 2048;
            var getter = (nuint)(delegate* unmanaged<nuint, byte>)&MockDockingAvailability;
            Write(computer, table); Write(table + 0x58, getter);
            // These unrelated SCA fields are deliberately invalid. They must
            // never be dereferenced when checking the docking computer.
            Write(computer + 0x168, nuint.MaxValue); Write(computer + 0x290, uint.MaxValue);
            dockingAvailabilityGetterCalls = 0; uint passed = 0;
            Write(computer + 0x377, (byte)1);
            if (ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 1) passed |= 1;
            Write(computer + 0x377, (byte)0);
            if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 2;
            if (!ReadLocalDockingAvailability(0, table, getter)) passed |= 4;
            if (!ReadLocalDockingAvailability(computer, table + 8, getter)) passed |= 8;
            Write(table + 0x58, (nuint)0);
            if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 16;
            return passed;
        }
        finally { Platform.Free(memory); }
    }
#if PLUGIN_NAVIGATION
    [UnmanagedCallersOnly(EntryPoint = "XFENavigationLocalDockingAvailabilitySelfTest")]
    internal static uint ExportLocalDockingAvailabilitySelfTest() => RunTest(LocalDockingAvailabilitySelfTest);
#endif
}