SMKM_STORE::SmStWorkItemQueue
void __fastcall SMKM_STORE::SmStWorkItemQueue(__int64 a1, __int64 a2, char a3){
int v4;
int v7;
__int64 v8;
__int64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 v12;
__int64 v13;
_ETHREAD *CurrentThread;
__int64 v15;
int v16;
int v17;
_ETHREAD *v18;
int v19;
unsigned __int64 v20;
_QWORD *v21;
unsigned __int64 v22;
__int64 i;
int v24;
v4 = *(_DWORD *)a2 & 7;
if( v4 == 2 && (*(_BYTE *)(a1 + 6021) & 4) != 0 )
{
if( !(unsigned int)SMKM_STORE::SmStDirectRead(a1, (__int128 *)a2) )
{
v20 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 6560));
*(_QWORD *)a2 = ((**(_QWORD **)(a1 + 6552) & 0xFFFFFFFFFFFFFFF8ui64) + 8) | *(_DWORD *)a2 & 7;
**(_QWORD **)(a1 + 6552) = a2 | **(_DWORD **)(a1 + 6552) & 7;
*(_QWORD *)(a1 + 6552) = a2;
KxReleaseSpinLock((UINT64 *)(a1 + 6560));
__writecr8(v20);
KeSetEvent((PRKEVENT)(a1 + 6520), 0, 0);
}
return;
}
if( (*(_BYTE *)(a1 + 6021) & 1) != 0 )
return;
v7 = a3 & 4;
if( (a3 & 4) == 0 )
_InterlockedIncrement((volatile signed __int32 *)(a1 + 6732));
v24 = a3 & 1;
if( (a3 & 1) != 0 )
{
v8 = 6080i64;
}
else
{
if( v4 == 2 && (*(_DWORD *)(a2 + 8) & 0x1000000) == 0 )
{
v9 = 6096i64;
v8 = 6048i64;
goto LABEL_9;
}
v8 = 6064i64;
}
v9 = 6100i64;
LABEL_9:
v10 = a1 + v8;
v11 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 6040));
v12 = **(_QWORD **)(v10 + 8);
v13 = *(_QWORD *)a2 & 7i64;
if( (a3 & 2) != 0 )
{
*(_QWORD *)a2 = *(_QWORD *)v10 | v13;
v21 = *(_QWORD **)(v10 + 8);
v22 = v12 >> 3;
*(_QWORD *)v10 = a2;
if( v21 == (_QWORD *)v10 )
{
*(_QWORD *)(v10 + 8) = a2;
v21 = (_QWORD *)a2;
}
*v21 = *(_DWORD *)v21 & 7 | (8 * (v22 + 1));
}
else
{
*(_QWORD *)a2 = ((v12 & 0xFFFFFFFFFFFFFFF8ui64) + 8) | v13;
**(_QWORD **)(v10 + 8) = a2 | **(_DWORD **)(v10 + 8) & 7;
*(_QWORD *)(v10 + 8) = a2;
}
if( !*(_DWORD *)(a1 + 6100) && !*(_DWORD *)(a1 + 6096) )
*(_QWORD *)(a1 + 6112) = KUSER_SHARED_DATA.TickCountQuad;
++*(_DWORD *)(v9 + a1);
if( v4 == 2 && *(_BYTE *)(a1 + 6020) )
{
for( i = *(_QWORD *)(*(_QWORD *)(a1 + 3952) + 16i64);
*(_DWORD *)i < (unsigned __int8)*(_DWORD *)(a2 + 8) << 12;
i += 32i64 )
{
;
}
*(_WORD *)(i + 4) = 0;
*(_QWORD *)(a1 + 6120) += *(_QWORD *)(i + 8);
}
KxReleaseSpinLock((UINT64 *)(a1 + 6040));
__writecr8(v11);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( !v7 )
{
v15 = *(unsigned __int8 *)(a1 + 6022);
if( (_DWORD)v15 == 4 )
v16 = *(_DWORD *)(a1 + 6728);
else
v16 = *((_DWORD *)`SMKM_STORE::SmStGetPriorityByMemoryCondition'::`2'::PriorityByMemoryCondition + v15);
if( v24 )
{
v17 = 12;
}
else if( v4 != 2 || (KeGetPcr()->Prcb._bf_0 & 0x10001) != 0 )
{
v17 = v16;
}
else
{
KeQueryPriorityThread(CurrentThread);
}
v18 = *(_ETHREAD **)(a1 + 6200);
if( v17 > v16 )
v16 = v17;
KeQueryPriorityThread(*(_ETHREAD **)(a1 + 6200));
if( v16 > v19 )
KeSetActualBasePriorityThread(&v18->Tcb, (unsigned int)v16);
KeSetEvent((PRKEVENT)(a1 + 6128), 0, 0);
_InterlockedAdd((volatile signed __int32 *)(a1 + 6732), 0xFFFFFFFF);
}
}
Referenced by:
No references.