MiSetGraphicsPtes
NTSTATUS __stdcall MiSetGraphicsPtes(UINT64 a1, INT64 a2, UINT64 *a3, UINT64 a4, INT64 a5, UINT8 WsIrql){
_MMPTE *PteBase;
NTSTATUS v8;
INT64 *v9;
UINT8 v10;
unsigned __int64 v11;
UINT64 v12;
_MMSUPPORT_FULL *p_Vm;
UINT64 v14;
UINT64 v15;
UINT8 v16;
int v17;
unsigned __int64 v18;
_MMPTE *v19;
unsigned __int64 v20;
__int64 v21;
unsigned __int64 v22;
int v23;
INT64 *v25;
INT64 *v26;
UINT64 v27;
unsigned __int64 v28;
UINT64 v29;
v29 = a4;
PteBase = MmGetPteBase();
v8 = 0;
v9 = (INT64 *)((char *)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64));
v25 = v9;
v10 = WsIrql;
v11 = (unsigned __int64)&PteBase[-1] + (((a2 + a1) >> 9) & 0x7FFFFFFFF8i64);
v27 = 0i64;
v28 = v11;
LODWORD(a5) = WsIrql & 1;
if( (WsIrql & 1) != 0 && a3 )
{
v12 = *a3;
a3 = &v27;
v27 = v12;
}
p_Vm = &KeGetCurrentThread()->ApcState.Process->Vm;
MiLockWorkingSetShared();
v15 = v27;
WsIrql = v16;
v17 = (v10 & 2) == 0;
while( 1 )
{
v18 = (unsigned __int64)v9;
if( (unsigned __int64)v9 <= v11 )
break;
LABEL_24:
if( (unsigned int)++v17 >= 2 )
goto LABEL_27;
}
while( 1 )
{
if( (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088 <= v28 )
v11 = (v18 & 0xFFFFFFFFFFFFF000ui64) + 4088;
v19 = MiLockLowestValidPageTable((INT64)p_Vm, (INT64 *)v18, &v26);
v27 = (UINT64)v19;
if( v19 == (_MMPTE *)((char *)MmGetPteBase() + ((v18 >> 9) & 0x7FFFFFFFF8i64)) )
break;
LABEL_14:
if( v17 )
{
LABEL_15:
v22 = (((__int64)(v11 - v18) >> 3) + 1) / (v29 >> 12);
if( (_DWORD)a5 )
{
v15 += v29 * v22;
}
else if( a3 )
{
a3 += v22;
}
}
LABEL_19:
MiUnlockPageTableInternal((INT64)p_Vm, (UINT64)v19);
LOBYTE(v23) = MiWorkingSetIsContended((INT64)p_Vm);
if( v23 || (unsigned int)KeShouldYieldProcessor() )
{
LOBYTE(v14) = WsIrql;
MiUnlockWorkingSetShared(&p_Vm->Instance, v14);
MiLockWorkingSetShared();
}
v18 = v11 + 8;
v11 = v28;
if( v18 > v28 )
{
v9 = v25;
goto LABEL_24;
}
}
if( v17 )
goto LABEL_15;
v20 = v18;
if( v18 > v11 )
goto LABEL_19;
while( 1 )
{
LODWORD(v21) = MI_READ_PTE_LOCK_FREE(v20);
if( v21 )
break;
v20 += 8i64;
if( v20 > v11 )
{
v19 = (_MMPTE *)v27;
goto LABEL_14;
}
}
v8 = -1073741800;
MiUnlockPageTableInternal((INT64)p_Vm, v27);
LABEL_27:
LOBYTE(v14) = WsIrql;
MiUnlockWorkingSetShared(&p_Vm->Instance, v14);
return v8;
}Referenced by:
MmSetGraphicsPtes