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.