IopProcessIoTracking

VOID __stdcall IopProcessIoTracking(UINT64 ElapsedTime, UINT64 DeviceType){
  char v2; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v4; 
  __int64 v5; 
  unsigned __int8 v6; 
  __int64 v7; 
  __int64 v8; 
  int SessionId; 
  bool v10; 
  __int64 i; 
  unsigned int v12; 
  _QWORD v13[3]; 
  v13[0] = 24i64;
  v2 = 0;
  v13[1] = ElapsedTime;
  v13[2] = (unsigned int)DeviceType;
  if( KeGetCurrentIrql() < 2u )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    v2 = 1;
  }
  v12 = 0;
  v4 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v4 + 243);
  if( ++*((_BYTE *)v4 + 794) != 1 )
  {
    v5 = 0i64;
    goto LABEL_5;
  }
  v6 = *((_BYTE *)v4 + 792);
  if( !v6 )
  {
    if( !*((_BYTE *)v4 + 870) )
    {
      v5 = 0i64;
      goto LABEL_5;
    }
    v7 = *((unsigned __int8 *)v4 + 870);
    *((_BYTE *)v4 + 870) = 0;
    v6 = v7 | *((_BYTE *)v4 + 792);
  }
  _BitScanForward((unsigned int *)&v8, v6);
  *((_BYTE *)v4 + 792) = v6 & ~(1 << v8);
  v5 = *((_QWORD *)v4 + 100) + 96 * v8;
  if( !v5 )
  {
LABEL_5:
    _interlockedbittestandset((volatile signed __int32 *)v4 + 30, 0x10u);
    goto LABEL_16;
  }
  if( (unsigned __int64)&IopPerfIoTrackingLock >= 0xFFFF800000000000ui64
    && *((_BYTE *)&antNameB + (((unsigned __int64)&IopPerfIoTrackingLock >> 39) & 0x1FF) - 256) == 1 )
  {
    SessionId = MmGetSessionIdEx(*((_QWORD *)v4 + 23));
  }
  else
  {
    SessionId = -1;
  }
  *(_DWORD *)(v5 + 40) = SessionId;
  *(_QWORD *)(v5 + 32) = (unsigned __int64)&IopPerfIoTrackingLock & 0x7FFFFFFFFFFFFFFCi64;
LABEL_16:
  --*((_BYTE *)v4 + 794);
  KiAbThreadRemoveBoosts((ULONG_PTR)v4, (__int64)&IopPerfIoTrackingLock, &v12);
  v10 = (*((_WORD *)v4 + 243))++ == 0xFFFF;
  if( v10 && *((_ETHREAD **)v4 + 19) != (_ETHREAD *)((char *)v4 + 152) )
    KiCheckForKernelApcDelivery();
  if( !_InterlockedCompareExchange64((volatile signed __int64 *)&IopPerfIoTrackingLock, 17i64, 0i64)
    || ExfTryAcquirePushLockShared(&IopPerfIoTrackingLock) )
  {
    if( v5 )
      *(_BYTE *)(v5 + 26) |= 1u;
    for( i = IopPerfIoTrackingListHead; (__int64 *)i != &IopPerfIoTrackingListHead; i = *(_QWORD *)i )
      (*(void(__fastcall **)(_QWORD *))(i + 16))(v13);
    if( _InterlockedCompareExchange64((volatile signed __int64 *)&IopPerfIoTrackingLock, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)&IopPerfIoTrackingLock);
    KeAbPostRelease(&IopPerfIoTrackingLock);
  }
  else if( v5 )
  {
    KeAbPostReleaseEx(&IopPerfIoTrackingLock, (PVOID)v5);
  }
  if( v2 == 1 )
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}

Referenced by:

IopPerfCompleteRequest