[FRD] GetFriendKeyList

This commit is contained in:
wheremyfoodat 2023-03-17 03:40:28 +02:00
parent 16d150496d
commit 739a82a704
2 changed files with 29 additions and 2 deletions

View file

@ -1,15 +1,25 @@
#pragma once #pragma once
#include <cassert>
#include "helpers.hpp" #include "helpers.hpp"
#include "kernel_types.hpp" #include "kernel_types.hpp"
#include "logger.hpp" #include "logger.hpp"
#include "memory.hpp" #include "memory.hpp"
// It's important to keep this struct to 16 bytes as we use its sizeof in the service functions in frd.cpp
struct FriendKey {
u32 friendID;
u32 dummy;
u64 friendCode;
};
static_assert(sizeof(FriendKey) == 16);
class FRDService { class FRDService {
Handle handle = KernelHandles::FRD; Handle handle = KernelHandles::FRD;
Memory& mem; Memory& mem;
MAKE_LOG_FUNCTION(log, frdLogger) MAKE_LOG_FUNCTION(log, frdLogger)
// Service commands // Service commands
void getFriendKeyList(u32 messagePointer);
void getMyFriendKey(u32 messagePointer); void getMyFriendKey(u32 messagePointer);
void getMyPresence(u32 messagePointer); void getMyPresence(u32 messagePointer);
void setClientSDKVersion(u32 messagePointer); void setClientSDKVersion(u32 messagePointer);

View file

@ -4,7 +4,8 @@ namespace FRDCommands {
enum : u32 { enum : u32 {
SetClientSdkVersion = 0x00320042, SetClientSdkVersion = 0x00320042,
GetMyFriendKey = 0x00050000, GetMyFriendKey = 0x00050000,
GetMyPresence = 0x00080000 GetMyPresence = 0x00080000,
GetFriendKeyList = 0x00110080
}; };
} }
@ -19,6 +20,7 @@ void FRDService::reset() {}
void FRDService::handleSyncRequest(u32 messagePointer) { void FRDService::handleSyncRequest(u32 messagePointer) {
const u32 command = mem.read32(messagePointer); const u32 command = mem.read32(messagePointer);
switch (command) { switch (command) {
case FRDCommands::GetFriendKeyList: getFriendKeyList(messagePointer); break;
case FRDCommands::GetMyFriendKey: getMyFriendKey(messagePointer); break; case FRDCommands::GetMyFriendKey: getMyFriendKey(messagePointer); break;
case FRDCommands::GetMyPresence: getMyPresence(messagePointer); break; case FRDCommands::GetMyPresence: getMyPresence(messagePointer); break;
case FRDCommands::SetClientSdkVersion: setClientSDKVersion(messagePointer); break; case FRDCommands::SetClientSdkVersion: setClientSDKVersion(messagePointer); break;
@ -27,7 +29,7 @@ void FRDService::handleSyncRequest(u32 messagePointer) {
} }
void FRDService::getMyFriendKey(u32 messagePointer) { void FRDService::getMyFriendKey(u32 messagePointer) {
log("FRD::GetMyFriendKey"); log("FRD::GetMyFriendKey\n");
mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 4, Result::Success);
mem.write32(messagePointer + 8, 0); // Principal ID mem.write32(messagePointer + 8, 0); // Principal ID
@ -36,6 +38,21 @@ void FRDService::getMyFriendKey(u32 messagePointer) {
mem.write32(messagePointer + 20, 0); mem.write32(messagePointer + 20, 0);
} }
void FRDService::getFriendKeyList(u32 messagePointer) {
log("FRD::GetFriendKeyList\n");
const u32 count = mem.read32(messagePointer + 8); // From what I understand this is a cap on the number of keys to receive?
constexpr u32 friendCount = 0; // And this should be the number of friends whose keys were actually received?
mem.write32(messagePointer + 4, Result::Success);
mem.write32(messagePointer + 8, 0);
// Zero out friend keys
for (u32 i = 0; i < count * sizeof(FriendKey); i += 4) {
mem.write32(messagePointer + 12 + i, 0);
}
}
void FRDService::getMyPresence(u32 messagePointer) { void FRDService::getMyPresence(u32 messagePointer) {
static constexpr u32 presenceSize = 0x12C; // A presence seems to be 12C bytes of data, not sure what it contains static constexpr u32 presenceSize = 0x12C; // A presence seems to be 12C bytes of data, not sure what it contains
log("FRD::GetMyPresence\n"); log("FRD::GetMyPresence\n");