mirror of
https://github.com/momo5502/hypervisor.git
synced 2025-07-05 10:41:50 +00:00
68 lines
1.4 KiB
C++
68 lines
1.4 KiB
C++
#include "std_include.hpp"
|
|
#include "process_callback.hpp"
|
|
#include "process.hpp"
|
|
#include "list.hpp"
|
|
#include "logging.hpp"
|
|
|
|
namespace process_callback
|
|
{
|
|
namespace
|
|
{
|
|
utils::list<callback_function>& get_callback_list()
|
|
{
|
|
static utils::list<callback_function> list{};
|
|
return list;
|
|
}
|
|
|
|
void process_notification_callback(const HANDLE parent, const HANDLE process, const BOOLEAN create)
|
|
{
|
|
const auto& list = get_callback_list();
|
|
for (const auto& callback : list)
|
|
{
|
|
callback(process::process_id_from_handle(parent), process::process_id_from_handle(process),
|
|
create == FALSE ? type::destroy : type::create);
|
|
}
|
|
}
|
|
|
|
class process_notifier
|
|
{
|
|
public:
|
|
process_notifier()
|
|
: added_(PsSetCreateProcessNotifyRoutine(process_notification_callback, FALSE) == STATUS_SUCCESS)
|
|
{
|
|
get_callback_list();
|
|
|
|
if (!added_)
|
|
{
|
|
debug_log("Failed to register process notification callback\n");
|
|
}
|
|
}
|
|
|
|
~process_notifier()
|
|
{
|
|
if (this->added_)
|
|
{
|
|
PsSetCreateProcessNotifyRoutine(process_notification_callback, TRUE);
|
|
}
|
|
}
|
|
|
|
private:
|
|
bool added_{};
|
|
};
|
|
}
|
|
|
|
void* add(callback_function callback)
|
|
{
|
|
static process_notifier _;
|
|
return &get_callback_list().push_back(std::move(callback));
|
|
}
|
|
|
|
void remove(void* handle)
|
|
{
|
|
if (handle)
|
|
{
|
|
get_callback_list().erase(*static_cast<callback_function*>(handle));
|
|
}
|
|
}
|
|
}
|