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