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.