PoEnergyContextCleanup

VOID __fastcall PoEnergyContextCleanup(INT64 a1){
  _POP_RW_LOCK *v1; 
  unsigned __int64 v3; 
  __int64 v4; 
  unsigned int TimelineBitmapTime; 
  __int64 v6; 
  _POP_RW_LOCK *v7; 
  unsigned int v8; 
  INT64 *p_Thread; 
  INT64 v10; 
  INT64 Value; 
  INT64 Thread; 
  INT64 v13[2]; 
  __int64 v14; 
  _POP_RW_LOCK *v15; 
  v1 = *(_POP_RW_LOCK **)(a1 + 2280);
  HIDWORD(v13[0]) = 0;
  v14 = 0i64;
  if( v1 )
  {
    v3 = (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
    v4 = 0i64;
    TimelineBitmapTime = KeQueryTimelineBitmapTime();
    v6 = 3i64;
    do
    {
      v8 = RtlStateDurationCapture(
             (INT64)&v1[6].Thread + v4,
             (_ETHREAD **)((char *)&v1[6].Thread + v4),
             (unsigned int)v3);
      if( v7 == (_POP_RW_LOCK *)&v1[6].Thread )
      {
        p_Thread = (INT64 *)&v1[19];
      }
      else if( v7 == &v1[7] )
      {
        p_Thread = (INT64 *)&v1[19].Thread;
      }
      else
      {
        p_Thread = 0i64;
      }
      if( p_Thread && v8 )
        RtlTimelineBitmapUpdateRange(p_Thread, TimelineBitmapTime - (v8 >> 12), TimelineBitmapTime);
      v4 += 8i64;
      --v6;
    }
    while( v6 );
    RtlStateDurationCapture((INT64)&v1[26], &v1[26].Lock.Value, (unsigned int)v3);
    v14 = 0i64;
    v13[0] = 4i64;
    v15 = v1;
    v13[1] = a1;
    PopAcquireRwLockExclusive(v1 + 27);
    PopEtEnumEnergyTrackers(v10, (INT64)v13);
    PopReleaseRwLock((UINT64)&v1[27]);
    Value = v1[28].Lock.Value;
    if( Value )
    {
      PopEtAppIdDereference(Value);
      v1[28].Lock.Value = 0i64;
    }
    Thread = (INT64)v1[28].Thread;
    if( Thread )
    {
      RtlInternEntryDereference(PopEtGlobals + 56, Thread);
      v1[28].Thread = 0i64;
    }
  }
}

Referenced by:

No references.