From 977cb0403c9c804ffd302bc3ecddce23cd5d3a0a Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 20 Aug 2023 03:08:34 +0300 Subject: [PATCH 1/2] Stub DLC::GetPatchTitleInfo to fail --- include/services/am.hpp | 1 + src/core/services/am.cpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/services/am.hpp b/include/services/am.hpp index d961734f..672909ff 100644 --- a/include/services/am.hpp +++ b/include/services/am.hpp @@ -12,6 +12,7 @@ class AMService { // Service commands void getDLCTitleInfo(u32 messagePointer); + void getPatchTitleInfo(u32 messagePointer); void listTitleInfo(u32 messagePointer); public: diff --git a/src/core/services/am.cpp b/src/core/services/am.cpp index 5e2956d8..32e6a0b3 100644 --- a/src/core/services/am.cpp +++ b/src/core/services/am.cpp @@ -4,7 +4,8 @@ namespace AMCommands { enum : u32 { GetDLCTitleInfo = 0x10050084, - ListTitleInfo = 0x10070102 + ListTitleInfo = 0x10070102, + GetPatchTitleInfo = 0x100D0084, }; } @@ -13,6 +14,7 @@ void AMService::reset() {} void AMService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case AMCommands::GetPatchTitleInfo: getPatchTitleInfo(messagePointer); break; case AMCommands::GetDLCTitleInfo: getDLCTitleInfo(messagePointer); break; case AMCommands::ListTitleInfo: listTitleInfo(messagePointer); break; default: Helpers::panic("AM service requested. Command: %08X\n", command); @@ -42,7 +44,16 @@ void AMService::listTitleInfo(u32 messagePointer) { void AMService::getDLCTitleInfo(u32 messagePointer) { log("AM::GetDLCTitleInfo (stubbed to fail)\n"); + Helpers::warn("Unimplemented AM::GetDLCTitleInfo. Will need to be implemented to support DLC\n"); mem.write32(messagePointer, IPC::responseHeader(0x1005, 1, 4)); - mem.write32(messagePointer + 4, -1); + mem.write32(messagePointer + 4, Result::FailurePlaceholder); +} + +void AMService::getPatchTitleInfo(u32 messagePointer) { + log("AM::GetPatchTitleInfo (stubbed to fail)\n"); + Helpers::warn("Unimplemented AM::GetDLCTitleInfo. Will need to be implemented to support updates\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x100D, 1, 4)); + mem.write32(messagePointer + 4, Result::FailurePlaceholder); } \ No newline at end of file From 415a5bb8dee35d050c645367d3a154eb72fd5346 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 20 Aug 2023 03:27:10 +0300 Subject: [PATCH 2/2] Add AM::RegisterDisconnectEvent --- include/services/ac.hpp | 1 + src/core/services/ac.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/include/services/ac.hpp b/include/services/ac.hpp index 058df381..3d3c3216 100644 --- a/include/services/ac.hpp +++ b/include/services/ac.hpp @@ -15,6 +15,7 @@ class ACService { void closeAsync(u32 messagePointer); void createDefaultConfig(u32 messagePointer); void getLastErrorCode(u32 messagePointer); + void registerDisconnectEvent(u32 messagePointer); void setClientVersion(u32 messagePointer); public: diff --git a/src/core/services/ac.cpp b/src/core/services/ac.cpp index 480cef93..56326609 100644 --- a/src/core/services/ac.cpp +++ b/src/core/services/ac.cpp @@ -7,6 +7,7 @@ namespace ACCommands { CancelConnectAsync = 0x00070002, CloseAsync = 0x00080004, GetLastErrorCode = 0x000A0000, + RegisterDisconnectEvent = 0x00300004, SetClientVersion = 0x00400042, }; } @@ -20,6 +21,7 @@ void ACService::handleSyncRequest(u32 messagePointer) { case ACCommands::CloseAsync: closeAsync(messagePointer); break; case ACCommands::CreateDefaultConfig: createDefaultConfig(messagePointer); break; case ACCommands::GetLastErrorCode: getLastErrorCode(messagePointer); break; + case ACCommands::RegisterDisconnectEvent: registerDisconnectEvent(messagePointer); break; case ACCommands::SetClientVersion: setClientVersion(messagePointer); break; default: Helpers::panic("AC service requested. Command: %08X\n", command); } @@ -63,4 +65,15 @@ void ACService::setClientVersion(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x40, 1, 0)); mem.write32(messagePointer + 4, Result::Success); +} + +void ACService::registerDisconnectEvent(u32 messagePointer) { + log("AC::RegisterDisconnectEvent (stubbed)\n"); + const u32 pidHeader = mem.read32(messagePointer + 4); + const u32 copyHandleHeader = mem.read32(messagePointer + 12); + // Event signaled when disconnecting from AC + const Handle eventHandle = mem.read32(messagePointer + 16); + + mem.write32(messagePointer, IPC::responseHeader(0x30, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file