#pragma once #include "kernel32/internal.h" #include #include #include #include #include using kernel32::ProcessObject; namespace wibo { namespace detail { class ProcessManagerImpl { public: virtual ~ProcessManagerImpl() = default; virtual bool init() = 0; virtual void shutdown() = 0; virtual bool addProcess(Pin po) = 0; [[nodiscard]] virtual bool running() const = 0; }; struct SpawnProcessInfo { pid_t pid = -1; int pidfd = -1; }; std::unique_ptr createProcessManagerImpl(); int spawnProcess(char *const argv[], char *const envp[], SpawnProcessInfo &info); } // namespace detail class ProcessManager { public: ProcessManager(); ~ProcessManager(); bool init(); void shutdown(); bool addProcess(Pin po); [[nodiscard]] bool running() const; private: std::unique_ptr mImpl; }; ProcessManager &processes(); std::optional resolveExecutable(const std::string &command, bool searchPath); int spawnWithCommandLine(const std::string &applicationName, const std::string &commandLine, Pin &pinOut); int spawnWithArgv(const std::string &applicationName, const std::vector &argv, Pin &pinOut); std::vector splitCommandLine(const char *commandLine); DWORD getThreadId(); } // namespace wibo