SMKM_STORE::SmStWorkItemGet

__int64 *__fastcall SMKM_STORE::SmStWorkItemGet(__int64 a1, _DWORD *a2){
  UINT64 *v2; 
  unsigned __int8 v5; 
  unsigned __int64 *v6; 
  unsigned __int64 v7; 
  __int64 *v8; 
  unsigned __int64 *v9; 
  __int64 *v10; 
  __int64 v11; 
  int v12; 
  int v13; 
  unsigned __int64 *v14; 
  __int64 *v15; 
  __int64 *v16; 
  _ETHREAD *v18; 
  int v19; 
  __int64 v20; 
  INT64 v21; 
  int v22; 
  __int64 i; 
  unsigned __int64 v24; 
  unsigned __int64 v25; 

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

Referenced by:

No references.