MiPreparePhysicalPagesMdlForFree

NTSTATUS __stdcall MiPreparePhysicalPagesMdlForFree(INT64 a1, UINT64 a2){
  _QWORD *v2; 
  unsigned __int64 v3; 
  _QWORD *v4; 
  UINT64 v5; 
  unsigned int v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int8 CurrentIrql; 
  _MMPFN *v10; 
  NTSTATUS result; 
  UINT64 SpinCount; 

  *(_DWORD *)(a1 + 44) = 0;
  v2 = (_QWORD *)(a1 + 48);
  if( a2 == 1 )
  {
    v6 = *(_DWORD *)(a1 + 40);
  }
  else
  {
    v3 = (unsigned __int64)*(unsigned int *)(a1 + 40) >> 12;
    v4 = &v2[a2 * v3];
    do
    {
      --v3;
      v4 -= a2;
      v5 = 1i64;
      *v4 = v2[v3];
      if( a2 > 1 )
      {
        do
        {
          v4[v5] = v4[v5 - 1] + 1i64;
          ++v5;
        }
        while( v5 < a2 );
      }
    }
    while( v3 );
    v6 = a2 * *(_DWORD *)(a1 + 40);
    *(_DWORD *)(a1 + 40) = v6;
  }
  v7 = 0i64;
  v8 = (unsigned __int64)v6 >> 12;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  for( ; v8; --v8 )
  {
    v10 = &MmGetPfnDb()[*v2];
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v10->u2._bf_0 < 0 );
    }
    v10->u2._bf_0 = v10->u2._bf_0 & 0x8000000000000000ui64 | 1;
    _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( (++v7 & 0x3F) == 0 && (unsigned int)KeShouldYieldProcessor() )
    {
      __writecr8(CurrentIrql);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
    }
    ++v2;
  }
  result = CurrentIrql;
  __writecr8(CurrentIrql);
  return result;
}

Referenced by:

NtFreeUserPhysicalPages