KernelTransfer.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Ryujinx.Cpu;
  2. using Ryujinx.HLE.HOS.Kernel.Process;
  3. using System;
  4. using System.Runtime.CompilerServices;
  5. using System.Runtime.InteropServices;
  6. namespace Ryujinx.HLE.HOS.Kernel.Common
  7. {
  8. static class KernelTransfer
  9. {
  10. public static bool UserToKernel<T>(out T value, ulong address) where T : unmanaged
  11. {
  12. KProcess currentProcess = KernelStatic.GetCurrentProcess();
  13. if (currentProcess.CpuMemory.IsRangeMapped(address, (ulong)Unsafe.SizeOf<T>()))
  14. {
  15. value = currentProcess.CpuMemory.Read<T>(address);
  16. return true;
  17. }
  18. value = default;
  19. return false;
  20. }
  21. public static bool UserToKernelArray<T>(ulong address, Span<T> values) where T : unmanaged
  22. {
  23. KProcess currentProcess = KernelStatic.GetCurrentProcess();
  24. Span<byte> data = MemoryMarshal.Cast<T, byte>(values);
  25. if (currentProcess.CpuMemory.IsRangeMapped(address, (ulong)data.Length))
  26. {
  27. currentProcess.CpuMemory.Read(address, data);
  28. return true;
  29. }
  30. return false;
  31. }
  32. public static bool UserToKernelString(out string value, ulong address, uint size)
  33. {
  34. KProcess currentProcess = KernelStatic.GetCurrentProcess();
  35. if (currentProcess.CpuMemory.IsRangeMapped(address, size))
  36. {
  37. value = MemoryHelper.ReadAsciiString(currentProcess.CpuMemory, address, size);
  38. return true;
  39. }
  40. value = null;
  41. return false;
  42. }
  43. public static bool KernelToUser<T>(ulong address, T value) where T: unmanaged
  44. {
  45. KProcess currentProcess = KernelStatic.GetCurrentProcess();
  46. if (currentProcess.CpuMemory.IsRangeMapped(address, (ulong)Unsafe.SizeOf<T>()))
  47. {
  48. currentProcess.CpuMemory.Write(address, value);
  49. return true;
  50. }
  51. return false;
  52. }
  53. }
  54. }