SMKM_STORE::SmStWorkItemGet
__int64 *__fastcall SMKM_STORE::SmStWorkItemGet(__int64 a1, _DWORD *a2){
UINT64 *v2;
unsigned __int8 v5;
unsigned __int64 *v6;
unsigned __int64 v7;
__int64 *v8;
unsigned __int64 *v9;
__int64 *v10;
__int64 v11;
int v12;
int v13;
unsigned __int64 *v14;
__int64 *v15;
__int64 *v16;
_ETHREAD *v18;
int v19;
__int64 v20;
INT64 v21;
int v22;
__int64 i;
unsigned __int64 v24;
unsigned __int64 v25;
*a2 = 0;
v2 = (UINT64 *)(a1 + 6040);
v5 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 6040));
v6 = (unsigned __int64 *)(a1 + 6080);
v7 = v5;
v8 = *(__int64 **)(a1 + 6088);
if( v8 == (__int64 *)(a1 + 6080) )
{
v9 = (unsigned __int64 *)(a1 + 6048);
v10 = *(__int64 **)(a1 + 6056);
if( v10 == (__int64 *)(a1 + 6048) )
{
if( !*(_DWORD *)(a1 + 6104) )
{
v11 = *(unsigned __int8 *)(a1 + 6022);
v12 = (_DWORD)v11 == 4 ? *(_DWORD *)(a1 + 6728) : *((_DWORD *)`SMKM_STORE::SmStGetPriorityByMemoryCondition'::`2'::PriorityByMemoryCondition
+ v11);
KeQueryPriorityThread(*(_ETHREAD **)(a1 + 6200));
if( v13 > v12 )
{
v20 = *(unsigned __int8 *)(a1 + 6022);
if( (_DWORD)v20 == 4 )
v21 = *(unsigned int *)(a1 + 6728);
else
v21 = *((unsigned int *)`SMKM_STORE::SmStGetPriorityByMemoryCondition'::`2'::PriorityByMemoryCondition
+ v20);
KeSetActualBasePriorityThread(*(_KTHREAD **)(a1 + 6200), v21);
}
}
v14 = (unsigned __int64 *)(a1 + 6064);
v15 = *(__int64 **)(a1 + 6072);
if( v15 == (__int64 *)(a1 + 6064) )
{
v16 = 0i64;
}
else
{
v16 = (__int64 *)*v14;
*v14 = *(_QWORD *)*v14 & 0xFFFFFFFFFFFFFFF8ui64;
if( v16 == v15 )
{
*v14 = 0i64;
*(_QWORD *)(a1 + 6072) = a1 + 6064;
}
else
{
*v15 = *v15 & 7 | (8 * (((unsigned __int64)*v15 >> 3) - 1));
}
if( !--*(_DWORD *)(a1 + 6100) && (*(_BYTE *)v16 & 7) == 6 )
{
if( *(_BYTE *)(a1 + 6022) )
{
v18 = *(_ETHREAD **)(a1 + 6200);
KeQueryPriorityThread(v18);
if( v19 > 4 )
KeSetActualBasePriorityThread(&v18->Tcb, 4i64);
}
}
}
}
else
{
v16 = (__int64 *)*v9;
*v9 = *(_QWORD *)*v9 & 0xFFFFFFFFFFFFFFF8ui64;
if( v16 == v10 )
{
*v9 = 0i64;
*(_QWORD *)(a1 + 6056) = a1 + 6048;
}
else
{
*v10 = *v10 & 7 | (8 * (((unsigned __int64)*v10 >> 3) - 1));
}
--*(_DWORD *)(a1 + 6096);
}
}
else
{
v16 = (__int64 *)*v6;
*v6 = *(_QWORD *)*v6 & 0xFFFFFFFFFFFFFFF8ui64;
if( v16 == v8 )
{
*v6 = 0i64;
*(_QWORD *)(a1 + 6088) = a1 + 6080;
}
else
{
*v8 = *v8 & 7 | (8 * (((unsigned __int64)*v8 >> 3) - 1));
}
v22 = *(_DWORD *)(a1 + 6100) - 1;
*a2 = 1;
*(_DWORD *)(a1 + 6100) = v22;
}
if( !v16 )
{
LABEL_16:
*(_QWORD *)(a1 + 6120) = 0i64;
goto LABEL_13;
}
*(_QWORD *)(a1 + 6112) = KUSER_SHARED_DATA.TickCountQuad;
if( (*(_DWORD *)v16 & 7) == 2 && *(_BYTE *)(a1 + 6020) )
{
for( i = *(_QWORD *)(*(_QWORD *)(a1 + 3952) + 16i64);
*(_DWORD *)i < (unsigned __int8)*((_DWORD *)v16 + 2) << 12;
i += 32i64 )
{
;
}
v24 = *(_QWORD *)(i + 8);
v25 = *(_QWORD *)(a1 + 6120);
if( v25 > v24 )
{
*(_QWORD *)(a1 + 6120) = v25 - v24;
goto LABEL_13;
}
goto LABEL_16;
}
LABEL_13:
KxReleaseSpinLock(v2);
__writecr8(v7);
return v16;
}
Referenced by:
No references.