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