KiGetHeteroThreadQos

__int64 __fastcall KiGetHeteroThreadQos(__int64 a1, struct _KPRCB *a2, int *a3){
  __int64 v4; 
  int v5; 
  int v6; 
  unsigned int v7; 
  __int64 v8; 
  int v9; 
  char v10; 
  __int64 v11; 
  char v12; 
  __int64 v13; 
  unsigned int v14; 
  int v15; 
  __int64 result; 
  v4 = a1;
  v5 = 1;
  if( (*(_DWORD *)(a1 + 120) & 0x400000) == 0 )
  {
    v8 = *(_QWORD *)(a1 + 1472);
    if( v8 )
    {
      v9 = *(_DWORD *)(a1 + 512);
      v10 = 0;
      v6 = *(_DWORD *)(v8 + 512);
      if( (unsigned __int8)v6 != (unsigned __int8)v9
        && ((unsigned __int8)v6 == 3
         || (unsigned __int8)v9 == 3
         || (unsigned __int8)v6 < (unsigned int)(unsigned __int8)v9) )
      {
        v10 = 1;
      }
      if( !v10 )
        LOBYTE(v6) = v9;
      goto LABEL_3;
    }
    if( *(_BYTE *)(a1 + 124) == 1 )
    {
      v7 = 3;
      goto LABEL_44;
    }
    if( *(_BYTE *)(a1 + 124) == 2 )
    {
      v7 = 4;
      goto LABEL_44;
    }
    if( ((*(_DWORD *)(a1 + 956) >> 8) & 3) != 0 )
    {
      if( ((*(_DWORD *)(a1 + 956) >> 8) & 3) != 1 )
      {
        if( ((*(_DWORD *)(a1 + 956) >> 8) & 3) == 2 )
        {
          v7 = 1;
          goto LABEL_44;
        }
LABEL_36:
        v7 = 0;
        goto LABEL_44;
      }
LABEL_43:
      v7 = 2;
      goto LABEL_44;
    }
    v11 = *(_QWORD *)(a1 + 544);
    v12 = KiDynamicHeteroCpuPolicyMask;
    v13 = (*(_DWORD *)(v11 + 632) >> 7) & 7;
    if( (KiDynamicHeteroCpuPolicyMask & 4) != 0 )
    {
      if( (_DWORD)v13 == 3 )
      {
LABEL_34:
        if( (v12 & 1) != 0 && *(_BYTE *)(v11 + 1850) == 2 )
          goto LABEL_36;
        v7 = *((_DWORD *)KiProcessPolicyToQosMappingTable + v13);
        if( v7 != 5 )
          goto LABEL_44;
        v15 = *(char *)(v4 + 195);
        if( *(char *)(v4 + 195) >= 15
          || (KiDynamicHeteroCpuPolicyMask & 2) != 0
          && (v15 >= KiDynamicHeteroCpuPolicyImportantPriority || (*(_DWORD *)(v4 + 116) & 0x400) != 0 && (char)v15 >= 8) )
        {
          goto LABEL_36;
        }
        goto LABEL_43;
      }
      v14 = *(_DWORD *)(a1 + 80);
      if( v14 <= *(_DWORD *)(v4 + 84) )
        v14 = *(_DWORD *)(v4 + 84);
      if( v14 < KiDynamicHeteroCpuPolicyExpectedCycles )
      {
        v5 = 0;
        if( KeHeteroSystemQos )
        {
          if( (KiDynamicHeteroCpuPolicyMask & 8) != 0 )
            goto LABEL_43;
        }
      }
    }
    if( (_DWORD)v13 != 3 && (KiDynamicHeteroCpuPolicyMask & 0x20) == 0 )
    {
      if( KiIsThreadRankBiased(v4, a2) )
        goto LABEL_43;
      v11 = *(_QWORD *)(v4 + 544);
      if( *(_BYTE *)(v11 + 1463) == 1 )
        goto LABEL_43;
      v12 = KiDynamicHeteroCpuPolicyMask;
      if( (KiDynamicHeteroCpuPolicyMask & 2) != 0 && *(char *)(v4 + 195) < 8 )
        goto LABEL_43;
    }
    goto LABEL_34;
  }
  v6 = *(_DWORD *)(a1 + 512);
LABEL_3:
  v7 = (unsigned __int8)v6;
LABEL_44:
  result = v7;
  *a3 = v5;
  return result;
}

Referenced by:

KiConvertDynamicHeteroPolicy