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.