PopFxIssueComponentPerfStateChanges

void __fastcall PopFxIssueComponentPerfStateChanges(
        ULONG_PTR BugCheckParameter2,
        __int64 a2,
        char a3,
        unsigned int a4,
        void *Src,
        __int64 a6){
  __int64 v10; 
  int v11; 
  void *v12; 
  EVENT_DESCRIPTOR *v13; 
  char v14; 
  INT64 v15; 
  CHAR v16; 
  CHAR v17; 
  __int64 v18; 
  int v19[8]; 
  CHAR *v20; 
  int v21; 
  CHAR v22; 
  KeGetCurrentIrql();
  v10 = *(_QWORD *)(a2 + 424);
  if( !v10 )
    PopFxBugCheck(0x61Bui64, *(_QWORD *)(BugCheckParameter2 + 64), BugCheckParameter2, *(unsigned int *)(a2 + 16));
  v11 = *(_DWORD *)(*(_QWORD *)v10 + 16i64);
  if( a4 > *(_DWORD *)(v10 + 144) )
    PopFxBugCheck(0x61Cui64, BugCheckParameter2, *(unsigned int *)(a2 + 16), 0i64);
  if( (_InterlockedExchange((volatile __int32 *)(v10 + 40), 0) & 7) != 0 )
    PopFxBugCheck(0x61Dui64, BugCheckParameter2, *(unsigned int *)(a2 + 16), *(_QWORD *)(v10 + 80));
  v12 = Src;
  if( *(_BYTE *)(v10 + 74) )
  {
    memmove(*(UINT8 **)(v10 + 48), (UINT8 *)Src, 16i64 * a4);
    *(_DWORD *)(v10 + 56) = a4;
    *(_BYTE *)(v10 + 72) = 0;
    *(_QWORD *)(v10 + 64) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
  }
  *(_QWORD *)(v10 + 80) = a6;
  KeResetEvent((VOID *)(v10 + 8), a2, a3, a4, (IRP *)v20);
  PopDiagTraceFxPerfRequest((__int64 *)v10, a4, (__int64)v12);
  v14 = 1;
  v21 = a3 & 1;
  if( (a3 & 1) != 0 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x88000000);
  }
  else if( (a3 & 2) != 0 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x10000000u);
  }
  _InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 4u);
  _InterlockedOr(v19, 0);
  if( *(_BYTE *)(v10 + 73) )
  {
    v15 = *(unsigned int *)(a2 + 16);
    v22 = 0;
    v16 = PopPluginRequestComponentPerfState(BugCheckParameter2, v15, a4, (INT64)v12, &v22);
    v17 = v22;
    v14 = v16;
  }
  else
  {
    v17 = 1;
    v22 = 1;
  }
  if( v14 )
  {
    _InterlockedOr((volatile signed __int32 *)(v10 + 40), v17 != 0 ? 1610612736 : 0x20000000);
    _InterlockedDecrement((volatile signed __int32 *)(v10 + 40));
  }
  PopDiagTraceFxPerfRequestProgress(
    (__int64 *)v10,
    ((unsigned __int8)_InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 0xFFFFFFFF) - 1) & 7,
    v13);
  if( v14 )
  {
    if( (a3 & 2) != 0 )
    {
      PopFxAddLogEntry(*(_QWORD *)(BugCheckParameter2 + 48), v11, 15, 0i64);
      PopFxQueueWorkOrder(v18, v10 + 88, BugCheckParameter2);
    }
    else
    {
      _InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x80000000);
      PopFxCompleteComponentPerfState(BugCheckParameter2, *(_DWORD *)(a2 + 16), v10, v22);
    }
  }
  else if( v21 )
  {
    KeWaitForSingleObject((PVOID)(v10 + 8), Executive, 0, 0, 0i64);
  }
  else
  {
    PopFxAddLogEntry(*(_QWORD *)(BugCheckParameter2 + 48), v11, 15, 0i64);
    PopFxAddLogEntry(*(_QWORD *)(BugCheckParameter2 + 48), v11, 20, 0i64);
  }
}

Referenced by:

PoFxIssueComponentPerfStateChangeMultiple