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