MiPreparePhysicalPagesMdlForFree
INT64 __fastcall MiPreparePhysicalPagesMdlForFree(INT64 a1, UINT64 a2){
_QWORD *v2;
unsigned __int64 v3;
_QWORD *v4;
UINT64 v5;
unsigned int v6;
__int64 v7;
unsigned __int64 v8;
unsigned __int8 CurrentIrql;
char *v10;
INT64 result;
UINT64 SpinCount;
*(_DWORD *)(a1 + 44) = 0;
v2 = (_QWORD *)(a1 + 48);
if( a2 == 1 )
{
v6 = *(_DWORD *)(a1 + 40);
}
else
{
v3 = (unsigned __int64)*(unsigned int *)(a1 + 40) >> 12;
v4 = &v2[a2 * v3];
do
{
--v3;
v4 -= a2;
v5 = 1i64;
*v4 = v2[v3];
if( a2 > 1 )
{
do
{
v4[v5] = v4[v5 - 1] + 1i64;
++v5;
}
while( v5 < a2 );
}
}
while( v3 );
v6 = a2 * *(_DWORD *)(a1 + 40);
*(_DWORD *)(a1 + 40) = v6;
}
v7 = 0i64;
v8 = (unsigned __int64)v6 >> 12;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
for( ; v8; --v8 )
{
v10 = (char *)MmGetPfnDb() + 48 * *v2;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v10 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v10 + 3) < 0 );
}
*((_QWORD *)v10 + 3) = *((_QWORD *)v10 + 3) & 0x8000000000000000ui64 | 1;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( (++v7 & 0x3F) == 0 && KeShouldYieldProcessor() )
{
__writecr8(CurrentIrql);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
++v2;
}
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
NtFreeUserPhysicalPages