SMKM_STORE_MGR::SmCompressCtxWorkerThread
void __fastcall SMKM_STORE_MGR::SmCompressCtxWorkerThread(PVOID StartContext){
__int64 v1;
unsigned __int8 v3;
_QWORD *v4;
unsigned __int64 v5;
__int64 *v6;
_MDL *v7;
unsigned __int64 v8;
_QWORD **v9;
_QWORD *v10;
_QWORD *v11;
__int64 v12;
char v13;
unsigned __int64 v14;
__int64 v15;
__int64 **v16;
__int64 v17;
__int64 **v18;
_KTHREAD *Thread;
__int64 v20;
v1 = *(_QWORD *)StartContext;
v20 = -50000000i64;
Thread = (_ETHREAD *)KeGetCurrentThread();
v3 = ExAcquireSpinLockExclusive((INT64 *)v1);
++*(_DWORD *)(v1 + 92);
v4 = *(_QWORD **)(v1 + 80);
v5 = v3;
if( *v4 != v1 + 72 )
goto LABEL_32;
v18 = *(__int64 ***)(v1 + 80);
v17 = v1 + 72;
*v4 = &v17;
*(_QWORD *)(v1 + 80) = &v17;
KeSetActualBasePriorityThread(&Thread->Tcb, *(unsigned int *)(v1 + 128));
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1);
__writecr8(v5);
KeSetEvent(*((PRKEVENT *)StartContext + 2), 0, 0);
while( 1 )
{
while( 1 )
{
v6 = &v20;
if( *(_DWORD *)(v1 + 92) <= 1u )
v6 = 0i64;
if( KeWaitForSingleObject(v1 + 24, 26, 0, 0, (INT64)v6) == 258 )
break;
v7 = 0i64;
LOBYTE(v8) = ExAcquireSpinLockExclusive((INT64 *)v1);
while( 1 )
{
if( *(_DWORD *)(v1 + 92) > *(_DWORD *)(v1 + 88) )
{
if( !v7 )
goto LABEL_22;
v11 = 0i64;
}
else
{
v9 = (_QWORD **)(v1 + 8);
v10 = *(_QWORD **)(v1 + 16);
if( v10 == (_QWORD *)(v1 + 8) )
{
v11 = 0i64;
KeResetEvent((_KEVENT *)(v1 + 24));
}
else
{
v11 = *v9;
*v9 = (_QWORD *)**v9;
if( v11 == v10 )
{
*(_QWORD *)(v1 + 16) = v1 + 8;
*v9 = 0i64;
}
else
{
--*v10;
}
}
}
if( !*(_DWORD *)(v1 + 28) && **(_QWORD **)(v1 + 16) >= 3ui64 )
KeSetEvent((PRKEVENT)(v1 + 24), 0, 0);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1);
__writecr8((unsigned __int8)v8);
v12 = *((_QWORD *)StartContext + 1);
if( !v11 )
break;
v7 = (_MDL *)(v11 - 9);
SMKM_STORE_MGR::SmCompressCtxProcessEntry(
v1,
v12,
*((VOID **)StartContext + 3),
*((VOID **)StartContext + 4),
v7);
v13 = ExAcquireSpinLockExclusive((INT64 *)v1);
v14 = *(unsigned int *)(v1 + 92);
LOBYTE(v8) = v13;
if( *(_DWORD *)(v1 + 88) > (unsigned int)v14 && **(_QWORD **)(v1 + 16) >> 1 > v14 )
KeSetEvent((PRKEVENT)(v1 + 48), 0, 0);
}
SMKM_STORE_MGR::SmCompressCtxProcessReadyQueue(v1, v12, 0xFFu, 1);
}
v8 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)v1);
if( *(_DWORD *)(v1 + 92) > 1u )
break;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1);
__writecr8(v8);
}
LABEL_22:
if( !*(_DWORD *)(v1 + 28) && (*(_QWORD *)(v1 + 16) != v1 + 8 || !*(_DWORD *)(v1 + 88)) )
KeSetEvent((PRKEVENT)(v1 + 24), 0, 0);
v15 = v17;
v16 = v18;
if( *(__int64 **)(v17 + 8) != &v17 || *v18 != &v17 )
LABEL_32:
__fastfail(3u);
*v18 = (__int64 *)v17;
*(_QWORD *)(v15 + 8) = v16;
--*(_DWORD *)(v1 + 92);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1);
__writecr8((unsigned __int8)v8);
SMKM_STORE_MGR::SmCompressContextDeleteThreadParams(StartContext);
}
Referenced by:
No references.