SMKM_STORE_MGR::SmAsyncReadQueueWorker

__int64 __fastcall SMKM_STORE_MGR::SmAsyncReadQueueWorker(__int64 a1){
  _QWORD *v1; 
  int v2; 
  UINT64 v3; 
  int v4; 
  unsigned int v5; 
  UINT64 *v6; 
  UINT64 v7; 
  unsigned __int8 v8; 
  unsigned __int64 v9; 
  LARGE_INTEGER v10; 
  unsigned __int64 v11; 
  LONGLONG v12; 
  __int128 v13; 
  LARGE_INTEGER PerformanceCounter; 
  int i; 
  unsigned __int8 v16; 
  unsigned __int64 v17; 
  _QWORD *v18; 
  int v19; 
  __int128 v20; 
  __int64 result; 
  _QWORD *v22; 
  union _LARGE_INTEGER PerformanceFrequency; 
  v1 = (_QWORD *)a1;
  v2 = *(_DWORD *)(a1 + 40) & 3;
  v3 = *(_QWORD *)(a1 + 40);
  v4 = *(_DWORD *)(a1 + 32) & 7;
  PerformanceFrequency.QuadPart = 0i64;
  v3 &= 0xFFFFFFFFFFFFFFFCui64;
  v5 = 100;
  v6 = (UINT64 *)(v3 + 768);
  v7 = v3 + 24i64 * ((8 * v2) | (unsigned int)v4);
  KeAcquireSpinLockRaiseToDpc((UINT64 *)(v3 + 768), v3);
  --*(_DWORD *)(v7 + 16);
  ++*(_DWORD *)(v7 + 20);
  v9 = v8;
  KxReleaseSpinLock(v6);
  __writecr8(v9);
LABEL_2:
  v10 = KeQueryPerformanceCounter(&PerformanceFrequency);
  SMKM_STORE::SmStWorkItemQueue(v1[4] & 0xFFFFFFFFFFFFFFF8ui64, (__int64)(v1 - 5), 0);
  v13 = 1000000 * (*(_QWORD *)&KeQueryPerformanceCounter(0i64) - v10.QuadPart);
  v11 = v13 / PerformanceFrequency.QuadPart;
  v12 = v13 % PerformanceFrequency.QuadPart;
  if( v11 < v5 )
    v5 = v11;
  PerformanceCounter.QuadPart = 0i64;
  for( i = 0; ; i = 1 )
  {
LABEL_5:
    KeAcquireSpinLockRaiseToDpc(v6, v12);
    v17 = v16;
    v18 = *(_QWORD **)(v7 + 8);
    if( *v18 )
    {
      if( v18 == (_QWORD *)v7 )
      {
        v1 = 0i64;
      }
      else
      {
        v1 = *(_QWORD **)v7;
        *(_QWORD *)v7 = **(_QWORD **)v7;
        v22 = *(_QWORD **)(v7 + 8);
        if( v1 == v22 )
        {
          *(_QWORD *)v7 = 0i64;
          *(_QWORD *)(v7 + 8) = v7;
        }
        else
        {
          --*v22;
        }
      }
      KxReleaseSpinLock(v6);
      __writecr8(v17);
      goto LABEL_2;
    }
    if( i )
      break;
    KxReleaseSpinLock(v6);
    __writecr8(v17);
    if( !PerformanceCounter.QuadPart )
      PerformanceCounter = KeQueryPerformanceCounter(0i64);
    v19 = 0;
    while( *(_DWORD *)(v7 + 16) <= *(_DWORD *)(v7 + 20) )
    {
      if( **(_QWORD **)(v7 + 8) )
        goto LABEL_5;
      if( (++v19 & 0x7F) == 0 )
      {
        v20 = 1000000 * (*(_QWORD *)&KeQueryPerformanceCounter(0i64) - PerformanceCounter.QuadPart);
        v12 = v20 % PerformanceFrequency.QuadPart;
        if( (unsigned __int64)(v20 / PerformanceFrequency.QuadPart) >= v5 )
          break;
      }
      _mm_pause();
    }
  }
  --*(_DWORD *)(v7 + 20);
  KxReleaseSpinLock(v6);
  result = (unsigned int)KiIrqlFlags;
  __writecr8(v17);
  return result;
}

Referenced by:

No references.