MiGetHugePageToZero

INT64 __fastcall MiGetHugePageToZero(INT64 a1, INT64 a2){
  unsigned int v3; 
  __int64 v5; 
  UINT64 v7; 
  INT64 v8; 
  UINT64 v9; 
  void *v10; 
  INT64 v11; 
  int v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  v3 = *(_DWORD *)(a2 + 260) >> byte_140C4DBCC;
  memset(&LockHandle, 0, sizeof(LockHandle));
  while( 1 )
  {
    *(_QWORD *)(a2 + 32) = 0i64;
    *(_BYTE *)(a2 + 69) = 0;
    v5 = 4544i64 * v3 + *(_QWORD *)(a1 + 16);
    if( !*(_QWORD *)(a2 + 224)
      && *(_QWORD *)(*(_QWORD *)(a2 + 232) + 56i64) == *(_QWORD *)(a2 + 232) + 56i64
      && !*(_QWORD *)(v5 + 8) )
    {
      return 0i64;
    }
    KeAcquireInStackQueuedSpinLock((UINT64 *)(v5 + 4304), &LockHandle);
    if( MiGetUltraHugeAlreadyActive(v7, a2, v8) )
      break;
    LODWORD(v9) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    v10 = (void *)v9;
    if( !v9 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      return 0i64;
    }
    LODWORD(v15) = 64;
    LODWORD(v14) = 1;
    LODWORD(v13) = 4;
    v11 = MiUnlinkNodeLargePages(a1, 0i64, 1i64, v3, v13, v14, a2 + 248, v15, v9);
    if( !v11 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      ExFreePoolWithTag(v10, 0);
      return 0i64;
    }
    v12 = MiInitializeNewUltraHugeContext(a2, (INT64)v10, v11);
    if( !v12 )
      MiDecrementHugeContext(v10);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( v12 )
      return 1i64;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  return 1i64;
}

Referenced by:

MiGetPagesToZero
MiZeroLargePages