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