SMKM_STORE::SmStWorkItemGet

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

Referenced by:

No references.