mirror of
https://github.com/momo5502/hypervisor.git
synced 2026-05-22 23:31:43 +00:00
Start using custom containers
This commit is contained in:
+20
-43
@@ -168,7 +168,7 @@ namespace vmx
|
||||
}
|
||||
|
||||
void ept::install_page_hook(void* destination, const void* source, const size_t length,
|
||||
ept_translation_hint* translation_hint)
|
||||
const ept_translation_hint* translation_hint)
|
||||
{
|
||||
auto* hook = this->get_or_create_ept_hook(destination, translation_hint);
|
||||
|
||||
@@ -194,7 +194,7 @@ namespace vmx
|
||||
}
|
||||
|
||||
void ept::install_hook(const void* destination, const void* source, const size_t length,
|
||||
ept_translation_hint* translation_hint)
|
||||
const utils::list<ept_translation_hint>& hints)
|
||||
{
|
||||
auto current_destination = reinterpret_cast<uint64_t>(destination);
|
||||
auto current_source = reinterpret_cast<uint64_t>(source);
|
||||
@@ -207,17 +207,16 @@ namespace vmx
|
||||
const auto page_remaining = PAGE_SIZE - page_offset;
|
||||
const auto data_to_write = min(page_remaining, current_length);
|
||||
|
||||
ept_translation_hint* relevant_hint = nullptr;
|
||||
ept_translation_hint* current_hint = translation_hint;
|
||||
while (current_hint)
|
||||
|
||||
|
||||
const ept_translation_hint* relevant_hint = nullptr;
|
||||
for(const auto& hint : hints)
|
||||
{
|
||||
if (current_hint->virtual_base_address == aligned_destination)
|
||||
if (hint.virtual_base_address == aligned_destination)
|
||||
{
|
||||
relevant_hint = current_hint;
|
||||
relevant_hint = &hint;
|
||||
break;
|
||||
}
|
||||
|
||||
current_hint = current_hint->next_hint;
|
||||
}
|
||||
|
||||
this->install_page_hook(reinterpret_cast<void*>(current_destination),
|
||||
@@ -539,7 +538,7 @@ namespace vmx
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ept_hook* ept::get_or_create_ept_hook(void* destination, ept_translation_hint* translation_hint)
|
||||
ept_hook* ept::get_or_create_ept_hook(void* destination, const ept_translation_hint* translation_hint)
|
||||
{
|
||||
const auto virtual_target = PAGE_ALIGN(destination);
|
||||
|
||||
@@ -654,18 +653,13 @@ namespace vmx
|
||||
target_entry->flags = new_pointer.flags;
|
||||
}
|
||||
|
||||
ept_translation_hint* ept::generate_translation_hints(const void* destination, const size_t length)
|
||||
utils::list<ept_translation_hint> ept::generate_translation_hints(const void* destination, const size_t length)
|
||||
{
|
||||
utils::list<ept_translation_hint> hints{};
|
||||
|
||||
auto current_destination = reinterpret_cast<uint64_t>(destination);
|
||||
auto current_length = length;
|
||||
|
||||
ept_translation_hint* current_hints = nullptr;
|
||||
|
||||
auto destructor = utils::finally([¤t_hints]()
|
||||
{
|
||||
ept::free_translation_hints(current_hints);
|
||||
});
|
||||
|
||||
while (current_length != 0)
|
||||
{
|
||||
const auto aligned_destination = PAGE_ALIGN(current_destination);
|
||||
@@ -673,42 +667,25 @@ namespace vmx
|
||||
const auto page_remaining = PAGE_SIZE - page_offset;
|
||||
const auto data_to_write = min(page_remaining, current_length);
|
||||
|
||||
auto* new_hint = memory::allocate_non_paged_object<ept_translation_hint>();
|
||||
if (!new_hint)
|
||||
{
|
||||
throw std::runtime_error("Failed to allocate hint");
|
||||
}
|
||||
ept_translation_hint current_hint{};
|
||||
|
||||
new_hint->next_hint = current_hints;
|
||||
current_hints = new_hint;
|
||||
current_hints->virtual_base_address = aligned_destination;
|
||||
current_hints->physical_base_address = memory::get_physical_address(aligned_destination);
|
||||
current_hint.virtual_base_address = aligned_destination;
|
||||
current_hint.physical_base_address = memory::get_physical_address(aligned_destination);
|
||||
|
||||
if (!current_hints->physical_base_address)
|
||||
if (!current_hint.physical_base_address)
|
||||
{
|
||||
throw std::runtime_error("Failed to resolve physical address");
|
||||
}
|
||||
|
||||
memcpy(¤t_hints->page[0], aligned_destination, PAGE_SIZE);
|
||||
memcpy(¤t_hint.page[0], aligned_destination, PAGE_SIZE);
|
||||
|
||||
hints.push_back(current_hint);
|
||||
|
||||
current_length -= data_to_write;
|
||||
current_destination += data_to_write;
|
||||
}
|
||||
|
||||
destructor.cancel();
|
||||
|
||||
return current_hints;
|
||||
}
|
||||
|
||||
void ept::free_translation_hints(ept_translation_hint* hints)
|
||||
{
|
||||
auto* hint = hints;
|
||||
while (hint)
|
||||
{
|
||||
auto* current_hint = hint;
|
||||
hint = hint->next_hint;
|
||||
memory::free_non_paged_object(current_hint);
|
||||
}
|
||||
return hints;
|
||||
}
|
||||
|
||||
uint64_t* ept::get_access_records(size_t* count)
|
||||
|
||||
Reference in New Issue
Block a user