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