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