MiInsertLargePageInNodeList

UINT64 __fastcall MiInsertLargePageInNodeList(__int64 a1){
  int v2; 
  int v3; 
  UINT64 v4; 
  int v5; 
  _MMPFN *v6; 
  _MI_PARTITION *v7; 
  __int64 PfnPageSizeIndex; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  unsigned int v12; 
  __int64 v13; 
  UINT64 v14; 
  UINT64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  UINT8 *v18; 
  INT64 *v19; 
  INT64 v20; 
  _MMPFN **v21; 
  __int64 v22; 
  __int64 v23; 
  UINT8 v24; 
  unsigned __int64 v25; 
  _MI_PARTITION *Partition; 
  unsigned __int64 NumberOfPages; 
  UINT64 v29; 
  unsigned __int64 v30; 
  _KLOCK_QUEUE_HANDLE LockQueue[4]; 
  char v32; 
  NTSTATUS updated; 
  unsigned int v34; 
  UINT64 a6; 

  *(_QWORD *)&LockQueue[0].OldIrql = 0i64;
  v2 = 1;
  a6 = 0i64;
  v3 = *(_DWORD *)(a1 + 8);
  v4 = *(_QWORD *)a1;
  v5 = *(_DWORD *)(a1 + 12);
  if( v3 == 5 )
    v3 = 1;
  LockQueue[0].LockQueue = 0i64;
  v32 = v5;
  v6 = &MmGetPfnDb()[v4];
  updated = 0;
  v34 = *((unsigned __int8 *)&v6->u3 + 2) >> 6;
  v7 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v6->u4._bf_0 >> 39) & 0x3FF));
  Partition = v7;
  PfnPageSizeIndex = (unsigned int)MiGetPfnPageSizeIndex((INT64)v6);
  v6->u4._bf_0 = v9 & 0x7FFFFFFFFFFFFFFFi64;
  NumberOfPages = MiLargePageSizes[PfnPageSizeIndex];
  if( v3 != 1 && (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
    MiArePageContentsZero((PVOID)v4);
  LODWORD(v10) = MiSearchNumaNodeTable((PVOID)v4);
  v11 = *(unsigned int *)(v10 + 8);
  v12 = MiPageToChannel(v4);
  v13 = v3;
  v14 = (UINT64)&v7->Core.NodeInformation[v11];
  v15 = v14 + 1072 * PfnPageSizeIndex;
  v29 = v15;
  v16 = v34 + 4 * (v12 + 4 * (v3 + (unsigned __int64)(v4 < 0x100000 ? 2 : 0)));
  v30 = v16;
  v17 = *(_QWORD *)(v15 + 8 * v16 + 560)
      + 24 * (v4 / MiLargePageSizes[PfnPageSizeIndex] % *((unsigned int *)&stru_140C4DB30 + PfnPageSizeIndex + 100));
  if( (v32 & 2) == 0 )
  {
    LockQueue[0].LockQueue.Next = 0i64;
    LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v14 + 4328);
    KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, (UINT64 *)(v14 + 4328));
    v15 = v29;
    v16 = v30;
    v13 = v3;
  }
  if( *(_QWORD *)(v14 + 4352) && MiAnyPagesRemovalPending(v4, (unsigned int)PfnPageSizeIndex) )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
    _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    MiConvertEntireLargePageToSmall(
      (_KQUEUE *)v6,
      PfnPageSizeIndex,
      1u,
      (_LARGE_INTEGER *)(unsigned int)v3,
      0i64,
      (UINT64)&a6);
    if( (v32 & 4) != 0 )
    {
      LockQueue[0].LockQueue.Next = 0i64;
      LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v14 + 4328);
      KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, (UINT64 *)(v14 + 4328));
      v19 = *(INT64 **)(v14 + 4288);
      --*(_DWORD *)(v14 + 4284);
      *(_QWORD *)(v14 + 4288) = 0i64;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
    }
    else
    {
      v19 = 0i64;
    }
    v2 = 0;
    v20 = (INT64)Partition;
  }
  else
  {
    *((_BYTE *)&v6->u3 + 2) ^= (*((_BYTE *)&v6->u3 + 2) ^ v3) & 7;
    v21 = *(_MMPFN ***)(v17 + 8);
    if( *v21 != (_MMPFN *)v17 )
      __fastfail(3u);
    v6->PteLong = (unsigned __int64)v21;
    v6->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v17;
    v22 = 2240i64;
    *v21 = v6;
    v23 = 2i64;
    *(_QWORD *)(v17 + 8) = v6;
    ++*(_QWORD *)(v17 + 16);
    ++*(_QWORD *)(v15 + 8 * v16 + 48);
    ++*(_QWORD *)(v15 + 8 * v13);
    v20 = (INT64)Partition;
    if( v4 < 0x100000 )
      v23 = 4i64;
    ++*(_QWORD *)(v15 + 8 * (v13 + v23));
    if( v3 )
      v22 = 2304i64;
    _InterlockedExchangeAdd64((volatile signed __int64 *)((char *)Partition + v22), NumberOfPages);
    updated = MiUpdateLargePageCandidates(v4, (unsigned int)PfnPageSizeIndex, 1i64);
    MiIncreaseAvailablePages(Partition, NumberOfPages, v24);
    a6 = NumberOfPages;
    if( (v32 & 4) != 0 )
    {
      v19 = *(INT64 **)(v14 + 4288);
      --*(_DWORD *)(v14 + 4284);
      *(_QWORD *)(v14 + 4288) = 0i64;
    }
    else
    {
      v19 = 0i64;
    }
    if( (v32 & 2) == 0 )
      KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
  }
  if( v19 )
    MiWakeLargePageWaiters(v19);
  if( !v2 )
  {
    v25 = *(unsigned __int8 *)(a1 + 16);
    if( (_BYTE)v25 == 17 )
      return a6;
    goto LABEL_43;
  }
  if( v3 == 1 )
    MiWakePageZeroing(v20, v14, v18);
  if( updated
    && (v32 & 1) == 0
    && (MiFlags & 0x30) != 0
    && ((_DWORD)PfnPageSizeIndex != 1 || ((unsigned __int64)KeFeatureBits & 0x2000000000i64) != 0) )
  {
    KeSetEvent((PRKEVENT)(v20 + 5144), 0, 0);
  }
  v25 = *(unsigned __int8 *)(a1 + 16);
  if( (_BYTE)v25 != 17 )
  {
    if( *(_BYTE *)(a1 + 17) )
    {
      _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      return a6;
    }
    _InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( (v32 & 2) != 0 )
      return a6;
LABEL_43:
    __writecr8(v25);
  }
  return a6;
}

Referenced by:

MiChangePageAttributeLargeFreeZeroPage
MiCoalesceFreePages
MiDeleteClusterPage
MiDeleteClusterSection
MiEnableNewPfns
MiFinishLargePageFree
MiFreeLargePageChain
MiFreeLargeZeroPages
MiInsertLargePageChain
MiLargePagePromote
MiMoveLargeFreePage
MiRebuildLargePage
MiScrubNodeLargePageList
MiTimeSingleLargePageZeroWorker
MxCreateFreePfns