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 __int8 v11;
unsigned __int64 v12;
unsigned __int64 v13;
__int64 v14;
_KTHREAD *CurrentThread;
__int64 v16;
int v17;
NTSTATUS PriorityThread;
__int64 v19;
UINT64 v20;
unsigned __int8 v21;
unsigned __int64 v22;
_QWORD *v23;
unsigned __int64 v24;
__int64 i;
int v26;
v4 = *(_DWORD *)a2 & 7;
if( v4 == 2 && (*(_BYTE *)(a1 + 6021) & 4) != 0 )
{
if( !(unsigned int)SMKM_STORE::SmStDirectRead(a1, (__int128 *)a2) )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 6560), v20);
v22 = v21;
*(_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(v22);
KeSetEvent((PRKEVENT)(a1 + 6520), 0);
}
return;
}
if( (*(_BYTE *)(a1 + 6021) & 1) != 0 )
return;
v7 = a3 & 4;
if( (a3 & 4) == 0 )
_InterlockedIncrement((volatile signed __int32 *)(a1 + 6732));
v26 = 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;
KeAcquireSpinLockRaiseToDpc((UINT64 *)(a1 + 6040), a2);
v12 = v11;
v13 = **(_QWORD **)(v10 + 8);
v14 = *(_QWORD *)a2 & 7i64;
if( (a3 & 2) != 0 )
{
*(_QWORD *)a2 = *(_QWORD *)v10 | v14;
v23 = *(_QWORD **)(v10 + 8);
v24 = v13 >> 3;
*(_QWORD *)v10 = a2;
if( v23 == (_QWORD *)v10 )
{
*(_QWORD *)(v10 + 8) = a2;
v23 = (_QWORD *)a2;
}
*v23 = *(_DWORD *)v23 & 7 | (8 * (v24 + 1));
}
else
{
*(_QWORD *)a2 = ((v13 & 0xFFFFFFFFFFFFFFF8ui64) + 8) | v14;
**(_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(v12);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( !v7 )
{
v16 = *(unsigned __int8 *)(a1 + 6022);
if( (_DWORD)v16 == 4 )
v17 = *(_DWORD *)(a1 + 6728);
else
v17 = *((_DWORD *)`SMKM_STORE::SmStGetPriorityByMemoryCondition'::`2'::PriorityByMemoryCondition + v16);
if( v26 )
{
PriorityThread = 12;
}
else if( v4 != 2 || (*((_DWORD *)KeGetPcr() + 3243) & 0x10001) != 0 )
{
PriorityThread = v17;
}
else
{
PriorityThread = KeQueryPriorityThread((_KTHREAD *)CurrentThread);
}
v19 = *(_QWORD *)(a1 + 6200);
if( PriorityThread > v17 )
v17 = PriorityThread;
if( v17 > KeQueryPriorityThread(*(_KTHREAD **)(a1 + 6200)) )
KeSetActualBasePriorityThread(v19, v17);
KeSetEvent((PRKEVENT)(a1 + 6128), 0);
_InterlockedAdd((volatile signed __int32 *)(a1 + 6732), 0xFFFFFFFF);
}
}
Referenced by:
No references.