forked from eden-emu/eden
		
	ILibraryAppletCreator: Implement CreateHandleStorage
Used by Monster Hunter Generations Ultimate
This commit is contained in:
		
							parent
							
								
									e1702e2844
								
							
						
					
					
						commit
						957dfba645
					
				
					 2 changed files with 65 additions and 7 deletions
				
			
		|  | @ -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}; |     IPC::RequestParser rp{ctx}; | ||||||
| 
 | 
 | ||||||
|     rp.SetCurrentOffset(3); |     struct Parameters { | ||||||
|     const auto handle{rp.Pop<Kernel::Handle>()}; |         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 = |     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}; | ||||||
|  |         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}; | ||||||
|  | 
 | ||||||
|  |     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 = | ||||||
|  |         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}; |         IPC::ResponseBuilder rb{ctx, 2}; | ||||||
|         rb.Push(RESULT_UNKNOWN); |         rb.Push(RESULT_UNKNOWN); | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|  | @ -254,6 +254,7 @@ private: | ||||||
|     void CreateLibraryApplet(Kernel::HLERequestContext& ctx); |     void CreateLibraryApplet(Kernel::HLERequestContext& ctx); | ||||||
|     void CreateStorage(Kernel::HLERequestContext& ctx); |     void CreateStorage(Kernel::HLERequestContext& ctx); | ||||||
|     void CreateTransferMemoryStorage(Kernel::HLERequestContext& ctx); |     void CreateTransferMemoryStorage(Kernel::HLERequestContext& ctx); | ||||||
|  |     void CreateHandleStorage(Kernel::HLERequestContext& ctx); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class IApplicationFunctions final : public ServiceFramework<IApplicationFunctions> { | class IApplicationFunctions final : public ServiceFramework<IApplicationFunctions> { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Morph
						Morph