CcGetFlushedValidData
LARGE_INTEGER __stdcall CcGetFlushedValidData(_SECTION_OBJECT_POINTERS *SectionObjectPointer, UINT8 CcInternalCaller){
char *SharedCacheMap;
INT64 v5;
LARGE_INTEGER v6;
_MBCB *v8;
_BITMAP_RANGE *BitmapRangeToClean;
_QWORD *v10;
_QWORD *v11;
__int64 v12;
INT64 Partition;
KLOCK_QUEUE_HANDLE v14;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v14, 0, sizeof(v14));
if( CcInternalCaller )
{
SharedCacheMap = (char *)SectionObjectPointer->SharedCacheMap;
}
else
{
KeAcquireInStackQueuedSpinLock(&CcMasterLock, &LockHandle);
SharedCacheMap = (char *)SectionObjectPointer->SharedCacheMap;
if( !SharedCacheMap )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return(LARGE_INTEGER)0x7FFFFFFFFFFFFFFFi64;
}
Partition = CcGetPartition((_QWORD *)SectionObjectPointer->SharedCacheMap);
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &v14);
++*((_DWORD *)SharedCacheMap + 1);
++*((_DWORD *)SharedCacheMap + 134);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v14);
__writecr8(v14.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
ExAcquireFastMutex((FAST_MUTEX *)SharedCacheMap + 5);
}
v5 = CcGetPartition(SharedCacheMap);
if( *(_QWORD *)(MmGetControlAreaPartition((INT64)SectionObjectPointer) + 8) != v5 )
KeBugCheckEx(0x34u, 0x1E8Bui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
v6 = *(LARGE_INTEGER *)(SharedCacheMap + 48);
if( *((_DWORD *)SharedCacheMap + 28) )
{
v8 = (_MBCB *)*((_QWORD *)SharedCacheMap + 20);
if( v8 && v8->DirtyPages )
{
BitmapRangeToClean = CcFindBitmapRangeToClean(v8, 0i64);
v6.QuadPart = (BitmapRangeToClean->BasePage + BitmapRangeToClean->FirstDirtyPage) << 12;
}
v10 = SharedCacheMap + 16;
v11 = (_QWORD *)*((_QWORD *)SharedCacheMap + 2);
v12 = (__int64)(v11 - 2);
while( v11 != v10 && (*(_WORD *)v12 != 765 || !*(_BYTE *)(v12 + 2)) )
{
v12 = *v11 - 16i64;
v11 = (_QWORD *)*v11;
}
if( (_QWORD *)(v12 + 16) != v10 && *(_QWORD *)(v12 + 8) < v6.QuadPart )
v6 = *(LARGE_INTEGER *)(v12 + 8);
}
if( !CcInternalCaller )
{
KeReleaseGuardedMutex((_FAST_MUTEX *)SharedCacheMap + 5);
KeAcquireInStackQueuedSpinLock((UINT64 *)(v5 + 128), &v14);
CcDecrementOpenCount((INT64)SharedCacheMap);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v14);
__writecr8(v14.OldIrql);
}
return v6;
}Referenced by:
CcWriteBehindInternal