MiLockPageTablePage
INT64 __fastcall MiLockPageTablePage(_MMPFN *a1, INT64 a2){
unsigned int v2;
int v3;
_MMPFN *v4;
_MMPFN *v5;
_MMPFN *PfnDb;
unsigned int v7;
unsigned __int64 v8;
UINT64 v9;
INT64 v10;
struct _KPRCB *CurrentPrcb;
UINT64 v12;
unsigned __int32 v13;
unsigned int i;
bool v15;
unsigned __int64 v16;
unsigned __int64 v17;
struct _KPRCB *v18;
__int64 v19;
signed __int32 v20;
char v22;
UINT64 v23;
char v24;
unsigned __int64 v25;
struct _KPRCB *v26;
__int64 v27;
signed __int32 v28;
INT64 v29;
INT64 v30;
INT64 v31;
INT64 v32;
INT64 v33;
INT64 v34;
INT64 v35;
INT64 v36;
UINT64 v37;
UINT64 SpinCount;
_MMPFN *v39;
v2 = 0;
v3 = a2;
v4 = a1;
if( (_DWORD)a2 == 1 )
{
v5 = a1;
}
else
{
v5 = 0i64;
if( !(_DWORD)a2 )
v5 = a1;
}
v39 = v5;
PfnDb = MmGetPfnDb();
v7 = 1;
while( 1 )
{
LABEL_6:
if( v3 == 1 )
v4 = (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v5 + 5) & 0xFFFFFFFFFi64));
if( (*((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
goto LABEL_18;
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v4 + 3) < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) );
PfnDb = MmGetPfnDb();
}
if( v3 == 1 && v4 != (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v5 + 5) & 0xFFFFFFFFFi64)) )
{
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
continue;
}
v8 = *((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64;
if( v8 >= 0x10000 )
break;
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_18:
if( v3 == 2 )
{
v9 = 3i64;
}
else
{
v9 = 1i64;
if( !v3 )
v9 = 4i64;
}
v10 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v4 + 5) >> 39) & 0x3FFi64));
if( (ULONG_PTR *)v10 == &MiSystemPartition )
{
CurrentPrcb = KeGetCurrentPrcb();
v12 = *((unsigned int *)CurrentPrcb + 8391);
if( v9 <= v12 )
{
do
{
if( (_DWORD)v12 == -1 )
break;
v13 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v12 - v9, v12);
v15 = (_DWORD)v12 == v13;
LODWORD(v12) = v13;
if( v15 )
goto LABEL_28;
}
while( v9 <= v13 );
}
}
if( !(unsigned int)MiChargePartitionResidentAvailable(v10, v9, 512i64) )
return 0i64;
LABEL_28:
for( i = 0; ; ++i )
{
v15 = i == v9;
if( i >= v9 )
goto LABEL_39;
LODWORD(v37) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v37);
while( *((__int64 *)v4 + 3) < 0 );
}
if( v3 == 1 )
{
PfnDb = MmGetPfnDb();
if( v4 != (_MMPFN *)((char *)PfnDb + 48 * (*((_QWORD *)v39 + 5) & 0xFFFFFFFFFi64)) )
break;
}
v16 = *((_QWORD *)v4 + 3) & 0x3FFFFFFFFFFFFFFFi64;
if( i )
{
if( v16 >= 0x3FFFFFFFFFFEFDFFi64 )
goto LABEL_56;
}
else if( v16 >= 0x3FFFFFFFFFFEFDFFi64 )
{
v7 = 0;
LABEL_38:
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
v15 = i == v9;
LABEL_39:
if( !v15 )
{
v17 = v9 - i;
if( (ULONG_PTR *)v10 == &MiSystemPartition )
{
v18 = KeGetCurrentPrcb();
v19 = *((int *)v18 + 8391);
if( (_DWORD)v19 != -1 )
{
if( v17 + v19 <= 0x100 )
{
do
{
if( v17 >= 0x80000 )
break;
v20 = _InterlockedCompareExchange((volatile signed __int32 *)v18 + 8391, v17 + v19, v19);
v15 = (_DWORD)v19 == v20;
LODWORD(v19) = v20;
if( v15 )
return v7;
}
while( v20 != -1 && v17 + v20 <= 0x100 );
}
if( (int)v19 > 192
&& (_DWORD)v19 != -1
&& (_DWORD)v19 == _InterlockedCompareExchange((volatile signed __int32 *)v18 + 8391, 192, v19) )
{
v17 += (int)v19 - 192;
}
}
}
if( v17 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 7168), v17);
}
return v7;
}
*((_QWORD *)v4 + 3) ^= ((v16 + 0x10000) ^ *((_QWORD *)v4 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
LABEL_56:
if( v16 >= 0x10000 )
goto LABEL_38;
v22 = *((_BYTE *)v4 + 34);
v23 = 0i64;
if( (v22 & 0x10) == 0 )
{
v24 = *((_BYTE *)v4 + 34);
if( (*((_DWORD *)v4 + 4) & 0x400i64) == 0 && (v22 & 8) == 0 )
{
v23 = MiCapturePageFileInfoInline((UINT64 *)v4 + 2, 1i64, 0i64);
v24 = *((_BYTE *)v4 + 34);
}
*((_BYTE *)v4 + 34) = v24 | 0x10;
}
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( v23 )
MiReleasePageFileInfo(v10, v23, 1, 0x7FFFFFFFFFFFFFFFi64, v29, v30, v31, v32, v33, v34, v35, v36);
v4 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * (*((_QWORD *)v4 + 5) & 0xFFFFFFFFFi64));
}
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
v25 = v9 - i;
if( (ULONG_PTR *)v10 == &MiSystemPartition )
{
v26 = KeGetCurrentPrcb();
v27 = *((int *)v26 + 8391);
if( (_DWORD)v27 != -1 )
{
if( v25 + v27 <= 0x100 )
{
do
{
if( v25 >= 0x80000 )
break;
v28 = _InterlockedCompareExchange((volatile signed __int32 *)v26 + 8391, v25 + v27, v27);
v15 = (_DWORD)v27 == v28;
v5 = v39;
LODWORD(v27) = v28;
if( v15 )
goto LABEL_6;
}
while( v28 != -1 && v25 + v28 <= 0x100 );
}
if( (int)v27 > 192
&& (_DWORD)v27 != -1
&& (_DWORD)v27 == _InterlockedCompareExchange((volatile signed __int32 *)v26 + 8391, 192, v27) )
{
v25 += (int)v27 - 192;
}
}
}
v5 = v39;
if( v25 )
_InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 7168), v25);
}
if( v8 < 0x3FFFFFFFFFFEFDFFi64 )
{
v2 = 1;
*((_QWORD *)v4 + 3) ^= (*((_QWORD *)v4 + 3) ^ (*((_QWORD *)v4 + 3) + 0x10000i64)) & 0x3FFFFFFFFFFFFFFFi64;
}
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
return v2;
}Referenced by:
MiBuildForkPte
MiLockPageTableRange
MiProbeLockFrame
NtLockVirtualMemory