MiUnlinkNodeLargePageHelper

BOOL __fastcall MiUnlinkNodeLargePageHelper(
        _MI_NODE_INFORMATION *NodeInformation,
        _MMPFN *Pfn1,
        INT64 LargePageIndex,
        UINT64 Channel){
  UINT64 *v4; 
  int v7; 
  __int64 v8; 
  __int64 v9; 
  UINT64 v10; 
  int v11; 
  __int64 v13; 
  _MMPFN **v14; 
  char v15; 
  unsigned __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 
  volatile signed __int32 *v26; 
  unsigned int v27; 
  unsigned __int64 v28; 
  UINT64 v29; 
  INT64 v30; 
  unsigned __int64 v31; 
  UINT64 *RebuildActivated; 
  UINT64 v33; 
  unsigned int v34; 
  char v35; 
  v34 = Channel;
  v7 = LargePageIndex;
  v8 = (unsigned int)LargePageIndex;
  v9 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)Pfn1 + 5) >> 39) & 0x3FFi64));
  v10 = MiLargePageSizes[(unsigned int)LargePageIndex];
  v11 = MiDecreaseAvailablePages((_MI_PARTITION *)v9, v10, 0xFFFFFFFFFFFFFFFFui64, 0i64);
  if( (v35 & 8) == 0 && !v11 )
  {
    MiIncreaseAvailablePages((_MI_PARTITION *)v9, v10);
    return 0;
  }
  v13 = *(_QWORD *)Pfn1;
  if( *(_MMPFN **)(*(_QWORD *)Pfn1 + 8i64) != Pfn1 || (v14 = (_MMPFN **)*((_QWORD *)Pfn1 + 1), *v14 != Pfn1) )
    __fastfail(3u);
  *v14 = (_MMPFN *)v13;
  *(_QWORD *)(v13 + 8) = v14;
  v15 = *((_BYTE *)Pfn1 + 34);
  RebuildActivated = v4;
  if( (v15 & 8) != 0 )
  {
    MiPageListCollision((INT64)Pfn1);
    MiSetOriginalPtePfnFromFreeList((UINT64 *)Pfn1 + 2);
    v15 = *((_BYTE *)Pfn1 + 34);
  }
  v16 = (Pfn1 - MmGetPfnDb()) / 48;
  v17 = ((__int64)NodeInformation - *(_QWORD *)(v9 + 16)) / 4544;
  v18 = v15 & 7;
  --*((_QWORD *)NodeInformation + 134 * v8 + v18);
  v19 = 2i64;
  if( v16 < 0x100000 )
    v19 = 4i64;
  --*((_QWORD *)NodeInformation + 134 * v8 + v18 + v19);
  v20 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)MmGetPfnDb() + 6 * v16 + 5) >> 39) & 0x3FFi64));
  if( *(_BYTE *)(v20 + 4830) )
  {
    if( v7 == 2 )
    {
      --*(_BYTE *)(*(_QWORD *)(v20 + 5104) + (v16 >> 9));
    }
    else if( v7 == 1 )
    {
      --*(_WORD *)(*(_QWORD *)(v20 + 5128) + 2 * (v16 >> 18));
    }
  }
  v21 = ((unsigned __int64)*((unsigned __int8 *)Pfn1 + 34) >> 6)
      + 134 * v8
      + 4 * (v34 + 4 * (v18 + (v16 < 0x100000 ? 2 : 0)));
  v22 = 3 * (v16 / MiLargePageSizes[v8] % (unsigned int)dword_140C4DCC0[v8]);
  --*(_QWORD *)(*((_QWORD *)NodeInformation + v21 + 70) + 8 * v22 + 16);
  v23 = 2240i64;
  --*((_QWORD *)NodeInformation + v21 + 6);
  if( (v15 & 7) != 0 )
    v23 = 2304i64;
  _InterlockedExchangeAdd64((volatile signed __int64 *)(v23 + v9), -(__int64)v10);
  if( dword_140C4E40C == 1 )
  {
    v24 = v16 & 0x1F;
    v25 = v10;
    v26 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v16 >> 5));
    if( v24 + v10 > 0x20 )
    {
      if( (v16 & 0x1F) != 0 )
      {
        _InterlockedOr(v26, ((1 << (32 - (v16 & 0x1F))) - 1) << v24);
        v25 = v10 - (32 - (unsigned int)(v16 & 0x1F));
        ++v26;
      }
      if( v25 >= 0x20 )
      {
        v28 = v25 >> 5;
        v25 += -32i64 * (v25 >> 5);
        do
        {
          *v26++ = -1;
          --v28;
        }
        while( v28 );
      }
      if( !v25 )
        goto LABEL_30;
      v27 = (1 << v25) - 1;
    }
    else
    {
      if( v10 == 32 )
      {
        *v26 = -1;
        goto LABEL_30;
      }
      v27 = ((1 << v10) - 1) << v24;
    }
    _InterlockedOr(v26, v27);
  }
LABEL_30:
  if( !(_DWORD)v18 )
  {
    if( *(_BYTE *)(v9 + 4829) == 1 )
    {
      LODWORD(v18) = 1;
    }
    else if( (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
    {
      MiArePageContentsZero((PVOID)v16);
    }
  }
  MiSetPfnPageState((INT64)Pfn1, 5);
  v30 = ZeroPte;
  v33 = ZeroPte;
  if( (_DWORD)v18 == 1 )
  {
    MiSetOriginalPtePfnFromFreeList(&v33);
    v30 = v33;
  }
  v31 = *((_QWORD *)Pfn1 + 2);
  if( qword_140C4DC80 && (v31 & 0x10) == 0 )
    v31 &= ~qword_140C4DC80;
  *((_QWORD *)Pfn1 + 2) = v30;
  if( HIDWORD(v31) == 4294967293 )
    *((_QWORD *)Pfn1 + 2) = MiUpdatePageFileHighInPte(v30, 4294967293i64);
  if( v10 == 16
    && (unsigned __int64)(16
                        * (*((_QWORD *)NodeInformation + 268)
                         + *((_QWORD *)NodeInformation + 269)
                         + 32i64
                         * (*((_QWORD *)NodeInformation + 134)
                          + *((_QWORD *)NodeInformation + 135)
                          + ((*(_QWORD *)NodeInformation + *((_QWORD *)NodeInformation + 1)) << 9)))) <= 0x200
    && (MiFlags & 0x30) != 0 )
  {
    MiWakeLargePageRebuild((_MI_PARTITION *)v9, (unsigned int)v17, 0i64, v29, RebuildActivated);
  }
  return 1;
}

Referenced by:

MiChangePageAttributeLargeFreeZeroPage
MiLargePagePromote
MiTryUnlinkNodeLargePage
MiUnlinkNodeLargePages