MiSetGraphicsPtes
INT64 __fastcall MiSetGraphicsPtes(UINT64 a1, INT64 a2, UINT64 *a3, UINT64 a4, INT64 a5, UINT8 a6){
_MMPTE *PteBase;
unsigned int v8;
INT64 *v9;
UINT8 v10;
unsigned __int64 v11;
UINT64 v12;
INT64 v13;
UINT8 v14;
UINT64 v15;
int v16;
unsigned __int64 v17;
_MMPTE *v18;
unsigned __int64 v19;
unsigned __int64 v20;
INT64 *v22;
INT64 *v23;
UINT64 v24;
unsigned __int64 v25;
UINT64 v26;
v26 = a4;
PteBase = MmGetPteBase();
v8 = 0;
v9 = (INT64 *)((char *)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64));
v22 = v9;
v10 = a6;
v11 = (unsigned __int64)PteBase + (((a2 + a1) >> 9) & 0x7FFFFFFFF8i64) - 8;
v24 = 0i64;
v25 = v11;
LODWORD(a5) = a6 & 1;
if( (a6 & 1) != 0 && a3 )
{
v12 = *a3;
a3 = &v24;
v24 = v12;
}
v13 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
v14 = MiLockWorkingSetShared(v13);
v15 = v24;
a6 = v14;
v16 = (v10 & 2) == 0;
while( 1 )
{
v17 = (unsigned __int64)v9;
if( (unsigned __int64)v9 <= v11 )
break;
LABEL_24:
if( (unsigned int)++v16 >= 2 )
goto LABEL_27;
}
while( 1 )
{
if( (v17 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v25 )
v11 = (v17 & 0xFFFFFFFFFFFFF000ui64) + 4088;
v18 = MiLockLowestValidPageTable(v13, (INT64 *)v17, &v23);
v24 = (UINT64)v18;
if( v18 == (_MMPTE *)((char *)MmGetPteBase() + ((v17 >> 9) & 0x7FFFFFFFF8i64)) )
break;
LABEL_14:
if( v16 )
{
LABEL_15:
v20 = (((__int64)(v11 - v17) >> 3) + 1) / (v26 >> 12);
if( (_DWORD)a5 )
{
v15 += v26 * v20;
}
else if( a3 )
{
a3 += v20;
}
}
LABEL_19:
MiUnlockPageTableInternal(v13, (UINT64)v18);
if( MiWorkingSetIsContended(v13) || KeShouldYieldProcessor() )
{
MiUnlockWorkingSetShared(v13, a6);
MiLockWorkingSetShared(v13);
}
v17 = v11 + 8;
v11 = v25;
if( v17 > v25 )
{
v9 = v22;
goto LABEL_24;
}
}
if( v16 )
goto LABEL_15;
v19 = v17;
if( v17 > v11 )
goto LABEL_19;
while( !MI_READ_PTE_LOCK_FREE(v19) )
{
v19 += 8i64;
if( v19 > v11 )
{
v18 = (_MMPTE *)v24;
goto LABEL_14;
}
}
v8 = -1073741800;
MiUnlockPageTableInternal(v13, v24);
LABEL_27:
MiUnlockWorkingSetShared(v13, a6);
return v8;
}Referenced by:
MmSetGraphicsPtes