MiTryUnlinkNodeLargePage

INT64 __fastcall MiTryUnlinkNodeLargePage(UINT64 BaseLargePage, UINT64 LargePageIndex){
  int v2; 
  char v3; 
  _DWORD *v4; 
  char v6; 
  __int64 v8; 
  __int64 v9; 
  char *v10; 
  unsigned __int8 v11; 
  void *v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  __int64 v17; 
  int PfnPageSizeIndex; 
  _BOOL8 v19; 
  unsigned __int8 v20; 
  unsigned int Channel; 
  __int64 v23; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v25; 
  __int64 PcValue; 
  __int64 v27[3]; 
  UINT64 SpinCount; 
  INT64 LargePageIndexa; 
  _DWORD *v31; 
  LODWORD(LargePageIndexa) = v2;
  v4 = v31;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v6 = v3;
  LODWORD(v8) = MiSearchNumaNodeTable((PVOID)LargePageIndex);
  v9 = *(unsigned int *)(v8 + 8);
  v10 = (char *)MmGetPfnDb() + 48 * LargePageIndex;
  Channel = MiGetPfnChannel((INT64)v10);
  v11 = MiLockPageInline((INT64)v10);
  v13 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64));
  if( v13 != BaseLargePage )
  {
LABEL_15:
    _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v11);
    *v4 = 1;
    return 0i64;
  }
  v14 = 4544 * v9;
  v23 = 4544 * v9;
  while( 1 )
  {
    v15 = *(_QWORD *)(v13 + 16);
    v16 = 1;
    LockHandle.LockQueue.Next = 0i64;
    v17 = v14 + v15;
    LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v17 + 4328);
    KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)(v17 + 4328), (WORK_QUEUE_TYPE)v13, v12);
    PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)v10);
    if( PfnPageSizeIndex != (_DWORD)LargePageIndexa )
    {
      LODWORD(v19) = 1;
      goto LABEL_7;
    }
    v20 = v10[34] & 7;
    if( v20 <= 1u )
      break;
    v19 = v20 != 5;
LABEL_7:
    v16 = 0;
    *v4 = v19;
    if( !*(_DWORD *)(v17 + 4284) )
      goto LABEL_22;
    if( (v6 & 0x10) != 0 )
    {
      PcValue = 393479i64;
      v27[1] = (__int64)v27;
      v27[0] = (__int64)v27;
      v25 = *(_QWORD *)(v17 + 4288);
      *(_QWORD *)(v17 + 4288) = &v25;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v11);
      KeWaitForGate(&PcValue, 18);
    }
    else
    {
      LODWORD(SpinCount) = 0;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v11);
      if( v11 != 2 )
      {
        *v4 = 0;
        return 0i64;
      }
      LODWORD(SpinCount) = 0;
      while( *(_DWORD *)(v17 + 4284) )
        KeYieldProcessorEx(&SpinCount);
    }
    v11 = MiLockPageInline((INT64)v10);
    v13 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64));
    v14 = v23;
    if( v13 != BaseLargePage )
      goto LABEL_15;
  }
  if( MiUnlinkNodeLargePageHelper((_MI_NODE_INFORMATION *)v17, (_MMPFN *)v10, (unsigned int)LargePageIndexa, Channel) )
  {
    if( (v6 & 0x20) != 0 )
      ++*(_DWORD *)(v23 + *(_QWORD *)(BaseLargePage + 16) + 4284);
  }
  else
  {
    *v4 = 0;
    v16 = 0;
  }
LABEL_22:
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  if( v16 && (v6 & 0x20) != 0 )
    v11 = 2;
  _InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v11);
  return v16;
}

Referenced by:

MiDemoteLargeFreePage
MiLargeFreePageToMdl
MiMoveLargeFreePage