VmpFillSlat

VOID __stdcall VmpFillSlat(PNOTIFY_SYNC NotifySync, PLIST_ENTRY NotifyList, PVOID FsContext){
  _QWORD *v3; 
  _QWORD *v4; 
  int v5; 
  unsigned int v6; 
  __int64 v9; 
  _QWORD *v10; 
  _QWORD *i; 
  INT64 v12; 
  INT64 v13; 
  UINT64 *a5; 

  v4 = v3;
  v5 = *((_DWORD *)NotifySync + 22);
  v6 = (unsigned int)NotifyList | 0x20000;
  if( (v5 & 1) == 0 )
    v6 = (unsigned int)NotifyList;
  if( FsContext != (PVOID)512 )
    goto LABEL_26;
  if( (*v4 & 0x1FFi64) != 0 )
    goto LABEL_26;
  v9 = v4[1];
  if( (v9 & 0x1FF) != 0 )
    goto LABEL_26;
  v10 = v4 + 1024;
  if( v4[1022] != *v4 + 511i64 || v4[1023] != v9 + 511 )
    goto LABEL_26;
  for( i = v4 + 2; i < v10 && *i == *(i - 2) + 1i64 && i[1] == *(i - 1) + 1i64; i += 2 )
    ;
  if( i == v10 )
  {
    *((_DWORD *)NotifySync + 22) = v5 | 1;
    if( VmpTraceLoggingProvider && *(_DWORD *)VmpTraceLoggingProvider )
    {
      if( tlgKeywordOn(VmpTraceLoggingProvider, 1i64) )
        VmpLogLargeSlatFill(v12, *v4);
    }
    HvlMapGpaPages(*((_QWORD *)NotifySync + 9), *v4, v6 | 0x2000, 1ui64, v4 + 1, a5);
    *a5 <<= 9;
  }
  else
  {
LABEL_26:
    if( VmpTraceLoggingProvider && *(_DWORD *)VmpTraceLoggingProvider && tlgKeywordOn(VmpTraceLoggingProvider, 1i64) )
      VmpLogSparseSlatFill(v13, (INT64)v4, (unsigned int)FsContext);
    HvlMapSparseGpaPages(*((_QWORD *)NotifySync + 9), v6, (UINT64)FsContext, (INT64)v4, (INT64)a5);
  }
}

Referenced by:

VmpProcessUpdateSlat