VmpProcessUpdateSlat

NTSTATUS __stdcall VmpProcessUpdateSlat(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4, INT64 a5){
  __int64 v6; 
  char *v7; 
  int v8; 
  unsigned __int64 v9; 
  unsigned int v10; 
  unsigned __int64 *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  int v14; 
  int v15; 
  int v16; 
  __int64 v17; 
  char v19; 

  v6 = (unsigned int)a3;
  if( a4 )
  {
    v7 = *(char **)(a4 + 24);
    v8 = *(_DWORD *)a4;
  }
  else
  {
    v7 = &v19;
    v8 = 16;
  }
  v9 = 0i64;
  v10 = 0;
  if( a2 < a2 + 48 * v6 )
  {
    v11 = (unsigned __int64 *)(a2 + 32);
    v12 = (48 * v6 - 1) / 0x30ui64 + 1;
    do
    {
      v13 = *v11;
      if( (*v11 & 0x80000000000000i64) == 0 )
      {
        v14 = (v13 >> 51) & 2 | 0xD;
        if( (v13 & 0x20000000000000i64) == 0 )
          v14 = (v13 >> 51) & 2 | 1;
        v15 = v14 | 0x4000;
        if( (*v11 & 0x40000000000000i64) == 0 )
          v15 = v14;
        v16 = v15 | 0x20000;
        if( (_DWORD)a5 )
          v16 = v15;
        if( v10 != v16 || (_DWORD)v9 == v8 )
        {
          if( (_DWORD)v9 )
          {
            VmpFillSlat((PNOTIFY_SYNC)a1, (PLIST_ENTRY)v10, (PVOID)v9);
            v13 = *v11;
            LODWORD(v9) = 0;
          }
          v10 = v16;
        }
        v17 = 2i64 * (unsigned int)v9;
        v9 = (unsigned int)(v9 + 1);
        *(_QWORD *)&v7[8 * v17] = v13 & 0xFFFFFFFFFFFFFi64;
        *(_QWORD *)&v7[8 * v17 + 8] = v11[1];
      }
      v11 += 6;
      --v12;
    }
    while( v12 );
    if( (_DWORD)v9 )
      VmpFillSlat((PNOTIFY_SYNC)a1, (PLIST_ENTRY)v10, (PVOID)v9);
  }
  return 0;
}

Referenced by:

VmpAccessFaultBatch