Support multiple instances

This commit is contained in:
Maurice Heumann 2022-12-28 08:38:51 +01:00
parent 4cde82aae1
commit a3f67b20b8
3 changed files with 43 additions and 10 deletions

View File

@ -14,6 +14,11 @@ public:
driver(driver&& obj) noexcept = default;; driver(driver&& obj) noexcept = default;;
driver& operator=(driver&& obj) noexcept = default; driver& operator=(driver&& obj) noexcept = default;
operator bool() const
{
return this->service_;
}
private: private:
service_handle manager_{}; service_handle manager_{};
service_handle service_{}; service_handle service_{};

View File

@ -44,28 +44,48 @@ driver_device& get_driver_device()
static driver hypervisor{}; static driver hypervisor{};
static driver_device device{}; static driver_device device{};
if (device) if (!hypervisor)
{
return device;
}
try
{
device = create_driver_device();
}
catch (...)
{ {
hypervisor = create_driver(); hypervisor = create_driver();
}
if (!device)
{
device = create_driver_device(); device = create_driver_device();
} }
return device; return device;
} }
extern "C" __declspec(dllexport)
int hyperhook_initialize()
{
try
{
const auto& device = get_driver_device();
if (device)
{
return 1;
}
}
catch (const std::exception& e)
{
printf("%s\n", e.what());
}
return 0;
}
extern "C" __declspec(dllexport) extern "C" __declspec(dllexport)
int hyperhook_write(const unsigned int process_id, const unsigned long long address, const void* data, int hyperhook_write(const unsigned int process_id, const unsigned long long address, const void* data,
const unsigned long long size) const unsigned long long size)
{ {
if (hyperhook_initialize() == 0)
{
return 0;
}
try try
{ {
const auto& device = get_driver_device(); const auto& device = get_driver_device();

View File

@ -6,6 +6,9 @@
#include "resource.hpp" #include "resource.hpp"
extern "C" __declspec(dllimport)
int hyperhook_initialize();
extern "C" __declspec(dllimport) extern "C" __declspec(dllimport)
int hyperhook_write(unsigned int process_id, unsigned long long address, const void* data, int hyperhook_write(unsigned int process_id, unsigned long long address, const void* data,
unsigned long long size); unsigned long long size);
@ -99,6 +102,11 @@ void try_patch_t6()
int safe_main(const int /*argc*/, char* /*argv*/[]) int safe_main(const int /*argc*/, char* /*argv*/[])
{ {
if (hyperhook_initialize() == 0)
{
throw std::runtime_error("Failed to initialize HyperHook");
}
while (true) while (true)
{ {
try_patch_iw5(); try_patch_iw5();