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