MiReadWriteAnyLevelShadowPte

UINT64 __fastcall MiReadWriteAnyLevelShadowPte(unsigned __int64 a1, int a2, int a3, unsigned __int64 a4){
  _EPROCESS *Process; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int64 *ShadowMapping; 
  UINT8 v9; 
  unsigned __int64 *v10; 
  __int64 v11; 
  unsigned __int64 v12; 
  UINT64 v13; 
  char *v14; 
  UINT64 v15; 
  unsigned __int64 v17; 
  int v18; 
  UINT64 BugCheckParameter4; 
  __int64 v20; 
  PVOID BugCheckParameter2[2]; 
  __int128 v22; 
  UINT8 OldIrql; 
  int v24; 

  v24 = a3;
  *(_OWORD *)BugCheckParameter2 = 0i64;
  Process = KeGetCurrentThread()->ApcState.Process;
  v6 = a2;
  v20 = a2;
  v7 = a2;
  v22 = 0i64;
  ShadowMapping = (unsigned __int64 *)Process->Vm.Shared.ShadowMapping;
  if( a2 < 4i64 )
  {
    a2 = 4;
    do
    {
      BugCheckParameter2[v6] = (PVOID)a1;
      a1 = (unsigned __int64)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64);
      ++v6;
    }
    while( v6 < 4 );
  }
  BugCheckParameter4 = 0i64;
  v9 = 17;
  OldIrql = 17;
  v10 = ShadowMapping;
  v11 = a2;
  do
  {
    v12 = (unsigned __int64)BugCheckParameter2[--v11];
    if( v11 == 3 )
    {
      v10 += (v12 >> 3) & 0x1FF;
    }
    else
    {
      if( v9 != 17 )
        MiUnmapPageInHyperSpaceWorker(ShadowMapping, v9, 0x80000000ui64);
      v13 = BugCheckParameter4;
      MiPteInShadowRange((UINT64)&BugCheckParameter4);
      v14 = (char *)MiMapPageInHyperSpaceWorker((v13 >> 12) & 0xFFFFFFFFFi64, &OldIrql, 0x80000000ui64);
      v9 = OldIrql;
      ShadowMapping = (unsigned __int64 *)v14;
      v7 = v20;
      v10 = (unsigned __int64 *)&v14[8 * ((v12 >> 3) & 0x1FF)];
    }
    if( v24 && v11 == v7 )
    {
      if( (a4 & 1) != 0 )
      {
        if( !v11 )
          a4 |= 0x100ui64;
        v17 = a4;
        LOBYTE(v18) = MiPteInShadowRange((UINT64)v10);
        if( v18 )
        {
          if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (a4 & 1) != 0 )
            v17 = a4 | 0x8000000000000000ui64;
          v9 = OldIrql;
        }
        *v10 = v17;
      }
      else
      {
        MiPteInShadowRange((UINT64)v10);
        *v10 = a4;
      }
    }
    else
    {
      LODWORD(v15) = MI_READ_PTE_LOCK_FREE((INT64)v10);
      BugCheckParameter4 = v15;
      if( v11 && (v15 & 1) != 0 && (v15 & 0x80u) != 0i64 )
        KeBugCheckEx(0x1Au, (PVOID)0x3606, (PVOID)v12, 0i64, (PVOID)BugCheckParameter4);
    }
    v7 = v20;
  }
  while( v11 != v20 );
  if( v9 != 17 )
    MiUnmapPageInHyperSpaceWorker(ShadowMapping, v9, 0x80000000ui64);
  return BugCheckParameter4;
}

Referenced by:

MiCheckKernelShadow
MiInitializeShadowPageTable
MiMakeShadowPageTableRange
MmDeleteShadowMapping