MiDemoteLocalLargePage

NTSTATUS __stdcall MiDemoteLocalLargePage(INT64 rcx0, UINT64 a2, INT64 er8, UINT64 a4){
  __int16 v4; 
  unsigned int v7; 
  unsigned int v8; 
  UINT64 v9; 
  int v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned __int8 CurrentIrql; 
  unsigned int v14; 
  INT64 v15; 
  INT64 v16; 
  unsigned __int64 v18; 
  int v19; 
  _LIST_ENTRY **v20; 
  UINT64 v21; 
  INT64 v22; 
  INT64 v23; 
  INT64 v24; 
  unsigned int v25; 
  unsigned int v26; 
  _MI_NODE_INFORMATION *v27; 

  v4 = er8;
  v26 = a2;
  if( (er8 & 1) != 0 )
    return 0;
  v7 = 0;
  v25 = 0;
  if( (unsigned int)MmNumberOfChannels > 1 )
  {
    v7 = (unsigned __int16)(unsigned __int8)MiChannelMaximumPowerOf2Mask & (unsigned __int16)((unsigned int)a2 >> *(&stru_140C4DB30 + 157));
    v25 = v7;
  }
  v8 = (unsigned int)a2 >> *(&stru_140C4DB30 + 156);
  v27 = (_MI_NODE_INFORMATION *)(*(_QWORD *)(rcx0 + 16) + 4544i64 * ((unsigned int)a2 >> *(&stru_140C4DB30 + 156)));
  LODWORD(v9) = MiNodeFreeZeroPages(v27, v7, (unsigned int)er8);
  if( v9 >= a4 )
    return 0;
  if( (v4 & 0x400) != 0 )
  {
    v10 = 0;
  }
  else
  {
    v10 = 1;
    if( (v4 & 0x800) != 0 )
      v10 = 2;
  }
  v11 = 3;
  v12 = (2 * (v4 & 2)) | 9;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  while( 1 )
  {
    v14 = v12;
    LODWORD(v24) = v10;
    v12 |= 0x20u;
    LODWORD(v23) = v7;
    if( --v11 )
      v12 = v14;
    LODWORD(v22) = v26;
    LODWORD(v21) = v8;
    LODWORD(v15) = MiGetFreeZeroLargePages(rcx0, v11, 1i64, v12, v21, v22, v23, v24);
    v16 = v15;
    if( v15 )
      break;
    v7 = v25;
    if( !v11 )
    {
      if( (v12 & 1) == 0 )
      {
        __writecr8(CurrentIrql);
        return 0;
      }
      v11 = 3;
      v12 &= 0xFFFFFFDE;
    }
  }
  if( (v12 & 0x20) != 0 )
  {
    MiInsertDemotedPages((INT64)v27, v15, v11, 1i64, v15);
    v11 = 1;
  }
  v18 = *(_QWORD *)(rcx0 + 7104);
  if( v18 )
    --v18;
  if( v18 >= 0x9F
    || (v19 = *(_DWORD *)&KeGetCurrentThread()[1].gapD8[12], (v19 & 0xC) == 8)
    || (v18 >= 0x20 || (_MI_PARTITION *)rcx0 != &Irp)
    && ((v19 & 2) != 0 && v18 >= 0x21 || (*(_DWORD *)(rcx0 + 4) & 0x20) != 0) )
  {
    v20 = (_LIST_ENTRY **)(v16 + 48 * (v26 & (unsigned __int64)(MiLargePageSizes[v11] - 1)));
  }
  else
  {
    v20 = 0i64;
  }
  MiIsFreeZeroPfnCold(v16);
  MiConvertEntireLargePageToSmall(
    (_KQUEUE *)v16,
    v11,
    1u,
    (_LARGE_INTEGER *)((*(_DWORD *)(v16 + 16) & 0x3E0i64) != 0),
    v20,
    0i64);
  __writecr8(CurrentIrql);
  return(int)v20;
}

Referenced by:

MiGetFreeOrZeroPageAnyColor