EtwpCoverageSamplerStop

VOID __fastcall EtwpCoverageSamplerStop(INT64 a1){
  _ETHREAD *CurrentThread; 
  struct _DMA_ADAPTER *v2; 
  int v4; 
  _ETHREAD *v5; 
  _ETHREAD *v6; 
  union SLIST_HEADER *v7; 
  int v8; 
  INT64 v9; 
  void *i; 
  INT64 v11; 
  _ETHREAD *v12; 
  __int64 NextProcess; 
  void *v14; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 0i64;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&EtwpCovSampGlobals, 0i64);
  qword_140C196A8 = (__int64)KeGetCurrentThread();
  if( qword_140C196B8 == a1 )
  {
    v4 = *(_DWORD *)(a1 + 1216);
    if( (v4 & 2) == 0 )
    {
      *(_DWORD *)(a1 + 1216) = v4 | 2;
      qword_140C196A8 = 0i64;
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EtwpCovSampGlobals, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)&EtwpCovSampGlobals);
      KeAbPostRelease(&EtwpCovSampGlobals);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)&stru_140C196C0);
      ExRundownCompleted((EX_RUNDOWN_REF *)&stru_140C196C0);
      v5 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v5 + 242);
      ExAcquirePushLockExclusiveEx((UINT64)&EtwpCovSampGlobals, 0i64);
      v6 = (_ETHREAD *)KeGetCurrentThread();
      v2 = (struct _DMA_ADAPTER *)qword_140C196B8;
      qword_140C196B8 = 0i64;
      v7 = (union SLIST_HEADER *)StartContext;
      qword_140C196A8 = (__int64)v6;
      v8 = *(_DWORD *)(a1 + 1148);
      if( (v8 & 8) != 0 )
      {
        KeStopProfile(StartContext + 16);
        *(_DWORD *)(a1 + 1148) &= ~8u;
        v8 = *(_DWORD *)(a1 + 1148);
      }
      if( (v8 & 2) != 0 )
      {
        PsRemoveLoadImageNotifyRoutine(EtwpCovSampImageNotify);
        *(_DWORD *)(a1 + 1148) &= ~2u;
        v8 = *(_DWORD *)(a1 + 1148);
      }
      if( (v8 & 4) != 0 )
      {
        v9 = EtwpHostSiloState;
        *(_DWORD *)(EtwpHostSiloState + 4552) &= 0xFFFFFDFB;
        *(_DWORD *)(v9 + 4548) &= 0xFFFFEFFB;
        EtwpUpdateGlobalGroupMasks(v9, 0i64, 9ui64);
        *(_DWORD *)(a1 + 1148) &= ~4u;
      }
      for( i = 0i64; ; i = v14 )
      {
        NextProcess = PsGetNextProcess(i);
        v14 = (void *)NextProcess;
        if( !NextProcess )
          break;
        v11 = *(_QWORD *)(NextProcess + 2544);
        if( v11 )
        {
          v12 = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)v12 + 242);
          ExAcquirePushLockExclusiveEx(v11 + 8, 0i64);
          *(_QWORD *)(v11 + 16) = KeGetCurrentThread();
          EtwpCovSampProcessCleanup(v11, 1);
          *(_QWORD *)(v11 + 16) = 0i64;
          if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v11 + 8), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock((volatile INT64 *)(v11 + 8));
          KeAbPostRelease((PVOID)(v11 + 8));
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        }
      }
      EtwpCovSampCaptureContextStop(v7);
      *(_DWORD *)(a1 + 1148) &= ~1u;
    }
  }
  if( (struct _KTHREAD *)qword_140C196A8 == KeGetCurrentThread() )
  {
    qword_140C196A8 = 0i64;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EtwpCovSampGlobals, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&EtwpCovSampGlobals);
    KeAbPostRelease(&EtwpCovSampGlobals);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  if( v2 )
    HalPutDmaAdapter(v2);
}

Referenced by:

EtwpCoverageSamplerClose
EtwpSetCoverageSamplerInformation