MiAddPartitionHugeRange

__int64 __fastcall MiAddPartitionHugeRange(_QWORD *a1, __int64 a2, int a3){
  _ETHREAD *CurrentThread; 
  unsigned __int64 v7; 
  unsigned int v8; 
  unsigned __int64 v9; 
  unsigned __int64 PageCount; 
  unsigned __int64 BasePage; 
  unsigned __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  __int64 *v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  bool v20; 
  bool i; 
  unsigned __int64 *v22; 
  _KLOCK_QUEUE_HANDLE v23; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&v23, 0, sizeof(v23));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  MiLockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
  v7 = 0i64;
  v8 = 0;
  if( MmPhysicalMemoryBlock->NumberOfRuns )
  {
    v9 = *(_QWORD *)(a2 + 24);
    do
    {
      PageCount = MmPhysicalMemoryBlock->Run[v8].PageCount;
      BasePage = MmPhysicalMemoryBlock->Run[v8].BasePage;
      if( PageCount )
      {
        if( v9 >= BasePage )
        {
          if( v9 < PageCount + BasePage )
            break;
        }
        else if( v9 + *(_QWORD *)(a2 + 32) > BasePage )
        {
          break;
        }
      }
      ++v8;
    }
    while( v8 < MmPhysicalMemoryBlock->NumberOfRuns );
  }
  MiUnlockDynamicMemoryShared((INT64)&Irp, (INT64)CurrentThread);
  v12 = (*(_QWORD *)(a2 + 24) >> 18) & 0x3FFFFi64;
  v13 = *(_QWORD *)(a2 + 32) >> 18;
  v14 = 0x80200000C0000i64;
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 274, &LockHandle);
  KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
  v15 = v13 & 0x3FFFF;
  if( v12 >= *(&stru_140C4DB30 + 270) )
    goto LABEL_13;
  if( v15 > 1 )
  {
    if( *(&stru_140C4DB30 + 270) - v12 < v15 )
      goto LABEL_13;
    v17 = (__int64 *)(*(&stru_140C4DB30 + 271) + 8 * (v12 >> 6));
    v18 = *v17;
    v19 = *(&stru_140C4DB30 + 271) + 8 * ((v12 + v15 - 1) >> 6);
    if( v17 != (__int64 *)v19 )
    {
      for( i = (v18 & (-1i64 << v12)) == 0; i; i = *v17 == 0 )
      {
        if( ++v17 == (__int64 *)v19 )
        {
          v20 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v12 + (unsigned __int8)v15 - 1)) & *v17) == 0;
          goto LABEL_22;
        }
      }
      goto LABEL_13;
    }
    v20 = (v18 & (0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v15) << v12)) == 0;
LABEL_22:
    if( !v20 )
    {
LABEL_13:
      KeReleaseInStackQueuedSpinLock(&v23);
      KeReleaseInStackQueuedSpinLock(&LockHandle);
      return 3221225496i64;
    }
  }
  else if( v15 != 1 || _bittest64(*(&stru_140C4DB30 + 271), v12) )
  {
    goto LABEL_13;
  }
  RtlSetBitsEx((_RTL_BITMAP_EX *)&stru_140C4DB30 + 135, v12, v15);
  memset64((void *)(*(&stru_140C4DB30 + 272) + 8 * v12), 0x80200000C0000ui64, v15);
  KeReleaseInStackQueuedSpinLock(&v23);
  KeReleaseInStackQueuedSpinLock(&LockHandle);
  if( a3 == 3 )
    v14 = ((unsigned __int64)(*(_WORD *)a1 & 0x7FF) << 41) | 0xC0000;
  v22 = (unsigned __int64 *)(*(&stru_140C4DB30 + 272) + 8 * v12);
  if( a3 == 3 )
    KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
  do
  {
    if( a3 == 3 )
    {
      *v22 = v14;
      ++a1[53];
    }
    else
    {
      MiInsertHugeRangeInList(v12, a3 == 1, a1);
    }
    ++v22;
    ++v7;
    LODWORD(v12) = (v12 ^ (v12 + 1)) & 0x3FFFF ^ v12;
  }
  while( v7 < v15 );
  if( a3 == 3 )
    KeReleaseInStackQueuedSpinLock(&v23);
  return 0i64;
}

Referenced by:

MiHotAddHugeRange