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