IpcHandleDesc.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.IO;
  3. namespace Ryujinx.HLE.HOS.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(params int[] Handles)
  38. {
  39. return new IpcHandleDesc(Handles, new int[0]);
  40. }
  41. public static IpcHandleDesc MakeMove(params int[] Handles)
  42. {
  43. return new IpcHandleDesc(new int[0], Handles);
  44. }
  45. public byte[] GetBytes()
  46. {
  47. using (MemoryStream MS = new MemoryStream())
  48. {
  49. BinaryWriter Writer = new BinaryWriter(MS);
  50. int Word = HasPId ? 1 : 0;
  51. Word |= (ToCopy.Length & 0xf) << 1;
  52. Word |= (ToMove.Length & 0xf) << 5;
  53. Writer.Write(Word);
  54. if (HasPId)
  55. {
  56. Writer.Write((long)PId);
  57. }
  58. foreach (int Handle in ToCopy)
  59. {
  60. Writer.Write(Handle);
  61. }
  62. foreach (int Handle in ToMove)
  63. {
  64. Writer.Write(Handle);
  65. }
  66. return MS.ToArray();
  67. }
  68. }
  69. }
  70. }