CcScanLogHandleList
VOID __stdcall CcScanLogHandleList(
UINT64 *TotalPagesToWriteForLoggedStreams,
UINT64 ReasonForFlush,
_LARGE_INTEGER *OldestLWSTimeStamp,
INT64 *a4){
char *v7;
unsigned __int64 *v8;
char *v9;
__int64 v10;
unsigned int *v11;
unsigned int *v12;
unsigned int v13;
unsigned int v14;
__int64 v15;
_DIRTY_PAGE_STATISTICS *v16;
unsigned int v17;
unsigned __int64 v18;
int v19;
int v20;
INT64 v21;
__int64 v22;
char **v23;
VOID *v24;
_KLOCK_QUEUE_HANDLE LockHandle;
_KLOCK_QUEUE_HANDLE v26;
unsigned __int16 v28;
_DIRTY_PAGE_STATISTICS *DirtyPageStatistics;
LODWORD(DirtyPageStatistics) = (_DWORD)OldestLWSTimeStamp;
*(_QWORD *)&LockHandle.OldIrql = 0i64;
*(_QWORD *)&v26.OldIrql = 0i64;
*(_DWORD *)ReasonForFlush = 0;
*a4 = 0x7FFFFFFFFFFFFFFFi64;
v28 = 0;
LockHandle.LockQueue = 0i64;
v26.LockQueue = 0i64;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
v7 = (char *)*(&CmpDummyThreadEvent + 366);
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 366) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2928) )
{
v8 = TotalPagesToWriteForLoggedStreams + 16;
do
{
v9 = v7 - 16;
++*((_DWORD *)v7 - 3);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v10 = *((_QWORD *)v7 + 3);
if( v10 )
(*((void(__fastcall **)(__int64, unsigned __int16 *))v9 + 7))(v10, &v28);
KeAcquireInStackQueuedSpinLock(v8, &v26);
if( !*((_QWORD *)v9 + 5) )
goto LABEL_12;
v11 = (unsigned int *)(v9 + 64);
v12 = (unsigned int *)(v9 + 112);
if( *((_QWORD *)v9 + 8) >= 0xFFFFFFFFui64 )
{
++CcDbgForcedLogPercentFull;
v28 = 0;
}
else
{
v13 = *v11;
*v12 = *v11;
if( v28 )
{
v14 = 100 * v13;
*v12 = v14;
v15 = v14 / v28;
goto LABEL_9;
}
}
v15 = *((unsigned int *)v9 + 37);
LABEL_9:
v16 = (_DIRTY_PAGE_STATISTICS *)(unsigned int)DirtyPageStatistics;
*((_QWORD *)v9 + 11) = v15;
*((_QWORD *)v9 + 13) = v15;
*((_QWORD *)v9 + 12) = v15;
*v12 = (unsigned int)(3 * v15) >> 2;
v17 = CcCalculatePagesToWrite(
(UINT64)TotalPagesToWriteForLoggedStreams,
v16,
(_DIRTY_PAGE_THRESHOLDS *)(v9 + 64),
(UINT64)(v9 + 88));
v18 = *(_QWORD *)v11;
*((_QWORD *)v9 + 9) = *(_QWORD *)v11;
if( v17 > v18 >> 3 )
{
*(_DWORD *)ReasonForFlush += v17;
++CcDbgAdditionalPagesQueuedCount;
}
else
{
v17 = 0;
}
*((_DWORD *)v9 + 36) = v17;
*((_DWORD *)v9 + 20) = v17;
if( *((_QWORD *)v9 + 4) )
{
v21 = *((_QWORD *)v9 + 22);
if( v21 < *a4 )
*a4 = v21;
}
LABEL_12:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v26);
__writecr8(v26.OldIrql);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
v19 = *((_DWORD *)v9 + 1);
v7 = *(char **)v7;
if( !v19 )
KeBugCheckEx(0x34u, (PVOID)0x599, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
v20 = v19 - 1;
*((_DWORD *)v9 + 1) = v20;
if( !v20 )
{
v22 = *((_QWORD *)v9 + 2);
v23 = (char **)*((_QWORD *)v9 + 3);
if( *(char **)(v22 + 8) != v9 + 16 || *v23 != v9 + 16 )
__fastfail(3u);
*v23 = (char *)v22;
*(_QWORD *)(v22 + 8) = v23;
v24 = (VOID *)*((_QWORD *)v9 + 20);
if( v24 )
{
ObfDereferenceObjectWithTag(v24, 0x746C6644ui64);
*((_QWORD *)v9 + 20) = 0i64;
}
ExFreePoolWithTag(v9, 0x6D566343u);
}
}
while( v7 != (char *)&CmpDummyThreadEvent + 2928 );
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}Referenced by:
CcLazyWriteScan