Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp
  2. index c0abfd7..ff1f426 100644
  3. --- a/src/core/hle/service/srv.cpp
  4. +++ b/src/core/hle/service/srv.cpp
  5. @@ -7,6 +7,7 @@
  6. #include "common/common_types.h"
  7. #include "common/logging/log.h"
  8. #include "core/hle/kernel/client_session.h"
  9. +#include "core/hle/kernel/server_port.h"
  10. #include "core/hle/kernel/server_session.h"
  11. #include "core/hle/kernel/event.h"
  12. #include "core/hle/service/srv.h"
  13. @@ -171,10 +172,48 @@ static void PublishToSubscriber(Service::Interface* self) {
  14. flags);
  15. }
  16.  
  17. +
  18. +static void RegisterService(Service::Interface* self) {
  19. + ResultCode res = RESULT_SUCCESS;
  20. + u32* cmd_buff = Kernel::GetCommandBuffer();
  21. +
  22. + std::string port_name = std::string((const char*)&cmd_buff[1], 0, Service::kMaxPortSize);
  23. + u32 name_length = cmd_buff[3];
  24. + u32 max_sessions = cmd_buff[4];
  25. +
  26. + cmd_buff[0] = IPC::MakeHeader(3, 1, 2);
  27. +
  28. + if (name_length > Service::kMaxPortSize) {
  29. + cmd_buff[1] = 0xD9006405;
  30. + return;
  31. + }
  32. +
  33. + auto it = Service::g_srv_services.find(port_name);
  34. +
  35. + if (it != Service::g_srv_services.end()) {
  36. + // The service is already registered
  37. + cmd_buff[1] = ResultCode(ErrorDescription::AlreadyExists, ErrorModule::OS,
  38. + ErrorSummary::WrongArgument, ErrorLevel::Permanent).raw;
  39. + return;
  40. + }
  41. +
  42. + auto ports = Kernel::ServerPort::CreatePortPair(max_sessions, port_name);
  43. +
  44. + auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
  45. + auto server_port = std::get<Kernel::SharedPtr<Kernel::ServerPort>>(ports);
  46. +
  47. + // We keep the ClientPort and return a handle to the ServerPort to the application.
  48. + Service::g_srv_services.emplace(port_name, std::make_tuple(client_port, nullptr));
  49. +
  50. + cmd_buff[1] = RESULT_SUCCESS.raw;
  51. + cmd_buff[3] = Kernel::g_handle_table.Create(server_port).MoveFrom();
  52. + LOG_TRACE(Service_SRV, "called port=%s, handle=0x%08X", port_name.c_str(), cmd_buff[3]);
  53. +}
  54. +
  55. const Interface::FunctionInfo FunctionTable[] = {
  56. {0x00010002, RegisterClient, "RegisterClient"},
  57. {0x00020000, EnableNotification, "EnableNotification"},
  58. - {0x00030100, nullptr, "RegisterService"},
  59. + {0x00030100, RegisterService, "RegisterService"},
  60. {0x000400C0, nullptr, "UnregisterService"},
  61. {0x00050100, GetServiceHandle, "GetServiceHandle"},
  62. {0x000600C2, nullptr, "RegisterPort"},
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement