|
|
@@ -8,6 +8,26 @@
|
|
|
|
|
|
namespace Service::PM {
|
|
|
|
|
|
+namespace {
|
|
|
+
|
|
|
+constexpr ResultCode ERROR_PROCESS_NOT_FOUND{ErrorModule::PM, 1};
|
|
|
+
|
|
|
+constexpr u64 NO_PROCESS_FOUND_PID{0};
|
|
|
+
|
|
|
+std::optional<Kernel::SharedPtr<Kernel::Process>> SearchProcessList(
|
|
|
+ const std::vector<Kernel::SharedPtr<Kernel::Process>>& process_list,
|
|
|
+ std::function<bool(const Kernel::SharedPtr<Kernel::Process>&)> predicate) {
|
|
|
+ const auto iter = std::find_if(process_list.begin(), process_list.end(), predicate);
|
|
|
+
|
|
|
+ if (iter == process_list.end()) {
|
|
|
+ return std::nullopt;
|
|
|
+ }
|
|
|
+
|
|
|
+ return *iter;
|
|
|
+}
|
|
|
+
|
|
|
+} // Anonymous namespace
|
|
|
+
|
|
|
class BootMode final : public ServiceFramework<BootMode> {
|
|
|
public:
|
|
|
explicit BootMode() : ServiceFramework{"pm:bm"} {
|
|
|
@@ -60,12 +80,37 @@ public:
|
|
|
|
|
|
class Info final : public ServiceFramework<Info> {
|
|
|
public:
|
|
|
- explicit Info() : ServiceFramework{"pm:info"} {
|
|
|
+ explicit Info(const std::vector<Kernel::SharedPtr<Kernel::Process>>& process_list)
|
|
|
+ : ServiceFramework{"pm:info"}, process_list(process_list) {
|
|
|
static const FunctionInfo functions[] = {
|
|
|
- {0, nullptr, "GetTitleId"},
|
|
|
+ {0, &Info::GetTitleId, "GetTitleId"},
|
|
|
};
|
|
|
RegisterHandlers(functions);
|
|
|
}
|
|
|
+
|
|
|
+private:
|
|
|
+ void GetTitleId(Kernel::HLERequestContext& ctx) {
|
|
|
+ IPC::RequestParser rp{ctx};
|
|
|
+ const auto process_id = rp.PopRaw<u64>();
|
|
|
+
|
|
|
+ LOG_DEBUG(Service_PM, "called, process_id={:016X}", process_id);
|
|
|
+
|
|
|
+ const auto process = SearchProcessList(process_list, [process_id](const auto& process) {
|
|
|
+ return process->GetProcessID() == process_id;
|
|
|
+ });
|
|
|
+
|
|
|
+ if (!process.has_value()) {
|
|
|
+ IPC::ResponseBuilder rb{ctx, 2};
|
|
|
+ rb.Push(ERROR_PROCESS_NOT_FOUND);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ IPC::ResponseBuilder rb{ctx, 4};
|
|
|
+ rb.Push(RESULT_SUCCESS);
|
|
|
+ rb.Push((*process)->GetTitleID());
|
|
|
+ }
|
|
|
+
|
|
|
+ const std::vector<Kernel::SharedPtr<Kernel::Process>>& process_list;
|
|
|
};
|
|
|
|
|
|
class Shell final : public ServiceFramework<Shell> {
|