MiCreateKernelHalSlabRange

INT64 __stdcall MiCreateKernelHalSlabRange(UINT64 a1, UINT64 a2, INT64 a3){
  int v5; 
  int v6; 
  __int64 v7; 
  INT64 SlabAllocator; 
  _MMPTE *PdeBase; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  _MMPFN *PfnDb; 
  INT64 v15; 
  unsigned __int8 CurrentIrql; 
  __int64 v17; 
  INT64 result; 
  INT64 v19; 
  v5 = MiComputeDriverProtection(0i64, (unsigned int)a3);
  v7 = (unsigned int)(v6 + 1);
  if( v5 == 24 )
    LOBYTE(v5) = v6 + 1;
  SlabAllocator = MiGetSlabAllocator((INT64)&MiSystemPartition, (unsigned int)(v6 + 1), v5);
  PdeBase = MmGetPdeBase();
  v10 = (unsigned __int64)PdeBase + ((a1 >> 18) & 0x3FFFFFF8);
  v11 = (unsigned __int64)PdeBase + ((a2 >> 18) & 0x3FFFFFF8);
  if( v10 >= v11 )
    return 0i64;
  v12 = (unsigned int)(v7 + 1);
  while( 1 )
  {
    v19 = MI_READ_PTE_LOCK_FREE(v10);
    v13 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64;
    PfnDb = MmGetPfnDb();
    v15 = (INT64)PfnDb + 48 * v13;
    if( (*(_QWORD *)(v15 + 40) & 0x1000000000i64) != 0 )
    {
      MiConvertEntireLargePageToSmall((KQUEUE *)((char *)PfnDb + 48 * v13), v7, 0, (LARGE_INTEGER *)6, 0i64, 0i64);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(v12);
      v17 = 512i64;
      do
      {
        MiLockPageAtDpc(v15);
        --*(_WORD *)(v15 + 32);
        _InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
        v15 += 48i64;
        v17 -= v7;
      }
      while( v17 );
      v12 = 2i64;
      __writecr8(CurrentIrql);
    }
    result = MiCreateBootSlabEntries(SlabAllocator, v13, 512i64, (unsigned int)v7);
    if( (int)result < 0 )
      break;
    v10 += 8i64;
    if( v10 >= v11 )
      return 0i64;
  }
  return result;
}

Referenced by:

No references.