MiReserveBootDriverPtes
NTSTATUS __stdcall MiReserveBootDriverPtes(UINT64 a1, INT64 a2){
__int64 v3;
__int64 v4;
const VOID **v5;
UINT64 v6;
__int64 v7;
UINT64 v8;
_RTL_BITMAP *Pool;
unsigned int v10;
_RTL_BITMAP *v11;
unsigned int *p_Buffer;
v3 = ((dword_140C4C9F0 & 0xFFF) != 0) + (unsigned int)a2 + ((unsigned int)dword_140C4C9F0 >> 12);
v4 = (__int64)((a1 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( (PVOID)v4 != PsHalImageBase && v4 != PsNtosImageBase )
v3 = (unsigned int)(dword_140C4C98C + v3);
v5 = (const VOID **)qword_140C4CA70;
v6 = a1 & 0xFFFFFFFFFFFFF000ui64;
if( qword_140C4CA70 )
{
v7 = *((_QWORD *)qword_140C4CA70 + 1);
v8 = v7 + 8i64 * *((unsigned int *)qword_140C4CA70 + 4);
if( a1 + 8 * v3 <= v8 )
{
RtlSetBits((_RTL_BITMAP *)qword_140C4CA70 + 1, (unsigned int)((__int64)(a1 - v7) >> 3), (unsigned int)v3);
goto LABEL_7;
}
v5 = (const VOID **)((unsigned __int64)qword_140C4CA70 & -(__int64)(a1 < v8));
if( v5 )
v6 = *(_QWORD *)(((unsigned __int64)qword_140C4CA70 & -(__int64)(a1 < v8)) + 8);
}
v10 = (__int64)(((a1 + 4088 + 8 * v3) & 0xFFFFFFFFFFFFF000ui64) - v6) >> 3;
Pool = (_RTL_BITMAP *)MiAllocatePool(64i64, ((unsigned __int64)v10 >> 3) + 40, 0x70446D4Dui64);
v11 = Pool;
if( !Pool )
return(int)Pool;
Pool[1].SizeOfBitMap = v10;
p_Buffer = (unsigned int *)&Pool[2].Buffer;
v11[1].Buffer = p_Buffer;
if( v5 )
{
memmove(p_Buffer, v5[3], *((_DWORD *)v5 + 4) >> 3);
qword_140C4CA70 = (PVOID)*v5;
ExFreePoolWithTag(v5, 0);
}
RtlSetBits(v11 + 1, (unsigned int)((__int64)(a1 - v6) >> 3), (unsigned int)v3);
v11[2].SizeOfBitMap = 0;
*(&v11[2].SizeOfBitMap + 1) = 1;
v11->Buffer = (unsigned int *)v6;
*(_QWORD *)&v11->SizeOfBitMap = qword_140C4CA70;
qword_140C4CA70 = v11;
LABEL_7:
LODWORD(Pool) = 1;
return(int)Pool;
}Referenced by:
MiInitializeDriverPtes