mirror of
https://github.com/PabloMK7/citra.git
synced 2025-10-11 20:10:03 +00:00
hle: Eliminate need to specify command headers for IPC. (#6678)
This commit is contained in:
parent
0bedb28bdc
commit
e043caac27
96 changed files with 2691 additions and 2707 deletions
|
@ -684,7 +684,7 @@ Module::Interface::Interface(std::shared_ptr<Module> am, const char* name, u32 m
|
|||
Module::Interface::~Interface() = default;
|
||||
|
||||
void Module::Interface::GetNumPrograms(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0001, 1, 0); // 0x00010040
|
||||
IPC::RequestParser rp(ctx);
|
||||
u32 media_type = rp.Pop<u8>();
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
||||
|
@ -693,7 +693,7 @@ void Module::Interface::GetNumPrograms(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::FindDLCContentInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1002, 4, 4); // 0x10020104
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
|
@ -758,7 +758,7 @@ void Module::Interface::FindDLCContentInfos(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::ListDLCContentInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1003, 5, 2); // 0x10030142
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
u32 content_count = rp.Pop<u32>();
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
|
@ -811,7 +811,7 @@ void Module::Interface::ListDLCContentInfos(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::DeleteContents(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1004, 4, 2); // 0x10040102
|
||||
IPC::RequestParser rp(ctx);
|
||||
u8 media_type = rp.Pop<u8>();
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
u32 content_count = rp.Pop<u32>();
|
||||
|
@ -825,7 +825,7 @@ void Module::Interface::DeleteContents(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetProgramList(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0002, 2, 2); // 0x00020082
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
u32 count = rp.Pop<u32>();
|
||||
u8 media_type = rp.Pop<u8>();
|
||||
|
@ -879,7 +879,7 @@ ResultCode GetTitleInfoFromList(std::span<const u64> title_id_list,
|
|||
}
|
||||
|
||||
void Module::Interface::GetProgramInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0003, 2, 4); // 0x00030084
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
u32 title_count = rp.Pop<u32>();
|
||||
|
@ -898,7 +898,7 @@ void Module::Interface::GetProgramInfos(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::DeleteUserProgram(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0004, 3, 0);
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto media_type = rp.PopEnum<FS::MediaType>();
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
|
@ -926,7 +926,7 @@ void Module::Interface::DeleteUserProgram(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetProductCode(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0005, 3, 0);
|
||||
IPC::RequestParser rp(ctx);
|
||||
FS::MediaType media_type = rp.PopEnum<FS::MediaType>();
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
std::string path = GetTitleContentPath(media_type, title_id);
|
||||
|
@ -952,7 +952,7 @@ void Module::Interface::GetProductCode(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetDLCTitleInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1005, 2, 4); // 0x10050084
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
u32 title_count = rp.Pop<u32>();
|
||||
|
@ -985,7 +985,7 @@ void Module::Interface::GetDLCTitleInfos(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetPatchTitleInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x100D, 2, 4); // 0x100D0084
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
u32 title_count = rp.Pop<u32>();
|
||||
|
@ -1018,7 +1018,7 @@ void Module::Interface::GetPatchTitleInfos(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::ListDataTitleTicketInfos(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1007, 4, 2); // 0x10070102
|
||||
IPC::RequestParser rp(ctx);
|
||||
u32 ticket_count = rp.Pop<u32>();
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
u32 start_index = rp.Pop<u32>();
|
||||
|
@ -1046,7 +1046,7 @@ void Module::Interface::ListDataTitleTicketInfos(Kernel::HLERequestContext& ctx)
|
|||
}
|
||||
|
||||
void Module::Interface::GetDLCContentInfoCount(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x1001, 3, 0); // 0x100100C0
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
|
||||
|
@ -1076,7 +1076,7 @@ void Module::Interface::GetDLCContentInfoCount(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::DeleteTicket(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0007, 2, 0); // 0x00070080
|
||||
IPC::RequestParser rp(ctx);
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
|
@ -1085,7 +1085,7 @@ void Module::Interface::DeleteTicket(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetNumTickets(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0008, 0, 0); // 0x00080000
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
u32 ticket_count = 0;
|
||||
for (const auto& title_list : am->am_title_list) {
|
||||
|
@ -1099,7 +1099,7 @@ void Module::Interface::GetNumTickets(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetTicketList(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0009, 2, 2); // 0x00090082
|
||||
IPC::RequestParser rp(ctx);
|
||||
u32 ticket_list_count = rp.Pop<u32>();
|
||||
u32 ticket_index = rp.Pop<u32>();
|
||||
auto& ticket_tids_out = rp.PopMappedBuffer();
|
||||
|
@ -1122,7 +1122,7 @@ void Module::Interface::GetTicketList(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::NeedsCleanup(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0013, 1, 0); // 0x00130040
|
||||
IPC::RequestParser rp(ctx);
|
||||
const auto media_type = rp.Pop<u8>();
|
||||
|
||||
LOG_DEBUG(Service_AM, "(STUBBED) media_type=0x{:02x}", media_type);
|
||||
|
@ -1133,7 +1133,7 @@ void Module::Interface::NeedsCleanup(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::QueryAvailableTitleDatabase(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0019, 1, 0); // 0x190040
|
||||
IPC::RequestParser rp(ctx);
|
||||
u8 media_type = rp.Pop<u8>();
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(2, 0);
|
||||
|
@ -1144,7 +1144,7 @@ void Module::Interface::QueryAvailableTitleDatabase(Kernel::HLERequestContext& c
|
|||
}
|
||||
|
||||
void Module::Interface::CheckContentRights(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0025, 3, 0); // 0x2500C0
|
||||
IPC::RequestParser rp(ctx);
|
||||
u64 tid = rp.Pop<u64>();
|
||||
u16 content_index = rp.Pop<u16>();
|
||||
|
||||
|
@ -1161,7 +1161,7 @@ void Module::Interface::CheckContentRights(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::CheckContentRightsIgnorePlatform(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x002D, 3, 0); // 0x2D00C0
|
||||
IPC::RequestParser rp(ctx);
|
||||
u64 tid = rp.Pop<u64>();
|
||||
u16 content_index = rp.Pop<u16>();
|
||||
|
||||
|
@ -1177,7 +1177,7 @@ void Module::Interface::CheckContentRightsIgnorePlatform(Kernel::HLERequestConte
|
|||
}
|
||||
|
||||
void Module::Interface::BeginImportProgram(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0402, 1, 0); // 0x04020040
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto media_type = static_cast<Service::FS::MediaType>(rp.Pop<u8>());
|
||||
|
||||
if (am->cia_installing) {
|
||||
|
@ -1203,7 +1203,7 @@ void Module::Interface::BeginImportProgram(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::BeginImportProgramTemporarily(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0403, 0, 0); // 0x04030000
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
if (am->cia_installing) {
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
||||
|
@ -1230,7 +1230,7 @@ void Module::Interface::BeginImportProgramTemporarily(Kernel::HLERequestContext&
|
|||
}
|
||||
|
||||
void Module::Interface::EndImportProgram(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0405, 0, 2); // 0x04050002
|
||||
IPC::RequestParser rp(ctx);
|
||||
[[maybe_unused]] const auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
am->ScanForAllTitles();
|
||||
|
@ -1241,7 +1241,7 @@ void Module::Interface::EndImportProgram(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::EndImportProgramWithoutCommit(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0406, 0, 2); // 0x04060002
|
||||
IPC::RequestParser rp(ctx);
|
||||
[[maybe_unused]] const auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
// Note: This function is basically a no-op for us since we don't use title.db or ticket.db
|
||||
|
@ -1254,7 +1254,7 @@ void Module::Interface::EndImportProgramWithoutCommit(Kernel::HLERequestContext&
|
|||
}
|
||||
|
||||
void Module::Interface::CommitImportPrograms(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0407, 3, 2); // 0x040700C2
|
||||
IPC::RequestParser rp(ctx);
|
||||
[[maybe_unused]] const auto media_type = static_cast<FS::MediaType>(rp.Pop<u8>());
|
||||
[[maybe_unused]] const u32 title_count = rp.Pop<u32>();
|
||||
[[maybe_unused]] const u8 database = rp.Pop<u8>();
|
||||
|
@ -1341,7 +1341,7 @@ ResultVal<std::unique_ptr<AMFileWrapper>> GetFileFromSession(
|
|||
}
|
||||
|
||||
void Module::Interface::GetProgramInfoFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0408, 1, 2); // 0x04080042
|
||||
IPC::RequestParser rp(ctx);
|
||||
[[maybe_unused]] const auto media_type = static_cast<FS::MediaType>(rp.Pop<u8>());
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
|
@ -1378,7 +1378,7 @@ void Module::Interface::GetProgramInfoFromCia(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetSystemMenuDataFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0409, 0, 4); // 0x04090004
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
auto& output_buffer = rp.PopMappedBuffer();
|
||||
|
||||
|
@ -1422,7 +1422,7 @@ void Module::Interface::GetSystemMenuDataFromCia(Kernel::HLERequestContext& ctx)
|
|||
}
|
||||
|
||||
void Module::Interface::GetDependencyListFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x040A, 0, 2); // 0x040A0002
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
auto file_res = GetFileFromSession(cia);
|
||||
|
@ -1449,7 +1449,7 @@ void Module::Interface::GetDependencyListFromCia(Kernel::HLERequestContext& ctx)
|
|||
}
|
||||
|
||||
void Module::Interface::GetTransferSizeFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x040B, 0, 2); // 0x040B0002
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
auto file_res = GetFileFromSession(cia);
|
||||
|
@ -1473,7 +1473,7 @@ void Module::Interface::GetTransferSizeFromCia(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetCoreVersionFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x040C, 0, 2); // 0x040C0002
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
auto file_res = GetFileFromSession(cia);
|
||||
|
@ -1497,7 +1497,7 @@ void Module::Interface::GetCoreVersionFromCia(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetRequiredSizeFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x040D, 1, 2); // 0x040D0042
|
||||
IPC::RequestParser rp(ctx);
|
||||
[[maybe_unused]] const auto media_type = static_cast<FS::MediaType>(rp.Pop<u8>());
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
|
@ -1525,7 +1525,7 @@ void Module::Interface::GetRequiredSizeFromCia(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::DeleteProgram(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0410, 3, 0);
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto media_type = rp.PopEnum<FS::MediaType>();
|
||||
u64 title_id = rp.Pop<u64>();
|
||||
LOG_INFO(Service_AM, "Deleting title 0x{:016x}", title_id);
|
||||
|
@ -1545,7 +1545,7 @@ void Module::Interface::DeleteProgram(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetSystemUpdaterMutex(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x412, 0, 0); // 0x04120000
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
||||
rb.Push(RESULT_SUCCESS);
|
||||
|
@ -1553,7 +1553,7 @@ void Module::Interface::GetSystemUpdaterMutex(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetMetaSizeFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0413, 0, 2); // 0x04130002
|
||||
IPC::RequestParser rp(ctx);
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
||||
auto file_res = GetFileFromSession(cia);
|
||||
|
@ -1578,7 +1578,7 @@ void Module::Interface::GetMetaSizeFromCia(Kernel::HLERequestContext& ctx) {
|
|||
}
|
||||
|
||||
void Module::Interface::GetMetaDataFromCia(Kernel::HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp(ctx, 0x0414, 1, 4); // 0x04140044
|
||||
IPC::RequestParser rp(ctx);
|
||||
|
||||
u32 output_size = rp.Pop<u32>();
|
||||
auto cia = rp.PopObject<Kernel::ClientSession>();
|
||||
|
|
|
@ -10,19 +10,19 @@ namespace Service::AM {
|
|||
AM_APP::AM_APP(std::shared_ptr<Module> am) : Module::Interface(std::move(am), "am:app", 5) {
|
||||
static const FunctionInfo functions[] = {
|
||||
// clang-format off
|
||||
{IPC::MakeHeader(0x1001, 3, 0), &AM_APP::GetDLCContentInfoCount, "GetDLCContentInfoCount"},
|
||||
{IPC::MakeHeader(0x1002, 4, 4), &AM_APP::FindDLCContentInfos, "FindDLCContentInfos"},
|
||||
{IPC::MakeHeader(0x1003, 5, 2), &AM_APP::ListDLCContentInfos, "ListDLCContentInfos"},
|
||||
{IPC::MakeHeader(0x1004, 4, 2), &AM_APP::DeleteContents, "DeleteContents"},
|
||||
{IPC::MakeHeader(0x1005, 2, 4), &AM_APP::GetDLCTitleInfos, "GetDLCTitleInfos"},
|
||||
{IPC::MakeHeader(0x1006, 2, 0), nullptr, "GetNumDataTitleTickets"},
|
||||
{IPC::MakeHeader(0x1007, 4, 2), &AM_APP::ListDataTitleTicketInfos, "ListDataTitleTicketInfos"},
|
||||
{IPC::MakeHeader(0x1008, 7, 2), nullptr, "GetItemRights"},
|
||||
{IPC::MakeHeader(0x1009, 3, 0), nullptr, "IsDataTitleInUse"},
|
||||
{IPC::MakeHeader(0x100A, 0, 0), nullptr, "IsExternalTitleDatabaseInitialized"},
|
||||
{IPC::MakeHeader(0x100B, 3, 0), nullptr, "GetNumExistingContentInfos"},
|
||||
{IPC::MakeHeader(0x100C, 5, 2), nullptr, "ListExistingContentInfos"},
|
||||
{IPC::MakeHeader(0x100D, 2, 4), &AM_APP::GetPatchTitleInfos, "GetPatchTitleInfos"},
|
||||
{0x1001, &AM_APP::GetDLCContentInfoCount, "GetDLCContentInfoCount"},
|
||||
{0x1002, &AM_APP::FindDLCContentInfos, "FindDLCContentInfos"},
|
||||
{0x1003, &AM_APP::ListDLCContentInfos, "ListDLCContentInfos"},
|
||||
{0x1004, &AM_APP::DeleteContents, "DeleteContents"},
|
||||
{0x1005, &AM_APP::GetDLCTitleInfos, "GetDLCTitleInfos"},
|
||||
{0x1006, nullptr, "GetNumDataTitleTickets"},
|
||||
{0x1007, &AM_APP::ListDataTitleTicketInfos, "ListDataTitleTicketInfos"},
|
||||
{0x1008, nullptr, "GetItemRights"},
|
||||
{0x1009, nullptr, "IsDataTitleInUse"},
|
||||
{0x100A, nullptr, "IsExternalTitleDatabaseInitialized"},
|
||||
{0x100B, nullptr, "GetNumExistingContentInfos"},
|
||||
{0x100C, nullptr, "ListExistingContentInfos"},
|
||||
{0x100D, &AM_APP::GetPatchTitleInfos, "GetPatchTitleInfos"},
|
||||
// clang-format on
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
|
|
@ -10,116 +10,116 @@ namespace Service::AM {
|
|||
AM_NET::AM_NET(std::shared_ptr<Module> am) : Module::Interface(std::move(am), "am:net", 5) {
|
||||
static const FunctionInfo functions[] = {
|
||||
// clang-format off
|
||||
{IPC::MakeHeader(0x0001, 1, 0), &AM_NET::GetNumPrograms, "GetNumPrograms"},
|
||||
{IPC::MakeHeader(0x0002, 2, 2), &AM_NET::GetProgramList, "GetProgramList"},
|
||||
{IPC::MakeHeader(0x0003, 2, 4), &AM_NET::GetProgramInfos, "GetProgramInfos"},
|
||||
{IPC::MakeHeader(0x0004, 3, 0), &AM_NET::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{IPC::MakeHeader(0x0005, 3, 0), &AM_NET::GetProductCode, "GetProductCode"},
|
||||
{IPC::MakeHeader(0x0006, 3, 0), nullptr, "GetStorageId"},
|
||||
{IPC::MakeHeader(0x0007, 2, 0), &AM_NET::DeleteTicket, "DeleteTicket"},
|
||||
{IPC::MakeHeader(0x0008, 0, 0), &AM_NET::GetNumTickets, "GetNumTickets"},
|
||||
{IPC::MakeHeader(0x0009, 2, 2), &AM_NET::GetTicketList, "GetTicketList"},
|
||||
{IPC::MakeHeader(0x000A, 0, 0), nullptr, "GetDeviceID"},
|
||||
{IPC::MakeHeader(0x000B, 1, 0), nullptr, "GetNumImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000C, 2, 2), nullptr, "GetImportTitleContextList"},
|
||||
{IPC::MakeHeader(0x000D, 2, 4), nullptr, "GetImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000E, 3, 0), nullptr, "DeleteImportTitleContext"},
|
||||
{IPC::MakeHeader(0x000F, 3, 0), nullptr, "GetNumImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0010, 4, 2), nullptr, "GetImportContentContextList"},
|
||||
{IPC::MakeHeader(0x0011, 4, 4), nullptr, "GetImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0012, 4, 2), nullptr, "DeleteImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0013, 1, 0), &AM_NET::NeedsCleanup, "NeedsCleanup"},
|
||||
{IPC::MakeHeader(0x0014, 1, 0), nullptr, "DoCleanup"},
|
||||
{IPC::MakeHeader(0x0015, 1, 0), nullptr, "DeleteAllImportContexts"},
|
||||
{IPC::MakeHeader(0x0016, 0, 0), nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{IPC::MakeHeader(0x0017, 1, 4), nullptr, "ImportTwlBackupLegacy"},
|
||||
{IPC::MakeHeader(0x0018, 2, 0), nullptr, "InitializeTitleDatabase"},
|
||||
{IPC::MakeHeader(0x0019, 1, 0), nullptr, "QueryAvailableTitleDatabase"},
|
||||
{IPC::MakeHeader(0x001A, 3, 0), nullptr, "CalcTwlBackupSize"},
|
||||
{IPC::MakeHeader(0x001B, 5, 4), nullptr, "ExportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001C, 2, 4), nullptr, "ImportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001D, 0, 0), nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{IPC::MakeHeader(0x001E, 3, 8), nullptr, "ReadTwlBackupInfo"},
|
||||
{IPC::MakeHeader(0x001F, 1, 0), nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{IPC::MakeHeader(0x0020, 0, 0), nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{IPC::MakeHeader(0x0021, 1, 2), nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{IPC::MakeHeader(0x0022, 2, 0), nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0023, 2, 0), nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0024, 3, 2), nullptr, "GetImportTitleContextListFiltered"},
|
||||
{IPC::MakeHeader(0x0025, 3, 0), nullptr, "CheckContentRights"},
|
||||
{IPC::MakeHeader(0x0026, 1, 4), nullptr, "GetTicketLimitInfos"},
|
||||
{IPC::MakeHeader(0x0027, 1, 4), nullptr, "GetDemoLaunchInfos"},
|
||||
{IPC::MakeHeader(0x0028, 4, 8), nullptr, "ReadTwlBackupInfoEx"},
|
||||
{IPC::MakeHeader(0x0029, 2, 2), nullptr, "DeleteUserProgramsAtomically"},
|
||||
{IPC::MakeHeader(0x002A, 3, 0), nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002B, 5, 2), nullptr, "ListExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002C, 2, 4), nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x002D, 3, 0), nullptr, "CheckContentRightsIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x0401, 2, 0), nullptr, "UpdateFirmwareTo"},
|
||||
{IPC::MakeHeader(0x0402, 1, 0), &AM_NET::BeginImportProgram, "BeginImportProgram"},
|
||||
{IPC::MakeHeader(0x0403, 0, 0), nullptr, "BeginImportProgramTemporarily"},
|
||||
{IPC::MakeHeader(0x0404, 0, 2), nullptr, "CancelImportProgram"},
|
||||
{IPC::MakeHeader(0x0405, 0, 2), &AM_NET::EndImportProgram, "EndImportProgram"},
|
||||
{IPC::MakeHeader(0x0406, 0, 2), nullptr, "EndImportProgramWithoutCommit"},
|
||||
{IPC::MakeHeader(0x0407, 3, 2), nullptr, "CommitImportPrograms"},
|
||||
{IPC::MakeHeader(0x0408, 1, 2), &AM_NET::GetProgramInfoFromCia, "GetProgramInfoFromCia"},
|
||||
{IPC::MakeHeader(0x0409, 0, 4), &AM_NET::GetSystemMenuDataFromCia, "GetSystemMenuDataFromCia"},
|
||||
{IPC::MakeHeader(0x040A, 0, 2), &AM_NET::GetDependencyListFromCia, "GetDependencyListFromCia"},
|
||||
{IPC::MakeHeader(0x040B, 0, 2), &AM_NET::GetTransferSizeFromCia, "GetTransferSizeFromCia"},
|
||||
{IPC::MakeHeader(0x040C, 0, 2), &AM_NET::GetCoreVersionFromCia, "GetCoreVersionFromCia"},
|
||||
{IPC::MakeHeader(0x040D, 1, 2), &AM_NET::GetRequiredSizeFromCia, "GetRequiredSizeFromCia"},
|
||||
{IPC::MakeHeader(0x040E, 3, 2), nullptr, "CommitImportProgramsAndUpdateFirmwareAuto"},
|
||||
{IPC::MakeHeader(0x040F, 0, 0), nullptr, "UpdateFirmwareAuto"},
|
||||
{IPC::MakeHeader(0x0410, 3, 0), &AM_NET::DeleteProgram, "DeleteProgram"},
|
||||
{IPC::MakeHeader(0x0411, 1, 4), nullptr, "GetTwlProgramListForReboot"},
|
||||
{IPC::MakeHeader(0x0412, 0, 0), nullptr, "GetSystemUpdaterMutex"},
|
||||
{IPC::MakeHeader(0x0413, 0, 2), &AM_NET::GetMetaSizeFromCia, "GetMetaSizeFromCia"},
|
||||
{IPC::MakeHeader(0x0414, 1, 4), &AM_NET::GetMetaDataFromCia, "GetMetaDataFromCia"},
|
||||
{IPC::MakeHeader(0x0415, 2, 0), nullptr, "CheckDemoLaunchRights"},
|
||||
{IPC::MakeHeader(0x0416, 3, 0), nullptr, "GetInternalTitleLocationInfo"},
|
||||
{IPC::MakeHeader(0x0417, 3, 0), nullptr, "PerpetuateAgbSaveData"},
|
||||
{IPC::MakeHeader(0x0418, 1, 0), nullptr, "BeginImportProgramForOverWrite"},
|
||||
{IPC::MakeHeader(0x0419, 0, 0), nullptr, "BeginImportSystemProgram"},
|
||||
{IPC::MakeHeader(0x0801, 0, 0), nullptr, "BeginImportTicket"},
|
||||
{IPC::MakeHeader(0x0802, 0, 2), nullptr, "CancelImportTicket"},
|
||||
{IPC::MakeHeader(0x0803, 0, 2), nullptr, "EndImportTicket"},
|
||||
{IPC::MakeHeader(0x0804, 4, 0), nullptr, "BeginImportTitle"},
|
||||
{IPC::MakeHeader(0x0805, 0, 0), nullptr, "StopImportTitle"},
|
||||
{IPC::MakeHeader(0x0806, 3, 0), nullptr, "ResumeImportTitle"},
|
||||
{IPC::MakeHeader(0x0807, 0, 0), nullptr, "CancelImportTitle"},
|
||||
{IPC::MakeHeader(0x0808, 0, 0), nullptr, "EndImportTitle"},
|
||||
{IPC::MakeHeader(0x0809, 3, 2), nullptr, "CommitImportTitles"},
|
||||
{IPC::MakeHeader(0x080A, 0, 0), nullptr, "BeginImportTmd"},
|
||||
{IPC::MakeHeader(0x080B, 0, 2), nullptr, "CancelImportTmd"},
|
||||
{IPC::MakeHeader(0x080C, 1, 2), nullptr, "EndImportTmd"},
|
||||
{IPC::MakeHeader(0x080D, 1, 2), nullptr, "CreateImportContentContexts"},
|
||||
{IPC::MakeHeader(0x080E, 1, 0), nullptr, "BeginImportContent"},
|
||||
{IPC::MakeHeader(0x080F, 0, 2), nullptr, "StopImportContent"},
|
||||
{IPC::MakeHeader(0x0810, 1, 0), nullptr, "ResumeImportContent"},
|
||||
{IPC::MakeHeader(0x0811, 0, 2), nullptr, "CancelImportContent"},
|
||||
{IPC::MakeHeader(0x0812, 0, 2), nullptr, "EndImportContent"},
|
||||
{IPC::MakeHeader(0x0813, 0, 0), nullptr, "GetNumCurrentImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0814, 1, 2), nullptr, "GetCurrentImportContentContextList"},
|
||||
{IPC::MakeHeader(0x0815, 1, 4), nullptr, "GetCurrentImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0816, 5, 6), nullptr, "Sign"},
|
||||
{IPC::MakeHeader(0x0817, 5, 6), nullptr, "Verify"},
|
||||
{IPC::MakeHeader(0x0818, 1, 2), nullptr, "GetDeviceCert"},
|
||||
{IPC::MakeHeader(0x0819, 4, 8), nullptr, "ImportCertificates"},
|
||||
{IPC::MakeHeader(0x081A, 1, 2), nullptr, "ImportCertificate"},
|
||||
{IPC::MakeHeader(0x081B, 3, 2), nullptr, "CommitImportTitlesAndUpdateFirmwareAuto"},
|
||||
{IPC::MakeHeader(0x081C, 4, 0), nullptr, "DeleteTicketId"},
|
||||
{IPC::MakeHeader(0x081D, 2, 0), nullptr, "GetNumTicketIds"},
|
||||
{IPC::MakeHeader(0x081E, 4, 2), nullptr, "GetTicketIdList"},
|
||||
{IPC::MakeHeader(0x081F, 2, 0), nullptr, "GetNumTicketsOfProgram"},
|
||||
{IPC::MakeHeader(0x0820, 4, 2), nullptr, "ListTicketInfos"},
|
||||
{IPC::MakeHeader(0x0821, 5, 2), nullptr, "GetRightsOnlyTicketData"},
|
||||
{IPC::MakeHeader(0x0822, 0, 0), nullptr, "GetNumCurrentContentInfos"},
|
||||
{IPC::MakeHeader(0x0823, 1, 4), nullptr, "FindCurrentContentInfos"},
|
||||
{IPC::MakeHeader(0x0824, 2, 2), nullptr, "ListCurrentContentInfos"},
|
||||
{IPC::MakeHeader(0x0825, 4, 2), nullptr, "CalculateContextRequiredSize"},
|
||||
{IPC::MakeHeader(0x0826, 1, 2), nullptr, "UpdateImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0827, 0, 0), nullptr, "DeleteAllDemoLaunchInfos"},
|
||||
{IPC::MakeHeader(0x0828, 3, 0), nullptr, "BeginImportTitleForOverWrite"},
|
||||
{0x0001, &AM_NET::GetNumPrograms, "GetNumPrograms"},
|
||||
{0x0002, &AM_NET::GetProgramList, "GetProgramList"},
|
||||
{0x0003, &AM_NET::GetProgramInfos, "GetProgramInfos"},
|
||||
{0x0004, &AM_NET::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{0x0005, &AM_NET::GetProductCode, "GetProductCode"},
|
||||
{0x0006, nullptr, "GetStorageId"},
|
||||
{0x0007, &AM_NET::DeleteTicket, "DeleteTicket"},
|
||||
{0x0008, &AM_NET::GetNumTickets, "GetNumTickets"},
|
||||
{0x0009, &AM_NET::GetTicketList, "GetTicketList"},
|
||||
{0x000A, nullptr, "GetDeviceID"},
|
||||
{0x000B, nullptr, "GetNumImportTitleContexts"},
|
||||
{0x000C, nullptr, "GetImportTitleContextList"},
|
||||
{0x000D, nullptr, "GetImportTitleContexts"},
|
||||
{0x000E, nullptr, "DeleteImportTitleContext"},
|
||||
{0x000F, nullptr, "GetNumImportContentContexts"},
|
||||
{0x0010, nullptr, "GetImportContentContextList"},
|
||||
{0x0011, nullptr, "GetImportContentContexts"},
|
||||
{0x0012, nullptr, "DeleteImportContentContexts"},
|
||||
{0x0013, &AM_NET::NeedsCleanup, "NeedsCleanup"},
|
||||
{0x0014, nullptr, "DoCleanup"},
|
||||
{0x0015, nullptr, "DeleteAllImportContexts"},
|
||||
{0x0016, nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{0x0017, nullptr, "ImportTwlBackupLegacy"},
|
||||
{0x0018, nullptr, "InitializeTitleDatabase"},
|
||||
{0x0019, nullptr, "QueryAvailableTitleDatabase"},
|
||||
{0x001A, nullptr, "CalcTwlBackupSize"},
|
||||
{0x001B, nullptr, "ExportTwlBackup"},
|
||||
{0x001C, nullptr, "ImportTwlBackup"},
|
||||
{0x001D, nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{0x001E, nullptr, "ReadTwlBackupInfo"},
|
||||
{0x001F, nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{0x0020, nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{0x0021, nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{0x0022, nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{0x0023, nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{0x0024, nullptr, "GetImportTitleContextListFiltered"},
|
||||
{0x0025, nullptr, "CheckContentRights"},
|
||||
{0x0026, nullptr, "GetTicketLimitInfos"},
|
||||
{0x0027, nullptr, "GetDemoLaunchInfos"},
|
||||
{0x0028, nullptr, "ReadTwlBackupInfoEx"},
|
||||
{0x0029, nullptr, "DeleteUserProgramsAtomically"},
|
||||
{0x002A, nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{0x002B, nullptr, "ListExistingContentInfosSystem"},
|
||||
{0x002C, nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{0x002D, nullptr, "CheckContentRightsIgnorePlatform"},
|
||||
{0x0401, nullptr, "UpdateFirmwareTo"},
|
||||
{0x0402, &AM_NET::BeginImportProgram, "BeginImportProgram"},
|
||||
{0x0403, nullptr, "BeginImportProgramTemporarily"},
|
||||
{0x0404, nullptr, "CancelImportProgram"},
|
||||
{0x0405, &AM_NET::EndImportProgram, "EndImportProgram"},
|
||||
{0x0406, nullptr, "EndImportProgramWithoutCommit"},
|
||||
{0x0407, nullptr, "CommitImportPrograms"},
|
||||
{0x0408, &AM_NET::GetProgramInfoFromCia, "GetProgramInfoFromCia"},
|
||||
{0x0409, &AM_NET::GetSystemMenuDataFromCia, "GetSystemMenuDataFromCia"},
|
||||
{0x040A, &AM_NET::GetDependencyListFromCia, "GetDependencyListFromCia"},
|
||||
{0x040B, &AM_NET::GetTransferSizeFromCia, "GetTransferSizeFromCia"},
|
||||
{0x040C, &AM_NET::GetCoreVersionFromCia, "GetCoreVersionFromCia"},
|
||||
{0x040D, &AM_NET::GetRequiredSizeFromCia, "GetRequiredSizeFromCia"},
|
||||
{0x040E, nullptr, "CommitImportProgramsAndUpdateFirmwareAuto"},
|
||||
{0x040F, nullptr, "UpdateFirmwareAuto"},
|
||||
{0x0410, &AM_NET::DeleteProgram, "DeleteProgram"},
|
||||
{0x0411, nullptr, "GetTwlProgramListForReboot"},
|
||||
{0x0412, nullptr, "GetSystemUpdaterMutex"},
|
||||
{0x0413, &AM_NET::GetMetaSizeFromCia, "GetMetaSizeFromCia"},
|
||||
{0x0414, &AM_NET::GetMetaDataFromCia, "GetMetaDataFromCia"},
|
||||
{0x0415, nullptr, "CheckDemoLaunchRights"},
|
||||
{0x0416, nullptr, "GetInternalTitleLocationInfo"},
|
||||
{0x0417, nullptr, "PerpetuateAgbSaveData"},
|
||||
{0x0418, nullptr, "BeginImportProgramForOverWrite"},
|
||||
{0x0419, nullptr, "BeginImportSystemProgram"},
|
||||
{0x0801, nullptr, "BeginImportTicket"},
|
||||
{0x0802, nullptr, "CancelImportTicket"},
|
||||
{0x0803, nullptr, "EndImportTicket"},
|
||||
{0x0804, nullptr, "BeginImportTitle"},
|
||||
{0x0805, nullptr, "StopImportTitle"},
|
||||
{0x0806, nullptr, "ResumeImportTitle"},
|
||||
{0x0807, nullptr, "CancelImportTitle"},
|
||||
{0x0808, nullptr, "EndImportTitle"},
|
||||
{0x0809, nullptr, "CommitImportTitles"},
|
||||
{0x080A, nullptr, "BeginImportTmd"},
|
||||
{0x080B, nullptr, "CancelImportTmd"},
|
||||
{0x080C, nullptr, "EndImportTmd"},
|
||||
{0x080D, nullptr, "CreateImportContentContexts"},
|
||||
{0x080E, nullptr, "BeginImportContent"},
|
||||
{0x080F, nullptr, "StopImportContent"},
|
||||
{0x0810, nullptr, "ResumeImportContent"},
|
||||
{0x0811, nullptr, "CancelImportContent"},
|
||||
{0x0812, nullptr, "EndImportContent"},
|
||||
{0x0813, nullptr, "GetNumCurrentImportContentContexts"},
|
||||
{0x0814, nullptr, "GetCurrentImportContentContextList"},
|
||||
{0x0815, nullptr, "GetCurrentImportContentContexts"},
|
||||
{0x0816, nullptr, "Sign"},
|
||||
{0x0817, nullptr, "Verify"},
|
||||
{0x0818, nullptr, "GetDeviceCert"},
|
||||
{0x0819, nullptr, "ImportCertificates"},
|
||||
{0x081A, nullptr, "ImportCertificate"},
|
||||
{0x081B, nullptr, "CommitImportTitlesAndUpdateFirmwareAuto"},
|
||||
{0x081C, nullptr, "DeleteTicketId"},
|
||||
{0x081D, nullptr, "GetNumTicketIds"},
|
||||
{0x081E, nullptr, "GetTicketIdList"},
|
||||
{0x081F, nullptr, "GetNumTicketsOfProgram"},
|
||||
{0x0820, nullptr, "ListTicketInfos"},
|
||||
{0x0821, nullptr, "GetRightsOnlyTicketData"},
|
||||
{0x0822, nullptr, "GetNumCurrentContentInfos"},
|
||||
{0x0823, nullptr, "FindCurrentContentInfos"},
|
||||
{0x0824, nullptr, "ListCurrentContentInfos"},
|
||||
{0x0825, nullptr, "CalculateContextRequiredSize"},
|
||||
{0x0826, nullptr, "UpdateImportContentContexts"},
|
||||
{0x0827, nullptr, "DeleteAllDemoLaunchInfos"},
|
||||
{0x0828, nullptr, "BeginImportTitleForOverWrite"},
|
||||
// clang-format on
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
|
|
@ -10,64 +10,64 @@ namespace Service::AM {
|
|||
AM_SYS::AM_SYS(std::shared_ptr<Module> am) : Module::Interface(std::move(am), "am:sys", 5) {
|
||||
static const FunctionInfo functions[] = {
|
||||
// clang-format off
|
||||
{IPC::MakeHeader(0x0001, 1, 0), &AM_SYS::GetNumPrograms, "GetNumPrograms"},
|
||||
{IPC::MakeHeader(0x0002, 2, 2), &AM_SYS::GetProgramList, "GetProgramList"},
|
||||
{IPC::MakeHeader(0x0003, 2, 4), &AM_SYS::GetProgramInfos, "GetProgramInfos"},
|
||||
{IPC::MakeHeader(0x0004, 3, 0), &AM_SYS::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{IPC::MakeHeader(0x0005, 3, 0), &AM_SYS::GetProductCode, "GetProductCode"},
|
||||
{IPC::MakeHeader(0x0006, 3, 0), nullptr, "GetStorageId"},
|
||||
{IPC::MakeHeader(0x0007, 2, 0), &AM_SYS::DeleteTicket, "DeleteTicket"},
|
||||
{IPC::MakeHeader(0x0008, 0, 0), &AM_SYS::GetNumTickets, "GetNumTickets"},
|
||||
{IPC::MakeHeader(0x0009, 2, 2), &AM_SYS::GetTicketList, "GetTicketList"},
|
||||
{IPC::MakeHeader(0x000A, 0, 0), nullptr, "GetDeviceID"},
|
||||
{IPC::MakeHeader(0x000B, 1, 0), nullptr, "GetNumImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000C, 2, 2), nullptr, "GetImportTitleContextList"},
|
||||
{IPC::MakeHeader(0x000D, 2, 4), nullptr, "GetImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000E, 3, 0), nullptr, "DeleteImportTitleContext"},
|
||||
{IPC::MakeHeader(0x000F, 3, 0), nullptr, "GetNumImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0010, 4, 2), nullptr, "GetImportContentContextList"},
|
||||
{IPC::MakeHeader(0x0011, 4, 4), nullptr, "GetImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0012, 4, 2), nullptr, "DeleteImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0013, 1, 0), &AM_SYS::NeedsCleanup, "NeedsCleanup"},
|
||||
{IPC::MakeHeader(0x0014, 1, 0), nullptr, "DoCleanup"},
|
||||
{IPC::MakeHeader(0x0015, 1, 0), nullptr, "DeleteAllImportContexts"},
|
||||
{IPC::MakeHeader(0x0016, 0, 0), nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{IPC::MakeHeader(0x0017, 1, 4), nullptr, "ImportTwlBackupLegacy"},
|
||||
{IPC::MakeHeader(0x0018, 2, 0), nullptr, "InitializeTitleDatabase"},
|
||||
{IPC::MakeHeader(0x0019, 1, 0), &AM_SYS::QueryAvailableTitleDatabase, "QueryAvailableTitleDatabase"},
|
||||
{IPC::MakeHeader(0x001A, 3, 0), nullptr, "CalcTwlBackupSize"},
|
||||
{IPC::MakeHeader(0x001B, 5, 4), nullptr, "ExportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001C, 2, 4), nullptr, "ImportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001D, 0, 0), nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{IPC::MakeHeader(0x001E, 3, 8), nullptr, "ReadTwlBackupInfo"},
|
||||
{IPC::MakeHeader(0x001F, 1, 0), nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{IPC::MakeHeader(0x0020, 0, 0), nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{IPC::MakeHeader(0x0021, 1, 2), nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{IPC::MakeHeader(0x0022, 2, 0), nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0023, 2, 0), nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0024, 3, 2), nullptr, "GetImportTitleContextListFiltered"},
|
||||
{IPC::MakeHeader(0x0025, 3, 0), &AM_SYS::CheckContentRights, "CheckContentRights"},
|
||||
{IPC::MakeHeader(0x0026, 1, 4), nullptr, "GetTicketLimitInfos"},
|
||||
{IPC::MakeHeader(0x0027, 1, 4), nullptr, "GetDemoLaunchInfos"},
|
||||
{IPC::MakeHeader(0x0028, 4, 8), nullptr, "ReadTwlBackupInfoEx"},
|
||||
{IPC::MakeHeader(0x0029, 2, 2), nullptr, "DeleteUserProgramsAtomically"},
|
||||
{IPC::MakeHeader(0x002A, 3, 0), nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002B, 5, 2), nullptr, "ListExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002C, 2, 4), nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x002D, 3, 0), &AM_SYS::CheckContentRightsIgnorePlatform, "CheckContentRightsIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x1001, 3, 0), &AM_SYS::GetDLCContentInfoCount, "GetDLCContentInfoCount"},
|
||||
{IPC::MakeHeader(0x1002, 4, 4), &AM_SYS::FindDLCContentInfos, "FindDLCContentInfos"},
|
||||
{IPC::MakeHeader(0x1003, 5, 2), &AM_SYS::ListDLCContentInfos, "ListDLCContentInfos"},
|
||||
{IPC::MakeHeader(0x1004, 4, 2), &AM_SYS::DeleteContents, "DeleteContents"},
|
||||
{IPC::MakeHeader(0x1005, 2, 4), &AM_SYS::GetDLCTitleInfos, "GetDLCTitleInfos"},
|
||||
{IPC::MakeHeader(0x1006, 2, 0), nullptr, "GetNumDataTitleTickets"},
|
||||
{IPC::MakeHeader(0x1007, 4, 2), &AM_SYS::ListDataTitleTicketInfos, "ListDataTitleTicketInfos"},
|
||||
{IPC::MakeHeader(0x1008, 7, 2), nullptr, "GetItemRights"},
|
||||
{IPC::MakeHeader(0x1009, 3, 0), nullptr, "IsDataTitleInUse"},
|
||||
{IPC::MakeHeader(0x100A, 0, 0), nullptr, "IsExternalTitleDatabaseInitialized"},
|
||||
{IPC::MakeHeader(0x100B, 3, 0), nullptr, "GetNumExistingContentInfos"},
|
||||
{IPC::MakeHeader(0x100C, 5, 2), nullptr, "ListExistingContentInfos"},
|
||||
{IPC::MakeHeader(0x100D, 2, 4), &AM_SYS::GetPatchTitleInfos, "GetPatchTitleInfos"},
|
||||
{0x0001, &AM_SYS::GetNumPrograms, "GetNumPrograms"},
|
||||
{0x0002, &AM_SYS::GetProgramList, "GetProgramList"},
|
||||
{0x0003, &AM_SYS::GetProgramInfos, "GetProgramInfos"},
|
||||
{0x0004, &AM_SYS::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{0x0005, &AM_SYS::GetProductCode, "GetProductCode"},
|
||||
{0x0006, nullptr, "GetStorageId"},
|
||||
{0x0007, &AM_SYS::DeleteTicket, "DeleteTicket"},
|
||||
{0x0008, &AM_SYS::GetNumTickets, "GetNumTickets"},
|
||||
{0x0009, &AM_SYS::GetTicketList, "GetTicketList"},
|
||||
{0x000A, nullptr, "GetDeviceID"},
|
||||
{0x000B, nullptr, "GetNumImportTitleContexts"},
|
||||
{0x000C, nullptr, "GetImportTitleContextList"},
|
||||
{0x000D, nullptr, "GetImportTitleContexts"},
|
||||
{0x000E, nullptr, "DeleteImportTitleContext"},
|
||||
{0x000F, nullptr, "GetNumImportContentContexts"},
|
||||
{0x0010, nullptr, "GetImportContentContextList"},
|
||||
{0x0011, nullptr, "GetImportContentContexts"},
|
||||
{0x0012, nullptr, "DeleteImportContentContexts"},
|
||||
{0x0013, &AM_SYS::NeedsCleanup, "NeedsCleanup"},
|
||||
{0x0014, nullptr, "DoCleanup"},
|
||||
{0x0015, nullptr, "DeleteAllImportContexts"},
|
||||
{0x0016, nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{0x0017, nullptr, "ImportTwlBackupLegacy"},
|
||||
{0x0018, nullptr, "InitializeTitleDatabase"},
|
||||
{0x0019, &AM_SYS::QueryAvailableTitleDatabase, "QueryAvailableTitleDatabase"},
|
||||
{0x001A, nullptr, "CalcTwlBackupSize"},
|
||||
{0x001B, nullptr, "ExportTwlBackup"},
|
||||
{0x001C, nullptr, "ImportTwlBackup"},
|
||||
{0x001D, nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{0x001E, nullptr, "ReadTwlBackupInfo"},
|
||||
{0x001F, nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{0x0020, nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{0x0021, nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{0x0022, nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{0x0023, nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{0x0024, nullptr, "GetImportTitleContextListFiltered"},
|
||||
{0x0025, &AM_SYS::CheckContentRights, "CheckContentRights"},
|
||||
{0x0026, nullptr, "GetTicketLimitInfos"},
|
||||
{0x0027, nullptr, "GetDemoLaunchInfos"},
|
||||
{0x0028, nullptr, "ReadTwlBackupInfoEx"},
|
||||
{0x0029, nullptr, "DeleteUserProgramsAtomically"},
|
||||
{0x002A, nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{0x002B, nullptr, "ListExistingContentInfosSystem"},
|
||||
{0x002C, nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{0x002D, &AM_SYS::CheckContentRightsIgnorePlatform, "CheckContentRightsIgnorePlatform"},
|
||||
{0x1001, &AM_SYS::GetDLCContentInfoCount, "GetDLCContentInfoCount"},
|
||||
{0x1002, &AM_SYS::FindDLCContentInfos, "FindDLCContentInfos"},
|
||||
{0x1003, &AM_SYS::ListDLCContentInfos, "ListDLCContentInfos"},
|
||||
{0x1004, &AM_SYS::DeleteContents, "DeleteContents"},
|
||||
{0x1005, &AM_SYS::GetDLCTitleInfos, "GetDLCTitleInfos"},
|
||||
{0x1006, nullptr, "GetNumDataTitleTickets"},
|
||||
{0x1007, &AM_SYS::ListDataTitleTicketInfos, "ListDataTitleTicketInfos"},
|
||||
{0x1008, nullptr, "GetItemRights"},
|
||||
{0x1009, nullptr, "IsDataTitleInUse"},
|
||||
{0x100A, nullptr, "IsExternalTitleDatabaseInitialized"},
|
||||
{0x100B, nullptr, "GetNumExistingContentInfos"},
|
||||
{0x100C, nullptr, "ListExistingContentInfos"},
|
||||
{0x100D, &AM_SYS::GetPatchTitleInfos, "GetPatchTitleInfos"},
|
||||
// clang-format on
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
|
|
@ -10,76 +10,76 @@ namespace Service::AM {
|
|||
AM_U::AM_U(std::shared_ptr<Module> am) : Module::Interface(std::move(am), "am:u", 5) {
|
||||
static const FunctionInfo functions[] = {
|
||||
// clang-format off
|
||||
{IPC::MakeHeader(0x0001, 1, 0), &AM_U::GetNumPrograms, "GetNumPrograms"},
|
||||
{IPC::MakeHeader(0x0002, 2, 2), &AM_U::GetProgramList, "GetProgramList"},
|
||||
{IPC::MakeHeader(0x0003, 2, 4), &AM_U::GetProgramInfos, "GetProgramInfos"},
|
||||
{IPC::MakeHeader(0x0004, 3, 0), &AM_U::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{IPC::MakeHeader(0x0005, 3, 0), &AM_U::GetProductCode, "GetProductCode"},
|
||||
{IPC::MakeHeader(0x0006, 3, 0), nullptr, "GetStorageId"},
|
||||
{IPC::MakeHeader(0x0007, 2, 0), &AM_U::DeleteTicket, "DeleteTicket"},
|
||||
{IPC::MakeHeader(0x0008, 0, 0), &AM_U::GetNumTickets, "GetNumTickets"},
|
||||
{IPC::MakeHeader(0x0009, 2, 2), &AM_U::GetTicketList, "GetTicketList"},
|
||||
{IPC::MakeHeader(0x000A, 0, 0), nullptr, "GetDeviceID"},
|
||||
{IPC::MakeHeader(0x000B, 1, 0), nullptr, "GetNumImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000C, 2, 2), nullptr, "GetImportTitleContextList"},
|
||||
{IPC::MakeHeader(0x000D, 2, 4), nullptr, "GetImportTitleContexts"},
|
||||
{IPC::MakeHeader(0x000E, 3, 0), nullptr, "DeleteImportTitleContext"},
|
||||
{IPC::MakeHeader(0x000F, 3, 0), nullptr, "GetNumImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0010, 4, 2), nullptr, "GetImportContentContextList"},
|
||||
{IPC::MakeHeader(0x0011, 4, 4), nullptr, "GetImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0012, 4, 2), nullptr, "DeleteImportContentContexts"},
|
||||
{IPC::MakeHeader(0x0013, 1, 0), &AM_U::NeedsCleanup, "NeedsCleanup"},
|
||||
{IPC::MakeHeader(0x0014, 1, 0), nullptr, "DoCleanup"},
|
||||
{IPC::MakeHeader(0x0015, 1, 0), nullptr, "DeleteAllImportContexts"},
|
||||
{IPC::MakeHeader(0x0016, 0, 0), nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{IPC::MakeHeader(0x0017, 1, 4), nullptr, "ImportTwlBackupLegacy"},
|
||||
{IPC::MakeHeader(0x0018, 2, 0), nullptr, "InitializeTitleDatabase"},
|
||||
{IPC::MakeHeader(0x0019, 1, 0), nullptr, "QueryAvailableTitleDatabase"},
|
||||
{IPC::MakeHeader(0x001A, 3, 0), nullptr, "CalcTwlBackupSize"},
|
||||
{IPC::MakeHeader(0x001B, 5, 4), nullptr, "ExportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001C, 2, 4), nullptr, "ImportTwlBackup"},
|
||||
{IPC::MakeHeader(0x001D, 0, 0), nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{IPC::MakeHeader(0x001E, 3, 8), nullptr, "ReadTwlBackupInfo"},
|
||||
{IPC::MakeHeader(0x001F, 1, 0), nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{IPC::MakeHeader(0x0020, 0, 0), nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{IPC::MakeHeader(0x0021, 1, 2), nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{IPC::MakeHeader(0x0022, 2, 0), nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0023, 2, 0), nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{IPC::MakeHeader(0x0024, 3, 2), nullptr, "GetImportTitleContextListFiltered"},
|
||||
{IPC::MakeHeader(0x0025, 3, 0), nullptr, "CheckContentRights"},
|
||||
{IPC::MakeHeader(0x0026, 1, 4), nullptr, "GetTicketLimitInfos"},
|
||||
{IPC::MakeHeader(0x0027, 1, 4), nullptr, "GetDemoLaunchInfos"},
|
||||
{IPC::MakeHeader(0x0028, 4, 8), nullptr, "ReadTwlBackupInfoEx"},
|
||||
{IPC::MakeHeader(0x0029, 2, 2), nullptr, "DeleteUserProgramsAtomically"},
|
||||
{IPC::MakeHeader(0x002A, 3, 0), nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002B, 5, 2), nullptr, "ListExistingContentInfosSystem"},
|
||||
{IPC::MakeHeader(0x002C, 2, 4), nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x002D, 3, 0), nullptr, "CheckContentRightsIgnorePlatform"},
|
||||
{IPC::MakeHeader(0x0401, 2, 0), nullptr, "UpdateFirmwareTo"},
|
||||
{IPC::MakeHeader(0x0402, 1, 0), &AM_U::BeginImportProgram, "BeginImportProgram"},
|
||||
{IPC::MakeHeader(0x0403, 0, 0), &AM_U::BeginImportProgramTemporarily, "BeginImportProgramTemporarily"},
|
||||
{IPC::MakeHeader(0x0404, 0, 2), nullptr, "CancelImportProgram"},
|
||||
{IPC::MakeHeader(0x0405, 0, 2), &AM_U::EndImportProgram, "EndImportProgram"},
|
||||
{IPC::MakeHeader(0x0406, 0, 2), &AM_U::EndImportProgramWithoutCommit, "EndImportProgramWithoutCommit"},
|
||||
{IPC::MakeHeader(0x0407, 3, 2), &AM_U::CommitImportPrograms, "CommitImportPrograms"},
|
||||
{IPC::MakeHeader(0x0408, 1, 2), &AM_U::GetProgramInfoFromCia, "GetProgramInfoFromCia"},
|
||||
{IPC::MakeHeader(0x0409, 0, 4), &AM_U::GetSystemMenuDataFromCia, "GetSystemMenuDataFromCia"},
|
||||
{IPC::MakeHeader(0x040A, 0, 2), &AM_U::GetDependencyListFromCia, "GetDependencyListFromCia"},
|
||||
{IPC::MakeHeader(0x040B, 0, 2), &AM_U::GetTransferSizeFromCia, "GetTransferSizeFromCia"},
|
||||
{IPC::MakeHeader(0x040C, 0, 2), &AM_U::GetCoreVersionFromCia, "GetCoreVersionFromCia"},
|
||||
{IPC::MakeHeader(0x040D, 1, 2), &AM_U::GetRequiredSizeFromCia, "GetRequiredSizeFromCia"},
|
||||
{IPC::MakeHeader(0x040E, 3, 2), nullptr, "CommitImportProgramsAndUpdateFirmwareAuto"},
|
||||
{IPC::MakeHeader(0x040F, 0, 0), nullptr, "UpdateFirmwareAuto"},
|
||||
{IPC::MakeHeader(0x0410, 3, 0), &AM_U::DeleteProgram, "DeleteProgram"},
|
||||
{IPC::MakeHeader(0x0411, 1, 4), nullptr, "GetTwlProgramListForReboot"},
|
||||
{IPC::MakeHeader(0x0412, 0, 0), &AM_U::GetSystemUpdaterMutex, "GetSystemUpdaterMutex"},
|
||||
{IPC::MakeHeader(0x0413, 0, 2), &AM_U::GetMetaSizeFromCia, "GetMetaSizeFromCia"},
|
||||
{IPC::MakeHeader(0x0414, 1, 4), &AM_U::GetMetaDataFromCia, "GetMetaDataFromCia"},
|
||||
{IPC::MakeHeader(0x0415, 2, 0), nullptr, "CheckDemoLaunchRights"},
|
||||
{IPC::MakeHeader(0x0416, 3, 0), nullptr, "GetInternalTitleLocationInfo"},
|
||||
{IPC::MakeHeader(0x0417, 3, 0), nullptr, "PerpetuateAgbSaveData"},
|
||||
{IPC::MakeHeader(0x0418, 1, 0), nullptr, "BeginImportProgramForOverWrite"},
|
||||
{IPC::MakeHeader(0x0419, 0, 0), nullptr, "BeginImportSystemProgram"},
|
||||
{0x0001, &AM_U::GetNumPrograms, "GetNumPrograms"},
|
||||
{0x0002, &AM_U::GetProgramList, "GetProgramList"},
|
||||
{0x0003, &AM_U::GetProgramInfos, "GetProgramInfos"},
|
||||
{0x0004, &AM_U::DeleteUserProgram, "DeleteUserProgram"},
|
||||
{0x0005, &AM_U::GetProductCode, "GetProductCode"},
|
||||
{0x0006, nullptr, "GetStorageId"},
|
||||
{0x0007, &AM_U::DeleteTicket, "DeleteTicket"},
|
||||
{0x0008, &AM_U::GetNumTickets, "GetNumTickets"},
|
||||
{0x0009, &AM_U::GetTicketList, "GetTicketList"},
|
||||
{0x000A, nullptr, "GetDeviceID"},
|
||||
{0x000B, nullptr, "GetNumImportTitleContexts"},
|
||||
{0x000C, nullptr, "GetImportTitleContextList"},
|
||||
{0x000D, nullptr, "GetImportTitleContexts"},
|
||||
{0x000E, nullptr, "DeleteImportTitleContext"},
|
||||
{0x000F, nullptr, "GetNumImportContentContexts"},
|
||||
{0x0010, nullptr, "GetImportContentContextList"},
|
||||
{0x0011, nullptr, "GetImportContentContexts"},
|
||||
{0x0012, nullptr, "DeleteImportContentContexts"},
|
||||
{0x0013, &AM_U::NeedsCleanup, "NeedsCleanup"},
|
||||
{0x0014, nullptr, "DoCleanup"},
|
||||
{0x0015, nullptr, "DeleteAllImportContexts"},
|
||||
{0x0016, nullptr, "DeleteAllTemporaryPrograms"},
|
||||
{0x0017, nullptr, "ImportTwlBackupLegacy"},
|
||||
{0x0018, nullptr, "InitializeTitleDatabase"},
|
||||
{0x0019, nullptr, "QueryAvailableTitleDatabase"},
|
||||
{0x001A, nullptr, "CalcTwlBackupSize"},
|
||||
{0x001B, nullptr, "ExportTwlBackup"},
|
||||
{0x001C, nullptr, "ImportTwlBackup"},
|
||||
{0x001D, nullptr, "DeleteAllTwlUserPrograms"},
|
||||
{0x001E, nullptr, "ReadTwlBackupInfo"},
|
||||
{0x001F, nullptr, "DeleteAllExpiredUserPrograms"},
|
||||
{0x0020, nullptr, "GetTwlArchiveResourceInfo"},
|
||||
{0x0021, nullptr, "GetPersonalizedTicketInfoList"},
|
||||
{0x0022, nullptr, "DeleteAllImportContextsFiltered"},
|
||||
{0x0023, nullptr, "GetNumImportTitleContextsFiltered"},
|
||||
{0x0024, nullptr, "GetImportTitleContextListFiltered"},
|
||||
{0x0025, nullptr, "CheckContentRights"},
|
||||
{0x0026, nullptr, "GetTicketLimitInfos"},
|
||||
{0x0027, nullptr, "GetDemoLaunchInfos"},
|
||||
{0x0028, nullptr, "ReadTwlBackupInfoEx"},
|
||||
{0x0029, nullptr, "DeleteUserProgramsAtomically"},
|
||||
{0x002A, nullptr, "GetNumExistingContentInfosSystem"},
|
||||
{0x002B, nullptr, "ListExistingContentInfosSystem"},
|
||||
{0x002C, nullptr, "GetProgramInfosIgnorePlatform"},
|
||||
{0x002D, nullptr, "CheckContentRightsIgnorePlatform"},
|
||||
{0x0401, nullptr, "UpdateFirmwareTo"},
|
||||
{0x0402, &AM_U::BeginImportProgram, "BeginImportProgram"},
|
||||
{0x0403, &AM_U::BeginImportProgramTemporarily, "BeginImportProgramTemporarily"},
|
||||
{0x0404, nullptr, "CancelImportProgram"},
|
||||
{0x0405, &AM_U::EndImportProgram, "EndImportProgram"},
|
||||
{0x0406, &AM_U::EndImportProgramWithoutCommit, "EndImportProgramWithoutCommit"},
|
||||
{0x0407, &AM_U::CommitImportPrograms, "CommitImportPrograms"},
|
||||
{0x0408, &AM_U::GetProgramInfoFromCia, "GetProgramInfoFromCia"},
|
||||
{0x0409, &AM_U::GetSystemMenuDataFromCia, "GetSystemMenuDataFromCia"},
|
||||
{0x040A, &AM_U::GetDependencyListFromCia, "GetDependencyListFromCia"},
|
||||
{0x040B, &AM_U::GetTransferSizeFromCia, "GetTransferSizeFromCia"},
|
||||
{0x040C, &AM_U::GetCoreVersionFromCia, "GetCoreVersionFromCia"},
|
||||
{0x040D, &AM_U::GetRequiredSizeFromCia, "GetRequiredSizeFromCia"},
|
||||
{0x040E, nullptr, "CommitImportProgramsAndUpdateFirmwareAuto"},
|
||||
{0x040F, nullptr, "UpdateFirmwareAuto"},
|
||||
{0x0410, &AM_U::DeleteProgram, "DeleteProgram"},
|
||||
{0x0411, nullptr, "GetTwlProgramListForReboot"},
|
||||
{0x0412, &AM_U::GetSystemUpdaterMutex, "GetSystemUpdaterMutex"},
|
||||
{0x0413, &AM_U::GetMetaSizeFromCia, "GetMetaSizeFromCia"},
|
||||
{0x0414, &AM_U::GetMetaDataFromCia, "GetMetaDataFromCia"},
|
||||
{0x0415, nullptr, "CheckDemoLaunchRights"},
|
||||
{0x0416, nullptr, "GetInternalTitleLocationInfo"},
|
||||
{0x0417, nullptr, "PerpetuateAgbSaveData"},
|
||||
{0x0418, nullptr, "BeginImportProgramForOverWrite"},
|
||||
{0x0419, nullptr, "BeginImportSystemProgram"},
|
||||
// clang-format on
|
||||
};
|
||||
RegisterHandlers(functions);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue