MiReserveBootDriverPtes
INT64 __stdcall MiReserveBootDriverPtes(UINT64 a1, INT64 a2){
__int64 v3;
__int64 v4;
UINT8 **v5;
UINT64 v6;
__int64 v7;
UINT64 v8;
INT64 result;
RTL_BITMAP *v10;
UINT8 *v11;
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 = (UINT8 **)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);
return 1i64;
}
v5 = (UINT8 **)((unsigned __int64)qword_140C4CA70 & -(__int64)(a1 < v8));
if( v5 )
v6 = *(_QWORD *)(((unsigned __int64)qword_140C4CA70 & -(__int64)(a1 < v8)) + 8);
}
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v10 = (RTL_BITMAP *)result;
if( result )
{
*(_DWORD *)(result + 16) = (__int64)(((a1 + 4088 + 8 * v3) & 0xFFFFFFFFFFFFF000ui64) - v6) >> 3;
v11 = (UINT8 *)(result + 40);
v10[1].Buffer = (unsigned int *)v11;
if( v5 )
{
memmove(v11, v5[3], (unsigned __int64)*((unsigned int *)v5 + 4) >> 3);
qword_140C4CA70 = *v5;
ExFreePoolWithTag(v5, 0);
}
RtlSetBits(v10 + 1, (unsigned int)((__int64)(a1 - v6) >> 3), (unsigned int)v3);
v10[2].SizeOfBitMap = 0;
*(&v10[2].SizeOfBitMap + 1) = 1;
v10->Buffer = (unsigned int *)v6;
*(_QWORD *)&v10->SizeOfBitMap = qword_140C4CA70;
qword_140C4CA70 = v10;
return 1i64;
}
return result;
}Referenced by:
MiInitializeDriverPtes