MiUnlinkNodeLargePageHelper

NTSTATUS __stdcall MiUnlinkNodeLargePageHelper(
        _MI_NODE_INFORMATION *NodeInformation,
        _MMPFN *Pfn1,
        UINT64 LargePageIndex,
        UINT64 Channel,
        UINT64 Channela){
  UINT64 *v5; 
  int v8; 
  __int64 v9; 
  _MI_PARTITION *v10; 
  UINT64 v11; 
  NTSTATUS v12; 
  UINT8 v13; 
  __int64 bf_0; 
  _LIST_ENTRY *Blink; 
  char v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  volatile signed __int32 *v28; 
  unsigned int v29; 
  unsigned __int64 v30; 
  UINT64 v31; 
  INT64 v32; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v33; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v34; 
  UINT64 *RebuildActivated; 
  UINT64 Long; 
  unsigned int v37; 

  v37 = Channel;
  v8 = LargePageIndex;
  v9 = (unsigned int)LargePageIndex;
  v10 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
  v11 = MiLargePageSizes[(unsigned int)LargePageIndex];
  v12 = MiDecreaseAvailablePages(v10, v11, 0xFFFFFFFFFFFFFFFFui64, 0i64);
  if( (Channela & 8) == 0 && !v12 )
  {
    MiIncreaseAvailablePages(v10, v11, v13);
    return 0;
  }
  bf_0 = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
  if( *(_MMPFN **)(Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 + 8) != Pfn1
    || (Blink = Pfn1->ListEntry.Blink, (_MMPFN *)Blink->Flink != Pfn1) )
  {
    __fastfail(3u);
  }
  Blink->Flink = (_LIST_ENTRY *)bf_0;
  *(_QWORD *)(bf_0 + 8) = Blink;
  v17 = *((_BYTE *)&Pfn1->u3 + 2);
  RebuildActivated = v5;
  if( (v17 & 8) != 0 )
  {
    MiPageListCollision(Pfn1);
    MiSetOriginalPtePfnFromFreeList(&Pfn1->OriginalPte.u.Long);
    v17 = *((_BYTE *)&Pfn1->u3 + 2);
  }
  v18 = Pfn1 - MmGetPfnDb();
  v19 = NodeInformation - v10->Core.NodeInformation;
  v20 = v17 & 7;
  --NodeInformation->FreeLargePages[v9].LargePageFreeCount[v20];
  v21 = 2i64;
  if( v18 < 0x100000 )
    v21 = 4i64;
  --NodeInformation->FreeLargePages[v9].LargePageFreeCount[v20 + v21];
  v22 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)MmGetPfnDb()[v18].u4._bf_0 >> 39) & 0x3FF));
  if( *(_BYTE *)(v22 + 4830) )
  {
    if( v8 == 2 )
    {
      --*(_BYTE *)(*(_QWORD *)(v22 + 5104) + (v18 >> 9));
    }
    else if( v8 == 1 )
    {
      --*(_WORD *)(*(_QWORD *)(v22 + 5128) + 2 * (v18 >> 18));
    }
  }
  v23 = ((unsigned __int64)*((unsigned __int8 *)&Pfn1->u3 + 2) >> 6)
      + 134 * v9
      + 4 * (v37 + 4 * (v20 + (v18 < 0x100000 ? 2 : 0)));
  v24 = v18 / MiLargePageSizes[v9] % *((unsigned int *)&stru_140C4DB30 + v9 + 100);
  --NodeInformation->FreeLargePages[0].LargePageEntries[0][0][0][v23][v24].EntryCount;
  v25 = 2240i64;
  --NodeInformation->FreeLargePages[0].LargePagesCount[0][0][0][v23];
  if( (v17 & 7) != 0 )
    v25 = 2304i64;
  _InterlockedExchangeAdd64((volatile signed __int64 *)((char *)v10 + v25), -(__int64)v11);
  if( *(&stru_140C4DB30 + 567) == 1 )
  {
    v26 = v18 & 0x1F;
    v27 = v11;
    v28 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v18 >> 5));
    if( v26 + v11 > 0x20 )
    {
      if( (v18 & 0x1F) != 0 )
      {
        _InterlockedOr(v28, ((1 << (32 - (v18 & 0x1F))) - 1) << v26);
        v27 = v11 - (32 - (unsigned int)(v18 & 0x1F));
        ++v28;
      }
      if( v27 >= 0x20 )
      {
        v30 = v27 >> 5;
        v27 += -32i64 * (v27 >> 5);
        do
        {
          *v28++ = -1;
          --v30;
        }
        while( v30 );
      }
      if( !v27 )
        goto LABEL_30;
      v29 = (1 << v27) - 1;
    }
    else
    {
      if( v11 == 32 )
      {
        *v28 = -1;
        goto LABEL_30;
      }
      v29 = ((1 << v11) - 1) << v26;
    }
    _InterlockedOr(v28, v29);
  }
LABEL_30:
  if( !(_DWORD)v20 )
  {
    if( v10->PageLists.FreeListDiscard == 1 )
    {
      LODWORD(v20) = 1;
    }
    else if( (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
    {
      MiArePageContentsZero((PVOID)v18);
    }
  }
  MiSetPfnPageState((INT64)Pfn1, 5);
  v32 = ZeroPte.u.Hard._bf_0;
  Long = ZeroPte.u.Long;
  if( (_DWORD)v20 == 1 )
  {
    MiSetOriginalPtePfnFromFreeList(&Long);
    v32 = Long;
  }
  v33.Long = (unsigned __int64)Pfn1->OriginalPte.u;
  if( *(&stru_140C4DB30 + 42) && (v33.Long & 0x10) == 0 )
    v33.Long &= ~*(&stru_140C4DB30 + 42);
  Pfn1->OriginalPte.u.Long = v32;
  if( HIDWORD(v33.Long) == 4294967293 )
  {
    LODWORD(v34.Long) = MiUpdatePageFileHighInPte(v32, 4294967293i64);
    Pfn1->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v34.Long;
  }
  if( v11 == 16
    && 16
     * (NodeInformation->FreeLargePages[2].LargePageFreeCount[0]
      + NodeInformation->FreeLargePages[2].LargePageFreeCount[1]
      + 32
      * (NodeInformation->FreeLargePages[1].LargePageFreeCount[0]
       + NodeInformation->FreeLargePages[1].LargePageFreeCount[1]
       + ((NodeInformation->FreeLargePages[0].LargePageFreeCount[0]
         + NodeInformation->FreeLargePages[0].LargePageFreeCount[1]) << 9))) <= 0x200
    && (MiFlags & 0x30) != 0 )
  {
    MiWakeLargePageRebuild(v10, (unsigned int)v19, 0i64, v31, RebuildActivated);
  }
  return 1;
}

Referenced by:

MiChangePageAttributeLargeFreeZeroPage
MiLargePagePromote
MiTryUnlinkNodeLargePage
MiUnlinkNodeLargePages