MiUpdatePrivateDemandZeroView
INT64 __fastcall MiUpdatePrivateDemandZeroView(INT64 a1, INT64 a2, INT64 a3){
__int64 v3;
__int64 v4;
INT64 v5;
INT64 v6;
UINT64 v7;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
_MMPTE *ProtoPteAddress;
unsigned __int64 v12;
_SUBSECTION *v13;
UINT64 v14;
unsigned __int64 v15;
_MMPTE *v16;
bool v17;
unsigned int v18;
int v19;
__int64 v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 v23;
unsigned int v24;
INT64 v25;
INT64 v26;
UINT64 v27;
INT64 v28;
UINT8 v29;
_MMPTE *PteBase;
INT64 v31;
__int64 v32;
_SUBSECTION *v34;
INT64 v35;
PVOID OpaquePointer;
INT64 v37;
unsigned __int64 v38;
unsigned __int64 v39;
UINT8 v40;
int v42;
_MMPTE *v43;
v42 = a3;
v3 = *(unsigned int *)(a2 + 24);
v4 = *(unsigned __int8 *)(a2 + 32);
v34 = 0i64;
v5 = a2;
v35 = a1 + 1664;
v6 = 0i64;
v7 = v3 | (v4 << 32);
v8 = (unsigned __int64)*(unsigned __int8 *)(a2 + 33) << 32;
v9 = *(unsigned int *)(a2 + 28);
v37 = 0i64;
v10 = v9 | v8;
ProtoPteAddress = MiGetProtoPteAddress((_MMVAD *)a2, v7, 6ui64, &v34);
v43 = ProtoPteAddress;
v12 = *(_QWORD *)(v5 + 80) + 8 * (v10 - v7);
v38 = v12;
v13 = v34;
v14 = (UINT64)MmGetPteBase() + 8 * (v7 & 0xFFFFFFFFFi64);
while( 1 )
{
if( !v13 )
return v6;
v15 = v12;
v16 = (_MMPTE *)*((_QWORD *)v13 + 1);
if( (unsigned __int64)v16 + 8 * *((unsigned int *)v13 + 11) - 8 <= v12 )
v15 = (unsigned __int64)v16 + 8 * *((unsigned int *)v13 + 11) - 8;
v17 = (*((_BYTE *)v13 + 34) & 2) == 0;
v39 = v15;
if( v17 )
{
v18 = *((unsigned __int16 *)v13 + 16);
if( (v18 & 8) == 0 || (v18 & 0xA) == 10 )
{
v19 = *((_DWORD *)v13 + 10);
if( v19 )
v16 = (_MMPTE *)((char *)v16 + 8 * ((unsigned __int64)(unsigned int)((v19 << 9) - 1) >> 12) + 8);
if( (unsigned __int64)v16 <= v15 )
break;
}
}
LABEL_40:
v32 = 8i64 * (unsigned int)((__int64)(v15 - (_QWORD)ProtoPteAddress + 8) >> 3);
ProtoPteAddress = (_MMPTE *)((char *)ProtoPteAddress + v32);
v14 += v32;
v43 = ProtoPteAddress;
if( (unsigned __int64)ProtoPteAddress > v12 )
return v6;
v13 = (_SUBSECTION *)*((_QWORD *)v13 + 2);
v34 = v13;
}
if( ProtoPteAddress < v16 )
{
v43 = v16;
v20 = v16 - ProtoPteAddress;
ProtoPteAddress = v16;
v14 += 8 * (v20 >> 3);
}
if( (unsigned __int64)ProtoPteAddress <= v12 )
{
v21 = 0i64;
if( (unsigned __int64)ProtoPteAddress <= v15 )
{
do
{
v22 = MI_READ_PTE_LOCK_FREE((INT64)ProtoPteAddress);
if( (v22 & 1) != 0 )
{
LODWORD(v23) = v18 >> 1;
}
else
{
if( !v22 )
break;
v23 = v22 >> 5;
}
if( (v23 & 0x1F) == 24 )
break;
v21 = (unsigned int)(v21 + 1);
ProtoPteAddress = (_MMPTE *)((char *)ProtoPteAddress + 8);
}
while( (unsigned __int64)ProtoPteAddress <= v15 );
v12 = v38;
v43 = ProtoPteAddress;
}
if( (v18 & 0xA) != 10 )
{
v6 += (unsigned int)v21;
v37 = v6;
}
if( !v42 || !(_DWORD)v21 )
{
v14 += 8 * v21;
goto LABEL_40;
}
v24 = v18 >> 1;
if( (v18 & 8) != 0 )
LOBYTE(v24) = v24 & 2 | 4;
v25 = MiSwizzleInvalidPte(32i64 * (v24 & 0x1F));
v26 = v35;
v27 = 0i64;
OpaquePointer = 0i64;
v28 = v25;
v29 = MiLockWorkingSetShared(v35);
v40 = v29;
while( 1 )
{
if( !v27 )
goto LABEL_31;
if( (v14 & 0xFFF) == 0 )
break;
LABEL_35:
*(_QWORD *)v14 = v28;
MiIncreaseUsedPtesCount(OpaquePointer, 1ui64);
v5 = a2;
v14 += 8i64;
LODWORD(v21) = v21 - 1;
if( !(_DWORD)v21 )
{
ProtoPteAddress = v43;
v15 = v39;
v31 = v35;
if( v27 )
MiUnlockPageTableInternal(v35, v27);
MiUnlockWorkingSetShared(v31, v40);
v12 = v38;
v13 = v34;
v6 = v37;
v5 = a2;
goto LABEL_40;
}
}
MiUnlockPageTableInternal(v26, v27);
LABEL_31:
if( MiWorkingSetIsContended(v26) || KeShouldYieldProcessor() )
{
MiUnlockWorkingSetShared(v26, v29);
MiLockWorkingSetShared(v26);
}
MiMakeSystemAddressValid(v14, 0i64, (*(_DWORD *)(v5 + 48) >> 12) & 0x3F, v29, 0);
PteBase = MmGetPteBase();
OpaquePointer = MiGetUsedPtesHandle((__int64)((v14 << 25) - ((_QWORD)PteBase << 25)) >> 16);
v27 = (UINT64)PteBase + ((v14 >> 9) & 0x7FFFFFFFF8i64);
goto LABEL_35;
}
return v6;
}Referenced by:
MiMapViewOfImageSection