MmUpdateMdlTrackerForMdlSwitch
NTSTATUS __stdcall MmUpdateMdlTrackerForMdlSwitch(PVOID BugCheckParameter3){
int v1;
int v2;
NTSTATUS result;
_EPROCESS *v5;
__int64 v6;
_QWORD *i;
_BOOL8 v8;
PVOID v9;
unsigned __int64 *v10;
INT64(__stdcall *v11)(UINT64, INT64);
unsigned __int64 v12;
_QWORD *v13;
int v14;
_QWORD *v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
v2 = v1;
result = MmTrackLockedPages;
if( (MmTrackLockedPages & 1) == 0 )
return result;
v5 = (_EPROCESS *)*((_QWORD *)BugCheckParameter3 + 2);
if( !v5 )
v5 = (_EPROCESS *)PsInitialSystemProcess;
v6 = *((_QWORD *)v5 + 193);
if( !v6 )
return result;
KeAcquireInStackQueuedSpinLock((UINT64 *)(v6 + 24), &LockHandle);
if( !v2 )
{
i = *(_QWORD **)(v6 + 8);
if( !i )
{
LABEL_22:
if( *(_DWORD *)(v6 + 32) )
KeBugCheckEx(0x76u, 9ui64, (ULONG_PTR)BugCheckParameter3, *((_QWORD *)v5 + 160), *((_QWORD *)v5 + 193));
goto LABEL_30;
}
v12 = *((_QWORD *)BugCheckParameter3 + 6);
while( 1 )
{
if( v12 < i[8] )
{
i = (_QWORD *)*i;
}
else
{
if( v12 <= i[8] )
{
i[3] = BugCheckParameter3;
MiValidateMdlTracker(i);
RtlAvlRemoveNode((unsigned __int64 *)(v6 + 8), i);
v10 = (unsigned __int64 *)v6;
v11 = MiLockTrackerCompare;
v9 = BugCheckParameter3;
goto LABEL_25;
}
i = (_QWORD *)i[1];
}
if( !i )
goto LABEL_22;
}
}
for( i = *(_QWORD **)v6; ; i = (_QWORD *)i[1] )
{
while( 1 )
{
if( !i )
{
if( *(_DWORD *)(v6 + 32) )
KeBugCheckEx(0x76u, 8ui64, (ULONG_PTR)BugCheckParameter3, *((_QWORD *)v5 + 160), *((_QWORD *)v5 + 193));
goto LABEL_30;
}
if( (unsigned __int64)BugCheckParameter3 >= i[3] )
break;
i = (_QWORD *)*i;
}
if( (unsigned __int64)BugCheckParameter3 <= i[3] )
break;
}
MiValidateMdlTracker(i);
i[3] &= ~0x8000000000000000ui64;
RtlAvlRemoveNode((unsigned __int64 *)v6, i);
v9 = (PVOID)*((_QWORD *)BugCheckParameter3 + 6);
v10 = (unsigned __int64 *)(v6 + 8);
v11 = MiLockSwitchedMdlTrackerCompare;
LABEL_25:
v13 = (_QWORD *)*v10;
LOBYTE(v8) = 0;
if( !*v10 )
goto LABEL_29;
while( 1 )
{
v14 = ((__int64(__fastcall *)(PVOID, _QWORD *, _BOOL8))v11)(v9, v13, v8);
if( v14 <= 0 )
break;
v15 = (_QWORD *)v13[1];
if( !v15 )
{
LOBYTE(v8) = 1;
goto LABEL_29;
}
LABEL_34:
v13 = v15;
}
if( v14 >= 0 )
KeBugCheckEx(0xD9u, 2ui64, (ULONG_PTR)v13, (ULONG_PTR)BugCheckParameter3, *(_QWORD *)(v6 + 16));
v15 = (_QWORD *)*v13;
if( *v13 )
goto LABEL_34;
LOBYTE(v8) = 0;
LABEL_29:
RtlAvlInsertNodeEx(v10, (__int64)v13, v8, i);
LABEL_30:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
return result;
}Referenced by:
VmProbeAndLockPages
VmUnlockPages