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.