VmColdPagesHint
NTSTATUS __stdcall VmColdPagesHint(UINT64 a1, UINT64 a2, INT64 a3){
char *VmContext;
unsigned __int64 v5;
unsigned __int64 *v6;
UINT64 v7;
unsigned __int8 v8;
unsigned __int64 v9;
unsigned __int64 v10;
_QWORD *v12;
unsigned __int64 v13;
UINT64 v14;
INT64 v15;
UINT64 RegionSize;
UINT64 v18;
VOID *BaseAddress;
RegionSize = 0i64;
BaseAddress = 0i64;
VmContext = (char *)KeGetCurrentThread()->ApcState.Process->VmContext;
if( !VmContext )
NT_ASSERT("ProcessContext != ((void *)0)");
if( *((_QWORD *)VmContext + 9) != a3 )
NT_ASSERT("ProcessContext->PartitionId == PartitionId");
v5 = a1 >> 12;
v6 = (unsigned __int64 *)(VmContext + 8);
v7 = 0i64;
v18 = (a1 >> 12) + a2 - 1;
do
{
v8 = VmpProcessContextLockShared((PEX_SPIN_LOCK)VmContext);
v9 = *v6;
if( (VmContext[16] & 1) != 0 && v9 )
v9 ^= (unsigned __int64)v6;
while( 1 )
{
if( !v9 )
goto LABEL_19;
if( v5 <= *(_QWORD *)(v9 + 32) )
break;
v10 = *(_QWORD *)(v9 + 8);
LABEL_14:
if( (VmContext[16] & 1) != 0 && v10 )
v9 ^= v10;
else
v9 = v10;
}
if( v5 < *(_QWORD *)(v9 + 24) )
{
v10 = *(_QWORD *)v9;
goto LABEL_14;
}
v12 = (_QWORD *)(v9 - 24);
if( v9 == 24 )
LABEL_19:
NT_ASSERT("GpaMemoryRange != ((void *)0)");
BaseAddress = *(VOID **)(v12[2] + 24i64);
BaseAddress = (char *)BaseAddress + v5 - v12[6];
v13 = v12[7];
if( v13 >= v18 )
v13 = v18;
RegionSize = v13 - v5 + 1;
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)VmContext);
__writecr8(v8);
v14 = RegionSize;
v15 = VmpTraceLoggingProvider;
v7 += RegionSize;
v5 += RegionSize;
if( VmpTraceLoggingProvider )
{
if( *(_DWORD *)VmpTraceLoggingProvider && tlgKeywordOn(VmpTraceLoggingProvider, 4i64) )
{
VmpLogColdHint(v15, v5);
v14 = RegionSize;
}
}
BaseAddress = (VOID *)((_QWORD)BaseAddress << 12);
RegionSize = v14 << 12;
ZwUnlockVirtualMemory((VOID *)0xFFFFFFFFFFFFFFFFi64, &BaseAddress, &RegionSize, 1ui64);
}
while( v7 < a2 );
return 0;
}Referenced by:
No references.