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