From a167a6d53f5b728c6ad3dcb9d7b9cde4bfab5975 Mon Sep 17 00:00:00 2001 From: Nomi Date: Tue, 26 Sep 2023 04:42:20 +0200 Subject: [PATCH] Write proper pointers --- src/core/services/am.cpp | 14 ++++++++++++-- src/core/services/apt.cpp | 8 ++++---- src/core/services/cfg.cpp | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/core/services/am.cpp b/src/core/services/am.cpp index d34c2492..d04eee8c 100644 --- a/src/core/services/am.cpp +++ b/src/core/services/am.cpp @@ -78,10 +78,20 @@ void AMService::getProgramInfos(u32 messagePointer) { const u32 titleInfos = mem.read32(messagePointer + 24); log("AM::GetProgramInfos (media type = %X, title count = %X, title IDs pointer = %X, title infos pointer = %X) (Stubbed)\n", mediaType, titleCount, titleIDs, titleInfos); + for (u32 title = 0; title < titleCount; title++) { + const u64 id = mem.read64(titleIDs + sizeof(u64) * title); + + mem.write64(titleInfos + 0x18 * title, id); // Title ID + mem.write64(titleInfos + 0x18 * title + 8, 0); // Size + mem.write16(titleInfos + 0x18 * title + 16, 0); // Version + mem.write16(titleInfos + 0x18 * title + 18, 0); // Padding + mem.write32(titleInfos + 0x18 * title + 20, 0); // Type + } + mem.write32(messagePointer, IPC::responseHeader(0x3, 1, 4)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, IPC::pointerHeader(0, sizeof(u64) * titleCount, IPC::BufferType::Send)); - mem.write32(messagePointer + 12, 0xC0DEC0DE); + mem.write32(messagePointer + 12, titleIDs); mem.write32(messagePointer + 16, IPC::pointerHeader(1, sizeof(u32) * titleCount, IPC::BufferType::Receive)); - mem.write32(messagePointer + 20, 0xC0DEC0DE); + mem.write32(messagePointer + 20, titleInfos); } \ No newline at end of file diff --git a/src/core/services/apt.cpp b/src/core/services/apt.cpp index d8bd9ef7..a1fb7e11 100644 --- a/src/core/services/apt.cpp +++ b/src/core/services/apt.cpp @@ -392,9 +392,9 @@ void APTService::receiveDeliverArg(u32 messagePointer) { mem.write32(messagePointer + 8, 0); // Program ID mem.write8(messagePointer + 16, 1); // Is valid response mem.write32(messagePointer + 20, IPC::pointerHeader(0, sizeof(u32) * parameterSize, IPC::BufferType::Send)); - mem.write32(messagePointer + 24, 0xDEADBEEF); // TODO: look into how this works if program reads from this address + mem.write32(messagePointer + 24, parameter); mem.write32(messagePointer + 28, IPC::pointerHeader(1, sizeof(u32) * hmacSize, IPC::BufferType::Send)); - mem.write32(messagePointer + 32, 0xDEADBEEF); + mem.write32(messagePointer + 32, hmac); } void APTService::loadSysMenuArg(u32 messagePointer) { @@ -404,7 +404,7 @@ void APTService::loadSysMenuArg(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x35, 4, 4)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, IPC::pointerHeader(0, sizeof(u32) * outputSize, IPC::BufferType::Send)); - mem.write32(messagePointer + 12, 0xDEADBEEF); + mem.write32(messagePointer + 12, outputSize); } void APTService::getCaptureInfo(u32 messagePointer) { @@ -415,5 +415,5 @@ void APTService::getCaptureInfo(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x4A, 1, 2)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, IPC::pointerHeader(0, sizeof(u32) * size, IPC::BufferType::Send)); - mem.write32(messagePointer + 12, 0xDEADDEAD); + mem.write32(messagePointer + 12, captureBufferInfo); } \ No newline at end of file diff --git a/src/core/services/cfg.cpp b/src/core/services/cfg.cpp index 46938e50..937e1e42 100644 --- a/src/core/services/cfg.cpp +++ b/src/core/services/cfg.cpp @@ -283,7 +283,7 @@ void CFGService::setConfigInfoBlk4(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x401, 1, 2)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, IPC::pointerHeader(0, size, IPC::BufferType::Receive)); - mem.write32(messagePointer + 12, 0xCAFE0000); // Nonsensical pointer to see if anything uses this + mem.write32(messagePointer + 12, input); } void CFGService::updateConfigNANDSavegame(u32 messagePointer) {