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