CcMdlWriteComplete2

VOID __fastcall CcMdlWriteComplete2(INT64 a1, LARGE_INTEGER *a2, INT64 a3, IO_STATUS_BLOCK *a4){
  _LARGE_INTEGER v4; 
  __int64 v5; 
  __int16 v6; 
  _MDL *v7; 
  int Status; 
  __int16 v10; 
  _SHARED_CACHE_MAP *v11; 
  _MDL *Next; 
  UINT64 ByteCount; 
  __int64 v14; 
  PMDL v15; 
  INT64 Partition; 
  struct _MDL *v17; 
  NTSTATUS v18; 
  char v19; 
  UINT64 Flags; 
  _IO_STATUS_BLOCK IoStatus; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  _LARGE_INTEGER FileOffset; 
  PMDL Mdl; 
  Mdl = (PMDL)a3;
  v4 = *a2;
  FileOffset = *a2;
  v5 = *(_QWORD *)(a1 + 40);
  v6 = *(_WORD *)(a3 + 10);
  v7 = (_MDL *)a3;
  Status = 0;
  IoStatus = 0i64;
  v10 = v6 & 2;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v11 = *(_SHARED_CACHE_MAP **)(v5 + 8);
  do
  {
    Next = v7->Next;
    if( v10 )
      MmUnlockPages(v7);
    ByteCount = v7->ByteCount;
    if( (*(_DWORD *)(a1 + 80) & 0x10) != 0 )
    {
      LODWORD(Flags) = 1;
      MmFlushSection(*(_SECTION_OBJECT_POINTERS **)(a1 + 40), &FileOffset, ByteCount, (_KEVENT *)a4, &IoStatus, Flags);
      if( IoStatus.Status < 0 )
        Status = IoStatus.Status;
    }
    else
    {
      CcSetDirtyInMask(v11, &FileOffset, ByteCount, 0i64);
    }
    v14 = v7->ByteCount;
    v7 = Next;
    v4.QuadPart += v14;
    FileOffset = v4;
  }
  while( Next );
  v15 = Mdl;
  if( v10 )
  {
    Partition = CcGetPartition(v11);
    KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &LockHandle);
    CcDecrementOpenCount((INT64)v11);
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
  }
  if( Status < 0 )
  {
    FsRtlIsNtstatusExpected((unsigned int)Status);
    v18 = -1073741591;
    if( v19 )
      v18 = Status;
    RtlRaiseStatus(v18);
  }
  do
  {
    v17 = v15->Next;
    IoFreeMdl(v15);
    v15 = v17;
  }
  while( v17 );
}

Referenced by:

CcMdlWriteComplete
FsRtlMdlWriteCompleteDev