aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsegfault <toni@impl.cc>2020-10-01 16:32:42 -0700
committersegfault <toni@impl.cc>2020-10-01 16:39:30 -0700
commitdb67fda2a689da4a8a8d8dd32aa6bc1a47246b12 (patch)
tree0f6012c3fc76da542be7806ab557d5a338e1c68a
parentbe751c6dc97bac1334968047408bcf3184c2a0eb (diff)
Added some PTE code for future use.
-rw-r--r--KMemDriver/Memory.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/KMemDriver/Memory.c b/KMemDriver/Memory.c
index 9a064c3..2b0621b 100644
--- a/KMemDriver/Memory.c
+++ b/KMemDriver/Memory.c
@@ -315,4 +315,89 @@ NTSTATUS FreeMemoryFromProcess(IN PEPROCESS pep, IN PVOID baseAddr, IN SIZE_T si
MmFreeNonCachedMemory(apc, sizeof(*apc));
return status;
+}
+
+NTSTATUS WritePhysicalPage(IN PVOID addr, IN PUCHAR content, IN OUT PSIZE_T content_size_and_transferred)
+{
+ PHYSICAL_ADDRESS pa = { 0 };
+ MM_COPY_ADDRESS mm = { 0 };
+ PVOID vaddr;
+
+ if (content_size_and_transferred == NULL || *content_size_and_transferred > 4096)
+ {
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ pa.QuadPart = (LONGLONG)addr;
+ mm.VirtualAddress = content;
+ vaddr = MmGetVirtualForPhysical(pa);
+
+ if (vaddr == NULL)
+ {
+ return STATUS_UNSUCCESSFUL;
+ }
+ return MmCopyMemory(vaddr, mm, 4096, MM_COPY_MEMORY_VIRTUAL, content_size_and_transferred);
+}
+
+NTSTATUS ReadPhysicalPage(IN PHYSICAL_ADDRESS * addr, OUT PUCHAR content, IN OUT PSIZE_T content_size_and_transferred)
+{
+ MM_COPY_ADDRESS mm = { 0 };
+
+ if (content_size_and_transferred == NULL || *content_size_and_transferred > 4096)
+ {
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ mm.PhysicalAddress = *(PHYSICAL_ADDRESS *)addr;
+ return MmCopyMemory(content, mm, 4096, MM_COPY_MEMORY_PHYSICAL, content_size_and_transferred);
+}
+
+SIZE_T GetCR3(IN PEPROCESS pep)
+{
+ SIZE_T ret;
+ KAPC_STATE apcState;
+
+ KeStackAttachProcess((PRKPROCESS)pep, &apcState);
+ ret = __readcr3();
+ KeUnstackDetachProcess(&apcState);
+
+ return ret;
+}
+
+void SetCR3(IN PEPROCESS pep, IN SIZE_T value)
+{
+ KAPC_STATE apcState;
+
+ KeStackAttachProcess((PRKPROCESS)pep, &apcState);
+ __writecr3(value);
+ KeUnstackDetachProcess(&apcState);
+}
+
+static ULONG_PTR invalidate_tlb(ULONG_PTR addr)
+{
+ __invlpg(addr);
+ return 0;
+}
+
+void FlushTLB(IN PVOID addr)
+{
+ KeIpiGenericCall(invalidate_tlb, (ULONG_PTR)addr);
+}
+
+#define IA32_PAT 0x277
+
+SIZE_T GetIA32PAT(void)
+{
+ return __readmsr(IA32_PAT);
+}
+
+static ULONG_PTR set_pat(ULONG_PTR pat)
+{
+ __writemsr(IA32_PAT, pat);
+ return 0;
+}
+
+void SetIA32PAT(IN SIZE_T value)
+{
+ KeIpiGenericCall(set_pat, value);
} \ No newline at end of file