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.
139 lines
4.9 KiB
139 lines
4.9 KiB
#pragma once
|
|
#include "Utils.h"
|
|
|
|
#define MAP_PHYSICAL_SIG "\xE8\x00\x00\x00\x00\x85\xC0\x0F\x88\x00\x00\x00\x00\x48\x8B\xBC\x24"
|
|
#define MAP_PHYSICAL_MASK "x????xxxx????xxxx"
|
|
static_assert(sizeof(MAP_PHYSICAL_SIG) == sizeof(MAP_PHYSICAL_MASK), "signature and mask do not patch sizes...\n");
|
|
|
|
typedef EFI_STATUS(EFIAPI* MAP_PHYSICAL)
|
|
(
|
|
VOID** VirtualAddress,
|
|
VOID* PhysicalAddress,
|
|
UINTN Size,
|
|
VOID* Unknown,
|
|
VOID* Unknown2
|
|
);
|
|
extern MAP_PHYSICAL MmMapPhysicalMemory;
|
|
|
|
typedef union _CR3
|
|
{
|
|
UINTN Value;
|
|
struct
|
|
{
|
|
UINTN reserved1 : 3;
|
|
UINTN PageLevelWriteThrough : 1;
|
|
UINTN PageLevelCacheDisable : 1;
|
|
UINTN reserved2 : 7;
|
|
UINTN Pml4Pfn : 36;
|
|
UINTN reserved3 : 16;
|
|
};
|
|
} CR3;
|
|
|
|
typedef union _VIRT_ADDR_T
|
|
{
|
|
void* Value;
|
|
struct
|
|
{
|
|
UINT64 offset : 12;
|
|
UINT64 PtIdx : 9;
|
|
UINT64 PdIdx : 9;
|
|
UINT64 PdptIdx : 9;
|
|
UINT64 Pml4Idx : 9;
|
|
UINT64 reserved : 16;
|
|
};
|
|
} VIRT_ADDR_T, *PVIRT_ADDR_T;
|
|
|
|
|
|
typedef union _PML4E_T
|
|
{
|
|
UINT64 Value;
|
|
struct
|
|
{
|
|
UINT64 Present : 1; // Must be 1, region invalid if 0.
|
|
UINT64 ReadWrite : 1; // If 0, writes not allowed.
|
|
UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed.
|
|
UINT64 page_write_through : 1; // Determines the memory type used to access PDPT.
|
|
UINT64 page_cache : 1; // Determines the memory type used to access PDPT.
|
|
UINT64 accessed : 1; // If 0, this entry has not been used for translation.
|
|
UINT64 ignore_1 : 1;
|
|
UINT64 LargePage : 1; // Must be 0 for PML4E.
|
|
UINT64 ignore_2 : 4;
|
|
UINT64 Pfn : 36; // The page frame number of the PDPT of this PML4E.
|
|
UINT64 reserved : 4;
|
|
UINT64 ignore_3 : 11;
|
|
UINT64 nx : 1; // If 1, instruction fetches not allowed.
|
|
};
|
|
} PML4E_T, * PPML4E_T;
|
|
|
|
typedef union _PDPTE
|
|
{
|
|
UINT64 Value;
|
|
struct
|
|
{
|
|
UINT64 Present : 1; // Must be 1, region invalid if 0.
|
|
UINT64 ReadWrite : 1; // If 0, writes not allowed.
|
|
UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed.
|
|
UINT64 page_write_through : 1; // Determines the memory type used to access PD.
|
|
UINT64 page_cache : 1; // Determines the memory type used to access PD.
|
|
UINT64 accessed : 1; // If 0, this entry has not been used for translation.
|
|
UINT64 ignore_1 : 1;
|
|
UINT64 LargePage : 1; // If 1, this entry maps a 1GB page.
|
|
UINT64 ignore_2 : 4;
|
|
UINT64 Pfn : 36; // The page frame number of the PD of this PDPTE.
|
|
UINT64 reserved : 4;
|
|
UINT64 ignore_3 : 11;
|
|
UINT64 nx : 1; // If 1, instruction fetches not allowed.
|
|
};
|
|
} PDPTE_T, * PPDPTE_T;
|
|
|
|
typedef union _PDE
|
|
{
|
|
UINT64 Value;
|
|
struct
|
|
{
|
|
UINT64 Present : 1; // Must be 1, region invalid if 0.
|
|
UINT64 ReadWrite : 1; // If 0, writes not allowed.
|
|
UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed.
|
|
UINT64 page_write_through : 1; // Determines the memory type used to access PT.
|
|
UINT64 page_cache : 1; // Determines the memory type used to access PT.
|
|
UINT64 accessed : 1; // If 0, this entry has not been used for translation.
|
|
UINT64 ignore_1 : 1;
|
|
UINT64 LargePage : 1; // If 1, this entry maps a 2MB page.
|
|
UINT64 ignore_2 : 4;
|
|
UINT64 Pfn : 36; // The page frame number of the PT of this PDE.
|
|
UINT64 reserved : 4;
|
|
UINT64 ignore_3 : 11;
|
|
UINT64 nx : 1; // If 1, instruction fetches not allowed.
|
|
};
|
|
} PDE_T, * PPDE_T;
|
|
|
|
typedef union _PTE
|
|
{
|
|
UINT64 Value;
|
|
struct
|
|
{
|
|
UINT64 Present : 1; // Must be 1, region invalid if 0.
|
|
UINT64 ReadWrite : 1; // If 0, writes not allowed.
|
|
UINT64 UserSuperVisor : 1; // If 0, user-mode accesses not allowed.
|
|
UINT64 page_write_through : 1; // Determines the memory type used to access the memory.
|
|
UINT64 page_cache : 1; // Determines the memory type used to access the memory.
|
|
UINT64 accessed : 1; // If 0, this entry has not been used for translation.
|
|
UINT64 dirty : 1; // If 0, the memory backing this page has not been written to.
|
|
UINT64 access_type : 1; // Determines the memory type used to access the memory.
|
|
UINT64 global : 1; // If 1 and the PGE bit of CR4 is set, translations are global.
|
|
UINT64 ignore_2 : 3;
|
|
UINT64 Pfn : 36; // The page frame number of the backing physical page.
|
|
UINT64 reserved : 4;
|
|
UINT64 ignore_3 : 7;
|
|
UINT64 pk : 4; // If the PKE bit of CR4 is set, determines the protection key.
|
|
UINT64 nx : 1; // If 1, instruction fetches not allowed.
|
|
};
|
|
} PTE_T, *PPTE_T;
|
|
|
|
typedef struct _TABLE_ENTRIES
|
|
{
|
|
PML4E_T Pml4Entry;
|
|
PDPTE_T PdptEntry;
|
|
PDE_T PdEntry;
|
|
PTE_T PtEntry;
|
|
} TABLE_ENTRIES, *PTABLE_ENTRIES; |