MiCheckVadSequential

__int64 __fastcall MiCheckVadSequential(__int64 a1){
  unsigned __int64 v1; 
  unsigned int v3; 
  __int64 v4; 
  char *v5; 
  unsigned __int64 v6; 
  signed __int32 v7; 
  signed __int32 v8; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  unsigned int v20; 
  char *v21; 
  __int64 v22; 
  UINT64 SpinCount; 
  __int64 CurrentIrql; 
  unsigned __int64 v25; 
  v1 = *(_QWORD *)(a1 + 16);
  v3 = 0;
  v4 = *(_QWORD *)(a1 + 64);
  LODWORD(SpinCount) = 0;
  v5 = (char *)MmGetPteBase() + ((v1 >> 9) & 0x7FFFFFFFF8i64);
  v6 = v1 & 0xFFFFFFFFFFFFF000ui64 | 1;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  v7 = *(_DWORD *)(v4 + 48);
  do
  {
    while( (v7 & 1) != 0 )
    {
      if( (v7 & 2) != 0 )
      {
        LODWORD(SpinCount) = 0;
        do
        {
          KeYieldProcessorEx(&SpinCount);
          v7 = *(_DWORD *)(v4 + 48);
        }
        while( (v7 & 1) != 0 );
      }
      else
      {
        v7 = _InterlockedCompareExchange((volatile signed __int32 *)(v4 + 48), v7 | 2, v7);
      }
    }
    v8 = v7;
    v7 = _InterlockedCompareExchange((volatile signed __int32 *)(v4 + 48), v7 & 0xFFFFFFFC | 1, v7);
  }
  while( v8 != v7 );
  v9 = *(_QWORD *)(v4 + 120);
  v10 = v9 & 0xFFF;
  v11 = *(_DWORD *)a1 | 0x20;
  v12 = *(_DWORD *)(v4 + 120) & 0xFFF;
  *(_DWORD *)a1 = v11;
  v13 = v9 & 0xFFFFFFFFFFFFF000ui64;
  v14 = (v9 & 0xFFFFFFFFFFFFF000ui64) + (v12 << 12);
  if( (v1 & 0xFFFFFFFFFFFFF000ui64) == v14 )
  {
    if( v10 == 4095 )
      v6 = (v13 + 4096) | 0xFFF;
    else
      v6 = v13 | ((_WORD)v9 + 1) & 0xFFF;
    LOBYTE(v16) = v11;
  }
  else if( v1 > v14 && (v15 = (v1 - v14) >> 12, v25 = v15, v15 < 8) )
  {
    v16 = v11;
    v20 = ((unsigned int)v5 >> 3) & 0x1FF;
    if( v20 <= v15 )
    {
      if( v20 )
      {
        v16 = v11 & 0xFFFFFFDF;
        *(_DWORD *)a1 = v11 & 0xFFFFFFDF;
      }
    }
    else
    {
      v20 = (v1 - v14) >> 12;
    }
    if( (v16 & 0x20) == 0 )
      goto LABEL_10;
    v21 = v5 - 8;
    if( v20 )
    {
      while( (*(_QWORD *)v21 & 1) != 0 && (*(_QWORD *)v21 & 0x20) != 0 )
      {
        --v20;
        v21 -= 8;
        if( !v20 )
        {
          LODWORD(v15) = v25;
          goto LABEL_28;
        }
      }
      goto LABEL_8;
    }
LABEL_28:
    v22 = (unsigned int)(v15 + 1);
    if( (unsigned __int64)(v10 + v22) > 0xFFF )
      v6 = (v9 + ((unsigned __int64)((unsigned int)v22 + (v9 & 0xFFF) - 4095) << 12)) | 0xFFF;
    else
      v6 = v13 | ((_WORD)v15 + 1 + (_WORD)v9) & 0xFFF;
    v16 = *(_DWORD *)a1;
  }
  else
  {
    v16 = v11;
    if( v14 || v1 >> 12 != (*(unsigned int *)(v4 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v4 + 32) << 32)) )
    {
LABEL_8:
      v16 &= ~0x20u;
      *(_DWORD *)a1 = v16;
    }
  }
  if( (v16 & 0x20) == 0 )
  {
LABEL_10:
    *(_DWORD *)(v4 + 64) &= ~0x2000000u;
    goto LABEL_11;
  }
  if( (*(_DWORD *)(v4 + 64) & 0x2000000) != 0 )
  {
    v18 = *(unsigned int *)(v4 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v4 + 32) << 32);
    v19 = ((v1 >> 12) - v18) >> 8;
    if( v14 )
      v1 = v14 - 4096;
    if( (((v1 >> 12) - v18) >> 8) + 1 == v19 )
      v3 = -1073741280;
  }
LABEL_11:
  *(_QWORD *)(v4 + 120) = v6;
  _InterlockedAnd((volatile signed __int32 *)(v4 + 48), 0xFFFFFFFC);
  __writecr8((unsigned __int8)CurrentIrql);
  return v3;
}

Referenced by:

MiZeroFault