MiGetHugePageToZero

NTSTATUS __stdcall MiGetHugePageToZero(INT64 a1, INT64 a2){
  unsigned int v3; 
  __int64 v5; 
  _EPROCESS *v7; 
  __int64 v8; 
  VOID *Pool; 
  void *v10; 
  INT64 v11; 
  NTSTATUS v12; 
  INT64 v13; 
  INT64 v14; 
  INT64 v15; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v3 = *(_DWORD *)(a2 + 260) >> *(&stru_140C4DB30 + 156);
  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 0;
    }
    KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v5 + 4304), &LockHandle);
    MiGetUltraHugeAlreadyActive(v7);
    if( v8 )
      break;
    Pool = MiAllocatePool(64i64, 0xC8ui64, 0x7548694Dui64);
    v10 = Pool;
    if( !Pool )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      return 0;
    }
    LODWORD(v15) = 64;
    LODWORD(v14) = 1;
    LODWORD(v13) = 4;
    LODWORD(v11) = MiUnlinkNodeLargePages(a1, 0i64, 1i64, v3, v13, v14, a2 + 248, v15, (UINT64)Pool);
    if( !v11 )
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      ExFreePoolWithTag(v10, 0);
      return 0;
    }
    v12 = MiInitializeNewUltraHugeContext(a2, (INT64)v10, v11);
    if( !v12 )
      MiDecrementHugeContext(v10);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( v12 )
      return 1;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  return 1;
}

Referenced by:

MiGetPagesToZero
MiZeroLargePages