HvpViewMapMakeViewRangeCOWByCaller
INT64 __fastcall HvpViewMapMakeViewRangeCOWByCaller(UINT64 a1, _QWORD *a2, INT64 a3, INT64 a4){
INT64 v4;
UINT64 v8;
int v9;
INT64 v10;
__int64 v11;
__int64 v12;
unsigned __int64 v13;
VOID *v14;
UINT64 v16;
UINT64 NewAccessProtection;
UINT64 NewAccessProtectiona;
INT64 a6;
LODWORD(a6) = 0;
v4 = a3;
LODWORD(NewAccessProtection) = 8;
v9 = CmSiProtectViewOfSection(
a1,
*(VOID ***)(a1 + 24),
(VOID *)(a2[7] + a3 - a2[3]),
a4 - a3,
NewAccessProtection,
(INT64)&a6);
if( v9 >= 0 )
{
v10 = v4;
if( v4 >= a4 )
{
return 0;
}
else
{
while( 1 )
{
v11 = a2[3];
if( (*((_BYTE *)a2 + ((unsigned __int64)(v10 - v11) >> 12) + 72) & 2) == 0 )
{
v9 = HvpViewMapTouchPages((BYTE *)(a2[7] + v10 - v11), 4096i64, 1);
if( v9 < 0 )
break;
}
v10 += 4096i64;
if( v10 >= a4 )
{
while( v4 < a4 )
{
v12 = a2[3];
v13 = (unsigned __int64)(v4 - v12) >> 12;
v14 = (VOID *)(a2[7] + v4 - v12);
LOBYTE(v12) = *((_BYTE *)a2 + v13 + 72) | 0xA;
*((_BYTE *)a2 + v13 + 72) = v12;
if( (v12 & 0x10) != 0 )
{
CmSiUnlockViewOfSection(v8, *(VOID ***)(a1 + 24), v14, 0x1000ui64);
*((_BYTE *)a2 + v13 + 72) &= ~0x10u;
--a2[8];
*((_BYTE *)a2 + v13 + 72) |= 4u;
}
v4 += 4096i64;
}
return 0;
}
}
do
{
v16 = a2[3];
if( (*((_BYTE *)a2 + ((v4 - v16) >> 12) + 72) & 6) == 0 )
{
LODWORD(NewAccessProtectiona) = -2147483646;
CmSiProtectViewOfSection(
v16,
*(VOID ***)(a1 + 24),
(VOID *)(a2[7] + v4 - v16),
0x1000ui64,
NewAccessProtectiona,
(INT64)&a6);
}
v4 += 4096i64;
}
while( v4 < a4 );
}
}
return(unsigned int)v9;
}Referenced by:
HvpViewMapCOWAndUnsealRange