CcNotifyOfMappedWrite
NTSTATUS __fastcall CcNotifyOfMappedWrite(
_SECTION_OBJECT_POINTERS *SectionObjectPointer,
_LARGE_INTEGER FileOffset,
UINT64 Length){
char *Partition;
_LARGE_INTEGER *SharedCacheMap;
UINT64 v7;
UINT8 v8;
unsigned int v9;
unsigned __int64 OldIrql;
ULONG LowPart;
int v13;
unsigned __int64 *v14;
_WORK_QUEUE_ENTRY *v15;
_LIST_ENTRY *v16;
_LARGE_INTEGER v17;
ULONG v18;
_LARGE_INTEGER FileOffseta;
_WORK_QUEUE_ENTRY *WorkQueueEntry;
_LARGE_INTEGER TargetOffset;
_BCB *FirstBcb;
_KLOCK_QUEUE_HANDLE v23;
_KLOCK_QUEUE_HANDLE LockHandle;
ULONG TargetLength;
UINT64 v26;
TargetLength = Length;
WorkQueueEntry = 0i64;
FileOffseta.QuadPart = 0i64;
FirstBcb = 0i64;
Partition = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
memset(&v23, 0, sizeof(v23));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&WheapErrorSourceTable + 189, &LockHandle);
SharedCacheMap = (_LARGE_INTEGER *)SectionObjectPointer->SharedCacheMap;
if( !SharedCacheMap || (SharedCacheMap[19].anonymous_0.LowPart & 0x100) != 0 )
{
v9 = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
goto LABEL_10;
}
Partition = (char *)CcGetPartition(SharedCacheMap);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Partition + 16, &v23);
++SharedCacheMap->anonymous_0.HighPart;
++SharedCacheMap[67].anonymous_0.LowPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Partition + 16, &v23);
CcDecrementOpenCount((_SHARED_CACHE_MAP *)SharedCacheMap, v7, v8);
if( (SharedCacheMap[19].anonymous_0.LowPart & 0x20) != 0 || SharedCacheMap[64].anonymous_0.HighPart )
goto LABEL_23;
if( !SharedCacheMap[14].anonymous_0.LowPart )
goto LABEL_26;
if( (*(_DWORD *)((SharedCacheMap[12].QuadPart & 0xFFFFFFFFFFFFFFF0ui64) + 0x50) & 0x8000) != 0
|| !CcCanIWriteStreamEx(
(UINT8 *)Partition,
SharedCacheMap[12].QuadPart & 0xFFFFFFFFFFFFFFF0ui64,
0x1000000ui64,
0i64,
8,
0i64) )
{
v17 = SharedCacheMap[5];
if( FileOffset.QuadPart > v17.QuadPart && SharedCacheMap[6].QuadPart > v17.QuadPart )
{
LowPart = SharedCacheMap[14].anonymous_0.LowPart;
SharedCacheMap[24].anonymous_0.LowPart = LowPart;
*((_DWORD *)Partition + 124) += LowPart;
*((_DWORD *)Partition + 164) += SharedCacheMap[24].anonymous_0.LowPart;
SharedCacheMap[19].anonymous_0.LowPart |= 0x20u;
++SharedCacheMap[14].anonymous_0.LowPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
v13 = CcAllocateWorkQueueEntry((__int64)Partition, (PSLIST_ENTRY *)&WorkQueueEntry);
v14 = (unsigned __int64 *)(Partition + 128);
if( v13 >= 0 )
{
v15 = WorkQueueEntry;
*((_BYTE *)WorkQueueEntry + 120) = 2;
*((_QWORD *)v15 + 2) = SharedCacheMap;
KeAcquireInStackQueuedSpinLock(v14, &v23);
--SharedCacheMap[14].anonymous_0.LowPart;
if( (SharedCacheMap[19].anonymous_0.LowPart & 0x10000) != 0 )
{
v16 = (_LIST_ENTRY *)(Partition + 224);
SharedCacheMap[62].QuadPart = (unsigned __int64)v15 | 1;
}
else
{
SharedCacheMap[62].QuadPart = (LONGLONG)v15;
v16 = (_LIST_ENTRY *)(Partition + 256);
}
CcPostWorkQueue(v15, v16);
LABEL_23:
v9 = 0;
goto LABEL_10;
}
KeAcquireInStackQueuedSpinLock(v14, &v23);
SharedCacheMap[19].anonymous_0.LowPart &= ~0x20u;
--SharedCacheMap[14].anonymous_0.LowPart;
}
LABEL_26:
v9 = 2;
goto LABEL_10;
}
v9 = 0;
if( Partition[964] )
CcScheduleLazyWriteScan((UINT8)Partition, 1u);
LABEL_10:
if( !TargetLength && v9 == 2 )
v9 = 1;
if( v9 > 1 )
{
SharedCacheMap[19].anonymous_0.LowPart |= 0x400400u;
++SharedCacheMap->anonymous_0.HighPart;
++SharedCacheMap[67].anonymous_0.LowPart;
++SharedCacheMap[64].anonymous_0.HighPart;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
__writecr8(v23.OldIrql);
v18 = TargetLength;
TargetOffset = FileOffset;
for( LODWORD(v26) = TargetLength; v18; TargetOffset = FileOffseta )
{
if( !SharedCacheMap[1].QuadPart && (SharedCacheMap[19].anonymous_0.LowPart & 4) == 0 )
break;
if( !CcAcquireByteRangeForWrite(
(_SHARED_CACHE_MAP *)SharedCacheMap,
&TargetOffset,
v18,
0i64,
&FileOffseta,
&v26,
&FirstBcb,
0) )
break;
FileOffseta.QuadPart += (unsigned int)v26;
v18 = TargetLength + FileOffset.anonymous_0.LowPart - FileOffseta.anonymous_0.LowPart;
LODWORD(v26) = v18;
}
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Partition + 16, &v23);
if( !SharedCacheMap->anonymous_0.HighPart )
KeBugCheckEx(0x34u, (PVOID)0x129A, (PVOID)0xFFFFFFFFC0000420i64, 0i64, 0i64);
SharedCacheMap[19].anonymous_0.LowPart &= ~0x400000u;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
OldIrql = v23.OldIrql;
goto LABEL_16;
}
if( Partition )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&v23);
OldIrql = v23.OldIrql;
LABEL_16:
__writecr8(OldIrql);
}
return v9;
}Referenced by:
MiGatherMappedPages