|
|
|
@ -4,6 +4,7 @@ |
|
|
|
|
|
|
|
#include <boost/range/algorithm_ext/erase.hpp>
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "common/common_funcs.h"
|
|
|
|
#include "common/common_types.h"
|
|
|
|
#include "core/hle/ipc_helpers.h"
|
|
|
|
#include "core/hle/kernel/handle_table.h"
|
|
|
|
@ -45,10 +46,15 @@ void HLERequestContext::ClearIncomingObjects() { |
|
|
|
request_handles.clear(); |
|
|
|
} |
|
|
|
|
|
|
|
void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { |
|
|
|
void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf, bool incoming) { |
|
|
|
IPC::RequestParser rp(src_cmdbuf); |
|
|
|
command_header = std::make_unique<IPC::CommandHeader>(rp.PopRaw<IPC::CommandHeader>()); |
|
|
|
|
|
|
|
if (command_header->type == IPC::CommandType::Close) { |
|
|
|
// Close does not populate the rest of the IPC header
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
// If handle descriptor is present, add size of it
|
|
|
|
if (command_header->enable_handle_descriptor) { |
|
|
|
handle_descriptor_header = |
|
|
|
@ -80,9 +86,18 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { |
|
|
|
UNIMPLEMENTED(); |
|
|
|
} |
|
|
|
|
|
|
|
if (incoming && Session()->IsDomain()) { |
|
|
|
domain_message_header = std::make_unique<IPC::DomainMessageHeader>(rp.PopRaw<IPC::DomainMessageHeader>()); |
|
|
|
} |
|
|
|
|
|
|
|
data_payload_header = |
|
|
|
std::make_unique<IPC::DataPayloadHeader>(rp.PopRaw<IPC::DataPayloadHeader>()); |
|
|
|
ASSERT(data_payload_header->magic == 0x49434653 || data_payload_header->magic == 0x4F434653); |
|
|
|
|
|
|
|
if (incoming) { |
|
|
|
ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'I')); |
|
|
|
} else { |
|
|
|
ASSERT(data_payload_header->magic == Common::MakeMagic('S', 'F', 'C', 'O')); |
|
|
|
} |
|
|
|
|
|
|
|
data_payload_offset = rp.GetCurrentOffset(); |
|
|
|
command = rp.Pop<u32_le>(); |
|
|
|
@ -91,7 +106,7 @@ void HLERequestContext::ParseCommandBuffer(u32_le* src_cmdbuf) { |
|
|
|
ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdbuf, |
|
|
|
Process& src_process, |
|
|
|
HandleTable& src_table) { |
|
|
|
ParseCommandBuffer(src_cmdbuf); |
|
|
|
ParseCommandBuffer(src_cmdbuf, true); |
|
|
|
size_t untranslated_size = data_payload_offset + command_header->data_size; |
|
|
|
std::copy_n(src_cmdbuf, untranslated_size, cmd_buf.begin()); |
|
|
|
|
|
|
|
@ -106,7 +121,7 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(u32_le* src_cmdb |
|
|
|
|
|
|
|
ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, Process& dst_process, |
|
|
|
HandleTable& dst_table) { |
|
|
|
ParseCommandBuffer(&cmd_buf[0]); |
|
|
|
ParseCommandBuffer(&cmd_buf[0], false); |
|
|
|
size_t untranslated_size = data_payload_offset + command_header->data_size; |
|
|
|
std::copy_n(cmd_buf.begin(), untranslated_size, dst_cmdbuf); |
|
|
|
|
|
|
|
|