PopCallPowerSettingCallback
void __fastcall PopCallPowerSettingCallback(_QWORD *a1, __int64 a2){
_DWORD *v3;
EVENT_DESCRIPTOR *v4;
int v5;
unsigned int v6;
void(__fastcall *v7)(_QWORD, _QWORD, _QWORD, _QWORD);
UINT64 v8;
unsigned __int8 CurrentIrql;
EVENT_DESCRIPTOR *v10;
unsigned __int8 v11;
UINT64 v12;
_DWORD *v13;
bool v14;
int v16;
void(__fastcall *v17)(_QWORD, _QWORD, _QWORD, _QWORD);
__int64 v18;
EVENT_DATA_DESCRIPTOR v19;
__int64 v20;
int v21;
int v22;
EVENT_DATA_DESCRIPTOR UserData;
__int64 v24;
__int64 v25;
int *v26;
__int64 v27;
_DWORD *v28;
int v29;
int v30;
if( a2 )
{
if( a1 )
{
a1[9] = a2;
if( !a1[3] )
{
a1[3] = KeGetCurrentThread();
do
{
v3 = (_DWORD *)a1[9];
++*v3;
KeReleaseGuardedMutex(&PopSettingLock);
v5 = v3[1];
v6 = v5;
v7 = (void(__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD))a1[10];
v17 = v7;
v16 = v5;
if( PopDiagHandleRegistered )
{
v8 = PopDiagHandle;
if( EtwEventEnabled(PopDiagHandle, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_POWER_SETTING_CALLBACK_START, v4) )
{
v30 = 0;
v27 = 4i64;
UserData.Ptr = (unsigned __int64)&v17;
*(_QWORD *)&UserData.Size = 8i64;
v24 = (__int64)a1 + 36;
v25 = 16i64;
v26 = &v16;
v29 = v5;
v28 = v3 + 3;
EtwWrite(v8, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_POWER_SETTING_CALLBACK_START, 0i64, 4ui64, &UserData);
v6 = v3[1];
v7 = (void(__fastcall *)(_QWORD, _QWORD, _QWORD, _QWORD))a1[10];
}
}
CurrentIrql = KeGetCurrentIrql();
v7((char *)a1 + 52, v3 + 3, v6, a1[11]);
v11 = KeGetCurrentIrql();
if( v11 != CurrentIrql )
KeBugCheckEx(0xA0u, 0x900ui64, a1[10], CurrentIrql, v11);
v18 = a1[10];
if( PopDiagHandleRegistered )
{
v12 = PopDiagHandle;
if( EtwEventEnabled(PopDiagHandle, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_POWER_SETTING_CALLBACK_STOP, v10) )
{
v19.Reserved = 0;
v22 = 0;
v19.Ptr = (unsigned __int64)&v18;
v19.Size = 8;
v20 = (__int64)a1 + 36;
v21 = 16;
EtwWrite(v12, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_POWER_SETTING_CALLBACK_STOP, 0i64, 2ui64, &v19);
}
}
if( *((_DWORD *)KeGetCurrentThread() + 121) )
__fastfail(0x20u);
ExAcquireFastMutex(&PopSettingLock);
v13 = (_DWORD *)a1[9];
v14 = v13 && v3 != v13;
if( (*v3)-- == 1 )
ExFreePoolWithTag(v3, 0x74655350u);
}
while( v14 );
a1[3] = 0i64;
}
}
}
}Referenced by:
PopDispatchPowerSettingCallbacks