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.