CcQueueLazyWriteScanThread
VOID __stdcall CcQueueLazyWriteScanThread(VOID *StartContext){
char *v1;
unsigned int v3;
char v4;
NTSTATUS v5;
int v6;
int v7;
signed __int64 v8;
unsigned __int64 i;
signed __int64 v10;
_WORK_QUEUE_ENTRY *v11;
__int64 v12;
char v13;
int v14;
int v15;
_KLOCK_QUEUE_HANDLE WaitBlockArray;
__int64 v17;
_WORK_QUEUE_ENTRY *WorkQueueEntry;
VOID *Object[6];
_KWAIT_BLOCK v20;
v1 = (char *)StartContext + 1000;
WorkQueueEntry = 0i64;
v17 = 0i64;
Object[5] = (char *)StartContext + 1000;
Object[0] = (char *)StartContext + 376;
v3 = 0;
Object[1] = (char *)StartContext + 400;
v4 = 0;
Object[2] = (char *)StartContext + 424;
Object[3] = (char *)StartContext + 448;
Object[4] = (char *)StartContext + 472;
*(_OWORD *)&WaitBlockArray.LockQueue.Lock = 0i64;
while( 1 )
{
if( v4 )
CcDereferencePartition((INT64)StartContext);
v5 = KeWaitForMultipleObjects(6ui64, Object, WaitAny, WrFreePage, 0, 0, 0i64, &v20);
if( !v5 )
{
v3 = 1;
goto LABEL_39;
}
v6 = v5 - 1;
if( !v6 )
{
v3 = 2;
goto LABEL_8;
}
v7 = v6 - 1;
if( v7 )
break;
v3 = 4;
LABEL_8:
_m_prefetchw((char *)StartContext + 968);
v8 = *((_QWORD *)StartContext + 121);
for( i = v8 + 1; ; i = v8 + 1 )
{
if( i <= 1 )
{
if( i != 1 )
__fastfail(0xEu);
KeWaitForSingleObject((UINT64)v1, 0, 0, 0, 0i64);
return;
}
v10 = v8;
v8 = _InterlockedCompareExchange64((volatile signed __int64 *)StartContext + 121, i, v8);
if( v10 == v8 )
break;
}
v4 = 1;
if( *(&CmpDummyThreadEvent + 720)
&& (_UNKNOWN *)*(&CmpDummyThreadEvent + 386) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 3088)
&& StartContext == *(VOID **)(PspSystemPartition + 8) )
{
CcNotifyExternalCaches(v3);
}
CcAdjustWriteBehindThreadPoolIfNeeded((UINT8)StartContext);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)StartContext + 16, (PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
if( v3 > 2 )
{
if( v3 == 4 )
{
if( !*((_BYTE *)StartContext + 635) && !*((_BYTE *)StartContext + 634) )
goto LABEL_16;
LABEL_31:
KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
__writecr8((unsigned __int8)v17);
continue;
}
if( v3 == 8 )
{
v13 = *((_BYTE *)StartContext + 634);
LABEL_30:
if( !v13 )
goto LABEL_16;
goto LABEL_31;
}
}
if( *((_BYTE *)StartContext + 636) || *((_BYTE *)StartContext + 637) || *((_BYTE *)StartContext + 638) )
{
v13 = 1;
goto LABEL_30;
}
LABEL_16:
CcSetLazyWriteScanQueued((UINT64)StartContext, v3);
KeReleaseInStackQueuedSpinLockFromDpcLevel((PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
__writecr8((unsigned __int8)v17);
if( (int)CcAllocateWorkQueueEntry((__int64)StartContext, (PSLIST_ENTRY *)&WorkQueueEntry) < 0 )
{
++*(&CmpDummyThreadEvent + 767);
KeAcquireInStackQueuedSpinLock(
(PKSPIN_LOCK)StartContext + 16,
(PKLOCK_QUEUE_HANDLE)&WaitBlockArray.LockQueue.Lock);
*((_BYTE *)StartContext + 632) = 0;
CcSetLazyWriteScanQueued((UINT64)StartContext, v3);
goto LABEL_31;
}
v11 = WorkQueueEntry;
v12 = 224i64;
*((_BYTE *)WorkQueueEntry + 120) = 3;
if( v3 != 8 )
v12 = 256i64;
*((_DWORD *)v11 + 4) = v3;
CcPostWorkQueue(v11, (_LIST_ENTRY *)((char *)StartContext + v12));
}
v14 = v7 - 1;
if( !v14 )
{
v3 = 8;
goto LABEL_8;
}
v15 = v14 - 1;
if( !v15 )
{
v3 = 16;
goto LABEL_8;
}
if( v15 == 1 )
return;
LABEL_39:
if( v3 )
goto LABEL_8;
}Referenced by:
No references.