MiLeapPrefetch

NTSTATUS __stdcall MiLeapPrefetch(_MI_FAULT_VA_LIST *PrefetchHead, VOID *Va){
  VOID *v2; 
  NTSTATUS v4; 
  unsigned __int64 v5; 
  _ETHREAD *CurrentThread; 
  char bf_0; 
  _EPROCESS *Process; 
  unsigned __int64 Root; 
  char v10; 
  char v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  _QWORD *v19; 
  unsigned __int64 v20; 
  _QWORD **v21; 
  unsigned __int64 v22; 
  _QWORD *v23; 

  v2 = Va;
  v4 = 1;
  if( Va )
  {
LABEL_20:
    v18 = *((_QWORD *)PrefetchHead + 3);
    v19 = (_QWORD *)(*((_QWORD *)PrefetchHead + 1) + 16 * v18);
    v20 = *v19 & 0xFFFFFFFFFFFFF000ui64;
    if( (unsigned __int64)v2 >= v20
      && (unsigned __int64)v2 < v20 + (((*(_DWORD *)v19 & 0xFFF) + v19[1] + 4095i64) & 0xFFFFFFFFFFFFF000ui64) )
    {
      *((_QWORD *)PrefetchHead + 4) = ((unsigned __int64)v2 - v20) >> 12;
      return v4;
    }
    goto LABEL_22;
  }
  v5 = *(_QWORD *)(*((_QWORD *)PrefetchHead + 1) + 16i64 * *((_QWORD *)PrefetchHead + 3))
     + (*((_QWORD *)PrefetchHead + 4) << 12);
  if( v5 <= 0x7FFFFFFEFFFFi64 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    bf_0 = CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0;
    if( bf_0 >= 0 && ((unsigned __int8)~((unsigned __int8)CurrentThread->_bf_1 >> 6) & ((bf_0 & 3) == 0)) != 0 )
    {
      Process = CurrentThread->Tcb.ApcState.Process;
      MiLockWorkingSetShared();
      v11 = v10;
      if( (Process->Flags & 0x20) == 0 && Process->VadCount )
      {
        Root = (unsigned __int64)Process->VadRoot.Root;
        v12 = v5 >> 12;
        while( Root )
        {
          v13 = *(unsigned int *)(Root + 24) | ((unsigned __int64)*(unsigned __int8 *)(Root + 32) << 32);
          if( v12 >= v13 )
          {
            if( v12 <= (*(unsigned int *)(Root + 28) | ((unsigned __int64)*(unsigned __int8 *)(Root + 33) << 32)) )
              goto LABEL_16;
            v14 = *(_QWORD *)(Root + 8);
          }
          else
          {
            v14 = *(_QWORD *)Root;
          }
          if( !v14 )
          {
            if( v13 >= v12 )
              goto LABEL_19;
            v21 = *(_QWORD ***)(Root + 8);
            v22 = Root;
            if( v21 )
            {
              v23 = *v21;
              for( Root = *(_QWORD *)(Root + 8); v23; v23 = (_QWORD *)*v23 )
                Root = (unsigned __int64)v23;
            }
            else
            {
              while( 1 )
              {
                Root = *(_QWORD *)(Root + 16) & 0xFFFFFFFFFFFFFFFCui64;
                if( !Root || *(_QWORD *)Root == v22 )
                  break;
                v22 = Root;
              }
            }
            if( Root )
            {
LABEL_19:
              v16 = *(unsigned __int8 *)(Root + 32);
              v17 = *(unsigned int *)(Root + 24);
              LOBYTE(Root) = v11;
              v2 = (VOID *)((v17 | (v16 << 32)) << 12);
              MiUnlockWorkingSetShared(&Process->Vm.Instance, Root);
              goto LABEL_20;
            }
            break;
          }
          Root = v14;
        }
        LOBYTE(Root) = v11;
        MiUnlockWorkingSetShared(&Process->Vm.Instance, Root);
        v18 = *((_QWORD *)PrefetchHead + 3);
LABEL_22:
        *((_QWORD *)PrefetchHead + 4) = 0i64;
        *((_QWORD *)PrefetchHead + 3) = v18 + 1;
        return v4;
      }
      v4 = 0;
LABEL_16:
      LOBYTE(Root) = v11;
      MiUnlockWorkingSetShared(&Process->Vm.Instance, Root);
    }
  }
  return v4;
}

Referenced by:

MiInPagePageTable
MiPrefetchJumpVad
MiPrefetchVirtualMemory