You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.2 KiB
61 lines
1.2 KiB
#pragma once
|
|
#include "../mem_ctx/mem_ctx.hpp"
|
|
|
|
namespace nasa
|
|
{
|
|
class patch_ctx
|
|
{
|
|
public:
|
|
explicit patch_ctx(mem_ctx* mem_ctx);
|
|
|
|
//
|
|
// returns a virtual address mapping of the newly patched page(s).
|
|
//
|
|
void* patch(void* kernel_addr);
|
|
__forceinline void enable()
|
|
{
|
|
mapped_pml4e->pfn = new_pml4e.pfn;
|
|
}
|
|
|
|
__forceinline void disable()
|
|
{
|
|
mapped_pml4e->pfn = old_pml4e.pfn;
|
|
}
|
|
private:
|
|
|
|
//
|
|
// std::pair< physical page, virtual address >
|
|
//
|
|
std::pair<void*, void*> make_pdpt(const pt_entries& kernel_entries, void* kernel_addr);
|
|
std::pair<void*, void*> make_pd(const pt_entries& kernel_entries, void* kernel_addr);
|
|
std::pair<void*, void*> make_pt(const pt_entries& kernel_entries, void* kernel_addr);
|
|
std::pair<void*, void*> make_page(const pt_entries& kernel_entries, void* kernel_addr);
|
|
|
|
//
|
|
// context of the current process you want to patch.
|
|
//
|
|
mem_ctx* mem_ctx;
|
|
|
|
//
|
|
// newly created table entries and table pointers (pdpte, pde, pte)
|
|
//
|
|
pt_entries new_entries;
|
|
|
|
//
|
|
// old and new pml4e
|
|
//
|
|
pml4e new_pml4e;
|
|
pml4e old_pml4e;
|
|
|
|
//
|
|
// kernel address of the patch.
|
|
//
|
|
void* kernel_addr;
|
|
|
|
//
|
|
// pointer to the mapped pml4e
|
|
// used for enable/disable patch...
|
|
//
|
|
ppml4e mapped_pml4e;
|
|
};
|
|
} |