KeCleanupImageTracepoints

VOID __stdcall KeCleanupImageTracepoints(
        UINT64 SessionId,
        UINT64 LastInputTime,
        POWER_SESSION_TIMEOUTS *SessionTimeouts){
  unsigned __int64 v4; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v6; 
  void **v7; 
  unsigned __int64 v8; 
  void **v9; 
  void **v10; 
  void *v11; 
  int v12[14]; 

  if( qword_140CFBBD0 )
    qword_140CFBBD0(SessionId, LastInputTime, SessionTimeouts);
  if( KiTpHashTable )
  {
    v4 = *(_QWORD *)(SessionId + 48);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v6 = v4 + *(unsigned int *)(SessionId + 64) - 1i64;
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx(&KiTpStateLock, 0i64);
    v7 = (void **)(KiTpHashTable + 8 * ((v4 >> 4) & 0x3FFF));
    v8 = KiTpHashTable + 8 * ((v6 >> 4) & 0x3FFF);
    while( (unsigned __int64)v7 <= v8 )
    {
      v9 = (void **)*v7;
      v10 = v7;
      while( v9 )
      {
        v11 = v9[1];
        if( (unsigned __int64)v11 < v4 || (unsigned __int64)v11 > v6 )
        {
          v10 = v9;
        }
        else
        {
          if( *((_BYTE *)v9 + 48) )
          {
            if( !--KiTpEnabledCount )
              _InterlockedAnd(&KiDynamicTraceMask, 0xFFFFFFFD);
          }
          *v10 = *v9;
          _InterlockedOr(v12, 0);
          --KiTpRegisteredCount;
          while( KiTpActiveTrapsCount )
            _mm_pause();
          ExFreePoolWithTag(v9, 0x70727446u);
        }
        v9 = (void **)*v10;
      }
      ++v7;
    }
    if( (_InterlockedExchangeAdd64(&KiTpStateLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&KiTpStateLock);
    KeAbPostRelease(&KiTpStateLock);
    KeLeaveCriticalRegion();
  }
}

Referenced by:

No references.