PopFxIssueComponentPerfStateChanges
VOID __stdcall PopFxIssueComponentPerfStateChanges(
_POP_FX_DEVICE *FxDevice,
_POP_FX_COMPONENT *FxComponent,
UINT64 Flags,
UINT64 PerfChangesCount,
_PO_FX_PERF_STATE_CHANGE *PerfChanges,
VOID *Context){
unsigned int v6;
char v7;
__int64 v10;
int v11;
_PO_FX_PERF_STATE_CHANGE *v12;
char v13;
int v14;
char v15;
UINT8 v16;
_KQUEUE *v17;
UINT8 v18;
int v19[8];
int v20;
UINT8 Succeeded;
v6 = PerfChangesCount;
v7 = Flags;
KeGetCurrentIrql();
v10 = *((_QWORD *)FxComponent + 53);
if( !v10 )
PopFxBugCheck(0x61Bu, *((_QWORD *)FxDevice + 8), (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4));
v11 = *(_DWORD *)(*(_QWORD *)v10 + 16i64);
if( (unsigned int)PerfChangesCount > *(_DWORD *)(v10 + 144) )
PopFxBugCheck(0x61Cu, (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4), 0);
if( (_InterlockedExchange((volatile __int32 *)(v10 + 40), 0) & 7) != 0 )
PopFxBugCheck(0x61Du, (ULONG_PTR)FxDevice, *((_DWORD *)FxComponent + 4), *(_QWORD *)(v10 + 80));
v12 = PerfChanges;
if( *(_BYTE *)(v10 + 74) )
{
memmove(*(VOID **)(v10 + 48), PerfChanges, 16 * PerfChangesCount);
*(_DWORD *)(v10 + 56) = v6;
*(_BYTE *)(v10 + 72) = 0;
*(_QWORD *)(v10 + 64) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
}
*(_QWORD *)(v10 + 80) = Context;
KeResetEvent((_KEVENT *)(v10 + 8));
PopDiagTraceFxPerfRequest((_POP_FX_PERF_INFO *)v10, v6, v12);
v13 = 1;
v20 = v7 & 1;
if( (v7 & 1) != 0 )
{
_InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x88000000);
}
else if( (v7 & 2) != 0 )
{
_InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x10000000u);
}
_InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 4u);
_InterlockedOr(v19, 0);
if( *(_BYTE *)(v10 + 73) )
{
v14 = *((_DWORD *)FxComponent + 4);
Succeeded = 0;
v15 = PopPluginRequestComponentPerfState((__int64)FxDevice, v14, v6, (__int64)v12, (char *)&Succeeded);
v16 = Succeeded;
v13 = v15;
}
else
{
v16 = 1;
Succeeded = 1;
}
if( v13 )
{
_InterlockedOr((volatile signed __int32 *)(v10 + 40), v16 != 0 ? 1610612736 : 0x20000000);
_InterlockedDecrement((volatile signed __int32 *)(v10 + 40));
}
PopDiagTraceFxPerfRequestProgress(
(_POP_FX_PERF_INFO *)v10,
((unsigned __int8)_InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 40), 0xFFFFFFFF) - 1) & 7);
if( v13 )
{
if( (v7 & 2) != 0 )
{
PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 15, 0i64);
PopFxQueueWorkOrder(v17, (_POP_FX_WORK_ORDER *)(v10 + 88), FxDevice, v18);
}
else
{
_InterlockedOr((volatile signed __int32 *)(v10 + 40), 0x80000000);
PopFxCompleteComponentPerfState(FxDevice, *((unsigned int *)FxComponent + 4), (_POP_FX_PERF_INFO *)v10, Succeeded);
}
}
else if( v20 )
{
KeWaitForSingleObject(v10 + 8, 0, 0, 0, 0i64);
}
else
{
PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 15, 0i64);
PopFxAddLogEntry(*((_QWORD *)FxDevice + 6), v11, 20, 0i64);
}
}Referenced by:
PoFxIssueComponentPerfStateChangeMultiple