MiCreateBootSlabEntries
NTSTATUS __stdcall MiCreateBootSlabEntries(_DEVICE_OBJECT *DeviceObject, UINT64 NumberOfPages, INT64 a3, INT64 a4){
int v4;
INT64 v5;
UINT64 v6;
_MMPFN *v8;
_RTL_BITMAP *Pool;
_RTL_BITMAP *v10;
int v12;
UINT64 v13;
v4 = a4;
v5 = a3;
v6 = NumberOfPages;
v8 = &MmGetPfnDb()[NumberOfPages];
if( !a3 )
return 0;
while( 1 )
{
Pool = (_RTL_BITMAP *)MiAllocatePool(64i64, 0x90ui64, 0x6553694Dui64);
v10 = Pool;
if( !Pool )
break;
Pool[2].Buffer = (unsigned int *)DeviceObject;
Pool[3].SizeOfBitMap = 512;
Pool[3].Buffer = &Pool[4].SizeOfBitMap;
*(_QWORD *)&Pool[2].SizeOfBitMap = v6 + 511;
Pool[1].Buffer = (unsigned int *)v6;
RtlSetAllBits(Pool + 3);
if( v4 )
HIDWORD(v10[8].Buffer) |= 1u;
if( !DeviceObject->Flags )
{
v12 = 512;
do
{
if( !v8->PteLong )
--*(&stru_140C4DB30 + 569);
++v8;
--v12;
}
while( v12 );
}
if( _bittest64(*(&stru_140C50B28 + 756), v6 >> 9) )
KeBugCheckEx(0x1Au, (PVOID)0x3030311, v10[1].Buffer, (PVOID)(int)DeviceObject->Flags, 0i64);
LODWORD(v13) = 0;
_bittestandset64(*(&stru_140C50B28 + 756), v6 >> 9);
MiUpdateLargePageBitMap((UINT64)&Irp, v6, 0x200ui64, 1ui64, v13);
MiInsertSlabEntry((_IRP *)&Irp, DeviceObject);
v6 += 512i64;
v5 -= 512i64;
if( !v5 )
return 0;
}
return -1073741670;
}Referenced by:
MiCreateKernelHalSlabRange
MiCreateSlabAllocationsFromLoaderBlock