ServiceUtil.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Ryujinx.Horizon.Common;
  2. using Ryujinx.Horizon.Sdk.Sf.Cmif;
  3. using Ryujinx.Horizon.Sdk.Sf.Hipc;
  4. using System;
  5. namespace Ryujinx.Horizon.Sdk
  6. {
  7. static class ServiceUtil
  8. {
  9. public static Result SendRequest(out CmifResponse response, int sessionHandle, uint requestId, bool sendPid, scoped ReadOnlySpan<byte> data)
  10. {
  11. ulong tlsAddress = HorizonStatic.ThreadContext.TlsAddress;
  12. int tlsSize = Api.TlsMessageBufferSize;
  13. using (var tlsRegion = HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize))
  14. {
  15. CmifRequest request = CmifMessage.CreateRequest(tlsRegion.Memory.Span, new CmifRequestFormat()
  16. {
  17. DataSize = data.Length,
  18. RequestId = requestId,
  19. SendPid = sendPid
  20. });
  21. data.CopyTo(request.Data);
  22. }
  23. Result result = HorizonStatic.Syscall.SendSyncRequest(sessionHandle);
  24. if (result.IsFailure)
  25. {
  26. response = default;
  27. return result;
  28. }
  29. return CmifMessage.ParseResponse(out response, HorizonStatic.AddressSpace.GetWritableRegion(tlsAddress, tlsSize).Memory.Span, false, 0);
  30. }
  31. }
  32. }