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.