CcFlushCachePriv
VOID __fastcall CcFlushCachePriv(
_SECTION_OBJECT_POINTERS *SectionObjectPointer,
_LARGE_INTEGER *FileOffset,
UINT64 Length,
_LARGE_INTEGER *LargestLsn,
UINT8 MarkWritethrough,
_IO_STATUS_BLOCK *IoStatus){
char v6;
int v8;
__int64 v9;
_IO_STATUS_BLOCK *v10;
int v11;
_LARGE_INTEGER *v12;
_SHARED_CACHE_MAP *SharedCacheMap;
signed __int64 *v14;
WORK_QUEUE_TYPE v15;
PVOID v16;
unsigned int Flags;
int v18;
UINT8 *v19;
signed __int64 v20;
signed __int64 QuadPart;
_KEVENT *v22;
void **v23;
int v24;
int Status;
int v26;
int v27;
int v28;
char v29;
char v30;
unsigned int v31;
__int64 *p_IoObject;
unsigned int v33;
unsigned int v34;
INT64 v35;
unsigned int v36;
int v37;
INT64 VirtualAddressIfMapped;
_KEVENT *v39;
unsigned int v40;
__int64 v41;
struct _KEVENT *v42;
unsigned int v43;
void(__fastcall *Routine)(void *, void *, _IO_WORKITEM *);
UINT64 v45;
unsigned int v46;
int v47;
int v48;
INT64 v49;
CHAR v50;
char *v51;
int v52;
_KEVENT *v53;
int v54;
int v55;
int v56;
INT64 v57;
int v58;
INT64 v59;
INT64 v60;
__int64 v61;
LONGLONG v62;
void *v63;
ULONG_PTR BugCheckParameter4;
ULONG_PTR BugCheckParameter4a;
ULONG_PTR BugCheckParameter4b;
UINT64 v67;
UINT64 v68;
UINT64 v69;
INT64 v70;
int v71;
int v72;
unsigned int v73;
int v74;
int v75;
_LARGE_INTEGER *Offset;
INT64 Partition;
unsigned int v78;
_LARGE_INTEGER v79;
INT64 Information;
struct _IO_WORKITEM v81;
_IO_STATUS_BLOCK *v82;
__int128 v83;
_LARGE_INTEGER *v85;
unsigned int v86;
v86 = Length;
v85 = FileOffset;
v79.QuadPart = 0i64;
v6 = 0;
memset(&v81.IoObject, 0, 48);
v70 = 0i64;
v73 = 0;
v8 = 0;
v75 = 0;
v9 = 0i64;
v78 = 0;
v74 = 0;
v71 = 0;
v72 = 0;
Information = 0i64;
Partition = 0i64;
v83 = 0i64;
memset(&v81, 0, 24);
if( LargestLsn && FileOffset && FileOffset != (_LARGE_INTEGER *)CcNoDelay )
KeBugCheckEx(0x34u, 0x1640ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
v10 = (_IO_STATUS_BLOCK *)&v83;
if( IoStatus )
v10 = IoStatus;
v81.Routine = 0i64;
v82 = v10;
v10->Status = 0;
if( FileOffset == (_LARGE_INTEGER *)CcNoDelay )
{
FileOffset = 0i64;
Information = v10->Information;
v85 = 0i64;
v10->Status = -2147483626;
v71 = 1;
}
else
{
v11 = 1;
if( MarkWritethrough )
v11 = 17;
HIDWORD(v70) = v11;
}
v10->Information = 0i64;
v12 = 0i64;
if( FileOffset != &CcFlushForImageSection )
v12 = FileOffset;
KeAcquireInStackQueuedSpinLock(&CcMasterLock, (KLOCK_QUEUE_HANDLE *)&v81.Type);
SharedCacheMap = (_SHARED_CACHE_MAP *)SectionObjectPointer->SharedCacheMap;
v14 = (signed __int64 *)v12;
Offset = v12;
if( !SharedCacheMap )
{
v18 = v71;
goto LABEL_29;
}
Partition = CcGetPartition(SharedCacheMap);
v81.WorkItem.List.Flink = 0i64;
v81.WorkItem.List.Blink = (_LIST_ENTRY *)(Partition + 128);
KxAcquireQueuedSpinLock(&v81, (PIO_WORKITEM_ROUTINE)(Partition + 128), v15, v16);
Flags = SharedCacheMap->Flags;
v6 = 1;
Offset = v12;
v14 = (signed __int64 *)v12;
if( (Flags & 0x2000) != 0 )
{
if( ((unsigned __int8)v12 & 1) == 0 )
goto LABEL_36;
v14 = (signed __int64 *)((unsigned __int64)v12 ^ 1);
Offset = (_LARGE_INTEGER *)((unsigned __int64)v12 ^ 1);
}
v18 = v71;
if( !v71 )
{
if( !v14 )
{
LABEL_26:
v19 = (UINT8 *)v86;
++SharedCacheMap->WritesInProgress;
goto LABEL_30;
}
v20 = *v14;
QuadPart = SharedCacheMap->SectionSize.QuadPart;
if( *v14 < QuadPart )
{
v19 = (UINT8 *)v86;
if( v20 + v86 <= QuadPart )
{
v14 = (signed __int64 *)Offset;
++SharedCacheMap->WritesInProgress;
goto LABEL_30;
}
v86 = QuadPart - v20;
v14 = (signed __int64 *)Offset;
goto LABEL_26;
}
LABEL_36:
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
LABEL_37:
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
return;
}
if( (Flags & 0x10000) == 0 )
{
LABEL_29:
v19 = (UINT8 *)v86;
goto LABEL_30;
}
v19 = (UINT8 *)v86;
v72 = 1;
if( SharedCacheMap->WritesInProgress )
v8 = 1;
v14 = (signed __int64 *)Offset;
LABEL_30:
if( v14 && !(_DWORD)v19 )
{
if( SharedCacheMap )
{
if( !v18 )
--SharedCacheMap->WritesInProgress;
}
if( !v6 )
goto LABEL_37;
goto LABEL_36;
}
if( v85 == &CcFlushForImageSection )
{
if( !SharedCacheMap )
goto LABEL_45;
if( SharedCacheMap->WritesInProgress >= 2 || !CcSerializeWithLazyWriter(Partition, (INT64)SharedCacheMap, v19) )
{
--SharedCacheMap->WritesInProgress;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
v10->Status = -1073741740;
return;
}
}
if( SharedCacheMap )
{
++SharedCacheMap->OpenCount;
++SharedCacheMap->InternalRefCount;
v9 = *(_QWORD *)((SharedCacheMap->FileObjectFastRef.Value & 0xFFFFFFFFFFFFFFF0ui64) + 0x18);
}
LABEL_45:
if( v6 )
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&v81);
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81.Type);
if( SharedCacheMap && (SharedCacheMap->Flags & 0x40000000) != 0 )
v8 = 1;
if( (xmmword_140CFB490 & 0x20000) != 0 )
CcPerfLogFlushCache(Information, (INT64)SharedCacheMap, (INT64 *)Offset, v86, v18, v72, v8 == 1);
if( !v18 )
{
if( !SharedCacheMap )
goto LABEL_64;
if( (SharedCacheMap->Flags & 0x20) != 0 )
CcBoostLowPriorityWorkerThread((_SHARED_CACHE_MAP *)Partition);
}
if( (!SharedCacheMap
|| (*(_BYTE *)(v9 + 6) & 0x10) != 0 && (*(_BYTE *)(v9 + 4) & 0x20) != 0
|| (SharedCacheMap->Flags & 0x20000) != 0)
&& !v18
|| v8 )
{
goto LABEL_64;
}
if( !SharedCacheMap )
return;
if( (SharedCacheMap->Flags & 0x4000000) != 0 )
{
LABEL_64:
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
LODWORD(BugCheckParameter4) = HIDWORD(v70);
CcPerfLogFlushSection((_WORK_QUEUE_ENTRY *)Information, SharedCacheMap, Offset, v86, BugCheckParameter4);
}
if( SharedCacheMap )
CcUnmapVacbArray(SharedCacheMap, Offset, v86, 0, 0);
LODWORD(v67) = HIDWORD(v70);
v23 = (void **)Offset;
MmFlushSection(SectionObjectPointer, Offset, v86, v22, v10, v67);
if( v24 >= 0 )
goto LABEL_74;
Status = v10->Status;
if( v18 )
{
if( Status != -2147483626 )
goto LABEL_74;
}
else if( Status )
{
LABEL_74:
v26 = v75;
if( v10->Status < 0 )
v26 = v10->Status;
v75 = v26;
goto LABEL_78;
}
v10->Status = v24;
goto LABEL_74;
}
v26 = v75;
v23 = (void **)Offset;
LABEL_78:
if( !SharedCacheMap )
goto LABEL_193;
if( (SharedCacheMap->Flags & 0x4000000) != 0 )
goto LABEL_184;
if( v23 )
v81.IoObject = *v23;
v27 = 1;
if( v86 )
v27 = v86;
LODWORD(v70) = v27;
if( v18 )
v81.Routine = (void(__fastcall *)(void *, void *, _IO_WORKITEM *))KUSER_SHARED_DATA.TickCountQuad;
do
{
LABEL_86:
v28 = v72;
if( !SharedCacheMap->PagesToWrite && v18 && !v72
|| !SharedCacheMap->FileSize.QuadPart && (SharedCacheMap->Flags & 4) == 0 && !SharedCacheMap->DirtyPages
|| v74 )
{
goto LABEL_181;
}
v30 = 0;
if( v18 )
{
CcAmILowPriorityWriter(SharedCacheMap);
if( v29 )
v30 = 1;
}
v31 = !v18 || v28 ? v70 : 0;
if( !v18 || v28 )
{
p_IoObject = (__int64 *)&v81.IoObject;
if( !Offset )
p_IoObject = 0i64;
}
else
{
p_IoObject = 0i64;
}
if( !CcAcquireByteRangeForWrite(
(__int64)SharedCacheMap,
p_IoObject,
v31,
LargestLsn,
&v79,
(unsigned int *)&v70,
(__int64 *)&v81.WorkOnBehalfThread,
v30) )
goto LABEL_181;
v33 = v70;
v34 = 0;
v35 = Partition;
v36 = v70;
v37 = v72;
while( 1 )
{
VirtualAddressIfMapped = CcGetVirtualAddressIfMapped(
(INT64)SharedCacheMap,
v79.QuadPart + v33 - (unsigned __int64)v36,
(INT64 *)&v81.Context,
&v73);
if( VirtualAddressIfMapped )
{
v40 = v73;
if( v73 > v36 )
v40 = v36;
v73 = v40;
if( !(unsigned __int8)MmSetAddressRangeModifiedEx(VirtualAddressIfMapped, v40) && !v34
|| v79.QuadPart + (unsigned int)v70 >= SharedCacheMap->ValidDataLength.QuadPart
|| (SharedCacheMap->LazyWritePassCount & 0xF) == 0
|| !v18
|| v37
|| (SharedCacheMap->Flags & 0x200) != 0
|| (v34 = 1, *(_BYTE *)(v35 + 964)) )
{
v34 = 0;
}
v41 = *((_QWORD *)v81.Context + 1);
if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)v81.Context + 4) )
{
v42 = *(struct _KEVENT **)(v41 + 184);
if( v42 )
KeSetEvent(v42, 0);
_InterlockedDecrement((volatile signed __int32 *)(v41 + 544));
}
v18 = v71;
}
else
{
v43 = v73;
if( v73 > v36 )
v43 = v36;
v73 = v43;
}
v36 -= v73;
if( !v36 )
break;
v33 = v70;
}
__addgsdword(0x8128u, v34);
Routine = v81.Routine;
v10 = v82;
v26 = v75;
if( v34 )
{
v59 = Partition;
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
*(_QWORD *)(v59 + 752) += (unsigned __int64)(unsigned int)v70 >> 12;
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
goto LABEL_167;
}
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
LODWORD(BugCheckParameter4a) = HIDWORD(v70);
CcPerfLogFlushSection(
(_WORK_QUEUE_ENTRY *)Information,
SharedCacheMap,
&v79,
(unsigned int)v70,
BugCheckParameter4a);
}
v45 = (unsigned int)v70;
LODWORD(v68) = HIDWORD(v70);
v46 = v18 != 0 ? 0x80000016 : 0;
v10->Status = v46;
MmFlushSection(SectionObjectPointer, &v79, v45, v39, v10, v68);
if( v47 >= 0 )
goto LABEL_139;
v48 = v10->Status;
if( v18 )
{
if( v48 != -2147483626 )
goto LABEL_139;
LABEL_138:
v10->Status = v47;
goto LABEL_139;
}
if( !v48 )
goto LABEL_138;
LABEL_139:
v49 = (unsigned int)v10->Status;
if( (int)v49 >= 0 )
{
if( (SharedCacheMap->Flags & 0x400) == 0 )
{
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
SharedCacheMap->Flags |= 0x400u;
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
}
if( v18 )
{
__incgsdword(0x812Cu);
__addgsdword(0x8130u, (unsigned int)(v70 + 4095) >> 12);
v50 = 0;
}
else
{
LABEL_160:
v50 = 0;
}
goto LABEL_168;
}
v51 = (char *)v79.QuadPart;
v52 = v70;
v81.WorkItem.Parameter = (void *)v79.QuadPart;
if( !CcIsFatalWriteError((INT64)SharedCacheMap, v49) )
{
v74 = 1;
goto LABEL_167;
}
v54 = v71;
do
{
if( (xmmword_140CFB490 & 0x20000) != 0 )
{
LODWORD(BugCheckParameter4b) = HIDWORD(v70);
CcPerfLogFlushSection(
(_WORK_QUEUE_ENTRY *)Information,
SharedCacheMap,
(_LARGE_INTEGER *)&v81.WorkItem.Parameter,
0x1000ui64,
BugCheckParameter4b);
}
LODWORD(v69) = HIDWORD(v70);
v10->Status = v46;
MmFlushSection(SectionObjectPointer, (_LARGE_INTEGER *)&v81.WorkItem.Parameter, 0x1000ui64, v53, v10, v69);
if( v55 < 0 )
{
v56 = v10->Status;
if( !v54 )
{
if( v56 )
goto LABEL_155;
LABEL_154:
v10->Status = v55;
goto LABEL_155;
}
if( v56 == -2147483626 )
goto LABEL_154;
}
LABEL_155:
v57 = (unsigned int)v10->Status;
if( (int)v57 >= 0 )
{
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
SharedCacheMap->Flags |= 0x400u;
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
LABEL_157:
v58 = v74;
goto LABEL_158;
}
if( CcIsFatalWriteError((INT64)SharedCacheMap, v57) )
{
if( !v26 )
v26 = v10->Status;
goto LABEL_157;
}
v58 = 1;
v74 = 1;
if( !v26 )
v26 = v10->Status;
LABEL_158:
v51 += 4096;
v81.WorkItem.Parameter = v51;
v52 -= 4096;
}
while( v52 );
Routine = v81.Routine;
v75 = v26;
if( !v58 )
goto LABEL_160;
LABEL_167:
v50 = 1;
LABEL_168:
CcReleaseByteRangeFromWrite((INT64)SharedCacheMap, (INT64 *)&v79, (unsigned int)v70, v81.WorkOnBehalfThread, v50);
v60 = Partition;
v78 += v70;
if( v78 >= 0x40000 && *(_QWORD *)(Partition + 784) != Partition + 784 )
{
CcPostDeferredWrites();
v60 = Partition;
v78 = 0;
}
v18 = v71;
if( v71 && !v72 )
{
v61 = *(_QWORD *)(v60 + 784) == v60 + 784 ? CcIdleDelayTick / 0xAu : (unsigned int)CcIdleDelayTick;
if( (__int64)KUSER_SHARED_DATA.TickCountQuad > (__int64)Routine + v61 )
{
v10->Information = 35422i64;
goto LABEL_181;
}
}
}
while( !Offset );
v62 = Offset->QuadPart;
v63 = (void *)((unsigned int)v70 + v79.QuadPart);
v79.QuadPart = (LONGLONG)v63;
if( v62 + v86 > (__int64)v63 )
{
v81.IoObject = v63;
LODWORD(v70) = v86 + v62 - (_DWORD)v63;
goto LABEL_86;
}
LABEL_181:
if( v78 && *(_QWORD *)(Partition + 784) != Partition + 784 )
CcPostDeferredWrites();
LABEL_184:
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), (KLOCK_QUEUE_HANDLE *)&v81);
CcDecrementOpenCount((INT64)SharedCacheMap);
if( !v18 )
--SharedCacheMap->WritesInProgress;
if( v85 == &CcFlushForImageSection
&& v10->Status >= 0
&& v26 >= 0
&& (SharedCacheMap->DirtyPages || SharedCacheMap->WritesInProgress) )
{
v26 = -1073741740;
}
KeReleaseInStackQueuedSpinLock((PKLOCK_QUEUE_HANDLE)&v81);
LABEL_193:
if( v26 < 0 )
v10->Status = v26;
}Referenced by:
CcCoherencyFlushAndPurgeCache
CcFlushCache
CcFlushCacheToLsn
CcMapAndCopyInToCache
CcWriteBehindInternal
CcZeroData
CcZeroEndOfLastPage
MiFlushDataSection