|
@@ -1125,7 +1125,7 @@ ILibraryAppletCreator::ILibraryAppletCreator(Core::System& system_)
|
|
|
{2, nullptr, "AreAnyLibraryAppletsLeft"},
|
|
{2, nullptr, "AreAnyLibraryAppletsLeft"},
|
|
|
{10, &ILibraryAppletCreator::CreateStorage, "CreateStorage"},
|
|
{10, &ILibraryAppletCreator::CreateStorage, "CreateStorage"},
|
|
|
{11, &ILibraryAppletCreator::CreateTransferMemoryStorage, "CreateTransferMemoryStorage"},
|
|
{11, &ILibraryAppletCreator::CreateTransferMemoryStorage, "CreateTransferMemoryStorage"},
|
|
|
- {12, nullptr, "CreateHandleStorage"},
|
|
|
|
|
|
|
+ {12, &ILibraryAppletCreator::CreateHandleStorage, "CreateHandleStorage"},
|
|
|
};
|
|
};
|
|
|
RegisterHandlers(functions);
|
|
RegisterHandlers(functions);
|
|
|
}
|
|
}
|
|
@@ -1134,6 +1134,7 @@ ILibraryAppletCreator::~ILibraryAppletCreator() = default;
|
|
|
|
|
|
|
|
void ILibraryAppletCreator::CreateLibraryApplet(Kernel::HLERequestContext& ctx) {
|
|
void ILibraryAppletCreator::CreateLibraryApplet(Kernel::HLERequestContext& ctx) {
|
|
|
IPC::RequestParser rp{ctx};
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
+
|
|
|
const auto applet_id = rp.PopRaw<Applets::AppletId>();
|
|
const auto applet_id = rp.PopRaw<Applets::AppletId>();
|
|
|
const auto applet_mode = rp.PopRaw<Applets::LibraryAppletMode>();
|
|
const auto applet_mode = rp.PopRaw<Applets::LibraryAppletMode>();
|
|
|
|
|
|
|
@@ -1159,9 +1160,18 @@ void ILibraryAppletCreator::CreateLibraryApplet(Kernel::HLERequestContext& ctx)
|
|
|
|
|
|
|
|
void ILibraryAppletCreator::CreateStorage(Kernel::HLERequestContext& ctx) {
|
|
void ILibraryAppletCreator::CreateStorage(Kernel::HLERequestContext& ctx) {
|
|
|
IPC::RequestParser rp{ctx};
|
|
IPC::RequestParser rp{ctx};
|
|
|
- const u64 size{rp.Pop<u64>()};
|
|
|
|
|
|
|
+
|
|
|
|
|
+ const s64 size{rp.Pop<s64>()};
|
|
|
|
|
+
|
|
|
LOG_DEBUG(Service_AM, "called, size={}", size);
|
|
LOG_DEBUG(Service_AM, "called, size={}", size);
|
|
|
|
|
|
|
|
|
|
+ if (size <= 0) {
|
|
|
|
|
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_UNKNOWN);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
std::vector<u8> buffer(size);
|
|
std::vector<u8> buffer(size);
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
@@ -1170,18 +1180,65 @@ void ILibraryAppletCreator::CreateStorage(Kernel::HLERequestContext& ctx) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ILibraryAppletCreator::CreateTransferMemoryStorage(Kernel::HLERequestContext& ctx) {
|
|
void ILibraryAppletCreator::CreateTransferMemoryStorage(Kernel::HLERequestContext& ctx) {
|
|
|
- LOG_DEBUG(Service_AM, "called");
|
|
|
|
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
|
|
+
|
|
|
|
|
+ struct Parameters {
|
|
|
|
|
+ u8 permissions;
|
|
|
|
|
+ s64 size;
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ const auto parameters{rp.PopRaw<Parameters>()};
|
|
|
|
|
+ const auto handle{ctx.GetCopyHandle(0)};
|
|
|
|
|
+
|
|
|
|
|
+ LOG_DEBUG(Service_AM, "called, permissions={}, size={}, handle={:08X}", parameters.permissions,
|
|
|
|
|
+ parameters.size, handle);
|
|
|
|
|
+
|
|
|
|
|
+ if (parameters.size <= 0) {
|
|
|
|
|
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_UNKNOWN);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ auto transfer_mem =
|
|
|
|
|
+ system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle);
|
|
|
|
|
+
|
|
|
|
|
+ if (transfer_mem == nullptr) {
|
|
|
|
|
+ LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_UNKNOWN);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const u8* const mem_begin = transfer_mem->GetPointer();
|
|
|
|
|
+ const u8* const mem_end = mem_begin + transfer_mem->GetSize();
|
|
|
|
|
+ std::vector<u8> memory{mem_begin, mem_end};
|
|
|
|
|
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
|
|
+ rb.PushIpcInterface<IStorage>(system, std::move(memory));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void ILibraryAppletCreator::CreateHandleStorage(Kernel::HLERequestContext& ctx) {
|
|
|
IPC::RequestParser rp{ctx};
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
|
|
|
- rp.SetCurrentOffset(3);
|
|
|
|
|
- const auto handle{rp.Pop<Kernel::Handle>()};
|
|
|
|
|
|
|
+ const s64 size{rp.Pop<s64>()};
|
|
|
|
|
+ const auto handle{ctx.GetCopyHandle(0)};
|
|
|
|
|
+
|
|
|
|
|
+ LOG_DEBUG(Service_AM, "called, size={}, handle={:08X}", size, handle);
|
|
|
|
|
+
|
|
|
|
|
+ if (size <= 0) {
|
|
|
|
|
+ LOG_ERROR(Service_AM, "size is less than or equal to 0");
|
|
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
+ rb.Push(RESULT_UNKNOWN);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
auto transfer_mem =
|
|
auto transfer_mem =
|
|
|
system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle);
|
|
system.CurrentProcess()->GetHandleTable().Get<Kernel::TransferMemory>(handle);
|
|
|
|
|
|
|
|
if (transfer_mem == nullptr) {
|
|
if (transfer_mem == nullptr) {
|
|
|
- LOG_ERROR(Service_AM, "shared_mem is a nullpr for handle={:08X}", handle);
|
|
|
|
|
|
|
+ LOG_ERROR(Service_AM, "transfer_mem is a nullptr for handle={:08X}", handle);
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
rb.Push(RESULT_UNKNOWN);
|
|
rb.Push(RESULT_UNKNOWN);
|
|
|
return;
|
|
return;
|