IpcHandleDesc.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System;
  2. using System.IO;
  3. namespace Ryujinx.HLE.OsHle.Ipc
  4. {
  5. class IpcHandleDesc
  6. {
  7. public bool HasPId { get; private set; }
  8. public long PId { get; private set; }
  9. public int[] ToCopy { get; private set; }
  10. public int[] ToMove { get; private set; }
  11. public IpcHandleDesc(BinaryReader Reader)
  12. {
  13. int Word = Reader.ReadInt32();
  14. HasPId = (Word & 1) != 0;
  15. ToCopy = new int[(Word >> 1) & 0xf];
  16. ToMove = new int[(Word >> 5) & 0xf];
  17. PId = HasPId ? Reader.ReadInt64() : 0;
  18. for (int Index = 0; Index < ToCopy.Length; Index++)
  19. {
  20. ToCopy[Index] = Reader.ReadInt32();
  21. }
  22. for (int Index = 0; Index < ToMove.Length; Index++)
  23. {
  24. ToMove[Index] = Reader.ReadInt32();
  25. }
  26. }
  27. public IpcHandleDesc(int[] Copy, int[] Move)
  28. {
  29. ToCopy = Copy ?? throw new ArgumentNullException(nameof(Copy));
  30. ToMove = Move ?? throw new ArgumentNullException(nameof(Move));
  31. }
  32. public IpcHandleDesc(int[] Copy, int[] Move, long PId) : this(Copy, Move)
  33. {
  34. this.PId = PId;
  35. HasPId = true;
  36. }
  37. public static IpcHandleDesc MakeCopy(int Handle) => new IpcHandleDesc(
  38. new int[] { Handle },
  39. new int[0]);
  40. public static IpcHandleDesc MakeMove(int Handle) => new IpcHandleDesc(
  41. new int[0],
  42. new int[] { Handle });
  43. public byte[] GetBytes()
  44. {
  45. using (MemoryStream MS = new MemoryStream())
  46. {
  47. BinaryWriter Writer = new BinaryWriter(MS);
  48. int Word = HasPId ? 1 : 0;
  49. Word |= (ToCopy.Length & 0xf) << 1;
  50. Word |= (ToMove.Length & 0xf) << 5;
  51. Writer.Write(Word);
  52. if (HasPId)
  53. {
  54. Writer.Write((long)PId);
  55. }
  56. foreach (int Handle in ToCopy)
  57. {
  58. Writer.Write(Handle);
  59. }
  60. foreach (int Handle in ToMove)
  61. {
  62. Writer.Write(Handle);
  63. }
  64. return MS.ToArray();
  65. }
  66. }
  67. }
  68. }