MiFreeMdlTracker
NTSTATUS __stdcall MiFreeMdlTracker(ULONG_PTR MemoryDescriptorList, UINT64 NumberOfPages){
PEPROCESS v2;
void *v4;
unsigned __int64 *LockedPagesList;
VOID *v6;
_QWORD *v7;
_KLOCK_QUEUE_HANDLE LockHandle;
v2 = *(PEPROCESS *)(*(_QWORD *)&MemoryDescriptorList + 16i64);
v4 = *(void **)&MemoryDescriptorList;
memset(&LockHandle, 0, sizeof(LockHandle));
if( v2 || (v2 = PsInitialSystemProcess) != 0i64 )
{
LockedPagesList = (unsigned __int64 *)v2->LockedPagesList;
if( LockedPagesList )
{
v6 = 0i64;
KeAcquireInStackQueuedSpinLock(LockedPagesList + 3, &LockHandle);
v7 = (_QWORD *)*LockedPagesList;
while( v7 )
{
if( (unsigned __int64)v4 < v7[3] )
{
v7 = (_QWORD *)*v7;
}
else
{
if( (unsigned __int64)v4 <= v7[3] )
{
v6 = v7;
MiValidateMdlTracker(v7);
RtlAvlRemoveNode(LockedPagesList, v7);
LockedPagesList[2] -= NumberOfPages;
break;
}
v7 = (_QWORD *)v7[1];
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( v6 )
{
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&stru_140C4DB30 + 3152), v6);
}
else if( *((_DWORD *)LockedPagesList + 8) )
{
KeBugCheckEx(0x76u, (PVOID)1, v4, (PVOID)v2->NumberOfLockedPages, v2->LockedPagesList);
}
}
}
return 1;
}Referenced by:
MmUnlockPages