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