示例#1
0
        public static async Task <string> GetVersionAsync(this ISwitchConnectionAsync connection, CancellationToken token)
        {
            var gvbytes = Encoding.ASCII.GetBytes("getVersion\r\n");

            byte[] socketReturn = await connection.ReadRaw(gvbytes, 9, token).ConfigureAwait(false);

            string version = Encoding.UTF8.GetString(socketReturn).TrimEnd('\0').TrimEnd('\n');

            return(version);
        }
        public async Task <ulong> FollowMainPointer(long[] jumps, bool canSolveOnSysmodule, CancellationToken token) //include the last jump here
        {
            // 1.7+ sys-botbase can solve entire pointer
            if (canSolveOnSysmodule)
            {
                var jumpsWithoutLast = jumps.Take(jumps.Length - 1);

                byte[] command = Encoding.UTF8.GetBytes($"pointer{string.Concat(jumpsWithoutLast.Select(z => $" {z}"))}\r\n");

                byte[] socketReturn = await Connection.ReadRaw(command, sizeof(ulong) * 2 + 1, token).ConfigureAwait(false);

                var bytes = Base.Decoder.ConvertHexByteStringToBytes(socketReturn);
                bytes = bytes.Reverse().ToArray();

                var offset = (ulong)((long)BitConverter.ToUInt64(bytes, 0) + jumps[jumps.Length - 1]);
                return(offset);
            }

            // solve pointer manually
            var ofs     = (ulong)jumps[0]; // won't work with negative first jump
            var address = BitConverter.ToUInt64(await Connection.ReadBytesMainAsync(ofs, 0x8, token).ConfigureAwait(false), 0);

            for (int i = 1; i < jumps.Length - 1; ++i)
            {
                await Task.Delay(0_008, token).ConfigureAwait(false); // 1/4 frame

                var jump = jumps[i];
                if (jump > 0)
                {
                    address += (ulong)jump;
                }
                else
                {
                    address -= (ulong)Math.Abs(jump);
                }

                byte[] bytes = await Connection.ReadBytesAbsoluteAsync(address, 0x8, token).ConfigureAwait(false);

                address = BitConverter.ToUInt64(bytes, 0);
            }
            return(address + (ulong)jumps[jumps.Length - 1]);
        }