This commit is contained in:
lizzie 2026-03-29 05:21:55 +00:00
parent 819d7eb46d
commit 965e2d563a
2 changed files with 9 additions and 12 deletions

View file

@ -438,7 +438,7 @@ void WriteOutArgument(bool is_domain, CallArguments& args, u8* raw_data, HLERequ
template <bool Domain, typename T, typename... A> template <bool Domain, typename T, typename... A>
void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) { void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) {
const auto mgr = ctx.GetManager(); const auto mgr = ctx.GetManager().get();
// Verify domain state. // Verify domain state.
if constexpr (!Domain) { if constexpr (!Domain) {
const bool is_domain = mgr ? mgr->IsDomain() : false; const bool is_domain = mgr ? mgr->IsDomain() : false;

View file

@ -78,32 +78,29 @@ public:
memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH); memset(cmdbuf, 0, sizeof(u32) * IPC::COMMAND_BUFFER_LENGTH);
IPC::CommandHeader header{}; IPC::CommandHeader header{};
auto const mgr = ctx.GetManager().get();
// The entire size of the raw data section in u32 units, including the 16 bytes of mandatory // The entire size of the raw data section in u32 units, including the 16 bytes of mandatory
// padding. // padding.
u32 raw_data_size = ctx.write_size = u32 raw_data_size = ctx.write_size = ctx.IsTipc() ? normal_params_size - 1 : normal_params_size;
ctx.IsTipc() ? normal_params_size - 1 : normal_params_size;
u32 num_handles_to_move{}; u32 num_handles_to_move{};
u32 num_domain_objects{}; u32 num_domain_objects{};
const bool always_move_handles{ const bool always_move_handles = (u32(flags) & u32(Flags::AlwaysMoveHandles)) != 0;
(static_cast<u32>(flags) & static_cast<u32>(Flags::AlwaysMoveHandles)) != 0}; if (!mgr->IsDomain() || always_move_handles) {
if (!ctx.GetManager()->IsDomain() || always_move_handles) {
num_handles_to_move = num_objects_to_move; num_handles_to_move = num_objects_to_move;
} else { } else {
num_domain_objects = num_objects_to_move; num_domain_objects = num_objects_to_move;
} }
if (ctx.GetManager()->IsDomain()) { if (mgr->IsDomain()) {
raw_data_size += raw_data_size += u32(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects);
static_cast<u32>(sizeof(DomainMessageHeader) / sizeof(u32) + num_domain_objects);
ctx.write_size += num_domain_objects; ctx.write_size += num_domain_objects;
} }
if (ctx.IsTipc()) { if (ctx.IsTipc()) {
header.type.Assign(ctx.GetCommandType()); header.type.Assign(ctx.GetCommandType());
} else { } else {
raw_data_size += static_cast<u32>(sizeof(IPC::DataPayloadHeader) / sizeof(u32) + 4 + raw_data_size += u32(sizeof(IPC::DataPayloadHeader) / sizeof(u32) + 4 + normal_params_size);
normal_params_size);
} }
header.data_size.Assign(raw_data_size); header.data_size.Assign(raw_data_size);
@ -126,7 +123,7 @@ public:
if (!ctx.IsTipc()) { if (!ctx.IsTipc()) {
AlignWithPadding(); AlignWithPadding();
if (ctx.GetManager()->IsDomain() && ctx.HasDomainMessageHeader()) { if (mgr->IsDomain() && ctx.HasDomainMessageHeader()) {
IPC::DomainMessageHeader domain_header{}; IPC::DomainMessageHeader domain_header{};
domain_header.num_objects = num_domain_objects; domain_header.num_objects = num_domain_objects;
PushRaw(domain_header); PushRaw(domain_header);