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