ILogger.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using Ryujinx.Common.Logging;
  2. using System.IO;
  3. using System.Text;
  4. namespace Ryujinx.HLE.HOS.Services.Lm.LogService
  5. {
  6. class ILogger : IpcService
  7. {
  8. public ILogger() { }
  9. private static int ReadEncodedInt(BinaryReader reader)
  10. {
  11. int result = 0;
  12. int position = 0;
  13. byte encoded;
  14. do
  15. {
  16. encoded = reader.ReadByte();
  17. result += (encoded & 0x7F) << (7 * position);
  18. position++;
  19. } while ((encoded & 0x80) != 0);
  20. return result;
  21. }
  22. [Command(0)]
  23. // Log(buffer<unknown, 0x21>)
  24. public ResultCode Log(ServiceCtx context)
  25. {
  26. (long bufPos, long bufSize) = context.Request.GetBufferType0x21();
  27. byte[] logBuffer = context.Memory.ReadBytes(bufPos, bufSize);
  28. using (MemoryStream ms = new MemoryStream(logBuffer))
  29. {
  30. BinaryReader reader = new BinaryReader(ms);
  31. long pid = reader.ReadInt64();
  32. long threadContext = reader.ReadInt64();
  33. short flags = reader.ReadInt16();
  34. byte level = reader.ReadByte();
  35. byte verbosity = reader.ReadByte();
  36. int payloadLength = reader.ReadInt32();
  37. StringBuilder sb = new StringBuilder();
  38. sb.AppendLine("Guest log:");
  39. sb.AppendLine($" Log level: {(LmLogLevel)level}");
  40. while (ms.Position < ms.Length)
  41. {
  42. int type = ReadEncodedInt(reader);
  43. int size = ReadEncodedInt(reader);
  44. LmLogField field = (LmLogField)type;
  45. string fieldStr = string.Empty;
  46. if (field == LmLogField.Start)
  47. {
  48. reader.ReadBytes(size);
  49. continue;
  50. }
  51. else if (field == LmLogField.Stop)
  52. {
  53. break;
  54. }
  55. else if (field == LmLogField.Line)
  56. {
  57. fieldStr = $"{field}: {reader.ReadInt32()}";
  58. }
  59. else if (field == LmLogField.DropCount)
  60. {
  61. fieldStr = $"{field}: {reader.ReadInt64()}";
  62. }
  63. else if (field == LmLogField.Time)
  64. {
  65. fieldStr = $"{field}: {reader.ReadInt64()}s";
  66. }
  67. else if (field < LmLogField.Count)
  68. {
  69. fieldStr = $"{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'";
  70. }
  71. else
  72. {
  73. fieldStr = $"Field{field}: '{Encoding.UTF8.GetString(reader.ReadBytes(size)).TrimEnd()}'";
  74. }
  75. sb.AppendLine(" " + fieldStr);
  76. }
  77. string text = sb.ToString();
  78. Logger.PrintGuest(LogClass.ServiceLm, text);
  79. }
  80. return ResultCode.Success;
  81. }
  82. }
  83. }