PopCallPowerSettingCallback
void __fastcall PopCallPowerSettingCallback(__int64 a1, __int64 a2){
_DWORD *v3;
int v4;
unsigned int v5;
void(__fastcall *v6)(_QWORD, _QWORD, _QWORD, _QWORD);
REGHANDLE v7;
unsigned __int8 CurrentIrql;
unsigned __int8 v9;
REGHANDLE v10;
_DWORD *v11;
bool v12;
int v14;
void(__fastcall *v15)(_QWORD, _QWORD, _QWORD, _QWORD);
__int64 v16;
_EVENT_DATA_DESCRIPTOR v17;
__int64 v18;
int v19;
int v20;
_EVENT_DATA_DESCRIPTOR UserData;
__int64 v22;
__int64 v23;
int *v24;
__int64 v25;
_DWORD *v26;
int v27;
int v28;
if( a2 )
{
if( a1 )
{
*(_QWORD *)(a1 + 72) = a2;
if( !*(_QWORD *)(a1 + 24) )
{
*(_QWORD *)(a1 + 24) = KeGetCurrentThread();
do
{
v3 = *(_DWORD **)(a1 + 72);
++*v3;
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3000));
v4 = v3[1];
v5 = v4;
v6 = *(void(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(a1 + 80);
v15 = v6;
v14 = v4;
if( PopDiagHandleRegistered )
{
v7 = PopDiagHandle;
if( EtwEventEnabled(PopDiagHandle, &POP_ETW_EVENT_POWER_SETTING_CALLBACK_START) )
{
v28 = 0;
v25 = 4i64;
UserData.Ptr = (unsigned __int64)&v15;
*(_QWORD *)&UserData.Size = 8i64;
v22 = a1 + 36;
v23 = 16i64;
v24 = &v14;
v27 = v4;
v26 = v3 + 3;
EtwWrite(v7, &POP_ETW_EVENT_POWER_SETTING_CALLBACK_START, 0, 4u, &UserData);
v5 = v3[1];
v6 = *(void(__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(a1 + 80);
}
}
CurrentIrql = KeGetCurrentIrql();
v6(a1 + 52, v3 + 3, v5, *(_QWORD *)(a1 + 88));
v9 = KeGetCurrentIrql();
if( v9 != CurrentIrql )
KeBugCheckEx(0xA0u, (PVOID)0x900, *(PVOID *)(a1 + 80), (PVOID)CurrentIrql, (PVOID)v9);
v16 = *(_QWORD *)(a1 + 80);
if( PopDiagHandleRegistered )
{
v10 = PopDiagHandle;
if( EtwEventEnabled(PopDiagHandle, &POP_ETW_EVENT_POWER_SETTING_CALLBACK_STOP) )
{
v17.Reserved = 0;
v20 = 0;
v17.Ptr = (unsigned __int64)&v16;
v17.Size = 8;
v18 = a1 + 36;
v19 = 16;
EtwWrite(v10, &POP_ETW_EVENT_POWER_SETTING_CALLBACK_STOP, 0, 2u, &v17);
}
}
if( KeGetCurrentThread()->WaitBlock[3].SpareLong )
__fastfail(0x20u);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C23628 + 3000));
v11 = *(_DWORD **)(a1 + 72);
v12 = v11 && v3 != v11;
if( (*v3)-- == 1 )
ExFreePoolWithTag(v3, 0x74655350u);
}
while( v12 );
*(_QWORD *)(a1 + 24) = 0i64;
}
}
}
}Referenced by:
PopDispatchPowerSettingCallbacks