public void Read(uint address, int length, byte[] buffer, int offset, ref int read) { // only check base address - would add too much overhead to check range // plus, it's much more likely that the entire range will be valid if the base address is if (safeMode & !Xbox.IsValidAddress(address)) { throw new Exception("Safe Mode detected invalid base address"); } int iterations = (int)length / bufferSize; int remainder = (int)length % bufferSize; read = 0; StatusResponse response; for (int i = 0; i < iterations; i++) { response = Xbox.SendCommand("getmem2 addr=0x{0} length={1}", Convert.ToString(address + read, 16).PadLeft(8, '0'), bufferSize); Xbox.Wait(bufferSize); Xbox.Connection.Client.Receive(buffer, (int)(offset + read), bufferSize, SocketFlags.None); read += bufferSize; } if (remainder > 0) { response = Xbox.SendCommand("getmem2 addr=0x{0} length={1}", Convert.ToString(address + read, 16).PadLeft(8, '0'), remainder); Xbox.Wait(remainder); Xbox.Connection.Client.Receive(buffer, (int)(offset + read), remainder, SocketFlags.None); read += remainder; } }