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