#include <ntifs.h>
UNICODE_STRING g_ustr = {0};
typedef
struct
_MMPTE_HARDWARE {
unsigned
long
long
P : 1;
unsigned
long
long
RW : 1;
unsigned
long
long
US : 1;
unsigned
long
long
PWT : 1;
unsigned
long
long
PCD : 1;
unsigned
long
long
A : 1;
unsigned
long
long
Reserved : 1;
unsigned
long
long
PS : 1;
unsigned
long
long
G : 1;
unsigned
long
long
A1 : 1;
unsigned
long
long
A2 : 1;
unsigned
long
long
A3 : 1;
unsigned
long
long
PFN : 28;
unsigned
long
long
reserved1 : 12;
unsigned
long
long
WS : 11;
unsigned
long
long
NE : 1;
} MMPTE_HARDWARE, *PMMPTE_HARDWARE;
typedef
struct
_MMPTE {
union
{
ULONG_PTR
Long;
MMPTE_HARDWARE Hard;
} u;
} MMPTE, *PMMPTE;
#define PAGE_SHIFT 12L
#define PXE_BASE 0xFFFFF6FB7DBED000UI64
#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68UI64
#define PPE_BASE 0xFFFFF6FB7DA00000UI64
#define PDE_BASE 0xFFFFF6FB40000000UI64
#define PTE_BASE 0xFFFFF68000000000UI64
#define PTE_PER_PAGE 512
#define PDE_PER_PAGE 512
#define PPE_PER_PAGE 512
#define PXE_PER_PAGE 512
#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
#define PPI_MASK (PPE_PER_PAGE - 1)
#define PXI_MASK (PXE_PER_PAGE - 1)
#define VIRTUAL_ADDRESS_BITS 48
#define VIRTUAL_ADDRESS_MASK ((((ULONG_PTR)1) << VIRTUAL_ADDRESS_BITS) - 1)
#define PTI_SHIFT 12
#define PDI_SHIFT 21
#define PPI_SHIFT 30
#define PXI_SHIFT 39
#define PTE_SHIFT 3
#define MiGetPxeOffset(va) ((ULONG)(((ULONG_PTR)(va) >> PXI_SHIFT) & PXI_MASK))
#define MiGetPxeAddress(va) ((PMMPTE)PXE_BASE + MiGetPxeOffset(va))
#define MiGetPpeAddress(va) \
((PMMPTE)(((((
ULONG_PTR
)(va) & VIRTUAL_ADDRESS_MASK) >> PPI_SHIFT) << PTE_SHIFT) + PPE_BASE))
#define MiGetPdeAddress(va) \
((PMMPTE)(((((
ULONG_PTR
)(va) & VIRTUAL_ADDRESS_MASK) >> PDI_SHIFT) << PTE_SHIFT) + PDE_BASE))
#define MiGetPteAddress(va) \
((PMMPTE)(((((
ULONG_PTR
)(va) & VIRTUAL_ADDRESS_MASK) >> PTI_SHIFT) << PTE_SHIFT) + PTE_BASE))
#define MI_PDE_MAPS_LARGE_PAGE(PDE) ((PDE)->u.Hard.PS == 1)
BOOLEAN
MyMmIsAddressValid(
PVOID
Address) {
ULONG_PTR
StartAddress = (
ULONG_PTR
)Address;
PMMPTE PointerPte = NULL;
UINT_PTR
kernelbase = 0x7fffffffffffffffULL;
UINT_PTR
toppart = 0;
if
(!StartAddress) {
return
FALSE;
}
toppart = (StartAddress >> 47);
if
(toppart & 1) {
if
(toppart != 0x1ffff)
return
FALSE;
}
else
{
if
(toppart != 0)
return
FALSE;
}
PointerPte = MiGetPxeAddress (Address);
if
(PointerPte->u.Hard.P == 0) {
return
FALSE;
}
PointerPte = MiGetPpeAddress (Address);
if
(PointerPte->u.Hard.P == 0) {
return
FALSE;
}
PointerPte = MiGetPdeAddress (Address);
if
(PointerPte->u.Hard.P == 0) {
return
FALSE;
}
if
(MI_PDE_MAPS_LARGE_PAGE (PointerPte)) {
return
TRUE;
}
PointerPte = MiGetPteAddress (Address);
if
(PointerPte->u.Hard.P == 0) {
return
FALSE;
}
if
(MI_PDE_MAPS_LARGE_PAGE (PointerPte)) {
return
FALSE;
}
return
TRUE;
}
VOID
DriverUnload(PDRIVER_OBJECT pDrvObj) {
KIRQL irql = KeGetCurrentIrql();
DbgPrint(
"Unload IRQL [%d] \n"
, irql);
DbgBreakPoint();
DbgPrint(
"Ustr --> [%wZ][%d] \n"
, &g_ustr, MyMmIsAddressValid(g_ustr.Buffer));
RtlFreeUnicodeString(&g_ustr);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pUstrRegPath) {
NTSTATUS status = STATUS_SUCCESS;
ANSI_STRING ansiString;
RtlInitAnsiString(&ansiString,
"abbccddee"
);
pDrvObj->DriverUnload = DriverUnload;
status = RtlAnsiStringToUnicodeString(&g_ustr, &ansiString, TRUE);
DbgPrint(
"RtlAnsiStringToUnicodeString return [0x%X] \n"
, status);
if
(!NT_SUCCESS(status)) {
return
STATUS_UNSUCCESSFUL;
}
DbgBreakPoint();
DbgPrint(
"Ustr --> [%wZ][%d] \n"
, &g_ustr, MyMmIsAddressValid(g_ustr.Buffer));
return
STATUS_SUCCESS;
}