VmpAccessFaultBatchResolve
INT64 __fastcall VmpAccessFaultBatchResolve(_QWORD *a1, UINT64 a2, INT64 a3, CHAR a4, CHAR a5, INT64 a6){
CHAR v6;
__int64 v8;
char *v9;
unsigned int v10;
int v11;
int v12;
int v13;
int v14;
int v15;
_QWORD *v16;
unsigned int v17;
__int64 v18;
_QWORD *i;
__int64 v20;
INT64 v21;
__int64 v22;
INT64 result;
char *v24;
unsigned int PageFrameNumber;
int PageFrameNumber_4;
int v27;
_QWORD *v29;
__int64 VirtualAddress;
__int64 v31;
char v32;
v31 = 0i64;
v6 = a4;
v8 = (unsigned int)a2;
if( a3 )
{
v9 = *(char **)(a3 + 16);
v10 = *(_DWORD *)a3;
}
else
{
v9 = &v32;
v10 = 16;
}
v11 = v6 & 1 | 2;
v12 = v6 & 2;
if( (v6 & 2) == 0 )
v11 = v6 & 1;
v27 = v6 & 4;
if( (v6 & 4) != 0 )
v11 |= 1u;
v13 = v11 | 8;
if( (v6 & 8) == 0 )
v13 = v11;
v14 = v13 | 0x10;
if( (v6 & 0x10) == 0 )
v14 = v13;
PageFrameNumber_4 = v6 & 0x20;
v15 = v14 | 0x20;
if( (v6 & 0x20) == 0 )
v15 = v14;
v16 = &a1[6 * v8];
PageFrameNumber = v15;
v17 = 0;
v29 = v16;
while( a1 < v16 )
{
v18 = a1[3] & 0xFFFFFFFFFFFFFi64;
VirtualAddress = a1[3] << 12;
if( !v17 )
{
v17 = 1;
for( i = a1 + 6; i < v16; i += 6 )
{
if( v17 >= v10 )
break;
v20 = i[3] & 0xFFFFFFFFFFFFFi64;
if( v20 != v18 + 1 )
break;
v18 = v20;
++v17;
}
if( (v6 & 0x40) != 0 && v17 == 512 && !MmGetNodeFastLargePageCounts((INT64)i, (unsigned int)(a6 - 1)) )
MmBuildLargePages(v21, (unsigned int)(a6 - 1));
}
v22 = 8i64 * v17;
v31 = v17 << 12;
memset((INT64)v9, 0i64);
LODWORD(result) = MmVirtualAccessFault(&VirtualAddress, (UINT64)v9, (UINT64 *)PageFrameNumber);
if( (int)result >= 0 )
{
v24 = v9;
if( v9 < &v9[v22] )
{
do
{
if( (*(_QWORD *)v24 & 0x10000000000000i64) == 0 )
break;
a1[5] = *(_QWORD *)v24 & 0xFFFFFFFFFFFFFi64;
if( v12 || (*(_QWORD *)v24 & 0x20000000000000i64) != 0 && (a5 & 2) != 0 )
a1[4] |= 0x10000000000000ui64;
if( v27 )
a1[4] |= 0x20000000000000ui64;
if( (*(_QWORD *)v24 & 0x80000000000000i64) != 0 )
a1[4] |= 0x40000000000000ui64;
v24 += 8;
a1 += 6;
--v17;
}
while( v24 < &v9[v22] );
v6 = a4;
v16 = v29;
}
}
else
{
if( !PageFrameNumber_4 )
return result;
a1[4] |= 0x100000000000000ui64;
a1 += 6;
v17 = 0;
v10 = 1;
}
}
return 0i64;
}Referenced by:
VmpAccessFaultBatch