MiReserveDriverPtes
_MMPTE *__stdcall MiReserveDriverPtes(UINT64 SessionImage, UINT64 ExactPtes){
unsigned int v2;
_ETHREAD *CurrentThread;
__int64 v4;
unsigned int v6;
UINT8 *v7;
_MMPTE *v8;
__int64 i;
unsigned int ClearBitsAndSet;
unsigned int v12;
_RTL_BITMAP *Pool;
int v14;
VOID *v15;
_MMPTE *PteAddress;
_MI_TB_FLUSH_LIST *v17;
_RTL_BITMAP *v18;
VOID *BaseVa;
VOID *BaseVaa;
_TABLE_SEARCH_RESULT v21;
UINT64 v22;
unsigned __int64 v24;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = v2;
v6 = (unsigned int)(SessionImage + 15) >> 4;
MiLockDriverMappings(CurrentThread);
v8 = 0i64;
if( !ExactPtes )
{
for( i = MiState[v4 + 142]; i; i = *(_QWORD *)i )
{
if( (*(_DWORD *)(i + 36) & 1) == 0 && *(_DWORD *)(i + 16) >= v6 )
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)(i + 16),
(VOID *)v6,
*(unsigned int *)(i + 32),
v7,
BaseVa,
v21);
if( ClearBitsAndSet != -1 )
{
v8 = (_MMPTE *)(*(_QWORD *)(i + 8) + ((unsigned __int64)ClearBitsAndSet << 7));
*(_DWORD *)(i + 32) = v6 + ClearBitsAndSet;
goto LABEL_8;
}
}
}
}
v12 = (unsigned __int8)ExGenRandom(ExGenRandomDomainUserVisible);
v24 = (16 * (v6 + v12) + 511) & 0xFFFFFE00;
v22 = (v24 >> 7) + 40;
Pool = (_RTL_BITMAP *)MiAllocatePool((_DWORD)InitializationPhase != 0 ? 256i64 : 64i64, v22, 0x70446D4Dui64);
if( !Pool )
{
LABEL_8:
MiUnlockDriverMappings(CurrentThread);
return v8;
}
v14 = 12 - ((_DWORD)v4 != 0);
v15 = MiObtainSystemVa(((16 * (v6 + v12) + 511) & 0xFFFFFE00) >> 9, (_MI_SYSTEM_VA_TYPE)v14);
BaseVaa = v15;
if( !v15 )
goto LABEL_18;
PteAddress = MiGetPteAddress(v15);
if( !(_DWORD)v4 && !MiMakeZeroedPageTables(PteAddress, &PteAddress[v24 - 1], 1ui64, (_MI_SYSTEM_VA_TYPE)v14) )
{
MiReturnSystemVa(
BaseVaa,
(VOID *)((__int64)(((_QWORD)PteAddress << 25) - ((_QWORD)MmGetPteBase() << 25) + (v24 << 28)) >> 16),
(_MI_SYSTEM_VA_TYPE)v14,
v17);
LABEL_18:
MiUnlockDriverMappings(CurrentThread);
ExFreePoolWithTag(Pool, 0);
return 0i64;
}
memset(&Pool[2].Buffer, 0i64, v22 - 40);
v18 = Pool + 1;
Pool[1].SizeOfBitMap = ((16 * (v6 + v12) + 511) & 0xFFFFFE00) >> 4;
Pool[1].Buffer = (unsigned int *)&Pool[2].Buffer;
if( ExactPtes )
{
v12 = 0;
RtlSetAllBits(v18);
LODWORD(v8) = 2;
}
else
{
RtlSetBits(v18, v12, v6);
}
*(&Pool[2].SizeOfBitMap + 1) = (unsigned int)v8;
Pool->Buffer = (unsigned int *)PteAddress;
Pool[2].SizeOfBitMap = v6 + v12;
*(_QWORD *)&Pool->SizeOfBitMap = MiState[v4 + 142];
MiState[v4 + 142] = (__int64)Pool;
MiUnlockDriverMappings(CurrentThread);
return &PteAddress[16 * (unsigned __int64)v12];
}Referenced by:
MiSelectSystemImageAddress
MmMapLockedRestartPages