MiRemovePteTracker

VOID __stdcall MiRemovePteTracker(_MDL *MemoryDescriptorList, VOID *VirtualAddress, UINT64 NumberOfPtes){
  _SLIST_ENTRY *v5; 
  __int64 v6; 
  void *v7; 
  _SLIST_ENTRY *v8; 
  _SLIST_ENTRY *Next; 
  unsigned __int64 v10; 
  _MDL *v11; 
  void *v12; 
  _SLIST_ENTRY *v13; 
  _SLIST_ENTRY **v14; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = 0i64;
  v6 = 40543i64 * (unsigned int)((unsigned __int64)VirtualAddress >> 12);
  v7 = (void *)((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64);
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 412, &LockHandle);
  v8 = (_SLIST_ENTRY *)((char *)&stru_140C4DB30 + 16 * (((unsigned __int8)v6 ^ BYTE4(v6)) & 0xF) + 6720);
  Next = v8->Next;
  if( v8->Next == v8 )
    goto LABEL_16;
  do
  {
    v10 = (unsigned __int64)Next[2].Next;
    if( v7 == (void *)(v10 & 0xFFFFFFFFFFFFF000ui64) )
    {
      if( v5 )
        KeBugCheckEx(0xDAu, (PVOID)1, Next, MemoryDescriptorList, v5);
      if( *((_QWORD *)&Next[1].Next + 1) != NumberOfPtes )
        KeBugCheckEx(0xDAu, (PVOID)2, Next, *((PVOID *)&Next[1].Next + 1), (PVOID)NumberOfPtes);
      if( MemoryDescriptorList && (MemoryDescriptorList->MdlFlags & 0x200) == 0 )
      {
        v11 = (_MDL *)*((_QWORD *)&Next[3].Next + 1);
        if( v11 != MemoryDescriptorList[1].Next )
          KeBugCheckEx(0xDAu, (PVOID)4, Next, v11, MemoryDescriptorList[1].Next);
        if( !*(&stru_140C4DB30 + 3940) )
        {
          if( (void *)v10 != MemoryDescriptorList->MappedSystemVa )
            KeBugCheckEx(0xDAu, (PVOID)3, Next, (PVOID)v10, MemoryDescriptorList->MappedSystemVa);
          v12 = (void *)*((_QWORD *)&Next[2].Next + 1);
          if( v12 != MemoryDescriptorList->StartVa )
            KeBugCheckEx(0xDAu, (PVOID)5, Next, v12, MemoryDescriptorList->StartVa);
        }
      }
      v13 = Next->Next;
      v14 = (_SLIST_ENTRY **)*((_QWORD *)&Next->Next + 1);
      if( *(&Next->Next->Next + 1) != Next || *v14 != Next )
        __fastfail(3u);
      *v14 = v13;
      v5 = Next;
      *((_QWORD *)&v13->Next + 1) = v14;
    }
    Next = Next->Next;
  }
  while( Next != v8 );
  if( !v5 )
  {
LABEL_16:
    if( !*(&stru_140C4DB30 + 3533) )
      KeBugCheckEx(0xDAu, (PVOID)6, MemoryDescriptorList, v7, (PVOID)NumberOfPtes);
  }
  *(&stru_140C4DB30 + 872) -= NumberOfPtes;
  --*(&stru_140C4DB30 + 873);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v5 )
    RtlpInterlockedPushEntrySList((PSLIST_HEADER)&stru_140C4DB30 + 205, v5);
}

Referenced by:

MmFreeMappingAddress
MmUnlockPages
MmUnmapIoSpace
MmUnmapLockedPages