MiAllocateAccessLog
_MM_PAGE_ACCESS_INFO_HEADER *__stdcall MiAllocateAccessLog(_MMSUPPORT_INSTANCE *Vm){
INT64 v2;
UINT64 v3;
_MM_PAGE_ACCESS_INFO_HEADER **AgeDistribution;
_MM_PAGE_ACCESS_INFO_HEADER *v5;
UINT64 v6;
_MM_PAGE_ACCESS_INFO_HEADER *PoolMm;
_MM_PAGE_ACCESS_INFO_HEADER *v8;
_MM_PAGE_ACCESS_INFO_HEADER *result;
_SINGLE_LIST_ENTRY *Next;
v2 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * Vm->PartitionId);
if( MiSufficientAvailablePages(v2, 0x420ui64)
&& *(__int64 *)(v2 + 7168) >= 1056
&& (unsigned __int64)(MiState[0] - qword_140C4C608) >= 0x800 )
{
v3 = 4096i64;
}
else
{
v3 = 512i64;
}
if( (Vm->Flags._bf_0 & 7) == 2 )
AgeDistribution = (_MM_PAGE_ACCESS_INFO_HEADER **)((char *)&stru_140C4DB30 + 6584);
else
AgeDistribution = (_MM_PAGE_ACCESS_INFO_HEADER **)Vm[1].AgeDistribution;
v5 = *AgeDistribution;
if( *AgeDistribution )
{
Next = v5->Link.Next;
if( v3 == 512 || Next && Next->Next )
{
MiEmptyPageAccessLog(*AgeDistribution);
v5 = 0i64;
*AgeDistribution = 0i64;
}
}
do
{
v6 = KeGetCurrentPrcb()->ParentNode->Affinity.Reserved[0];
LODWORD(v6) = v6 | 0x80000000;
PoolMm = (_MM_PAGE_ACCESS_INFO_HEADER *)ExAllocatePoolMm(64i64, v3, 0x63416D4Dui64, v6);
if( PoolMm )
{
*AgeDistribution = PoolMm;
MiInitializePageAccessLogging(Vm, PoolMm, v3);
result = v8;
v8->Link.Next = &v5->Link;
return result;
}
if( *AgeDistribution )
{
MiEmptyPageAccessLog(*AgeDistribution);
v5 = 0i64;
*AgeDistribution = 0i64;
}
v3 >>= 1;
}
while( v3 >= 0x200 );
return 0i64;
}Referenced by:
MiLogPageAccess