MiRebaseDynamicRelocationRegions
NTSTATUS __stdcall MiRebaseDynamicRelocationRegions(INT64 a1){
__int64 v2;
unsigned __int64 PteBase;
INT64 v4;
__int64 v5;
_MMPTE *PxeSelfRef;
int v7;
_MMPTE *v8;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v9;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v10;
int v11;
__int64 v12;
unsigned __int64 Long;
_MMPTE *v14;
int v15;
unsigned __int64 v16;
unsigned __int64 i;
_MMPFN *PfnDb;
NTSTATUS result;
INT64 v20;
v2 = *(_QWORD *)(a1 + 16);
PteBase = (unsigned __int64)MmGetPteBase();
v4 = *(&stru_140C4DB30 + 933);
v5 = *(&stru_140C4DB30 + 941);
v20 = *(&stru_140C4DB30 + 933);
if( (MiFlags & 0x8000) != 0 || *(&stru_140C4DB30 + 941) != PteBase )
{
PxeSelfRef = MmGetPxeSelfRef();
v7 = 0;
v8 = &MmGetPml4eBase()[(*(&stru_140C4DB30 + 941) >> 39) & 0x1FFi64];
if( v8 != PxeSelfRef )
{
LODWORD(v9.Long) = MI_READ_PTE_LOCK_FREE((INT64)PxeSelfRef);
v10.Long = v9.Long;
LOBYTE(v11) = MiPteInShadowRange((UINT64)v8);
if( v11 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v10.Long & 1) != 0 )
v10.Long |= v12;
v8->u.Long = v10.Long;
if( (MiFlags & 0x200000) == 0 )
{
Long = ZeroPte.u.Long;
v14 = MmGetPxeSelfRef();
LOBYTE(v15) = MiPteInShadowRange((UINT64)v14);
if( v15 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v14->u.Long = Long;
}
KeFlushEntireTb(0, 1u);
}
v16 = v5;
for( i = 39i64; ; i -= 9i64 )
{
MiApplyDynamicRelocations(*(PVOID *)(v2 + 48), *(unsigned int *)(v2 + 64), PteBase, v16);
if( i >= 0xC )
MiApplyDynamicRelocations(
*(PVOID *)(v2 + 48),
*(unsigned int *)(v2 + 64),
PteBase + (1i64 << i) - 1,
v16 + (1i64 << i) - 1);
if( (unsigned int)++v7 > 4 )
break;
PteBase = ((PteBase >> 9) & 0x7FFFFFFFF8i64) - 0x98000000000i64;
v16 = v5 + ((v16 >> 9) & 0x7FFFFFFFF8i64);
}
v4 = v20;
}
PfnDb = MmGetPfnDb();
if( (MiFlags & 0x8000) != 0 || PfnDb != (_MMPFN *)v4 )
MiApplyDynamicRelocations(*(PVOID *)(v2 + 48), *(unsigned int *)(v2 + 64), (INT64)PfnDb, v4);
result = MiApplyRetpolineFixupsToKernelAndHal(a1);
MmPteBase = v5;
qword_140C00E80 = v5;
return result;
}Referenced by:
MiInitializeSystemVa