CcWorkerThread
CHAR __fastcall CcWorkerThread(__int64 a1, __int64 a2, INT64 a3){
_QWORD *v3;
_LIST_ENTRY *v4;
_WORK_QUEUE_ENTRY *NextWorkQueueEntry;
__int64 v6;
int v7;
int v8;
_LIST_ENTRY *v9;
signed __int64 v10;
__int64 v11;
unsigned int v12;
__int64 v13;
_QWORD *v14;
_QWORD *v16;
__int64 *v17;
__int64 v18;
_QWORD *v19;
_LIST_ENTRY **p_Flink;
__int64 **v21;
_EXTRA_WORKER_THREAD_ACTION v22;
__int64 *v23;
__int64 v24;
char v25;
char v26;
int v27;
_IO_STATUS_BLOCK IoStatus;
int v30;
_LIST_ENTRY *v31;
__int64 v32;
_KLOCK_QUEUE_HANDLE LockHandle;
__int64 v34[4];
_WORK_QUEUE_ENTRY *v35;
_ETHREAD *CurrentThread;
_ETHREAD *v37;
__int64 v38[2];
__int64 v39[2];
v3 = (_QWORD *)a1;
v4 = 0i64;
NextWorkQueueEntry = 0i64;
v26 = 0;
IoStatus.Pointer = 0i64;
v34[2] = a1;
memset(&LockHandle, 0, sizeof(LockHandle));
IoStatus.Information = 0i64;
v27 = *(_DWORD *)(a1 + 32);
v30 = v27;
if( (unsigned int)(v27 - 1) > 1 )
KeBugCheckEx(0x34u, (PVOID)0x1737, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
v6 = *(_QWORD *)(a1 + 56);
v34[3] = v6;
v32 = v6;
while( 1 )
{
v7 = 0;
v25 = 0;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v6 + 192), &LockHandle);
if( v26 )
{
*(_BYTE *)(v6 + 352) = 0;
v26 = 0;
CcReEngageWorkerThreads(v6, *(unsigned int *)(v6 + 360));
}
if( IoStatus.Information == 35422 )
{
if( *((_BYTE *)NextWorkQueueEntry + 120) == 2 )
*(_QWORD *)(*((_QWORD *)NextWorkQueueEntry + 2) + 496i64) = NextWorkQueueEntry;
p_Flink = &v4->Blink->Flink;
if( *p_Flink != v4 )
goto LABEL_105;
*(_QWORD *)NextWorkQueueEntry = v4;
*((_QWORD *)NextWorkQueueEntry + 1) = p_Flink;
*p_Flink = (_LIST_ENTRY *)NextWorkQueueEntry;
v4->Blink = (_LIST_ENTRY *)NextWorkQueueEntry;
IoStatus.Information = 0i64;
}
v8 = v27;
if( v27 == 2 )
break;
while( 1 )
{
if( (v7 & 1) != 0 || (v7 |= 1u, v4 = (_LIST_ENTRY *)(v6 + 224), v4->Flink == v4) )
{
if( (v7 & 2) != 0 || (v7 |= 2u, v4 = (_LIST_ENTRY *)(v6 + 240), v4->Flink == v4) )
{
LABEL_11:
if( (v7 & 4) != 0 )
goto LABEL_43;
v7 |= 4u;
v4 = (_LIST_ENTRY *)(v6 + 256);
if( v4->Flink == v4 )
goto LABEL_43;
}
}
v31 = v4;
if( v8 != 2 || (v8 = v27, *(_DWORD *)(v6 + 960) >= *(_DWORD *)(v6 + 200)) )
{
if( v4 == (_LIST_ENTRY *)(v6 + 256) )
goto LABEL_15;
if( !*(_DWORD *)(v6 + 356) )
break;
if( (unsigned int)(*(_DWORD *)(v6 + 372) + 1) < *(_DWORD *)(v6 + 200) )
break;
v8 = v27;
if( *(_DWORD *)(v6 + 320) )
break;
}
LABEL_64:
if( v8 == 2 )
goto LABEL_11;
}
if( v4 != (_LIST_ENTRY *)(v6 + 256) )
goto LABEL_16;
LABEL_15:
v8 = v27;
if( (unsigned int)(*(_DWORD *)(v6 + 368) + 1) > *(_DWORD *)(v6 + 960) )
goto LABEL_64;
LABEL_16:
NextWorkQueueEntry = CcFindNextWorkQueueEntry((_LIST_ENTRY *)v6);
v34[1] = (__int64)NextWorkQueueEntry;
v8 = v27;
if( !NextWorkQueueEntry )
goto LABEL_64;
v10 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( *(_BYTE *)(v6 + 776)
&& *(__int64 *)&KUSER_SHARED_DATA.SystemTime.LowPart >= *(_QWORD *)(v6 + 768) + (unsigned int)dword_140C50814
&& *(_QWORD *)(v6 + 208) == v6 + 208
&& *(_DWORD *)(v6 + 496)
&& v9->Flink != v9 )
{
v21 = (__int64 **)(v6 + 304);
if( *v21 != (__int64 *)v21 )
{
v22 = CcOkToAddWriteBehindThread();
*(_QWORD *)(v6 + 768) = v10;
if( *(_DWORD *)(v6 + 320) && v22 == RemoveExtraThread )
*(_BYTE *)(v6 + 777) = 1;
if( v22 == AddExtraThread )
{
v23 = *v21;
v24 = **v21;
if( (__int64 **)(*v21)[1] != v21 || *(__int64 **)(v24 + 8) != v23 )
goto LABEL_105;
*v21 = (__int64 *)v24;
*(_QWORD *)(v24 + 8) = v21;
++*(_DWORD *)(v6 + 320);
if( _InterlockedIncrement64((volatile signed __int64 *)(v6 + 968)) <= 1 )
__fastfail(0xEu);
*v23 = 0i64;
ExQueueWorkItemToPartition(v23);
v25 = 1;
}
v9 = (_LIST_ENTRY *)(v6 + 256);
}
v3 = (_QWORD *)a1;
}
if( v4 == v9 )
*(_QWORD *)(v6 + 760) = v10;
if( *(_DWORD *)(v6 + 960) >= *(_DWORD *)(v6 + 200)
&& v10 >= *(_QWORD *)(v6 + 760) + (unsigned int)dword_140C50814
&& *(_QWORD *)(v6 + 208) == v6 + 208
&& v9->Flink != v9 )
{
v16 = (_QWORD *)(v6 + 304);
v17 = *(__int64 **)(v6 + 304);
if( v17 != (__int64 *)(v6 + 304) && !*(_DWORD *)(v6 + 320) )
{
v18 = *v17;
if( (_QWORD *)v17[1] != v16 || *(__int64 **)(v18 + 8) != v17 )
goto LABEL_105;
*v16 = v18;
*(_QWORD *)(v18 + 8) = v16;
++*(_DWORD *)(v6 + 320);
if( _InterlockedIncrement64((volatile signed __int64 *)(v6 + 968)) <= 1 )
__fastfail(0xEu);
*v17 = 0i64;
ExQueueWorkItemToPartition(v17);
*(_QWORD *)(v6 + 760) = v10;
v25 = 1;
v9 = (_LIST_ENTRY *)(v6 + 256);
}
}
if( v4 == v9 || (v11 = 372i64, v4 == (_LIST_ENTRY *)(v6 + 288)) )
v11 = 368i64;
_InterlockedAdd((volatile signed __int32 *)(v32 + v11), 1u);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
if( v25 )
CcLogExtraWBThreadAction((_EXTRA_WORKER_THREAD_ACTION)v6);
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
v34[0] = (__int64)NextWorkQueueEntry;
v38[0] = (__int64)v34;
v38[1] = 8i64;
EtwTraceKernelEvent((__int64)v38, 1u, 0x80020000, 0x1601u, 0x401902u);
}
}
switch( *((_BYTE *)NextWorkQueueEntry + 120) )
{
case 1:
CcPerformReadAhead(NextWorkQueueEntry, *((_FILE_OBJECT **)NextWorkQueueEntry + 2));
break;
case 2:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
CurrentThread->SameThreadPassiveFlags |= 2u;
v12 = 0;
do
{
IoStatus.Information = (unsigned __int64)NextWorkQueueEntry;
CcWriteBehind(*((_SHARED_CACHE_MAP **)NextWorkQueueEntry + 2), &IoStatus);
if( v12 >= 0xA )
break;
++v12;
}
while( IoStatus.Information == 35422 );
v37 = (_ETHREAD *)KeGetCurrentThread();
v37->SameThreadPassiveFlags &= ~2u;
break;
case 3:
CcLazyWriteScan((_WORK_QUEUE_ENTRY *)v6, (UINT64)NextWorkQueueEntry);
break;
case 4:
KeSetEvent(*((PRKEVENT *)NextWorkQueueEntry + 2), 0, 0);
v26 = 1;
break;
}
if( v4 == (_LIST_ENTRY *)(v6 + 256) || (v13 = 372i64, v4 == (_LIST_ENTRY *)(v6 + 288)) )
v13 = 368i64;
_InterlockedAdd((volatile signed __int32 *)(v32 + v13), 0xFFFFFFFF);
if( IoStatus.Information == 35422 )
{
if( (xmmword_140CFB490 & 0x20000) != 0 )
CcPerfLogWorkItemEnqueue(v4, NextWorkQueueEntry, 1u, 0);
}
else
{
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
v35 = NextWorkQueueEntry;
v39[0] = (__int64)&v35;
v39[1] = 8i64;
EtwTraceKernelEvent((__int64)v39, 1u, 0x80020000, 0x1602u, 0x401902u);
}
CcFreeWorkQueueEntry(NextWorkQueueEntry);
}
}
if( !*(_BYTE *)(v6 + 777) )
goto LABEL_64;
*(_BYTE *)(v6 + 777) = 0;
LABEL_43:
if( v8 == 2 )
{
v19 = *(_QWORD **)(v6 + 312);
if( *v19 == v6 + 304 )
{
*v3 = v6 + 304;
v3[1] = v19;
*v19 = v3;
*(_QWORD *)(v6 + 312) = v3;
--*(_DWORD *)(v6 + 320);
goto LABEL_46;
}
LABEL_105:
__fastfail(3u);
}
v14 = *(_QWORD **)(v6 + 216);
if( *v14 != v6 + 208 )
goto LABEL_105;
*v3 = v6 + 208;
v3[1] = v14;
*v14 = v3;
*(_QWORD *)(v6 + 216) = v3;
--*(_DWORD *)(v6 + 204);
LABEL_46:
if( *(_BYTE *)(v6 + 776) && !*(_DWORD *)(v6 + 320) && *(_DWORD *)(v6 + 204) <= 1u )
{
*(_BYTE *)(v6 + 776) = 0;
memset(*(VOID **)(v6 + 720), 0i64, 8 * (*(_DWORD *)(v6 + 324) + 1));
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( (xmmword_140CFB490 & 0x20000) != 0 && v27 == 2 )
CcLogExtraWBThreadAction((_EXTRA_WORKER_THREAD_ACTION)v6);
return CcDereferencePartition(v6);
}Referenced by:
No references.