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