PopDirectedDripsNotify

VOID __stdcall PopDirectedDripsNotify(INT64 a1, INT64 *a2, INT64 a3, INT64 a4){
  unsigned __int32 v5; 
  INT64 v6; 
  unsigned __int32 v7; 
  int v8; 
  INT64 v9; 
  int v10; 
  int v11; 
  char v12; 
  bool v13; 
  int v14; 
  int v15; 
  int v16; 
  INT64 v17; 
  int v18; 
  __int64 v19; 
  signed __int32 v20; 
  signed __int32 v21; 
  INT64 v22; 

  LODWORD(v22) = 0;
  _m_prefetchw((char *)&stru_140C23628 + 5048);
  v5 = *(&stru_140C23628 + 1262);
  do
  {
    v6 = v5;
    v7 = v5;
    v5 = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1262, v5, v5);
  }
  while( v7 != v5 );
  if( (v5 & 1) == 0 )
    return;
  v8 = 0;
  if( (int)a1 <= 5 )
  {
    if( (_DWORD)a1 == 5 )
    {
      v8 = 0x2000;
    }
    else
    {
      if( !(_DWORD)a1 )
      {
        *(&stru_140C23628 + 1293) = 0;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 648, 0i64);
        *(&stru_140C23628 + 697) = *a2;
        if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C23628 + 648, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C23628 + 648);
        KeAbPostRelease((char *)&stru_140C23628 + 5184);
        PopDirectedDripsQueryMitigationStatus(&v22, 0i64, 0i64);
        PopDirectedDripsDiagNotifySessionStart(*a2, (unsigned int)v22);
        return;
      }
      v14 = a1 - 1;
      if( !v14 )
      {
        v17 = *a2;
        ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 648, 0i64);
        *(_DWORD *)(v17 + 200) = *(&stru_140C23628 + 1293);
        *(&stru_140C23628 + 697) = 0i64;
        if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C23628 + 648, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
          ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C23628 + 648);
        KeAbPostRelease((char *)&stru_140C23628 + 5184);
        PopDirectedDripsSendSessionData();
        return;
      }
      v15 = v14 - 1;
      if( !v15 )
      {
LABEL_23:
        *(&stru_140C23628 + 1275) = 0;
        return;
      }
      v16 = v15 - 1;
      if( v16 )
      {
        if( v16 != 1 )
          return;
        goto LABEL_23;
      }
    }
    v18 = v8 | 0x1000;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 648, 0i64);
    if( *(&stru_140C23628 + 697) == *a2 )
    {
      if( *(&stru_140C23628 + 1396) )
      {
        _m_prefetchw((char *)&stru_140C23628 + 5048);
        v19 = (unsigned int)v18 | *(&stru_140C23628 + 1262);
        if( (v18 & _InterlockedOr((_DWORD *)&stru_140C23628 + 1262, v18)) != v18 || *(&stru_140C23628 + 1275) )
          PopQueueDirectedDripsWork(v19, 0x800ui64);
      }
    }
    v13 = (_InterlockedExchangeAdd64((_QWORD *)&stru_140C23628 + 648, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2;
    goto LABEL_37;
  }
  v9 = (unsigned int)(a1 - 6);
  if( !(_DWORD)v9 )
  {
    PopDirectedDripsEngage(v9, *(_BYTE *)a2, v6, a4);
    return;
  }
  v10 = v9 - 1;
  if( v10 )
  {
    v11 = v10 - 1;
    if( v11 )
    {
      if( v11 != 1 )
        return;
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 648, 0i64);
      if( !--*(&stru_140C23628 + 1312) )
        PopDirectedDripsClearDisengageReason(1);
    }
    else
    {
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C23628 + 648, 0i64);
      if( ++*(&stru_140C23628 + 1312) == 1 )
        PopDirectedDripsSetDisengageReason(1);
    }
    v12 = _InterlockedExchangeAdd64((_QWORD *)&stru_140C23628 + 648, 0xFFFFFFFFFFFFFFFFui64);
    if( (v12 & 2) == 0 )
      goto LABEL_12;
    v13 = (v12 & 4) == 0;
LABEL_37:
    if( v13 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C23628 + 648);
LABEL_12:
    KeAbPostRelease((char *)&stru_140C23628 + 5184);
    return;
  }
  _m_prefetchw((char *)&stru_140C23628 + 5048);
  v20 = *(&stru_140C23628 + 1262);
  do
  {
    v21 = v20;
    v20 = _InterlockedCompareExchange((_DWORD *)&stru_140C23628 + 1262, v20, v20);
  }
  while( v21 != v20 );
  if( (v20 & 0x800) != 0 )
    PopDirectedDripsNotifyAppsAndServices((INT64)&stru_140C23628 + 5048, (INT64)&stru_140C23628 + 5104, 0);
}

Referenced by:

PopAcquireTransitionLock
PopCaptureSleepStudyStatistics
PopDirectedDripsUmMarkTestDevices
PopDripsWatchdogCallbackHandler
PopPowerAggregatorDisengageModernStandby
PopPowerAggregatorScreenOffEnterStateHandler
PopReleaseTransitionLock