MiDemoteLocalLargePage

INT64 __fastcall MiDemoteLocalLargePage(INT64 a1, UINT64 a2, INT16 a3, UINT64 a4){
  int v6; 
  unsigned int v7; 
  int v8; 
  unsigned int v9; 
  unsigned int v10; 
  unsigned __int8 CurrentIrql; 
  unsigned int v12; 
  INT64 FreeZeroLargePages; 
  INT64 v14; 
  unsigned __int64 v16; 
  int v17; 
  LIST_ENTRY **v18; 
  UINT64 v19; 
  INT64 v20; 
  INT64 v21; 
  INT64 v22; 
  int v23; 
  unsigned int v24; 
  _QWORD *v25; 
  v24 = a2;
  if( (a3 & 1) != 0 )
    return 0i64;
  v6 = 0;
  v23 = 0;
  if( (unsigned int)MmNumberOfChannels > 1 )
  {
    v6 = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> byte_140C4DBCD);
    v23 = v6;
  }
  v7 = (unsigned int)a2 >> byte_140C4DBCC;
  v25 = (_QWORD *)(*(_QWORD *)(a1 + 16) + 4544i64 * ((unsigned int)a2 >> byte_140C4DBCC));
  if( MiNodeFreeZeroPages(v25, v6, a3) >= a4 )
    return 0i64;
  if( (a3 & 0x400) != 0 )
  {
    v8 = 0;
  }
  else
  {
    v8 = 1;
    if( (a3 & 0x800) != 0 )
      v8 = 2;
  }
  v9 = 3;
  v10 = (2 * (a3 & 2)) | 9;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  while( 1 )
  {
    v12 = v10;
    LODWORD(v22) = v8;
    v10 |= 0x20u;
    LODWORD(v21) = v6;
    if( --v9 )
      v10 = v12;
    LODWORD(v20) = v24;
    LODWORD(v19) = v7;
    FreeZeroLargePages = MiGetFreeZeroLargePages(a1, v9, 1i64, v10, v19, v20, v21, v22);
    v14 = FreeZeroLargePages;
    if( FreeZeroLargePages )
      break;
    v6 = v23;
    if( !v9 )
    {
      if( (v10 & 1) == 0 )
      {
        __writecr8(CurrentIrql);
        return 0i64;
      }
      v9 = 3;
      v10 &= 0xFFFFFFDE;
    }
  }
  if( (v10 & 0x20) != 0 )
  {
    MiInsertDemotedPages((INT64)v25, FreeZeroLargePages, v9, 1i64, FreeZeroLargePages);
    v9 = 1;
  }
  v16 = *(_QWORD *)(a1 + 7104);
  if( v16 )
    --v16;
  if( v16 >= 0x9F
    || (v17 = *((_DWORD *)KeGetCurrentThread() + 325), (v17 & 0xC) == 8)
    || (v16 >= 0x20 || (ULONG_PTR *)a1 != &MiSystemPartition)
    && ((v17 & 2) != 0 && v16 >= 0x21 || (*(_DWORD *)(a1 + 4) & 0x20) != 0) )
  {
    v18 = (LIST_ENTRY **)(v14 + 48 * (v24 & (unsigned __int64)(MiLargePageSizes[v9] - 1)));
  }
  else
  {
    v18 = 0i64;
  }
  MiIsFreeZeroPfnCold(v14);
  MiConvertEntireLargePageToSmall(
    (KQUEUE *)v14,
    v9,
    1u,
    (LARGE_INTEGER *)((*(_DWORD *)(v14 + 16) & 0x3E0i64) != 0),
    v18,
    0i64);
  __writecr8(CurrentIrql);
  return(INT64)v18;
}

Referenced by:

MiGetFreeOrZeroPageAnyColor