MiTryUnlinkNodeLargePage

_MMLISTS __stdcall MiTryUnlinkNodeLargePage(UINT64 BaseLargePage, UINT64 LargePageIndex){
  int v2; 
  int v3; 
  _DWORD *v4; 
  int v6; 
  __int64 v8; 
  __int64 v9; 
  _MMPFN *v10; 
  UINT8 v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  _MMLISTS v15; 
  _MI_NODE_INFORMATION *v16; 
  NTSTATUS PfnPageSizeIndex; 
  _BOOL8 v18; 
  unsigned __int8 v19; 
  CHAR v20; 
  UINT64 Channel; 
  unsigned int PfnChannel; 
  __int64 v24; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  _MI_LARGE_PAGE_LISTS_CHANGING *LargeListWaiters; 
  __int64 v27; 
  __int64 v28[3]; 
  UINT64 SpinCount; 
  UINT64 LargePageIndexa; 
  _DWORD *v32; 

  LODWORD(LargePageIndexa) = v2;
  v4 = v32;
  memset(&LockQueue, 0, sizeof(LockQueue));
  v6 = v3;
  LODWORD(v8) = MiSearchNumaNodeTable((PVOID)LargePageIndex);
  v9 = *(unsigned int *)(v8 + 8);
  v10 = &MmGetPfnDb()[LargePageIndex];
  PfnChannel = MiGetPfnChannel((INT64)v10);
  v11 = MiLockPageInline(v10);
  v12 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v10->u4._bf_0 >> 39) & 0x3FF));
  if( v12 != BaseLargePage )
  {
LABEL_15:
    _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v11);
    *v4 = 1;
    return 0;
  }
  v13 = 4544 * v9;
  v24 = 4544 * v9;
  while( 1 )
  {
    v14 = *(_QWORD *)(v12 + 16);
    v15 = FreePageList;
    LockQueue.LockQueue.Next = 0i64;
    v16 = (_MI_NODE_INFORMATION *)(v13 + v14);
    LockQueue.LockQueue.Lock = &v16->LargePageLock;
    KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &v16->LargePageLock);
    PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)v10);
    if( PfnPageSizeIndex != (_DWORD)LargePageIndexa )
    {
      LODWORD(v18) = 1;
      goto LABEL_7;
    }
    v19 = *(_BYTE *)(&v10->u3 + 1) & 7;
    if( v19 <= 1u )
      break;
    v18 = v19 != 5;
LABEL_7:
    v15 = ZeroedPageList;
    *v4 = v18;
    if( !v16->LargeListMoveInProgress )
      goto LABEL_22;
    if( (v6 & 0x10) != 0 )
    {
      v27 = 393479i64;
      v28[1] = (__int64)v28;
      v28[0] = (__int64)v28;
      LargeListWaiters = v16->LargeListWaiters;
      v16->LargeListWaiters = (_MI_LARGE_PAGE_LISTS_CHANGING *)&LargeListWaiters;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v11);
      KeWaitForGate((_KGATE *)&v27, WrVirtualMemory, v20);
    }
    else
    {
      LODWORD(SpinCount) = 0;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v11);
      if( v11 != 2 )
      {
        *v4 = 0;
        return 0;
      }
      LODWORD(SpinCount) = 0;
      while( v16->LargeListMoveInProgress )
        KeYieldProcessorEx(&SpinCount);
    }
    v11 = MiLockPageInline(v10);
    v12 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v10->u4._bf_0 >> 39) & 0x3FF));
    v13 = v24;
    if( v12 != BaseLargePage )
      goto LABEL_15;
  }
  LODWORD(Channel) = v6;
  if( MiUnlinkNodeLargePageHelper(v16, v10, (unsigned int)LargePageIndexa, PfnChannel, Channel) )
  {
    if( (v6 & 0x20) != 0 )
      ++*(_DWORD *)(v24 + *(_QWORD *)(BaseLargePage + 16) + 4284);
  }
  else
  {
    *v4 = 0;
    v15 = ZeroedPageList;
  }
LABEL_22:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
  if( v15 && (v6 & 0x20) != 0 )
    v11 = 2;
  _InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v11);
  return v15;
}

Referenced by:

MiDemoteLargeFreePage
MiLargeFreePageToMdl
MiMoveLargeFreePage