ExpWorkerThread

VOID __stdcall ExpWorkerThread(VOID *StartContext){
  _ETHREAD *CurrentThread; 
  char v2; 
  __int64 v3; 
  unsigned int SameThreadPassiveFlags; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *BugCheckParameter4; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  unsigned int SameThreadApcFlags; 
  signed __int32 v11; 
  int v12; 
  signed __int32 v13; 
  signed __int32 v14; 
  bool v15; 
  struct _KPRCB *CurrentPrcb; 
  unsigned int v17; 
  unsigned int PagePriorityThread; 
  _IO_PRIORITY_HINT IoPriorityThread; 
  int v20[8]; 
  __int64 v21; 
  __int64 v22; 
  _GROUP_AFFINITY PreviousAffinity; 
  unsigned int v24; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = 1;
  v3 = *((_QWORD *)StartContext + 87);
  v22 = *((_QWORD *)StartContext + 86);
  SameThreadPassiveFlags = CurrentThread->SameThreadPassiveFlags;
  v21 = 0i64;
  PreviousAffinity = 0i64;
  if( (SameThreadPassiveFlags & 1) != 0 )
    __fastfail(0x38u);
  CurrentThread->SameThreadPassiveFlags = SameThreadPassiveFlags | 1;
  _InterlockedOr(v20, 0);
  if( !*(&WheapDeferredInternalLogsEventLock + 2584) )
    KeSetKernelStackSwapEnable(0);
  do
  {
LABEL_4:
    while( 1 )
    {
      v6 = KeRemovePriQueue((_KPRIQUEUE *)StartContext, 0i64);
      BugCheckParameter4 = v6;
      if( !v2 )
        break;
      v2 = 0;
      *((_DWORD *)StartContext + 179) &= ~0x80000000;
      _InterlockedAnd((volatile signed __int32 *)StartContext + 178, 0xFFFFBFFF);
      if( v6 != (_LIST_ENTRY *)258 )
      {
LABEL_6:
        if( v6 == (_LIST_ENTRY *)128 )
          goto LABEL_28;
        if( ExpNewThreadNecessary((_EX_WORK_QUEUE *)StartContext, *((unsigned int *)StartContext + 180)) )
          KeSetEvent(
            (PRKEVENT)(*(_QWORD *)(*(_QWORD *)(v22 + 16) + 8i64 * *(unsigned __int16 *)(v3 + 146)) + 16i64),
            0,
            0);
        _InterlockedIncrement((volatile signed __int32 *)StartContext + 176);
        Flink = BugCheckParameter4[1].Flink;
        Blink = BugCheckParameter4[1].Blink;
        ((void(__fastcall *)(_LIST_ENTRY *))Flink)(Blink);
        if( (KeGetPcr()->Prcb.BpbRetpolineState & 1) != 0 )
        {
          _disable();
          CurrentPrcb = KeGetCurrentPrcb();
          v17 = v24 >> 9;
          CurrentPrcb->BpbRetpolineState &= ~1u;
          if( (v17 & 1) != 0 )
            _enable();
        }
        if( CurrentThread->Tcb.MutantListHead.Flink != &CurrentThread->Tcb.MutantListHead )
          KeBugCheckEx(0x39u, Flink, Blink, BugCheckParameter4, 0i64);
        if( CurrentThread->Tcb.WaitBlock[3].SpareLong )
          KeBugCheckEx(
            1u,
            Flink,
            (PVOID)CurrentThread->Tcb.ApcStateIndex,
            (PVOID)CurrentThread->Tcb.CombinedApcDisable,
            (PVOID)1);
        if( KeGetCurrentIrql() )
          KeBugCheckEx(0xE1u, Flink, (PVOID)KeGetCurrentIrql(), Blink, BugCheckParameter4);
        if( (CurrentThread->CrossThreadFlags & 8) != 0 )
          KeBugCheckEx(0xDFu, Flink, Blink, BugCheckParameter4, 0i64);
        if( KeGetCurrentThread()->ApcStateIndex == 1 )
          KeBugCheckEx(
            5u,
            CurrentThread->Tcb.Process,
            CurrentThread->Tcb.ApcState.Process,
            (PVOID)CurrentThread->Tcb.ApcStateIndex,
            CurrentThread);
        if( CurrentThread->Silo != (_EJOB *)-3i64 )
          KeBugCheckEx(0x19Au, Flink, Blink, BugCheckParameter4, 0i64);
        if( PsGetIoPriorityThread(CurrentThread) != IoPriorityNormal )
        {
          IoPriorityThread = PsGetIoPriorityThread(CurrentThread);
          KeBugCheckEx(0x128u, Flink, (PVOID)(int)IoPriorityThread, Blink, BugCheckParameter4);
        }
        if( (unsigned int)PsGetPagePriorityThread(CurrentThread) != 5 )
        {
          PagePriorityThread = PsGetPagePriorityThread(CurrentThread);
          KeBugCheckEx(0x129u, Flink, (PVOID)PagePriorityThread, Blink, BugCheckParameter4);
        }
        SameThreadApcFlags = CurrentThread->SameThreadApcFlags;
        if( (SameThreadApcFlags & 0x100) != 0 )
          KeBugCheckEx(0x15Bu, Flink, (PVOID)((SameThreadApcFlags >> 9) & 7), Blink, BugCheckParameter4);
        if( (CurrentThread->SameThreadPassiveFlags & 0x800) != 0 )
          KeBugCheckEx(
            0x1D6u,
            Flink,
            (PVOID)((CurrentThread->SameThreadPassiveFlags >> 11) & 1),
            Blink,
            BugCheckParameter4);
        if( (CurrentThread->Tcb._bf_0 & 8) != 0 )
        {
          DbgPrintEx(
            0,
            0,
            "EXWORKER: worker exit with system affinity set, worker routine %p, parameter %p, item %p\n",
            Flink,
            Blink,
            BugCheckParameter4);
          PreviousAffinity = 0i64;
          KeRevertToUserGroupAffinityThread(&PreviousAffinity);
        }
        if( CurrentThread->Tcb.UserAffinity.Group != *(_WORD *)(v3 + 144)
          || CurrentThread->Tcb.UserAffinity.Mask != *(_QWORD *)(v3 + 136) )
        {
          KeQueryNodeActiveAffinity(*(_WORD *)(v3 + 146), &PreviousAffinity, 0i64);
          KeSetAffinityThread((INT64)CurrentThread, (INT64)&PreviousAffinity);
        }
        if( CurrentThread->ActivityId )
        {
          DbgPrintEx(
            0,
            0,
            "EXWORKER: worker exit with activity ID set, worker routine %p, parameter %p, item %p\n",
            Flink,
            Blink,
            BugCheckParameter4);
          KeGetCurrentThread()[1].WaitBlock[1].WaitListEntry.Flink = 0i64;
        }
      }
    }
    if( v6 != (_LIST_ENTRY *)258 )
      goto LABEL_6;
LABEL_28:
    ;
  }
  while( (*((_DWORD *)StartContext + 178) & 0x8000) == 0
       && (CurrentThread->IrpList.Flink != &CurrentThread->IrpList || *((_DWORD *)StartContext + 1)) );
  _m_prefetchw((char *)StartContext + 712);
  v11 = *((_DWORD *)StartContext + 178);
  do
  {
    v12 = (v11 & 0x3FFF) - 1;
    v13 = v11;
    if( v12 < (2 * *((_DWORD *)StartContext + 179)) >> 1 && (v11 & 0x8000) == 0 )
      goto LABEL_4;
    v14 = v11 & 0xFFFFC000 | v12;
    v11 = _InterlockedCompareExchange((volatile signed __int32 *)StartContext + 178, v14, v11);
  }
  while( v11 != v13 );
  v15 = v14 == 0x8000;
  if( CurrentThread->IrpList.Flink != &CurrentThread->IrpList )
    KeBugCheckEx(0x1D2u, 0i64, CurrentThread, 0i64, 0i64);
  CurrentThread->SameThreadPassiveFlags &= ~1u;
  KeSetKernelStackSwapEnable(1);
  if( v15 )
    KeSetEvent(*((PRKEVENT *)StartContext + 91), 0, 0);
}

Referenced by:

No references.