MiInsertLargePageChain

VOID __stdcall MiInsertLargePageChain(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
  _BOOL8 v7; 
  unsigned int v8; 
  int v9; 
  unsigned int v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  INT64 v15; 
  PDRIVER_OBJECT v16; 
  char v17; 
  unsigned int v18; 
  bool v19; 
  INT64 *v20; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  INT64 v22; 
  __int128 v23; 
  __int64 v24; 

  v22 = a3;
  v24 = 0i64;
  v7 = (*(_DWORD *)(a2 + 16) & 0x3E0i64) != 0;
  memset(&LockQueue, 0, sizeof(LockQueue));
  v23 = 0i64;
  LOBYTE(v8) = MiIsFreeZeroPfnCold(a2);
  v10 = v8;
  v11 = MiLargePageSizes[v9];
  if( v9 == 2 )
  {
    MiConvertEntireLargePageToSmall((_KQUEUE *)a2, 2, 1u, (_LARGE_INTEGER *)v7, 0i64, 0i64);
  }
  else
  {
    v12 = MiLargePageSizes[v9 + 1];
    v13 = v11 / v12;
    v14 = v11 + (a2 - (__int64)MmGetPfnDb()) / 48 - v12;
    v15 = 48 * (v11 - v12) + a2;
    MiLockPageAtDpc(v15);
    LockQueue.LockQueue.Next = 0i64;
    *((_QWORD *)&v23 + 1) = v7 | 0x300000000i64;
    *(_QWORD *)&v23 = v14;
    LOBYTE(v24) = 2;
    LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
    while( 1 )
    {
      if( (*(_BYTE *)(v15 + 34) & 7) == 6 )
      {
        MiSetPfnPageState(v15, 5);
        MiSetFreeZeroPfnCold(v16, (PVOID)v10);
        MiSetPfnPageState(v15, 6);
      }
      else
      {
        MiSetFreeZeroPfnCold((PDRIVER_OBJECT)v15, (PVOID)v10);
      }
      *(_BYTE *)(v15 + 39) = v17 | *(_BYTE *)(v15 + 39) & 0xFC;
      if( (_DWORD)v13 == 1 )
      {
        if( v22 )
          break;
      }
      v19 = *(_QWORD *)(a1 + 4352) == 0i64;
      *(_QWORD *)&v23 = v14;
      if( v19 )
      {
        HIDWORD(v23) |= 2u;
      }
      else
      {
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
        HIDWORD(v23) &= ~2u;
      }
      MiInsertLargePageInNodeList((__int64)&v23);
      LODWORD(v13) = v13 - 1;
      if( !(_DWORD)v13 )
        goto LABEL_21;
      v14 -= v12;
      v15 += -48i64 * v12;
      v18 = HIDWORD(v23);
      v19 = (BYTE12(v23) & 2) == 0;
      if( (BYTE12(v23) & 2) != 0 )
      {
        if( _interlockedbittestandset64((volatile signed __int32 *)(v15 + 24), 0x3Fui64) )
        {
          KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
          v18 = HIDWORD(v23) & 0xFFFFFFFD;
          HIDWORD(v23) &= ~2u;
        }
        else
        {
          v18 = HIDWORD(v23);
        }
        v19 = (v18 & 2) == 0;
      }
      if( v19 )
      {
        HIDWORD(v23) = v18 | 2;
        MiLockPageAtDpc(v15);
        LockQueue.LockQueue.Next = 0i64;
        LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
        KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
      }
    }
    _InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
  }
LABEL_21:
  if( (_DWORD)a5 )
  {
    if( (BYTE12(v23) & 2) == 0 )
    {
      LockQueue.LockQueue.Next = 0i64;
      LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
      KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
    }
    v20 = *(INT64 **)(a1 + 4288);
    *(_QWORD *)(a1 + 4288) = 0i64;
    --*(_DWORD *)(a1 + 4284);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
    if( v20 )
      MiWakeLargePageWaiters(v20);
  }
  else if( (BYTE12(v23) & 2) != 0 )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  }
}

Referenced by:

MiInsertDemotedPages