KeQueryValuesThread
__int64 __fastcall KeQueryValuesThread(__int64 a1, __int64 a2){
char v3;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
_KPRCB **v7;
int v8;
_KPRCB *v9;
volatile signed __int32 *v10;
char v11;
char v12;
int v13;
__int64 v14;
__int64 v15;
char v16;
__int64 v17;
__int64 result;
__int64 v19;
struct _KPRCB *v20;
__int64 v21;
struct _KPRCB *v22;
struct _KPRCB *v23;
__int64 v24;
struct _KPRCB *v25;
__int64 v26;
struct _KPRCB *v27;
__int64 v28;
__int64 v29;
__int64 v30;
__int64 v31;
__int64 v32;
UINT64 v33[3];
UINT64 SpinCount;
UINT64 v35;
UINT64 v36;
UINT64 v37;
*(_DWORD *)a2 = 0;
v3 = 0;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
v28 = *((_QWORD *)CurrentPrcb + 4247);
if( v28 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v28 + 24);
}
if( *(__int64 **)(a1 + 544) == KiInitialProcess )
{
LOBYTE(v8) = *(_BYTE *)(a1 + 388);
*(_BYTE *)(a2 + 10) = 1;
goto LABEL_20;
}
LABEL_4:
v7 = &KiProcessorBlock;
while( 1 )
{
while( 1 )
{
v8 = *(unsigned __int8 *)(a1 + 388);
v9 = 0i64;
v10 = 0i64;
if( v8 == 5 )
{
v11 = *(_BYTE *)(a1 + 112) & 7;
if( v11 == 1 || (unsigned __int8)(v11 - 3) <= 3u )
goto LABEL_7;
LOBYTE(v8) = 2;
goto LABEL_35;
}
if( *(_BYTE *)(a1 + 388) == 1 )
break;
if( *(_BYTE *)(a1 + 388) == 2 )
{
LABEL_35:
v21 = *(unsigned int *)(a1 + 536);
if( (int)v21 >= 0 )
{
v23 = KeGetCurrentPrcb();
v9 = v7[v21];
LODWORD(v33[0]) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v9 + 12, 0i64) )
{
do
{
KeYieldProcessorEx(v33);
v21 = *((_QWORD *)v9 + 6);
}
while( v21 );
v29 = *((_QWORD *)v23 + 4247);
if( v29 && *((_BYTE *)v23 + 32) <= 1u )
{
LODWORD(v21) = *(_DWORD *)(v29 + 24) + 1;
*(_DWORD *)(v29 + 24) = v21;
}
}
if( a1 == *((_QWORD *)v9 + 1) )
goto LABEL_7;
LABEL_30:
_InterlockedAnd64((volatile signed __int64 *)v9 + 6, 0i64);
goto LABEL_31;
}
}
else
{
if( *(_BYTE *)(a1 + 388) != 3 )
goto LABEL_7;
v19 = *(unsigned int *)(a1 + 536);
if( (int)v19 >= 0 )
{
v20 = KeGetCurrentPrcb();
v9 = v7[v19];
LODWORD(v35) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v9 + 12, 0i64) )
{
do
KeYieldProcessorEx(&v35);
while( *((_QWORD *)v9 + 6) );
v32 = *((_QWORD *)v20 + 4247);
if( v32 && *((_BYTE *)v20 + 32) <= 1u )
++*(_DWORD *)(v32 + 24);
}
if( a1 == *((_QWORD *)v9 + 2) )
goto LABEL_7;
LODWORD(v21) = *(unsigned __int8 *)(a1 + 388);
if( (_BYTE)v21 == 3 )
{
LODWORD(v21) = *(_DWORD *)(a1 + 536);
if( (_DWORD)v21 == (_DWORD)v19 )
__fastfail(0x1Eu);
}
goto LABEL_30;
}
}
}
v24 = *(unsigned int *)(a1 + 536);
if( (int)v24 >= 0 )
{
v27 = KeGetCurrentPrcb();
v9 = v7[v24];
LODWORD(v37) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v9 + 12, 0i64) )
{
do
KeYieldProcessorEx(&v37);
while( *((_QWORD *)v9 + 6) );
v30 = *((_QWORD *)v27 + 4247);
if( v30 && *((_BYTE *)v27 + 32) <= 1u )
++*(_DWORD *)(v30 + 24);
}
LODWORD(v21) = *(unsigned __int8 *)(a1 + 388);
if( (_BYTE)v21 == 1 )
{
LODWORD(v21) = *(_DWORD *)(a1 + 536);
if( (_DWORD)v21 == (_DWORD)v24 )
goto LABEL_7;
}
goto LABEL_30;
}
v25 = KeGetCurrentPrcb();
v26 = (unsigned int)v24;
LODWORD(v26) = v24 & 0x7FFFFFFF;
LODWORD(v36) = 0;
v10 = (volatile signed __int32 *)*((_QWORD *)v7[v26] + 4233);
while( _interlockedbittestandset64(v10, 0i64) )
{
do
KeYieldProcessorEx(&v36);
while( *(_QWORD *)v10 );
v31 = *((_QWORD *)v25 + 4247);
if( v31 && *((_BYTE *)v25 + 32) <= 1u )
++*(_DWORD *)(v31 + 24);
}
LODWORD(v21) = *(unsigned __int8 *)(a1 + 388);
if( (_BYTE)v21 == 1 )
{
LODWORD(v21) = *(_DWORD *)(a1 + 536);
if( (_DWORD)v21 == (_DWORD)v24 )
break;
}
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
LABEL_31:
v22 = KeGetCurrentPrcb();
v7 = (_KPRCB **)*((_QWORD *)v22 + 4247);
if( !v7 || *((_BYTE *)v22 + 32) > 1u || !(_DWORD)v21 )
goto LABEL_4;
}
v9 = 0i64;
LABEL_7:
*(_DWORD *)a2 = *(_DWORD *)(a1 + 436);
v12 = *(_BYTE *)(a1 + 388);
v13 = *(_DWORD *)(a1 + 132);
if( v12 == 1 || v12 == 7 && (*(_DWORD *)(a1 + 116) & 2) != 0 )
v13 += KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(a1 + 436);
*(_DWORD *)(a2 + 4) = v13;
v14 = *(_QWORD *)(a1 + 992);
v15 = *(_QWORD *)(a1 + 1000);
if( *(_BYTE *)(a1 + 388) == 5 )
{
v16 = *(_BYTE *)(a1 + 112) & 7;
if( v16 == 1 || (unsigned __int8)(v16 - 3) <= 3u )
{
v17 = KUSER_SHARED_DATA.TickCount.LowPart - *(_DWORD *)(a1 + 436);
if( *(_BYTE *)(a1 + 391) )
v15 += v17;
else
v14 += v17;
}
}
*(_QWORD *)(a2 + 16) = v14;
*(_QWORD *)(a2 + 24) = v15;
if( v9 )
_InterlockedAnd64((volatile signed __int64 *)v9 + 6, 0i64);
if( v10 )
_InterlockedAnd64((volatile signed __int64 *)v10, 0i64);
v3 = *(_BYTE *)(a1 + 643);
*(_BYTE *)(a2 + 10) = *(_BYTE *)(a1 + 195);
if( (_BYTE)v8 == 5 && (*(_BYTE *)(a1 + 112) & 7) == 4 )
v3 = 5;
LABEL_20:
*(_BYTE *)(a2 + 11) = *(_BYTE *)(a1 + 563);
*(_QWORD *)(a1 + 64) = 0i64;
result = CurrentIrql;
__writecr8(CurrentIrql);
*(_BYTE *)(a2 + 9) = v3;
*(_BYTE *)(a2 + 8) = v8;
return result;
}Referenced by:
ExpGetProcessInformation
NtQueryInformationThread
PsQueryStatisticsProcess