[service, ns, acc] Stub IsQualificationTransitionSupportedByProcessId and SaveDataThumbnail commands
All checks were successful
eden-license / license-header (pull_request) Successful in 22s

- ns: Stubbed IsQualificationTransitionSupportedByProcessId (2520) to always return true.
- acc: added the missing SaveDataThumbnail commands:
  * ClearSaveDataThumbnail (111) → stubbed, returns success.
  * LoadSaveDataThumbnail (112) → stubbed, returns success with size=0.
  * GetSaveDataThumbnailExistence (113) → stubbed, returns false.

This allows titles like Borderlands GOTY to progress past save-related errors.
This commit is contained in:
JPikachu 2025-08-21 23:57:15 +01:00
parent 4ea9664ff4
commit 3b18de150e
7 changed files with 54 additions and 8 deletions

View file

@ -1108,6 +1108,35 @@ void Module::Interface::StoreSaveDataThumbnail(HLERequestContext& ctx, const Com
rb.Push(ResultSuccess);
}
void Module::Interface::ClearSaveDataThumbnail(HLERequestContext& ctx) {
LOG_WARNING(Service_ACC, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
void Module::Interface::LoadSaveDataThumbnail(HLERequestContext& ctx) {
// TODO: Grab thumbnail from Nand so this can be unstubbed
// For now, pretend a thumbnail exists and return dummy data
std::vector<u8> dummy_thumbnail(THUMBNAIL_SIZE, 0);
ctx.WriteBuffer(dummy_thumbnail);
LOG_WARNING(Service_ACC, "(STUBBED) called. returning dummy thumbnail");
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push<u64>(THUMBNAIL_SIZE);
}
void Module::Interface::GetSaveDataThumbnailExistence(HLERequestContext& ctx) {
// TODO: Get actual thumbnail image
LOG_WARNING(Service_ACC, "(STUBBED) called. Returning true (dummy thumbnail)");
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push<bool>(true);
}
void Module::Interface::TrySelectUserWithoutInteractionDeprecated(HLERequestContext& ctx) {
LOG_DEBUG(Service_ACC, "called");
// A u8 is passed into this function which we can safely ignore. It's to determine if we have

View file

@ -47,6 +47,9 @@ public:
void StoreSaveDataThumbnailApplication(HLERequestContext& ctx);
void GetBaasAccountManagerForSystemService(HLERequestContext& ctx);
void StoreSaveDataThumbnailSystem(HLERequestContext& ctx);
void ClearSaveDataThumbnail(HLERequestContext& ctx);
void LoadSaveDataThumbnail(HLERequestContext& ctx);
void GetSaveDataThumbnailExistence(HLERequestContext& ctx);
private:
Result InitializeApplicationInfoBase();

View file

@ -33,9 +33,9 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
{106, nullptr, "GetProfileSyncNotifier"},
{110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"},
{111, nullptr, "ClearSaveDataThumbnail"},
{112, nullptr, "LoadSaveDataThumbnail"},
{113, nullptr, "GetSaveDataThumbnailExistence"},
{111, &ACC_SU::ClearSaveDataThumbnail, "ClearSaveDataThumbnail"},
{112, &ACC_SU::LoadSaveDataThumbnail, "LoadSaveDataThumbnail"},
{113, &ACC_SU::GetSaveDataThumbnailExistence, "GetSaveDataThumbnailExistence"},
{120, nullptr, "ListOpenUsersInApplication"},
{130, nullptr, "ActivateOpenContextRetention"},
{140, &ACC_SU::ListQualifiedUsers, "ListQualifiedUsers"},

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -26,7 +29,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
{102, nullptr, "AuthenticateApplicationAsync"},
{103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+
{110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
{111, nullptr, "ClearSaveDataThumbnail"},
{111, &ACC_U0::ClearSaveDataThumbnail, "ClearSaveDataThumbnail"},
{120, nullptr, "CreateGuestLoginRequest"},
{130, nullptr, "LoadOpenContext"}, // 5.0.0+
{131, &ACC_U0::ListOpenContextStoredUsers, "ListOpenContextStoredUsers"}, // 6.0.0+

View file

@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -29,9 +32,9 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module_, std::shared_ptr<ProfileManager>
{105, nullptr, "CheckNetworkServiceAvailabilityAsync"},
{106, nullptr, "GetProfileSyncNotifier"},
{110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"},
{111, nullptr, "ClearSaveDataThumbnail"},
{112, nullptr, "LoadSaveDataThumbnail"},
{113, nullptr, "GetSaveDataThumbnailExistence"},
{111, &ACC_U1::ClearSaveDataThumbnail, "ClearSaveDataThumbnail"},
{112, &ACC_U1::LoadSaveDataThumbnail, "LoadSaveDataThumbnail"},
{113, &ACC_U1::GetSaveDataThumbnailExistence, "GetSaveDataThumbnailExistence"},
{120, nullptr, "ListOpenUsersInApplication"},
{130, nullptr, "ActivateOpenContextRetention"},
{140, &ACC_U1::ListQualifiedUsers, "ListQualifiedUsers"},

View file

@ -286,7 +286,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
{2517, nullptr, "CreateApplicationInstance"},
{2518, nullptr, "UpdateQualificationForDebug"},
{2519, nullptr, "IsQualificationTransitionSupported"},
{2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
{2520, D<&IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId>,"IsQualificationTransitionSupportedByProcessId"},
{2521, nullptr, "GetRightsUserChangedEvent"},
{2522, nullptr, "IsRomRedirectionAvailable"},
{2800, nullptr, "GetApplicationIdOfPreomia"},
@ -523,4 +523,11 @@ Result IApplicationManagerInterface::GetApplicationTerminateResult(Out<Result> o
R_SUCCEED();
}
Result IApplicationManagerInterface::IsQualificationTransitionSupportedByProcessId(
Out<bool> out_is_supported, u64 process_id) {
LOG_WARNING(Service_NS, "(STUBBED) called. process_id={:016X}", process_id);
*out_is_supported = true;
R_SUCCEED();
}
} // namespace Service::NS

View file

@ -53,6 +53,7 @@ public:
u64 application_id);
Result CheckApplicationLaunchVersion(u64 application_id);
Result GetApplicationTerminateResult(Out<Result> out_result, u64 application_id);
Result IsQualificationTransitionSupportedByProcessId(Out<bool> out_is_supported, u64 process_id);
private:
KernelHelpers::ServiceContext service_context;