MiLockPageLeafPageTable
INT64 __fastcall MiLockPageLeafPageTable(INT64 a1){
UINT64 v1;
INT64 v2;
__int64 v4;
_MMPTE *PteBase;
unsigned __int64 v6;
UINT64 v7;
_MMPTE *PxeSelfRef;
int v9;
INT64 result;
int v11;
__int64 v12;
UINT64 v13;
INT64 v14;
unsigned __int64 v15;
char v16;
__int64 v17;
__int64 i;
__int16 v19;
__int64 v20;
UINT64 v21;
UINT64 v22;
__int64 v23;
INT64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
__int64 v27;
UINT64 v28;
v1 = *(_QWORD *)a1;
v2 = *(_QWORD *)(a1 + 96);
v4 = (*(_QWORD *)a1 >> 9) & 0x7FFFFFFFF8i64;
*(_QWORD *)(a1 + 40) = ZeroPte;
PteBase = MmGetPteBase();
v6 = (unsigned __int64)PteBase + v4;
v24 = v6;
v25 = (unsigned __int64)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64);
v26 = (unsigned __int64)PteBase + ((v25 >> 9) & 0x7FFFFFFFF8i64);
v7 = *(_QWORD *)(a1 + 32);
v27 = (__int64)PteBase + ((v26 >> 9) & 0x7FFFFFFFF8i64);
PxeSelfRef = MmGetPxeSelfRef();
if( v7 )
{
if( (_MMPTE *)v7 == (_MMPTE *)((char *)PteBase + ((*(_QWORD *)(a1 + 16) >> 9) & 0x7FFFFFFFF8i64)) )
goto LABEL_4;
MiUnlockPageTableInternal(v2, v7);
*(_DWORD *)(a1 + 64) &= ~0x20u;
*(_QWORD *)(a1 + 32) = 0i64;
}
v9 = MiFastLockLeafPageTable(v2, v1);
if( !v9 )
{
v11 = 3;
*(_QWORD *)(a1 + 32) = PxeSelfRef;
MiLockPageTableInternal(v2, (UINT64)PxeSelfRef, 0i64);
goto LABEL_10;
}
*(_QWORD *)(a1 + 32) = *(&v24 + v9);
if( v9 != 1 )
{
v11 = v9 - 1;
goto LABEL_10;
}
LABEL_4:
while( (*(_QWORD *)v6 & 1) == 0 )
{
result = MiFaultInProbeAddress(a1);
if( (int)result < 0 )
{
LABEL_26:
++dword_140C4E4BC;
return result;
}
*(_QWORD *)(a1 + 32) = PxeSelfRef;
MiLockPageTableInternal(v2, (UINT64)PxeSelfRef, 0i64);
v11 = 3;
LABEL_10:
v12 = v11;
if( v11 )
{
while( 1 )
{
v13 = *(&v24 + v12);
v14 = MI_READ_PTE_LOCK_FREE(v13);
v28 = v14;
v15 = v14;
if( (v14 & 1) != 0 )
{
if( (v14 & 0x80u) != 0i64 )
{
if( *(_DWORD *)(a1 + 88) == 1 && (v14 & 0x800) == 0 )
{
++dword_140C4E4C4;
return 3221225477i64;
}
v16 = 1;
MiPteInShadowRange((UINT64)&v28);
v17 = (v15 >> 12) & 0xFFFFFFFFFi64;
v1 >>= 12;
for( i = 1i64; v12; --v12 )
{
v19 = v1;
v1 >>= 9;
v20 = i * (v19 & 0x1FF);
i <<= 9;
v17 += v20;
}
v21 = *(_QWORD *)a1;
v22 = *(_QWORD *)a1;
*(_QWORD *)(a1 + 128) = v17;
v23 = ~((i << 12) - 1);
*(_QWORD *)(a1 + 144) = v23 & v22;
*(_QWORD *)(a1 + 152) = (v23 & ((i << 12) + v21)) - 1;
*(_DWORD *)(a1 + 64) |= 0x20u;
*(_QWORD *)(a1 + 160) = v17 & ~(i - 1);
}
else
{
v16 = 0;
}
MiLockPageTableInternal(v2, v13, 0i64);
MiUnlockPageTableInternal(v2, *(_QWORD *)(a1 + 32));
*(_QWORD *)(a1 + 32) = v13;
if( v16 )
return 0i64;
PxeSelfRef = MmGetPxeSelfRef();
}
else
{
result = MiFaultInProbeAddress(a1);
if( (int)result < 0 )
goto LABEL_26;
*(_QWORD *)(a1 + 32) = PxeSelfRef;
MiLockPageTableInternal(v2, (UINT64)PxeSelfRef, 0i64);
v12 = 4i64;
}
if( !--v12 )
{
v6 = v24;
goto LABEL_4;
}
}
}
}
*(_QWORD *)(a1 + 40) = *(_QWORD *)v6;
return 0i64;
}Referenced by:
MiProbeAndLockPages
MiProbeLeafFrame