MiAddPartitionHugeRange

INT64 __fastcall MiAddPartitionHugeRange(_QWORD *a1, INT64 a2, INT64 a3){
  _ETHREAD *CurrentThread; 
  int v6; 
  unsigned __int64 v7; 
  unsigned int v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  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; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(&v23, 0, sizeof(v23));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v6 = a3;
  MiLockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
  v7 = 0i64;
  v8 = 0;
  if( *(_DWORD *)MmPhysicalMemoryBlock )
  {
    v9 = *(_QWORD *)(a2 + 24);
    do
    {
      v10 = *(_QWORD *)&MmPhysicalMemoryBlock[16 * v8 + 24];
      v11 = *(_QWORD *)&MmPhysicalMemoryBlock[16 * v8 + 16];
      if( v10 )
      {
        if( v9 >= v11 )
        {
          if( v9 < v10 + v11 )
            break;
        }
        else if( v9 + *(_QWORD *)(a2 + 32) > v11 )
        {
          break;
        }
      }
      ++v8;
    }
    while( v8 < *(_DWORD *)MmPhysicalMemoryBlock );
  }
  MiUnlockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
  v12 = (*(_QWORD *)(a2 + 24) >> 18) & 0x3FFFFi64;
  v13 = *(_QWORD *)(a2 + 32) >> 18;
  v14 = 0x80200000C0000i64;
  KeAcquireInStackQueuedSpinLock(&qword_140C4E3C0, &LockHandle);
  KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
  v15 = v13 & 0x3FFFF;
  if( v12 >= qword_140C4E3A0 )
    goto LABEL_13;
  if( v15 > 1 )
  {
    if( qword_140C4E3A0 - v12 < v15 )
      goto LABEL_13;
    v17 = (__int64 *)(qword_140C4E3A8 + 8 * (v12 >> 6));
    v18 = *v17;
    v19 = qword_140C4E3A8 + 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((const signed __int64 *)qword_140C4E3A8, v12) )
  {
    goto LABEL_13;
  }
  RtlSetBitsEx((INT64)&qword_140C4E3A0, v12, v15);
  memset64((void *)(qword_140C4E3B0 + 8 * v12), 0x80200000C0000ui64, v15);
  KeReleaseInStackQueuedSpinLock(&v23);
  KeReleaseInStackQueuedSpinLock(&LockHandle);
  if( v6 == 3 )
    v14 = ((unsigned __int64)(*(_WORD *)a1 & 0x7FF) << 41) | 0xC0000;
  v22 = (unsigned __int64 *)(qword_140C4E3B0 + 8 * v12);
  if( v6 == 3 )
    KeAcquireInStackQueuedSpinLock(a1 + 516, &v23);
  do
  {
    if( v6 == 3 )
    {
      *v22 = v14;
      ++a1[53];
    }
    else
    {
      MiInsertHugeRangeInList(v12, v6 == 1, a1);
    }
    ++v22;
    ++v7;
    v12 ^= ((unsigned int)v12 ^ ((_DWORD)v12 + 1)) & 0x3FFFF;
  }
  while( v7 < v15 );
  if( v6 == 3 )
    KeReleaseInStackQueuedSpinLock(&v23);
  return 0i64;
}

Referenced by:

MiHotAddHugeRange