PspChargeProcessWakeCounter

NTSTATUS __stdcall PspChargeProcessWakeCounter(INT64 a1, INT64 a2, CHAR a3, INT64 a4){
  char v4; 
  int v6; 
  char v7; 
  bool v8; 
  __int64 v9; 
  bool v10; 
  int v11; 
  bool v12; 
  int v13; 
  volatile signed __int32 *v14; 
  int v15; 
  int v16; 
  int v17; 
  PS_WAKE_REASON v18; 
  INT64 v19; 
  INT64 v20; 
  int v22; 
  _EPROCESS *v23; 
  int v24; 
  UINT64 Flags; 
  _EPROCESS *Process; 
  UINT64 Tag; 
  char v28; 
  int v29; 
  int v30; 
  int v31; 
  UINT64 v32; 
  _KTHREAD *Thread; 
  _EJOB *BaseJob; 
  bool v35; 
  int v36; 
  _PS_WAKE_REASON WakeReason; 
  signed int v39; 
  char v40; 
  int *v41; 

  WakeReason = a3;
  v36 = a2;
  v4 = 0;
  v31 = 1;
  v30 = 0;
  v6 = a2 & 2;
  v28 = 0;
  v29 = a3;
  Thread = (_ETHREAD *)KeGetCurrentThread();
  v7 = 0;
  v8 = 0;
  --Thread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 1080), 0i64);
  v9 = *(_QWORD *)(a1 + 1296);
  v10 = v6 != 0;
  v35 = v6 != 0;
  BaseJob = (_EJOB *)v9;
  if( !v9 || (v11 = *(_DWORD *)(v9 + 1320), v12 = v6 != 0, v35 = v6 != 0, (v11 & 0x1000) == 0) )
  {
    v13 = v29;
    goto LABEL_4;
  }
  if( v6 )
  {
    if( (v11 & 0x800000) != 0 )
    {
      v35 = v6 != 0;
      if( v39 > 0 )
      {
LABEL_31:
        v13 = v29;
        goto LABEL_12;
      }
    }
  }
  v22 = v36;
  v23 = KeGetCurrentThread()->ApcState.Process;
  v32 = (UINT64)v23;
  if( (v36 & 1) != 0 )
  {
    v35 = v6 != 0;
    if( !PspCheckConditionalWakeCharge(v23, (_EJOB *)v9, WakeReason) )
      goto LABEL_31;
    v12 = v6 != 0;
    v22 = v36;
    v23 = (_EPROCESS *)v32;
  }
  if( (v23->Flags2 & 0x40) != 0 || !v6 )
  {
    v13 = v29;
    v10 = 0;
    v35 = 0;
  }
  else
  {
    v31 = 5;
    v13 = 7;
    if( v22 < 0 )
      v31 = 7;
    v10 = v12;
    v35 = v12;
  }
  v4 = 1;
LABEL_4:
  if( !v40 || v4 || *(_QWORD *)(a1 + 2464) )
  {
    if( v10 )
    {
      v14 = (volatile signed __int32 *)(a1 + 2508);
      v13 = 7;
    }
    else
    {
      v14 = (volatile signed __int32 *)(a1 + 4 * ((int)WakeReason + 618i64));
    }
    v15 = _InterlockedExchangeAdd(v14, v39) + v39;
    v7 = 1;
    v16 = v15 & 0x7FFFFFFF;
    v8 = v15 < 0;
    if( v15 >= 0 )
      v16 = v15;
    v30 = v16;
    if( !v10 )
    {
      v30 = v16;
      if( *(_QWORD *)(a1 + 2464) )
      {
        v24 = 1 << WakeReason;
        if( v39 <= 0 )
        {
          if( (v24 & *(_DWORD *)(a1 + 2504)) != 0 && !v16 )
          {
            v28 = 1;
            v30 = 0;
            goto LABEL_12;
          }
        }
        else if( (v24 & *(_DWORD *)(a1 + 2500)) != 0 && v16 == 1 )
        {
          v28 = 1;
          v30 = 1;
          goto LABEL_12;
        }
        v28 = 0;
        v30 = v16;
      }
    }
  }
LABEL_12:
  if( _InterlockedCompareExchange64((volatile signed __int64 *)(a1 + 1080), 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 1080));
  KeAbPostRelease((VOID *)(a1 + 1080));
  KeLeaveCriticalRegionThread(&Thread->Tcb);
  if( v28 )
  {
    LODWORD(Tag) = 0;
    LODWORD(Process) = 0;
    ZwUpdateWnfStateData((const _WNF_STATE_NAME *)(a1 + 2464), 0i64, 0i64, 0i64, 0i64, (UINT64)Process, Tag);
    v17 = v30;
    if( (xmmword_140CFB490 & 0x400) != 0 && v30 == 1 )
      EtwTraceWakeEvent((VOID *)a1, WakeReason);
  }
  else
  {
    v17 = v30;
  }
  if( v41 )
    *v41 = v17;
  if( v8 || v4 )
  {
    v20 = a4;
    v18 = WakeReason;
    v19 = v39;
    LODWORD(Flags) = v31;
    PspChargeJobWakeCounter(BaseJob, 0i64, WakeReason, v39, Flags, (_EPROCESS *)a1, a4);
  }
  else
  {
    v18 = WakeReason;
    v19 = v39;
    v20 = a4;
  }
  if( !v7 )
    return 0;
  if( (xmmword_140CFB490 & 0x2000) != 0 && !v35 )
    EtwTraceWakeCounter((VOID *)a1, v18, v19, (_EPROCESS *)a1, v20, (UINT64)Process);
  if( !v40 )
    return 0;
  if( v39 <= 0 )
  {
    ObDereferenceObjectDeferDeleteWithTag(a1, 1800893264i64);
    return 0;
  }
  ObfReferenceObjectWithTag((VOID *)a1, 0x6B577350ui64);
  return a1 | v13;
}

Referenced by:

AlpcpSendMessage
PsChargeProcessWakeCounter
PsReleaseProcessWakeCounter
PspAdjustKeepAliveCountProcess