CcWriteBehind
VOID __stdcall CcWriteBehind(_SHARED_CACHE_MAP *SharedCacheMap, _IO_STATUS_BLOCK *IoStatus){
VOID **v3;
void *Partition;
int v6;
_WORK_QUEUE_ENTRY *v7;
VOID **PoolWithTag;
__int64 v9[18];
_WORK_QUEUE_ENTRY *WorkQueueEntry;
v3 = 0i64;
WorkQueueEntry = 0i64;
Partition = CcGetPartition(SharedCacheMap);
v6 = CcAllocateWorkQueueEntry((__int64)Partition, (PSLIST_ENTRY *)&WorkQueueEntry);
v7 = WorkQueueEntry;
if( v6 < 0
|| (*((_BYTE *)WorkQueueEntry + 120) = 2,
*((_QWORD *)v7 + 1) = 0i64,
*(_QWORD *)v7 = 0i64,
*((_QWORD *)v7 + 2) = SharedCacheMap,
*((_QWORD *)v7 + 3) = IoStatus,
*((_DWORD *)Partition + 240) >= *((_DWORD *)Partition + 50))
|| *((_QWORD *)Partition + 116)
|| *((_DWORD *)SharedCacheMap + 129)
|| (*((_DWORD *)SharedCacheMap + 38) & 0x10000) != 0
|| *((_BYTE *)Partition + 966)
|| (PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x40ui64, 1901552451i64), (v3 = PoolWithTag) == 0i64) )
{
memset(v9, 0i64, 0x88u);
if( !v7 )
{
v9[16] = (__int64)Partition;
v7 = (_WORK_QUEUE_ENTRY *)v9;
LOBYTE(v9[15]) = 2;
v9[1] = 0i64;
v9[0] = 0i64;
v9[2] = (__int64)SharedCacheMap;
v9[3] = (__int64)IoStatus;
LOBYTE(v9[7]) = 0;
}
*((_BYTE *)v7 + 56) = 0;
CcWriteBehindInternal(v7);
if( v7 == (_WORK_QUEUE_ENTRY *)v9 )
v7 = 0i64;
}
else
{
PoolWithTag[7] = Partition;
*((_DWORD *)PoolWithTag + 8) = 1;
*((_BYTE *)v7 + 56) = 1;
*((_QWORD *)v7 + 6) = (char *)v7 + 40;
*((_QWORD *)v7 + 5) = (char *)v7 + 40;
*((_WORD *)v7 + 16) = 1;
*((_BYTE *)v7 + 34) = 6;
*((_DWORD *)v7 + 9) = 0;
PoolWithTag[2] = CcWriteBehindInternal;
PoolWithTag[3] = v7;
*PoolWithTag = 0i64;
ExQueueWorkItemToPartition(PoolWithTag);
KeWaitForSingleObject((UINT64)v7 + 32, 0, 0, 0, 0i64);
}
if( v7 )
CcFreeWorkQueueEntry(v7);
if( v3 )
ExFreePoolWithTag(v3, 0x71576343u);
}Referenced by:
CcWaitForUninitializeCacheMap
CcWorkerThread