MiProbeLockFrame
INT64 __fastcall MiProbeLockFrame(__int64 a1){
unsigned __int64 v1;
int v3;
_MMPTE *PteBase;
_MMPFN *PfnDb;
UINT64 v6;
_MMPFN *v7;
UINT8 v8;
unsigned __int16 v9;
UINT64 CurrentPrcb;
unsigned int v11;
__int64 v12;
__int64 v13;
bool v14;
int v15;
unsigned __int64 v16;
unsigned __int64 v17;
ULONG_PTR *v18;
signed __int32 v19;
signed __int32 v20;
int v21;
__int64 v22;
char v23;
int v24;
__int64 v25;
_MMPFN *v26;
INT64 result;
int v28;
__int64 v29;
RTL_BALANCED_NODE *Address;
int v31;
UINT8 PageIrql;
UINT64 SpinCount;
UINT64 v34;
v1 = *(_QWORD *)(a1 + 128);
if( v1 > 0xFFFFFFFFFi64 || (*((_QWORD *)MmGetPfnDb() + 6 * v1 + 5) & 0x4000000000000i64) == 0 )
{
if( !*(_QWORD *)(a1 + 80)
|| (Address = MiLocateAddress(*(_QWORD *)a1)) != 0i64
&& ((v31 = (int)Address[2].Children[0], (v31 & 0x70) == 64) || (v31 & 0x70) == 16) )
{
result = MiReferenceIoPages(0i64, *(_QWORD *)(a1 + 128), 1i64, 0i64, 0i64, 0i64);
if( (int)result >= 0 )
{
*(_WORD *)(*(_QWORD *)(a1 + 56) + 10i64) |= 0x800u;
return 0i64;
}
else
{
++dword_140C4E4DC;
}
}
else
{
++dword_140C4E4D8;
return 3221225477i64;
}
return result;
}
v3 = *(_DWORD *)(a1 + 64);
PageIrql = 17;
PteBase = MmGetPteBase();
PfnDb = MmGetPfnDb();
if( (v3 & 0xF) != 4
|| (v6 = *(_QWORD *)a1, (unsigned int)MI_IS_PHYSICAL_ADDRESS(*(PVOID *)a1))
|| (v7 = MiLockNonPagedPoolPte((_MMPTE *)((char *)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64)), &PageIrql),
v1 = (v7 - PfnDb) / 48,
*(_QWORD *)(a1 + 128) = v1,
!v7) )
{
v7 = (_MMPFN *)((char *)PfnDb + 48 * v1);
PageIrql = 17;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v7 + 3) < 0 );
}
}
v8 = *((_BYTE *)v7 + 34);
if( (v8 & 7u) <= 1 || (v9 = *((_WORD *)v7 + 16)) == 0 )
{
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( PageIrql != 17 )
__writecr8(PageIrql);
++dword_140C4E4CC;
return 3221225477i64;
}
if( v9 >= 0x7FFFu )
goto LABEL_71;
CurrentPrcb = *((_QWORD *)v7 + 5);
v11 = 1;
v12 = 1023i64;
if( (CurrentPrcb & 0x1000000000i64) == 0 && (CurrentPrcb & 0x2000000000000i64) == 0 )
{
v13 = *((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64;
if( v9 == 1 )
{
if( v13 )
goto LABEL_20;
}
else if( v9 != 2 || !v13 )
{
goto LABEL_37;
}
if( (v8 & 8) != 0 )
{
LABEL_20:
v14 = 0;
LOBYTE(v15) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)0x3FF);
if( v15 && (*((_DWORD *)v7 + 4) & 0x400i64) != 0 )
{
v14 = 1;
}
else
{
v8 = 0;
v17 = *((_QWORD *)v7 + 1) | 0x8000000000000000ui64;
if( v17 <= (unsigned __int64)PteBase + 0x3FFFFFFF78i64 && v17 >= (unsigned __int64)PteBase )
v14 = (*((_BYTE *)v7 + 35) & 0x20) != 0;
}
v18 = *(ULONG_PTR **)(qword_140C4E388 + 8 * (v12 & (v16 >> 39)));
if( !v14 || (unsigned int)MiChargeCommit((_MI_PARTITION *)v18, 1ui64, 8ui64) )
{
if( v18 == &MiSystemPartition )
{
CurrentPrcb = (UINT64)KeGetCurrentPrcb();
v19 = *(_DWORD *)(CurrentPrcb + 33564);
while( v19 )
{
if( v19 == -1 )
break;
v20 = v19;
v19 = _InterlockedCompareExchange((volatile signed __int32 *)(CurrentPrcb + 33564), v19 - 1, v19);
if( v20 == v19 )
goto LABEL_37;
}
}
v21 = MiChargePartitionResidentAvailable((INT64)v18, 1ui64, 0i64);
if( !v21 && v14 )
MiReturnCommit((_MI_PARTITION *)v18, 1ui64);
if( v21 )
goto LABEL_37;
}
LABEL_71:
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( PageIrql != 17 )
__writecr8(PageIrql);
++dword_140C4E4D0;
return 3221225633i64;
}
}
LABEL_37:
++*((_WORD *)v7 + 16);
if( (*((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
{
v22 = *((_QWORD *)v7 + 2);
if( (v22 & 0x400) == 0 && (v22 & 4) != 0 )
*(_BYTE *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) + 675i64) = 1;
}
v23 = *((_BYTE *)v7 + 34);
if( (v23 & 0x20) != 0 && (v23 & 8) == 0 && (*((_QWORD *)v7 + 3) & 0x3FFFFFFFFFFFFFFFi64) == 0 )
_InterlockedIncrement64((volatile signed __int64 *)(*(_QWORD *)v7 + 232i64));
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( PageIrql != 17 )
__writecr8(PageIrql);
if( (*(_DWORD *)(a1 + 64) & 0xF) == 1 )
{
CurrentPrcb = *((_QWORD *)v7 + 5);
if( (CurrentPrcb & 0x1000000000i64) == 0 && ((CurrentPrcb >> 60) & 7) != 1 )
{
CurrentPrcb &= 0xFFFFFFFFFui64;
if( CurrentPrcb != 0xFFFFFFFFDi64 && *(_QWORD *)(a1 + 136) != CurrentPrcb )
{
LOBYTE(v24) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)v12);
if( !v24 )
{
v26 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v25);
v11 = 2;
}
if( !(unsigned int)MiLockPageTablePage(v26, v11) )
{
LODWORD(v34) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v34);
while( *((__int64 *)v7 + 3) < 0 );
}
MiRemoveLockedPageChargeAndDecRef(v7);
_InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
++dword_140C4E4D4;
return 3221225633i64;
}
*(_QWORD *)(a1 + 136) = *((_QWORD *)v7 + 5) & 0xFFFFFFFFFi64;
*(_WORD *)(*(_QWORD *)(a1 + 56) + 10i64) |= 0x100u;
}
}
}
if( *(char *)(*(_QWORD *)(a1 + 56) + 10i64) < 0 )
{
LOBYTE(v28) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, (UNICODE_STRING *)CurrentPrcb, v8, (PWCHAR)v12);
if( v28 )
{
v29 = *((_QWORD *)v7 + 2);
if( (v29 & 0x400) != 0 )
{
if( qword_140C4DC80 && (v29 & 0x10) == 0 )
v29 &= ~qword_140C4DC80;
_InterlockedIncrement64((volatile signed __int64 *)(*(_QWORD *)(v29 >> 16) + 112i64));
}
}
}
if( ((*((_QWORD *)v7 + 5) >> 39) & 0x3FF) != 0 )
ExAcquireRundownProtectionCacheAware(
*(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) + 2144i64),
CurrentPrcb);
return 0i64;
}Referenced by:
MiProbeAndLockPages
MmProbeAndLockSelectedPages