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]); }