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