Ejemplo n.º 1
0
        /// <summary>
        /// This method will make the game create a new object of string.
        /// </summary>
        /// <param name="s"></param>
        public unsafe static GameString New(GameContext ctx, string s)
        {
            using var alloc = MemoryAllocation.Alloc(ctx.HContext, (uint)(s.Length * 2 + 2) + (uint) sizeof(nuint));
            nuint addr    = alloc.AllocationBase;
            nuint resAddr = addr + (uint)(s.Length * 2 + 2);

            byte[] data = Encoding.Unicode.GetBytes(s);
            ctx.HContext.DataAccess.WriteBytes(addr, data);
            ctx.HContext.DataAccess.Write <short>(addr + (uint)data.Length, 0);
            var asm = AssemblySnippet.FromCode(new AssemblyCode[] {
                AssemblySnippet.FromConstructString(ctx.HContext, addr, resAddr)
            });
            var thread = ctx.RunOnManagedThread(asm);

            if (!Task.Run(() => thread.WaitToDispose()).Wait(2000))            //won't forcefully dispose because that would cause game crashing
            {
                throw new Exception("Failed to create string object");
            }
            nuint res = ctx.HContext.DataAccess.Read <nuint>(resAddr);

            return(new GameString(ctx, new HackObject(ctx.HContext, ctx.HContext.Runtime.Heap.StringType, res)));
        }