CcWriteBehindInternal
VOID __stdcall CcWriteBehindInternal(_WORK_QUEUE_ENTRY *WorkQueueEntry){
__int64 v1;
__int64 v3;
char *Partition;
char *v5;
unsigned __int64 *v6;
unsigned __int64 *v7;
_SHARED_CACHE_MAP *v8;
unsigned int v9;
unsigned int v10;
__int64 v11;
__int64 v12;
unsigned int v13;
_SECTION_OBJECT_POINTERS *v14;
_LARGE_INTEGER *v15;
_IO_STATUS_BLOCK *v16;
unsigned int v17;
INT64 Status;
int v19;
void **v20;
INT64 v21;
bool v22;
bool v23;
_FILE_OBJECT *v24;
int v25;
bool v26;
__int64 v27;
unsigned int v28;
_LARGE_INTEGER v29;
_FILE_OBJECT *v30;
int v31;
char v32;
int v33;
bool v34;
_FILE_OBJECT *v35;
int v36;
UINT64 v37;
UINT8 v38;
_KLOCK_QUEUE_HANDLE LockHandle;
_LARGE_INTEGER ValidDataLength;
_IO_STATUS_BLOCK *IoStatus;
__int64 v42;
_KLOCK_QUEUE_HANDLE v43;
_KLOCK_QUEUE_HANDLE v44;
bool v46;
char v47;
int v48;
v1 = *((_QWORD *)WorkQueueEntry + 2);
v3 = *((unsigned __int8 *)WorkQueueEntry + 56);
IoStatus = (_IO_STATUS_BLOCK *)*((_QWORD *)WorkQueueEntry + 3);
v47 = v3;
ValidDataLength.QuadPart = 0i64;
v42 = 0i64;
memset(&v43, 0, sizeof(v43));
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v44, 0, sizeof(v44));
Partition = (char *)CcGetPartition((_QWORD *)v1);
v5 = Partition;
if( Partition != *((char **)WorkQueueEntry + 16) )
KeBugCheckEx(0x34u, (PVOID)0x1A98, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
v6 = (unsigned __int64 *)(Partition + 192);
v7 = (unsigned __int64 *)(Partition + 128);
while( 1 )
{
v46 = 0;
KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
++*(_DWORD *)(v1 + 4);
++*(_DWORD *)(v1 + 536);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
LOBYTE(v8) = 1;
CcApplyLowIoPriorityToThread((UINT8)v5, v8);
KeAcquireInStackQueuedSpinLock(v6, &v44);
v9 = *((_DWORD *)v5 + 240);
v10 = *((_DWORD *)v5 + 50);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v44);
__writecr8(v44.OldIrql);
if( v9 >= v10 )
CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
LOBYTE(v11) = 1;
if( !(**(unsigned __int8(__fastcall ***)(_QWORD, __int64))(v1 + 208))(*(_QWORD *)(v1 + 216), v11) )
break;
ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280));
KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
v48 = *(_DWORD *)(v1 + 152) & 0x10000;
v12 = *(_QWORD *)(v1 + 160);
if( v12 )
{
v13 = *(_DWORD *)(v12 + 8);
*(_DWORD *)(v12 + 4) = v13;
v28 = *((_DWORD *)v5 + 124);
if( v13 > v28 )
{
*(_DWORD *)(v12 + 4) = v28;
v13 = v28;
}
}
else
{
v13 = *(_DWORD *)(v1 + 192);
}
v14 = *(_SECTION_OBJECT_POINTERS **)((*(_QWORD *)(v1 + 96) & 0xFFFFFFFFFFFFFFF0ui64) + 0x28);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280));
_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 196i64), v13);
if( (*(_DWORD *)(v1 + 152) & 0x1000000) != 0
&& (_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 200i64), v13),
(*(_DWORD *)(v1 + 152) & 0x1000000) != 0) )
{
v15 = (_LARGE_INTEGER *)&v42;
v42 = *(_QWORD *)(*(_QWORD *)(v1 + 240) + 112i64);
}
else
{
v15 = 0i64;
}
v16 = IoStatus;
CcFlushCachePriv(v14, (_LARGE_INTEGER *)&CmpDummyThreadEvent + 359, 1ui64, v15, 0, IoStatus);
CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
v17 = -v13;
_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 196i64), v17);
if( (*(_DWORD *)(v1 + 152) & 0x1000000) != 0 )
_InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)(v1 + 504) + 200i64), v17);
(*(void(__fastcall **)(_QWORD))(*(_QWORD *)(v1 + 208) + 8i64))(*(_QWORD *)(v1 + 216));
Status = (unsigned int)v16->Status;
if( (_DWORD)Status != -2147483626 && CcIsFatalWriteError((_SHARED_CACHE_MAP *)v1, Status) )
{
v35 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1);
CcMmLogLostDelayedWriteError(v35, (unsigned int)v16->Status);
CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v35);
}
v19 = 0;
ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280));
ValidDataLength = *(_LARGE_INTEGER *)(v1 + 40);
v20 = (void **)CcGetPartition((_QWORD *)v1);
v22 = *(_DWORD *)(v1 + 4) > 1u && v20[98] != v20 + 98;
v23 = 0;
if( (*(_DWORD *)(v1 + 152) & 0x400) != 0 )
{
v27 = *(_QWORD *)(v1 + 40);
if( *(_QWORD *)(v1 + 48) >= v27 && v27 != 0x7FFFFFFFFFFFFFFFi64 && *(_QWORD *)(v1 + 8) )
v23 = 1;
}
if( !*(_DWORD *)(v1 + 516) && v23 && !v22 )
{
v29.anonymous_0.LowPart = CcGetFlushedValidData((INT64)v14, 1, v21);
ValidDataLength = v29;
if( v29.QuadPart >= *(_QWORD *)(v1 + 40) )
{
if( (*(_DWORD *)(v1 + 152) & 0x40000000) != 0
|| (KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280)),
v30 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1),
CcSetValidData(v30, &ValidDataLength),
v19 = v31,
CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v30),
ExAcquireFastMutex((PFAST_MUTEX)(v1 + 280)),
v19 >= 0) )
{
*(_LARGE_INTEGER *)(v1 + 40) = ValidDataLength;
}
else if( v19 != -1073741670 && v19 != -2147483626 && v19 != -1073741740 )
{
ValidDataLength = *(_LARGE_INTEGER *)(v1 + 48);
}
}
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)(v1 + 280));
v7 = (unsigned __int64 *)(v5 + 128);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
--*(_DWORD *)(v1 + 4);
--*(_DWORD *)(v1 + 536);
if( !*(_DWORD *)(v1 + 4) )
{
if( v19 == -1073741740 || v19 == -2147483626 || v19 == -1073741670 )
{
if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
if( !*(_DWORD *)(v1 + 112) )
{
CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)v1);
v32 = 1;
goto LABEL_51;
}
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v24 = CcReferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1);
FsRtlAcquireFileExclusive((INT64)v24);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &v43);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
v25 = *(_DWORD *)(v1 + 4);
if( !v25
&& (!*(_DWORD *)(v1 + 112)
&& (*(_QWORD *)(v1 + 40) == 0x7FFFFFFFFFFFFFFFi64
|| (*(_DWORD *)(v1 + 152) & 0x400) == 0
|| ValidDataLength.QuadPart >= *(_QWORD *)(v1 + 48))
|| !*(_QWORD *)(v1 + 8) && (*(_DWORD *)(v1 + 152) & 4) == 0) )
{
CcDeleteSharedCacheMap((_SHARED_CACHE_MAP *)v1, (UINT8)&v43, (UINT64)&LockHandle, (_FILE_OBJECT *)1);
IoStatus->Information = 0i64;
LABEL_28:
v26 = v47 == 0;
goto LABEL_29;
}
if( *(_DWORD *)(v1 + 112) )
{
if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
}
else
{
v34 = v25 == 0;
if( !v25 )
{
CcInsertIntoDirtySharedCacheMapList((_SHARED_CACHE_MAP *)v1);
v34 = v36 == 0;
}
v46 = v34;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v43);
__writecr8(v43.OldIrql);
FsRtlReleaseFile(v24);
CcDereferenceSharedCacheMapFileObject((_SHARED_CACHE_MAP *)v1, v24);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)v5 + 16, &LockHandle);
}
}
v32 = v46;
LABEL_51:
v33 = *(_DWORD *)(v1 + 152);
if( (v33 & 0x10000) == 0 || v48 )
{
if( IoStatus->Information != 35422 )
*(_DWORD *)(v1 + 152) = v33 & 0xFFFFFFDF;
if( v32 )
{
v5[633] = 1;
CcScheduleLazyWriteScan((UINT8)v5, (*(_DWORD *)(v1 + 152) & 0x10000) != 0);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
goto LABEL_28;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v6 = (unsigned __int64 *)(v5 + 192);
}
CcApplyLowIoPriorityToThread((UINT8)v5, 0i64);
KeAcquireInStackQueuedSpinLock(v7, &LockHandle);
*(_DWORD *)(v1 + 152) &= ~0x20u;
if( (*(_DWORD *)(v1 + 152) & 0x10000) != 0 )
CcCancelMmWaitForUninitializeCacheMap((_SHARED_CACHE_MAP *)v1);
CcDecrementOpenCount((_SHARED_CACHE_MAP *)v1, v37, v38);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v26 = v47 == 0;
IoStatus->Status = -1073741740;
LABEL_29:
if( !v26 )
KeSetEvent((PRKEVENT)((char *)WorkQueueEntry + 32), 0, 0);
}Referenced by:
CcWriteBehind