MmUpdateMdlTracker
NTSTATUS __stdcall MmUpdateMdlTracker(_MDL *MemoryDescriptorList, VOID *CallingAddress, VOID *CallersCaller){
_EPROCESS *Process;
char *LockedPagesList;
_KLOCK_QUEUE_HANDLE LockHandle;
Process = MemoryDescriptorList->Process;
LockHandle.LockQueue = 0i64;
if( !Process )
Process = PsInitialSystemProcess;
*(_QWORD *)&LockHandle.OldIrql = 0i64;
LockedPagesList = (char *)Process->LockedPagesList;
if( !LockedPagesList )
return 0;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)LockedPagesList + 3, &LockHandle);
LABEL_5:
for( LockedPagesList = *(char **)LockedPagesList;
LockedPagesList;
LockedPagesList = (char *)*((_QWORD *)LockedPagesList + 1) )
{
if( (unsigned __int64)MemoryDescriptorList < *((_QWORD *)LockedPagesList + 3) )
goto LABEL_5;
if( (unsigned __int64)MemoryDescriptorList <= *((_QWORD *)LockedPagesList + 3) )
{
if( CallingAddress || CallersCaller )
{
*((_QWORD *)LockedPagesList + 9) = CallingAddress;
*((_QWORD *)LockedPagesList + 10) = CallersCaller;
*(_OWORD *)(LockedPagesList + 88) = 0i64;
*(_OWORD *)(LockedPagesList + 104) = 0i64;
*(_OWORD *)(LockedPagesList + 120) = 0i64;
}
break;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return LockedPagesList != 0;
}Referenced by:
IopProbeAndLockPages
IopProbeAndLockPages_0
IopProbeAndLockPages_1
IopProbeAndLockPages_2
NtWriteFile
NtWriteFileGather