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