PopFxHandleDirectedPowerTransition

NTSTATUS __stdcall PopFxHandleDirectedPowerTransition(PVOID BugCheckParameter3){
  signed __int32 v2; 
  signed __int32 v3; 
  int v4; 
  __int64 v5; 
  __int64 v6; 
  NTSTATUS result; 
  _m_prefetchw((char *)BugCheckParameter3 + 32);
  v2 = *((_DWORD *)BugCheckParameter3 + 8);
  do
  {
    v3 = v2;
    v2 = _InterlockedCompareExchange((volatile signed __int32 *)BugCheckParameter3 + 8, v2, v2);
  }
  while( v3 != v2 );
  v4 = v2 & 0x1000;
  PopDiagTraceFxDeviceDirectedTransition(*((_QWORD *)BugCheckParameter3 + 6), v4 != 0);
  v5 = (unsigned int)PopFxDirectedPowerDownTimeoutMs;
  if( !v4 )
    v5 = (unsigned int)PopFxDirectedPowerUpTimeoutMs;
  PopFxEnableWorkOrderWatchdog((char *)BugCheckParameter3 + 920, v5);
  v6 = *((_QWORD *)BugCheckParameter3 + 24);
  if( v4 )
    (*((void(__fastcall **)(__int64, _QWORD))BugCheckParameter3 + 23))(v6, 0i64);
  else(*((void(__fastcall **)(__int64, _QWORD))BugCheckParameter3 + 22))(v6, 0i64);
  if( _InterlockedExchangeAdd((volatile signed __int32 *)BugCheckParameter3 + 290, 0xFFFFFFFF) == 1 )
    return PopFxCompleteDirectedPowerTransition(BugCheckParameter3);
  PopFxAddLogEntry(*((_QWORD *)BugCheckParameter3 + 6), 0, 24, 0i64);
  return result;
}

Referenced by:

PopFxDirectedPowerTransitionWorker