summaryrefslogtreecommitdiff
path: root/src/envmodule.h
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-11-11 14:14:01 -0500
committerGitHub <noreply@github.com>2019-11-11 14:14:01 -0500
commitd6c3bad01a85c1a5b1a3bdd86efc85efdd4c5f29 (patch)
treefddae0025e65bd1d5064bf8ad6fa73a23aa750e9 /src/envmodule.h
parent7b3c5dcbb3b5d520d166eb5b51f669968f57302e (diff)
parentdecd5c1828f495be4e230c9fc6fb79dd9bfdfb81 (diff)
Merge pull request #887 from isanae/spawning-and-waiting
Spawning, waiting and locking
Diffstat (limited to 'src/envmodule.h')
-rw-r--r--src/envmodule.h40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/envmodule.h b/src/envmodule.h
index deb7520f..d152b840 100644
--- a/src/envmodule.h
+++ b/src/envmodule.h
@@ -7,6 +7,23 @@
namespace env
{
+// used by HandlePtr, calls CloseHandle() as the deleter
+//
+struct HandleCloser
+{
+ using pointer = HANDLE;
+
+ void operator()(HANDLE h)
+ {
+ if (h != INVALID_HANDLE_VALUE) {
+ ::CloseHandle(h);
+ }
+ }
+};
+
+using HandlePtr = std::unique_ptr<HANDLE, HandleCloser>;
+
+
// represents one module
//
class Module
@@ -101,25 +118,44 @@ private:
class Process
{
public:
- Process(DWORD pid, QString name);
+ Process();
+ explicit Process(HANDLE h);
+ Process(DWORD pid, DWORD ppid, QString name);
+ bool isValid() const;
DWORD pid() const;
+ DWORD ppid() const;
const QString& name() const;
+ HandlePtr openHandleForWait() const;
+
// whether this process can be accessed; fails if the current process doesn't
// have the proper permissions
//
bool canAccess() const;
+ void addChild(Process p);
+ std::vector<Process>& children();
+
private:
DWORD m_pid;
- QString m_name;
+ mutable std::optional<DWORD> m_ppid;
+ mutable std::optional<QString> m_name;
+ std::vector<Process> m_children;
};
std::vector<Process> getRunningProcesses();
std::vector<Module> getLoadedModules();
+Process getProcessTree(HANDLE parent);
+
+QString getProcessName(DWORD pid);
+QString getProcessName(HANDLE process);
+
+DWORD getProcessParentID(DWORD pid);
+DWORD getProcessParentID(HANDLE handle);
+
} // namespace env
#endif // ENV_MODULE_H