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.