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