diff --git a/include/services/apt.hpp b/include/services/apt.hpp index df98c825..53c6eafc 100644 --- a/include/services/apt.hpp +++ b/include/services/apt.hpp @@ -52,6 +52,7 @@ class APTService { void replySleepQuery(u32 messagePointer); void setApplicationCpuTimeLimit(u32 messagePointer); void setScreencapPostPermission(u32 messagePointer); + void sendParameter(u32 messagePointer); void prepareToStartLibraryApplet(u32 messagePointer); void startLibraryApplet(u32 messagePointer); void theSmashBrosFunction(u32 messagePointer); diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index e2dff928..fd65c5ee 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -10,6 +10,7 @@ namespace APTCommands { GetAppletInfo = 0x00060040, IsRegistered = 0x00090040, InquireNotification = 0x000B0040, + SendParameter = 0x000C0104, ReceiveParameter = 0x000D0080, GlanceParameter = 0x000E0080, PreloadLibraryApplet = 0x00160040, @@ -97,6 +98,7 @@ void APTService::handleSyncRequest(u32 messagePointer) { case APTCommands::ReceiveParameter: [[likely]] receiveParameter(messagePointer); break; case APTCommands::ReplySleepQuery: replySleepQuery(messagePointer); break; case APTCommands::SetApplicationCpuTimeLimit: setApplicationCpuTimeLimit(messagePointer); break; + case APTCommands::SendParameter: sendParameter(messagePointer); break; case APTCommands::SetScreencapPostPermission: setScreencapPostPermission(messagePointer); break; case APTCommands::TheSmashBrosFunction: theSmashBrosFunction(messagePointer); break; default: @@ -216,6 +218,22 @@ void APTService::notifyToWait(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void APTService::sendParameter(u32 messagePointer) { + const u32 sourceAppID = mem.read32(messagePointer + 4); + const u32 destAppID = mem.read32(messagePointer + 8); + const u32 cmd = mem.read32(messagePointer + 12); + const u32 paramSize = mem.read32(messagePointer + 16); + + const u32 parameterHandle = mem.read32(messagePointer + 24); // What dis? + const u32 parameterPointer = mem.read32(messagePointer + 32); + log("APT::SendParameter (source app = %X, dest app = %X, cmd = %X, size = %X) (Stubbed)", sourceAppID, destAppID, cmd, paramSize); + + mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); + + kernel.signalEvent(notificationEvent.value()); +} + void APTService::receiveParameter(u32 messagePointer) { const u32 app = mem.read32(messagePointer + 4); const u32 size = mem.read32(messagePointer + 8);