From bb7600e215456fd271ba1ec2f7b4fa5088ec2802 Mon Sep 17 00:00:00 2001 From: Ac_K Date: Fri, 29 Nov 2019 05:42:44 +0100 Subject: [PATCH] prepo: Silent error while parsing report (#837) Due to a guessed parsing implementation of the report, sometime it throw an error, since the data isn't really useful, it's better to silent possible exceptions with a message. --- .../HOS/Services/Prepo/IPrepoService.cs | 139 +++++++++--------- 1 file changed, 73 insertions(+), 66 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs b/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs index fdd156d30..f606361c7 100644 --- a/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs +++ b/Ryujinx.HLE/HOS/Services/Prepo/IPrepoService.cs @@ -93,94 +93,101 @@ namespace Ryujinx.HLE.HOS.Services.Prepo sb.AppendLine($" Room: {room}"); - using (MemoryStream stream = new MemoryStream(buffer)) - using (BinaryReader reader = new BinaryReader(stream)) + try { - byte unknown1 = reader.ReadByte(); // Version ? - short unknown2 = reader.ReadInt16(); // Size ? - - bool isValue = false; - - string fieldStr = string.Empty; - - while (stream.Position != stream.Length) + using (MemoryStream stream = new MemoryStream(buffer)) + using (BinaryReader reader = new BinaryReader(stream)) { - byte descriptor = reader.ReadByte(); + byte unknown1 = reader.ReadByte(); // Version ? + short unknown2 = reader.ReadInt16(); // Size ? - if (!isValue) + bool isValue = false; + + string fieldStr = string.Empty; + + while (stream.Position != stream.Length) { - byte[] key = reader.ReadBytes(descriptor - 0xA0); + byte descriptor = reader.ReadByte(); - fieldStr = $" Key: {Encoding.ASCII.GetString(key)}"; - - isValue = true; - } - else - { - if (descriptor > 0xD0) // Int value. + if (!isValue) { - if (descriptor - 0xD0 == 1) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadUInt16())}"; - } - else if (descriptor - 0xD0 == 2) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt32())}"; - } - else if (descriptor - 0xD0 == 4) - { - fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt64())}"; - } - else - { - // Unknown. - break; - } + byte[] key = reader.ReadBytes(descriptor - 0xA0); + + fieldStr = $" Key: {Encoding.ASCII.GetString(key)}"; + + isValue = true; } - else if (descriptor > 0xA0 && descriptor < 0xD0) // String value, max size = 0x20 bytes ? + else { - int size = descriptor - 0xA0; - string value = string.Empty; - byte[] rawValues = new byte[0]; - - for (int i = 0; i < size; i++) + if (descriptor > 0xD0) // Int value. { - byte chr = reader.ReadByte(); - - if (chr >= 0x20 && chr < 0x7f) + if (descriptor - 0xD0 == 1) { - value += (char)chr; + fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadUInt16())}"; + } + else if (descriptor - 0xD0 == 2) + { + fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt32())}"; + } + else if (descriptor - 0xD0 == 4) + { + fieldStr += $", Value: {BinaryPrimitives.ReverseEndianness(reader.ReadInt64())}"; } else { - Array.Resize(ref rawValues, rawValues.Length + 1); - - rawValues[rawValues.Length - 1] = chr; + // Unknown. + break; } } - - if (value != string.Empty) - { - fieldStr += $", Value: {value}"; - } - - // TODO(Ac_K): Determine why there are non-alphanumeric values sometimes. - if (rawValues.Length > 0) + else if (descriptor > 0xA0 && descriptor < 0xD0) // String value, max size = 0x20 bytes ? { - fieldStr += $", RawValue: 0x{BitConverter.ToString(rawValues).Replace("-", "")}"; + int size = descriptor - 0xA0; + string value = string.Empty; + byte[] rawValues = new byte[0]; + + for (int i = 0; i < size; i++) + { + byte chr = reader.ReadByte(); + + if (chr >= 0x20 && chr < 0x7f) + { + value += (char)chr; + } + else + { + Array.Resize(ref rawValues, rawValues.Length + 1); + + rawValues[rawValues.Length - 1] = chr; + } + } + + if (value != string.Empty) + { + fieldStr += $", Value: {value}"; + } + + // TODO(Ac_K): Determine why there are non-alphanumeric values sometimes. + if (rawValues.Length > 0) + { + fieldStr += $", RawValue: 0x{BitConverter.ToString(rawValues).Replace("-", "")}"; + } + } + else // Byte value. + { + fieldStr += $", Value: {descriptor}"; } - } - else // Byte value. - { - fieldStr += $", Value: {descriptor}"; - } - sb.AppendLine(fieldStr); + sb.AppendLine(fieldStr); - isValue = false; + isValue = false; + } } } } + catch (Exception) + { + sb.AppendLine(" Error while parsing the report buffer."); + } return sb.ToString(); }