service: fetch objects from the client handle table
This commit is contained in:
		@@ -1147,8 +1147,7 @@ Result KServerSession::ReceiveRequest(uintptr_t server_message, uintptr_t server
 | 
			
		||||
        *out_context =
 | 
			
		||||
            std::make_shared<Service::HLERequestContext>(m_kernel, memory, this, client_thread);
 | 
			
		||||
        (*out_context)->SetSessionRequestManager(manager);
 | 
			
		||||
        (*out_context)
 | 
			
		||||
            ->PopulateFromIncomingCommandBuffer(*client_thread->GetOwnerProcess(), cmd_buf);
 | 
			
		||||
        (*out_context)->PopulateFromIncomingCommandBuffer(cmd_buf);
 | 
			
		||||
        // We succeeded.
 | 
			
		||||
        R_SUCCEED();
 | 
			
		||||
    } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -1513,8 +1513,7 @@ void ILibraryAppletCreator::CreateTransferMemoryStorage(HLERequestContext& ctx)
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto transfer_mem =
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(handle);
 | 
			
		||||
    auto transfer_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(handle);
 | 
			
		||||
 | 
			
		||||
    if (transfer_mem.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
 | 
			
		||||
@@ -1547,8 +1546,7 @@ void ILibraryAppletCreator::CreateHandleStorage(HLERequestContext& ctx) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto transfer_mem =
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(handle);
 | 
			
		||||
    auto transfer_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(handle);
 | 
			
		||||
 | 
			
		||||
    if (transfer_mem.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
 | 
			
		||||
 
 | 
			
		||||
@@ -454,10 +454,8 @@ void AudRenU::OpenAudioRenderer(HLERequestContext& ctx) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const auto& handle_table{system.ApplicationProcess()->GetHandleTable()};
 | 
			
		||||
    auto process{handle_table.GetObject<Kernel::KProcess>(process_handle)};
 | 
			
		||||
    auto transfer_memory{
 | 
			
		||||
        process->GetHandleTable().GetObject<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
    auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle)};
 | 
			
		||||
    auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
 | 
			
		||||
    const auto session_id{impl->GetSessionId()};
 | 
			
		||||
    if (session_id == -1) {
 | 
			
		||||
 
 | 
			
		||||
@@ -278,9 +278,7 @@ void HwOpus::OpenHardwareOpusDecoder(HLERequestContext& ctx) {
 | 
			
		||||
    auto params = rp.PopRaw<OpusParameters>();
 | 
			
		||||
    auto transfer_memory_size{rp.Pop<u32>()};
 | 
			
		||||
    auto transfer_memory_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
    auto transfer_memory{
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
            transfer_memory_handle)};
 | 
			
		||||
    auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
 | 
			
		||||
              params.sample_rate, params.channel_count, transfer_memory_size);
 | 
			
		||||
@@ -323,9 +321,7 @@ void HwOpus::OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
    auto transfer_memory_size{rp.Pop<u32>()};
 | 
			
		||||
    auto transfer_memory_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
    auto transfer_memory{
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
            transfer_memory_handle)};
 | 
			
		||||
    auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_Audio,
 | 
			
		||||
              "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
 | 
			
		||||
@@ -374,9 +370,7 @@ void HwOpus::OpenHardwareOpusDecoderEx(HLERequestContext& ctx) {
 | 
			
		||||
    auto params = rp.PopRaw<OpusParametersEx>();
 | 
			
		||||
    auto transfer_memory_size{rp.Pop<u32>()};
 | 
			
		||||
    auto transfer_memory_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
    auto transfer_memory{
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
            transfer_memory_handle)};
 | 
			
		||||
    auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
 | 
			
		||||
              params.sample_rate, params.channel_count, transfer_memory_size);
 | 
			
		||||
@@ -414,9 +408,7 @@ void HwOpus::OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
    auto transfer_memory_size{rp.Pop<u32>()};
 | 
			
		||||
    auto transfer_memory_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
    auto transfer_memory{
 | 
			
		||||
        system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
            transfer_memory_handle)};
 | 
			
		||||
    auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
 | 
			
		||||
 | 
			
		||||
    LOG_DEBUG(Service_Audio,
 | 
			
		||||
              "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
 | 
			
		||||
 
 | 
			
		||||
@@ -1850,8 +1850,7 @@ void IHidServer::InitializeSevenSixAxisSensor(HLERequestContext& ctx) {
 | 
			
		||||
    ASSERT_MSG(t_mem_1_size == 0x1000, "t_mem_1_size is not 0x1000 bytes");
 | 
			
		||||
    ASSERT_MSG(t_mem_2_size == 0x7F000, "t_mem_2_size is not 0x7F000 bytes");
 | 
			
		||||
 | 
			
		||||
    auto t_mem_1 = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_1_handle);
 | 
			
		||||
    auto t_mem_1 = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_1_handle);
 | 
			
		||||
 | 
			
		||||
    if (t_mem_1.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_HID, "t_mem_1 is a nullptr for handle=0x{:08X}", t_mem_1_handle);
 | 
			
		||||
@@ -1860,8 +1859,7 @@ void IHidServer::InitializeSevenSixAxisSensor(HLERequestContext& ctx) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto t_mem_2 = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_2_handle);
 | 
			
		||||
    auto t_mem_2 = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_2_handle);
 | 
			
		||||
 | 
			
		||||
    if (t_mem_2.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_HID, "t_mem_2 is a nullptr for handle=0x{:08X}", t_mem_2_handle);
 | 
			
		||||
@@ -2142,8 +2140,7 @@ void IHidServer::WritePalmaWaveEntry(HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
    ASSERT_MSG(t_mem_size == 0x3000, "t_mem_size is not 0x3000 bytes");
 | 
			
		||||
 | 
			
		||||
    auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_handle);
 | 
			
		||||
    auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle);
 | 
			
		||||
 | 
			
		||||
    if (t_mem.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_HID, "t_mem is a nullptr for handle=0x{:08X}", t_mem_handle);
 | 
			
		||||
 
 | 
			
		||||
@@ -448,8 +448,7 @@ void HidBus::EnableJoyPollingReceiveMode(HLERequestContext& ctx) {
 | 
			
		||||
 | 
			
		||||
    ASSERT_MSG(t_mem_size == 0x1000, "t_mem_size is not 0x1000 bytes");
 | 
			
		||||
 | 
			
		||||
    auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_handle);
 | 
			
		||||
    auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle);
 | 
			
		||||
 | 
			
		||||
    if (t_mem.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_HID, "t_mem is a nullptr for handle=0x{:08X}", t_mem_handle);
 | 
			
		||||
 
 | 
			
		||||
@@ -197,8 +197,7 @@ void IRS::RunImageTransferProcessor(HLERequestContext& ctx) {
 | 
			
		||||
    const auto parameters{rp.PopRaw<Parameters>()};
 | 
			
		||||
    const auto t_mem_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
 | 
			
		||||
    auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_handle);
 | 
			
		||||
    auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle);
 | 
			
		||||
 | 
			
		||||
    if (t_mem.IsNull()) {
 | 
			
		||||
        LOG_ERROR(Service_IRS, "t_mem is a nullptr for handle=0x{:08X}", t_mem_handle);
 | 
			
		||||
@@ -444,8 +443,7 @@ void IRS::RunImageTransferExProcessor(HLERequestContext& ctx) {
 | 
			
		||||
    const auto parameters{rp.PopRaw<Parameters>()};
 | 
			
		||||
    const auto t_mem_handle{ctx.GetCopyHandle(0)};
 | 
			
		||||
 | 
			
		||||
    auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
 | 
			
		||||
        t_mem_handle);
 | 
			
		||||
    auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle);
 | 
			
		||||
 | 
			
		||||
    LOG_INFO(Service_IRS,
 | 
			
		||||
             "called, npad_type={}, npad_id={}, transfer_memory_size={}, "
 | 
			
		||||
 
 | 
			
		||||
@@ -146,10 +146,7 @@ HLERequestContext::HLERequestContext(Kernel::KernelCore& kernel_, Core::Memory::
 | 
			
		||||
 | 
			
		||||
HLERequestContext::~HLERequestContext() = default;
 | 
			
		||||
 | 
			
		||||
void HLERequestContext::ParseCommandBuffer(Kernel::KProcess& process, u32_le* src_cmdbuf,
 | 
			
		||||
                                           bool incoming) {
 | 
			
		||||
    client_handle_table = &process.GetHandleTable();
 | 
			
		||||
 | 
			
		||||
void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) {
 | 
			
		||||
    IPC::RequestParser rp(src_cmdbuf);
 | 
			
		||||
    command_header = rp.PopRaw<IPC::CommandHeader>();
 | 
			
		||||
 | 
			
		||||
@@ -162,7 +159,7 @@ void HLERequestContext::ParseCommandBuffer(Kernel::KProcess& process, u32_le* sr
 | 
			
		||||
    if (command_header->enable_handle_descriptor) {
 | 
			
		||||
        handle_descriptor_header = rp.PopRaw<IPC::HandleDescriptorHeader>();
 | 
			
		||||
        if (handle_descriptor_header->send_current_pid) {
 | 
			
		||||
            pid = process.GetProcessId();
 | 
			
		||||
            pid = thread->GetOwnerProcess()->GetProcessId();
 | 
			
		||||
            rp.Skip(2, false);
 | 
			
		||||
        }
 | 
			
		||||
        if (incoming) {
 | 
			
		||||
@@ -270,9 +267,10 @@ void HLERequestContext::ParseCommandBuffer(Kernel::KProcess& process, u32_le* sr
 | 
			
		||||
    rp.Skip(1, false); // The command is actually an u64, but we don't use the high part.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Result HLERequestContext::PopulateFromIncomingCommandBuffer(Kernel::KProcess& process,
 | 
			
		||||
                                                            u32_le* src_cmdbuf) {
 | 
			
		||||
    ParseCommandBuffer(process, src_cmdbuf, true);
 | 
			
		||||
Result HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdbuf) {
 | 
			
		||||
    client_handle_table = &thread->GetOwnerProcess()->GetHandleTable();
 | 
			
		||||
 | 
			
		||||
    ParseCommandBuffer(src_cmdbuf, true);
 | 
			
		||||
 | 
			
		||||
    if (command_header->IsCloseCommand()) {
 | 
			
		||||
        // Close does not populate the rest of the IPC header
 | 
			
		||||
@@ -284,9 +282,9 @@ Result HLERequestContext::PopulateFromIncomingCommandBuffer(Kernel::KProcess& pr
 | 
			
		||||
    return ResultSuccess;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Result HLERequestContext::WriteToOutgoingCommandBuffer(Kernel::KThread& requesting_thread) {
 | 
			
		||||
Result HLERequestContext::WriteToOutgoingCommandBuffer() {
 | 
			
		||||
    auto current_offset = handles_offset;
 | 
			
		||||
    auto& owner_process = *requesting_thread.GetOwnerProcess();
 | 
			
		||||
    auto& owner_process = *thread->GetOwnerProcess();
 | 
			
		||||
    auto& handle_table = owner_process.GetHandleTable();
 | 
			
		||||
 | 
			
		||||
    for (auto& object : outgoing_copy_objects) {
 | 
			
		||||
@@ -319,7 +317,7 @@ Result HLERequestContext::WriteToOutgoingCommandBuffer(Kernel::KThread& requesti
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Copy the translated command buffer back into the thread's command buffer area.
 | 
			
		||||
    memory.WriteBlock(requesting_thread.GetTlsAddress(), cmd_buf.data(), write_size * sizeof(u32));
 | 
			
		||||
    memory.WriteBlock(thread->GetTlsAddress(), cmd_buf.data(), write_size * sizeof(u32));
 | 
			
		||||
 | 
			
		||||
    return ResultSuccess;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@
 | 
			
		||||
#include "common/concepts.h"
 | 
			
		||||
#include "common/swap.h"
 | 
			
		||||
#include "core/hle/ipc.h"
 | 
			
		||||
#include "core/hle/kernel/k_handle_table.h"
 | 
			
		||||
#include "core/hle/kernel/svc_common.h"
 | 
			
		||||
 | 
			
		||||
union Result;
 | 
			
		||||
@@ -196,10 +197,10 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Populates this context with data from the requesting process/thread.
 | 
			
		||||
    Result PopulateFromIncomingCommandBuffer(Kernel::KProcess& process, u32_le* src_cmdbuf);
 | 
			
		||||
    Result PopulateFromIncomingCommandBuffer(u32_le* src_cmdbuf);
 | 
			
		||||
 | 
			
		||||
    /// Writes data from this context back to the requesting process/thread.
 | 
			
		||||
    Result WriteToOutgoingCommandBuffer(Kernel::KThread& requesting_thread);
 | 
			
		||||
    Result WriteToOutgoingCommandBuffer();
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] u32_le GetHipcCommand() const {
 | 
			
		||||
        return command;
 | 
			
		||||
@@ -359,8 +360,13 @@ public:
 | 
			
		||||
        return *thread;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Kernel::KHandleTable& GetClientHandleTable() {
 | 
			
		||||
        return *client_handle_table;
 | 
			
		||||
    template <typename T>
 | 
			
		||||
    Kernel::KScopedAutoObject<T> GetObjectFromHandle(u32 handle) {
 | 
			
		||||
        auto obj = client_handle_table->GetObjectForIpc(handle, thread);
 | 
			
		||||
        if (obj.IsNotNull()) {
 | 
			
		||||
            return obj->DynamicCast<T*>();
 | 
			
		||||
        }
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    [[nodiscard]] std::shared_ptr<SessionRequestManager> GetManager() const {
 | 
			
		||||
@@ -378,7 +384,7 @@ public:
 | 
			
		||||
private:
 | 
			
		||||
    friend class IPC::ResponseBuilder;
 | 
			
		||||
 | 
			
		||||
    void ParseCommandBuffer(Kernel::KProcess& process, u32_le* src_cmdbuf, bool incoming);
 | 
			
		||||
    void ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming);
 | 
			
		||||
 | 
			
		||||
    std::array<u32, IPC::COMMAND_BUFFER_LENGTH> cmd_buf;
 | 
			
		||||
    Kernel::KServerSession* server_session{};
 | 
			
		||||
 
 | 
			
		||||
@@ -188,7 +188,7 @@ public:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auto tmem{process->GetHandleTable().GetObject<Kernel::KTransferMemory>(tmem_handle)};
 | 
			
		||||
        auto tmem{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(tmem_handle)};
 | 
			
		||||
        if (tmem.IsNull()) {
 | 
			
		||||
            LOG_ERROR(Service_JIT, "attempted to load plugin with invalid transfer memory handle");
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
@@ -356,11 +356,7 @@ public:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Fetch using the handle table for the application process here,
 | 
			
		||||
        // since we are not multiprocess yet.
 | 
			
		||||
        const auto& handle_table{system.ApplicationProcess()->GetHandleTable()};
 | 
			
		||||
 | 
			
		||||
        auto process{handle_table.GetObject<Kernel::KProcess>(process_handle)};
 | 
			
		||||
        auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle)};
 | 
			
		||||
        if (process.IsNull()) {
 | 
			
		||||
            LOG_ERROR(Service_JIT, "process is null for handle=0x{:08X}", process_handle);
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
@@ -368,7 +364,7 @@ public:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auto rx_mem{handle_table.GetObject<Kernel::KCodeMemory>(rx_mem_handle)};
 | 
			
		||||
        auto rx_mem{ctx.GetObjectFromHandle<Kernel::KCodeMemory>(rx_mem_handle)};
 | 
			
		||||
        if (rx_mem.IsNull()) {
 | 
			
		||||
            LOG_ERROR(Service_JIT, "rx_mem is null for handle=0x{:08X}", rx_mem_handle);
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
@@ -376,7 +372,7 @@ public:
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        auto ro_mem{handle_table.GetObject<Kernel::KCodeMemory>(ro_mem_handle)};
 | 
			
		||||
        auto ro_mem{ctx.GetObjectFromHandle<Kernel::KCodeMemory>(ro_mem_handle)};
 | 
			
		||||
        if (ro_mem.IsNull()) {
 | 
			
		||||
            LOG_ERROR(Service_JIT, "ro_mem is null for handle=0x{:08X}", ro_mem_handle);
 | 
			
		||||
            IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
 
 | 
			
		||||
@@ -651,10 +651,9 @@ private:
 | 
			
		||||
    void RegisterProcessHandle(HLERequestContext& ctx) {
 | 
			
		||||
        LOG_DEBUG(Service_LDR, "(called)");
 | 
			
		||||
 | 
			
		||||
        auto process_h = ctx.GetClientHandleTable().GetObject(ctx.GetCopyHandle(0));
 | 
			
		||||
        auto process = ctx.GetObjectFromHandle<Kernel::KProcess>(ctx.GetCopyHandle(0));
 | 
			
		||||
        auto client_pid = ctx.GetPID();
 | 
			
		||||
        auto result = interface.RegisterProcessHandle(client_pid,
 | 
			
		||||
                                                      process_h->DynamicCast<Kernel::KProcess*>());
 | 
			
		||||
        auto result = interface.RegisterProcessHandle(client_pid, process.GetPointerUnsafe());
 | 
			
		||||
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
        rb.Push(result);
 | 
			
		||||
@@ -671,12 +670,11 @@ private:
 | 
			
		||||
 | 
			
		||||
        IPC::RequestParser rp{ctx};
 | 
			
		||||
        auto params = rp.PopRaw<InputParameters>();
 | 
			
		||||
        auto process_h = ctx.GetClientHandleTable().GetObject(ctx.GetCopyHandle(0));
 | 
			
		||||
        auto process = ctx.GetObjectFromHandle<Kernel::KProcess>(ctx.GetCopyHandle(0));
 | 
			
		||||
 | 
			
		||||
        auto client_pid = ctx.GetPID();
 | 
			
		||||
        auto result =
 | 
			
		||||
            interface.RegisterProcessModuleInfo(client_pid, params.nrr_address, params.nrr_size,
 | 
			
		||||
                                                process_h->DynamicCast<Kernel::KProcess*>());
 | 
			
		||||
        auto result = interface.RegisterProcessModuleInfo(
 | 
			
		||||
            client_pid, params.nrr_address, params.nrr_size, process.GetPointerUnsafe());
 | 
			
		||||
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 2};
 | 
			
		||||
        rb.Push(result);
 | 
			
		||||
 
 | 
			
		||||
@@ -203,7 +203,7 @@ Result ServiceFrameworkBase::HandleSyncRequest(Kernel::KServerSession& session,
 | 
			
		||||
    // If emulation was shutdown, we are closing service threads, do not write the response back to
 | 
			
		||||
    // memory that may be shutting down as well.
 | 
			
		||||
    if (system.IsPoweredOn()) {
 | 
			
		||||
        ctx.WriteToOutgoingCommandBuffer(ctx.GetThread());
 | 
			
		||||
        ctx.WriteToOutgoingCommandBuffer();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user