MiWaitForRotateToComplete

UINT64 __stdcall MiWaitForRotateToComplete(PVOID Va, UINT8 WsIrql){
  _ETHREAD *CurrentThread; 
  unsigned int v3; 
  INT64 v4; 
  unsigned __int64 v5; 
  __int64 v6; 
  _QWORD *i; 
  __int64 v8; 
  INT64 *v10; 
  INT64 *SharedVm; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0;
  v4 = WsIrql;
  v5 = (unsigned __int64)Va >> 12;
  v6 = *((_QWORD *)CurrentThread + 23);
LABEL_2:
  for( i = *(_QWORD **)(v6 + 1240); i; i = (_QWORD *)*i )
  {
    v8 = i[1];
    if( v5 >= (*(unsigned int *)(v8 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v8 + 32) << 32))
      && v5 <= (*(unsigned int *)(v8 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v8 + 33) << 32)) )
    {
      if( (_ETHREAD *)i[2] == CurrentThread )
        return v3;
      v3 = 1;
      if( (*(_BYTE *)(v4 + 13) & 1) != 0 )
      {
        if( !_InterlockedIncrement((volatile signed __int32 *)(v8 + 36)) )
          __fastfail(0xEu);
        MiUnlockWorkingSetExclusive(v6 + 1664, *(_BYTE *)(v4 + 12));
        --*((_WORD *)CurrentThread + 243);
        ExAcquirePushLockSharedEx(v8 + 40, 0i64);
        *((_BYTE *)CurrentThread + 1305) |= 0x40u;
        MiUnlockAndDereferenceVadShared((PVOID)v8);
        SharedVm = MiGetSharedVm(v6 + 1664);
        ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
        *((_DWORD *)SharedVm + 1) = 0;
      }
      else
      {
        MiUnlockFaultWorkingSet(v4);
        v10 = MiGetSharedVm(v6 + 1664);
        ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v10);
        *((_DWORD *)v10 + 1) = 0;
        *(_BYTE *)(v4 + 13) |= 1u;
      }
      goto LABEL_2;
    }
  }
  return v3;
}

Referenced by:

MiUserFault