IopCleanupFileObjectIosbRange
void __fastcall IopCleanupFileObjectIosbRange(__int64 a1){
PMDL *v2;
__int64 v3;
__int64 v4;
PMDL *v5;
PMDL v6;
PMDL v7;
void *Buffer[3];
Buffer[1] = 0i64;
Buffer[0] = *(void **)(a1 + 32);
v2 = 0i64;
ObfDereferenceObjectWithTag(Buffer[0], 0x70436F49ui64);
*(_QWORD *)(a1 + 32) = 0i64;
ExAcquireFastMutex(&IoStatusBlockRangeTableLock);
LODWORD(v3) = RtlLookupElementGenericTableAvl((RTL_AVL_TABLE *)IoStatusBlockRangeTable, Buffer);
v4 = v3;
v5 = *(PMDL **)(v3 + 8);
if( v5 )
{
while( *(PMDL *)(a1 + 16) != v5[3] )
{
v2 = v5;
v5 = (PMDL *)v5[5];
if( !v5 )
goto LABEL_6;
}
--*(_DWORD *)v5;
}
LABEL_6:
if( !*(_DWORD *)v5 )
{
v6 = v5[4];
if( v6 )
MmUnmapLockedPages(v6, v5[3]);
MmUnlockPages(v5[3]);
IoFreeMdl(v5[3]);
v7 = v5[5];
if( v2 )
v2[5] = v7;
else
*(_QWORD *)(v4 + 8) = v7;
ExFreePoolWithTag(v5, 0);
if( !*(_QWORD *)(v4 + 8) )
RtlDeleteElementGenericTableAvl((RTL_AVL_TABLE *)IoStatusBlockRangeTable, Buffer);
}
KeReleaseGuardedMutex(&IoStatusBlockRangeTableLock);
}Referenced by:
IopCleanupProcessResources