MiReserveDriverPtes
MMPTE *__stdcall MiReserveDriverPtes(UINT64 SessionImage, UINT64 ExactPtes){
unsigned int v2;
_ETHREAD *CurrentThread;
__int64 v4;
unsigned int v6;
MMPTE *v7;
struct _RTL_BITMAP *i;
CHAR v9;
ULONG ClearBitsAndSet;
INT64 v11;
unsigned int v13;
RTL_BITMAP *v14;
RTL_BITMAP *v15;
void *v16;
CHAR v17;
INT64 v18;
MMPTE *PteAddress;
int v20;
RTL_BITMAP *v21;
INT64 v22;
UINT64 v23;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = v2;
v6 = (unsigned int)(SessionImage + 15) >> 4;
MiLockDriverMappings((__int64)CurrentThread);
v7 = 0i64;
if( !ExactPtes )
{
for( i = *(struct _RTL_BITMAP **)&MiState[8 * v4 + 1136]; i; i = *(struct _RTL_BITMAP **)&i->SizeOfBitMap )
{
if( (*(&i[2].SizeOfBitMap + 1) & 1) == 0 && i[1].SizeOfBitMap >= v6 )
{
ClearBitsAndSet = RtlFindClearBitsAndSet(i + 1, v6, i[2].SizeOfBitMap);
if( ClearBitsAndSet != -1 )
{
v7 = (MMPTE *)&i->Buffer[32 * (unsigned __int64)ClearBitsAndSet];
i[2].SizeOfBitMap = v6 + ClearBitsAndSet;
goto LABEL_8;
}
}
}
}
v13 = (unsigned __int8)ExGenRandom(1i64);
LODWORD(v14) = MiAllocatePool((struct _SLIST_ENTRY *)(*(_DWORD *)InitializationPhase != 0 ? 256i64 : 64i64));
v15 = v14;
if( !v14 )
{
LABEL_8:
MiUnlockDriverMappings((INT64)CurrentThread, v9, v11);
return v7;
}
v16 = (void *)MiObtainSystemVa(((16 * (v6 + v13) + 511) & 0xFFFFFE00) >> 9, 12 - (unsigned int)((_DWORD)v4 != 0));
v23 = (UINT64)v16;
if( !v16 )
goto LABEL_18;
PteAddress = MiGetPteAddress(v16);
if( !(_DWORD)v4 )
{
LOBYTE(v20) = MiMakeZeroedPageTables(PteAddress);
if( !v20 )
{
MiReturnSystemVa(
v23,
(__int64)(((_QWORD)PteAddress << 25)
- ((_QWORD)MmGetPteBase() << 25)
+ ((unsigned __int64)((16 * (v6 + v13) + 511) & 0xFFFFFE00) << 28)) >> 16,
12 - (unsigned int)((_DWORD)v4 != 0));
LABEL_18:
MiUnlockDriverMappings((INT64)CurrentThread, v17, v18);
ExFreePoolWithTag(v15, 0);
return 0i64;
}
}
memset((INT64)&v15[2].Buffer, 0i64);
v21 = v15 + 1;
v15[1].SizeOfBitMap = ((16 * (v6 + v13) + 511) & 0xFFFFFE00) >> 4;
v15[1].Buffer = (unsigned int *)&v15[2].Buffer;
if( ExactPtes )
{
v13 = 0;
RtlSetAllBits(v21);
LODWORD(v7) = 2;
}
else
{
RtlSetBits(v21, v13, v6);
}
*(&v15[2].SizeOfBitMap + 1) = (unsigned int)v7;
v15->Buffer = (unsigned int *)PteAddress;
v15[2].SizeOfBitMap = v6 + v13;
*(_QWORD *)&v15->SizeOfBitMap = *(_QWORD *)&MiState[8 * v4 + 1136];
*(_QWORD *)&MiState[8 * v4 + 1136] = v15;
MiUnlockDriverMappings((INT64)CurrentThread, (CHAR)MiState, v22);
return(MMPTE *)((char *)PteAddress + 128 * (unsigned __int64)v13);
}Referenced by:
MiSelectSystemImageAddress
MmMapLockedRestartPages