CcNotifyOfMappedWrite
INT64 __fastcall CcNotifyOfMappedWrite(
_SECTION_OBJECT_POINTERS *SectionObjectPointer,
LARGE_INTEGER FileOffset,
UINT64 Length){
INT64 Partition;
LARGE_INTEGER *SharedCacheMap;
unsigned int v7;
unsigned __int64 OldIrql;
ULONG LowPart;
int v11;
UINT64 *v12;
LARGE_INTEGER v13;
_LIST_ENTRY *v14;
LARGE_INTEGER v15;
unsigned int v16;
ULONG_PTR v17;
PSLIST_ENTRY v18;
ULONG_PTR QuadPart;
__int64 v20;
KLOCK_QUEUE_HANDLE v21;
struct _KLOCK_QUEUE_HANDLE LockHandle;
unsigned int v23;
unsigned int i;
v23 = Length;
v18 = 0i64;
v17 = 0i64;
v20 = 0i64;
Partition = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v21, 0, sizeof(v21));
KeAcquireInStackQueuedSpinLock(&CcMasterLock, &LockHandle);
SharedCacheMap = (LARGE_INTEGER *)SectionObjectPointer->SharedCacheMap;
if( !SharedCacheMap || (SharedCacheMap[19].LowPart & 0x100) != 0 )
{
v7 = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
goto LABEL_10;
}
Partition = CcGetPartition(SharedCacheMap);
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &v21);
++SharedCacheMap->HighPart;
++SharedCacheMap[67].LowPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
__writecr8(v21.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &v21);
CcDecrementOpenCount((INT64)SharedCacheMap);
if( (SharedCacheMap[19].LowPart & 0x20) != 0 || SharedCacheMap[64].HighPart )
goto LABEL_23;
if( !SharedCacheMap[14].LowPart )
goto LABEL_26;
if( (*(_DWORD *)((SharedCacheMap[12].QuadPart & 0xFFFFFFFFFFFFFFF0ui64) + 0x50) & 0x8000) != 0
|| !CcCanIWriteStreamEx(
(UINT8 *)Partition,
SharedCacheMap[12].QuadPart & 0xFFFFFFFFFFFFFFF0ui64,
0x1000000ui64,
0i64,
8,
0i64) )
{
v15 = SharedCacheMap[5];
if( FileOffset.QuadPart > v15.QuadPart && SharedCacheMap[6].QuadPart > v15.QuadPart )
{
LowPart = SharedCacheMap[14].LowPart;
SharedCacheMap[24].LowPart = LowPart;
*(_DWORD *)(Partition + 496) += LowPart;
*(_DWORD *)(Partition + 656) += SharedCacheMap[24].LowPart;
SharedCacheMap[19].LowPart |= 0x20u;
++SharedCacheMap[14].LowPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
__writecr8(v21.OldIrql);
v11 = CcAllocateWorkQueueEntry(Partition, &v18);
v12 = (UINT64 *)(Partition + 128);
if( v11 >= 0 )
{
v13.QuadPart = (LONGLONG)v18;
*((_BYTE *)&v18[7].Next + 8) = 2;
*(_QWORD *)(v13.QuadPart + 16) = SharedCacheMap;
KeAcquireInStackQueuedSpinLock(v12, &v21);
--SharedCacheMap[14].LowPart;
if( (SharedCacheMap[19].LowPart & 0x10000) != 0 )
{
v14 = (_LIST_ENTRY *)(Partition + 224);
SharedCacheMap[62].QuadPart = v13.QuadPart | 1;
}
else
{
SharedCacheMap[62] = v13;
v14 = (_LIST_ENTRY *)(Partition + 256);
}
CcPostWorkQueue((_WORK_QUEUE_ENTRY *)v13.QuadPart, v14);
LABEL_23:
v7 = 0;
goto LABEL_10;
}
KeAcquireInStackQueuedSpinLock(v12, &v21);
SharedCacheMap[19].LowPart &= ~0x20u;
--SharedCacheMap[14].LowPart;
}
LABEL_26:
v7 = 2;
goto LABEL_10;
}
v7 = 0;
if( *(_BYTE *)(Partition + 964) )
CcScheduleLazyWriteScan(Partition, 1u);
LABEL_10:
if( !v23 && v7 == 2 )
v7 = 1;
if( v7 > 1 )
{
SharedCacheMap[19].LowPart |= 0x400400u;
++SharedCacheMap->HighPart;
++SharedCacheMap[67].LowPart;
++SharedCacheMap[64].HighPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
__writecr8(v21.OldIrql);
v16 = v23;
QuadPart = FileOffset.QuadPart;
for( i = v23; v16; QuadPart = v17 )
{
if( !SharedCacheMap[1].QuadPart && (SharedCacheMap[19].LowPart & 4) == 0 )
break;
if( !CcAcquireByteRangeForWrite((__int64)SharedCacheMap, (__int64 *)&QuadPart, v16, 0i64, &v17, &i, &v20, 0) )
break;
v17 += i;
v16 = v23 + FileOffset.LowPart - v17;
i = v16;
}
KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &v21);
if( !SharedCacheMap->HighPart )
KeBugCheckEx(0x34u, 0x129Aui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
SharedCacheMap[19].LowPart &= ~0x400000u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
OldIrql = v21.OldIrql;
goto LABEL_16;
}
if( Partition )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v21);
OldIrql = v21.OldIrql;
LABEL_16:
__writecr8(OldIrql);
}
return v7;
}Referenced by:
MiGatherMappedPages