From d925de2d0e7f3a065020c63dc1274644284e4006 Mon Sep 17 00:00:00 2001 From: Thog Date: Sun, 8 Dec 2019 14:35:25 +0100 Subject: [PATCH] Fix ILogger type and size decoding (#842) * Fix ILogger type and size decoding The type and size are custom encoded integer not byte. This fix issues on games that send messages longer than 127 characters. * Address gdk's comments --- .../HOS/Services/Lm/LogService/ILogger.cs | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs index 357a13324..a269312eb 100644 --- a/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs +++ b/Ryujinx.HLE/HOS/Services/Lm/LogService/ILogger.cs @@ -8,6 +8,26 @@ namespace Ryujinx.HLE.HOS.Services.Lm.LogService { public ILogger() { } + private static int ReadEncodedInt(BinaryReader reader) + { + int result = 0; + int position = 0; + + byte encoded; + + do + { + encoded = reader.ReadByte(); + + result += (encoded & 0x7F) << (7 * position); + + position++; + + } while ((encoded & 0x80) != 0); + + return result; + } + [Command(0)] // Log(buffer) public ResultCode Log(ServiceCtx context) @@ -34,8 +54,8 @@ namespace Ryujinx.HLE.HOS.Services.Lm.LogService while (ms.Position < ms.Length) { - byte type = reader.ReadByte(); - byte size = reader.ReadByte(); + int type = ReadEncodedInt(reader); + int size = ReadEncodedInt(reader); LmLogField field = (LmLogField)type;