Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/core/hle/service/srv.cpp b/src/core/hle/service/srv.cpp
- index c0abfd7..ff1f426 100644
- --- a/src/core/hle/service/srv.cpp
- +++ b/src/core/hle/service/srv.cpp
- @@ -7,6 +7,7 @@
- #include "common/common_types.h"
- #include "common/logging/log.h"
- #include "core/hle/kernel/client_session.h"
- +#include "core/hle/kernel/server_port.h"
- #include "core/hle/kernel/server_session.h"
- #include "core/hle/kernel/event.h"
- #include "core/hle/service/srv.h"
- @@ -171,10 +172,48 @@ static void PublishToSubscriber(Service::Interface* self) {
- flags);
- }
- +
- +static void RegisterService(Service::Interface* self) {
- + ResultCode res = RESULT_SUCCESS;
- + u32* cmd_buff = Kernel::GetCommandBuffer();
- +
- + std::string port_name = std::string((const char*)&cmd_buff[1], 0, Service::kMaxPortSize);
- + u32 name_length = cmd_buff[3];
- + u32 max_sessions = cmd_buff[4];
- +
- + cmd_buff[0] = IPC::MakeHeader(3, 1, 2);
- +
- + if (name_length > Service::kMaxPortSize) {
- + cmd_buff[1] = 0xD9006405;
- + return;
- + }
- +
- + auto it = Service::g_srv_services.find(port_name);
- +
- + if (it != Service::g_srv_services.end()) {
- + // The service is already registered
- + cmd_buff[1] = ResultCode(ErrorDescription::AlreadyExists, ErrorModule::OS,
- + ErrorSummary::WrongArgument, ErrorLevel::Permanent).raw;
- + return;
- + }
- +
- + auto ports = Kernel::ServerPort::CreatePortPair(max_sessions, port_name);
- +
- + auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
- + auto server_port = std::get<Kernel::SharedPtr<Kernel::ServerPort>>(ports);
- +
- + // We keep the ClientPort and return a handle to the ServerPort to the application.
- + Service::g_srv_services.emplace(port_name, std::make_tuple(client_port, nullptr));
- +
- + cmd_buff[1] = RESULT_SUCCESS.raw;
- + cmd_buff[3] = Kernel::g_handle_table.Create(server_port).MoveFrom();
- + LOG_TRACE(Service_SRV, "called port=%s, handle=0x%08X", port_name.c_str(), cmd_buff[3]);
- +}
- +
- const Interface::FunctionInfo FunctionTable[] = {
- {0x00010002, RegisterClient, "RegisterClient"},
- {0x00020000, EnableNotification, "EnableNotification"},
- - {0x00030100, nullptr, "RegisterService"},
- + {0x00030100, RegisterService, "RegisterService"},
- {0x000400C0, nullptr, "UnregisterService"},
- {0x00050100, GetServiceHandle, "GetServiceHandle"},
- {0x000600C2, nullptr, "RegisterPort"},
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement