Parcourir la source

Merge pull request #7847 from tech-ticks/master

service: pm: Implement AtmosphereGetProcessInfo
Morph il y a 4 ans
Parent
commit
b720009dc0
2 fichiers modifiés avec 46 ajouts et 1 suppressions
  1. 1 1
      src/core/hle/kernel/svc.cpp
  2. 45 0
      src/core/hle/service/pm/pm.cpp

+ 1 - 1
src/core/hle/kernel/svc.cpp

@@ -396,7 +396,7 @@ static ResultCode GetProcessId(Core::System& system, u64* out_process_id, Handle
     // Get the process id.
     // Get the process id.
     *out_process_id = process->GetId();
     *out_process_id = process->GetId();
 
 
-    return ResultInvalidHandle;
+    return ResultSuccess;
 }
 }
 
 
 static ResultCode GetProcessId32(Core::System& system, u32* out_process_id_low,
 static ResultCode GetProcessId32(Core::System& system, u32* out_process_id_low,

+ 45 - 0
src/core/hle/service/pm/pm.cpp

@@ -91,6 +91,8 @@ public:
             {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
             {4, &DebugMonitor::GetApplicationProcessId, "GetApplicationProcessId"},
             {5, nullptr, "HookToCreateApplicationProgress"},
             {5, nullptr, "HookToCreateApplicationProgress"},
             {6, nullptr, "ClearHook"},
             {6, nullptr, "ClearHook"},
+            {65000, &DebugMonitor::AtmosphereGetProcessInfo, "AtmosphereGetProcessInfo"},
+            {65001, nullptr, "AtmosphereGetCurrentLimitInfo"},
         };
         };
         // clang-format on
         // clang-format on
 
 
@@ -125,6 +127,49 @@ private:
         GetApplicationPidGeneric(ctx, kernel.GetProcessList());
         GetApplicationPidGeneric(ctx, kernel.GetProcessList());
     }
     }
 
 
+    void AtmosphereGetProcessInfo(Kernel::HLERequestContext& ctx) {
+        // https://github.com/Atmosphere-NX/Atmosphere/blob/master/stratosphere/pm/source/impl/pm_process_manager.cpp#L614
+        // This implementation is incomplete; only a handle to the process is returned.
+        IPC::RequestParser rp{ctx};
+        const auto pid = rp.PopRaw<u64>();
+
+        LOG_WARNING(Service_PM, "(Partial Implementation) called, pid={:016X}", pid);
+
+        const auto process = SearchProcessList(kernel.GetProcessList(), [pid](const auto& proc) {
+            return proc->GetProcessID() == pid;
+        });
+
+        if (!process.has_value()) {
+            IPC::ResponseBuilder rb{ctx, 2};
+            rb.Push(ResultProcessNotFound);
+            return;
+        }
+
+        struct ProgramLocation {
+            u64 program_id;
+            u8 storage_id;
+        };
+        static_assert(sizeof(ProgramLocation) == 0x10, "ProgramLocation has an invalid size");
+
+        struct OverrideStatus {
+            u64 keys_held;
+            u64 flags;
+        };
+        static_assert(sizeof(OverrideStatus) == 0x10, "OverrideStatus has an invalid size");
+
+        OverrideStatus override_status{};
+        ProgramLocation program_location{
+            .program_id = (*process)->GetProgramID(),
+            .storage_id = 0,
+        };
+
+        IPC::ResponseBuilder rb{ctx, 10, 1};
+        rb.Push(ResultSuccess);
+        rb.PushCopyObjects(*process);
+        rb.PushRaw(program_location);
+        rb.PushRaw(override_status);
+    }
+
     const Kernel::KernelCore& kernel;
     const Kernel::KernelCore& kernel;
 };
 };