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.