KiGetHeteroThreadQos

NTSTATUS __stdcall KiGetHeteroThreadQos(_ETHREAD *Thread, _KPRCB *Prcb, INT64 *a3){
  _ETHREAD *v4; 
  int v5; 
  volatile int v6; 
  NTSTATUS v7; 
  void *WorkOnBehalfThread; 
  volatile int ThreadFlags2; 
  char v10; 
  _EPROCESS *Process; 
  char v12; 
  __int64 v13; 
  unsigned int CurrentRunTime; 
  int Priority; 
  NTSTATUS result; 

  v4 = Thread;
  v5 = 1;
  if( (*(&Thread->Tcb.MiscFlags + 1) & 0x400000) == 0 )
  {
    WorkOnBehalfThread = Thread->WorkOnBehalfThread;
    if( WorkOnBehalfThread )
    {
      ThreadFlags2 = Thread->Tcb.ThreadFlags2;
      v10 = 0;
      v6 = *((_DWORD *)WorkOnBehalfThread + 128);
      if( (unsigned __int8)v6 != (unsigned __int8)ThreadFlags2
        && ((unsigned __int8)v6 == 3
         || (unsigned __int8)ThreadFlags2 == 3
         || (unsigned __int8)v6 < (unsigned int)(unsigned __int8)ThreadFlags2) )
      {
        v10 = 1;
      }
      if( !v10 )
        LOBYTE(v6) = ThreadFlags2;
      goto LABEL_3;
    }
    if( Thread->Tcb.Tag == 1 )
    {
      v7 = 3;
      goto LABEL_44;
    }
    if( Thread->Tcb.Tag == 2 )
    {
      v7 = 4;
      goto LABEL_44;
    }
    if( (((unsigned __int32)Thread->Tcb._bf_0 >> 8) & 3) != 0 )
    {
      if( (((unsigned __int32)Thread->Tcb._bf_0 >> 8) & 3) != 1 )
      {
        if( (((unsigned __int32)Thread->Tcb._bf_0 >> 8) & 3) == 2 )
        {
          v7 = 1;
          goto LABEL_44;
        }
LABEL_36:
        v7 = 0;
        goto LABEL_44;
      }
LABEL_43:
      v7 = 2;
      goto LABEL_44;
    }
    Process = Thread->Tcb.Process;
    v12 = KiDynamicHeteroCpuPolicyMask;
    v13 = ((unsigned __int32)Process->Pcb._bf_0 >> 7) & 7;
    if( (KiDynamicHeteroCpuPolicyMask & 4) != 0 )
    {
      if( (_DWORD)v13 == 3 )
      {
LABEL_34:
        if( (v12 & 1) != 0 && Process->Vm.Instance.Flags.MemoryPriority == 2 )
          goto LABEL_36;
        v7 = KiProcessPolicyToQosMappingTable[v13];
        if( v7 != 5 )
          goto LABEL_44;
        Priority = v4->Tcb.Priority;
        if( v4->Tcb.Priority >= 15
          || (KiDynamicHeteroCpuPolicyMask & 2) != 0
          && (Priority >= KiDynamicHeteroCpuPolicyImportantPriority
           || (v4->Tcb._bf_0 & 0x400) != 0 && (char)Priority >= 8) )
        {
          goto LABEL_36;
        }
        goto LABEL_43;
      }
      CurrentRunTime = Thread->Tcb.CurrentRunTime;
      if( CurrentRunTime <= v4->Tcb.ExpectedRunTime )
        CurrentRunTime = v4->Tcb.ExpectedRunTime;
      if( CurrentRunTime < KiDynamicHeteroCpuPolicyExpectedCycles )
      {
        v5 = 0;
        if( KeHeteroSystemQos )
        {
          if( (KiDynamicHeteroCpuPolicyMask & 8) != 0 )
            goto LABEL_43;
        }
      }
    }
    if( (_DWORD)v13 != 3 && (KiDynamicHeteroCpuPolicyMask & 0x20) == 0 )
    {
      if( KiIsThreadRankBiased((__int64)v4, Prcb) )
        goto LABEL_43;
      Process = v4->Tcb.Process;
      if( Process->PriorityClass == 1 )
        goto LABEL_43;
      v12 = KiDynamicHeteroCpuPolicyMask;
      if( (KiDynamicHeteroCpuPolicyMask & 2) != 0 && v4->Tcb.Priority < 8 )
        goto LABEL_43;
    }
    goto LABEL_34;
  }
  v6 = Thread->Tcb.ThreadFlags2;
LABEL_3:
  v7 = (unsigned __int8)v6;
LABEL_44:
  result = v7;
  *(_DWORD *)a3 = v5;
  return result;
}

Referenced by:

KiConvertDynamicHeteroPolicy