CcPrepareMdlWrite

VOID __stdcall CcPrepareMdlWrite(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *FileOffset,
        UINT64 Length,
        _MDL **MdlChain,
        _IO_STATUS_BLOCK *IoStatus){
  unsigned int v5; 
  unsigned int v7; 
  _FAST_MUTEX *SharedCacheMap; 
  char v9; 
  LONGLONG QuadPart; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  __int64 v14; 
  char v15; 
  _SHARED_CACHE_MAP *v16; 
  _MDL *v17; 
  _KEVENT *v18; 
  _MDL *Next; 
  unsigned __int64 *Partition; 
  UINT64 RequestHighPriorityMapping; 
  UINT64 PerformingReadAhead; 
  UINT64 ReceivedLength; 
  int v24; 
  int v25; 
  unsigned __int64 v26; 
  INT64 Mdl; 
  _VACB *Vacb; 
  LONGLONG v29; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _FAST_MUTEX *v31; 
  __int64 v32; 
  VOID *BaseAddress; 
  _MDL *i; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v36; 
  _ETHREAD *v37; 
  int v38; 

  v38 = Length;
  v5 = Length;
  Mdl = 0i64;
  v26 = 0i64;
  v24 = 0;
  v7 = 0;
  v25 = 0;
  Vacb = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  SharedCacheMap = (_FAST_MUTEX *)FileObject->SectionObjectPointer->SharedCacheMap;
  v31 = SharedCacheMap;
  if( (FileObject->Flags & 0x10) == 0 )
  {
    CcForceWriteThrough(FileObject, (unsigned int)Length, (_SHARED_CACHE_MAP *)SharedCacheMap, 0);
    if( v9 )
      RtlRaiseStatus(-1073741670);
  }
  QuadPart = FileOffset->QuadPart;
  v29 = QuadPart;
  while( v5 )
  {
    LODWORD(ReceivedLength) = 0;
    v32 = 0i64;
    LODWORD(PerformingReadAhead) = 0;
    LODWORD(RequestHighPriorityMapping) = 0;
    BaseAddress = CcGetVirtualAddress(
                    (_SHARED_CACHE_MAP *)SharedCacheMap,
                    (_LARGE_INTEGER)QuadPart,
                    &Vacb,
                    &ReceivedLength,
                    RequestHighPriorityMapping,
                    PerformingReadAhead);
    v11 = ReceivedLength;
    if( (unsigned int)ReceivedLength > v5 )
      v11 = v5;
    ReceivedLength = v11 | 0x200000000i64;
    v12 = QuadPart + v11;
    v32 = v12;
    v13 = 2;
    if( (QuadPart & 0xFFF) == 0 )
    {
      if( v11 >= 0x1000 )
        v13 = 3;
      HIDWORD(ReceivedLength) = v13;
    }
    if( (v12 & 0xFFF) == 0 )
    {
      v13 |= 4u;
      HIDWORD(ReceivedLength) = v13;
    }
    v26 = QuadPart & 0xFFFFFFFFFFFFF000ui64;
    ExAcquireFastMutex(SharedCacheMap + 5);
    v26 = *(_QWORD *)&SharedCacheMap->OldIrql - v26;
    v14 = v26;
    KeReleaseGuardedMutex(SharedCacheMap + 5);
    if( v14 <= 0 )
    {
      v13 |= 7u;
LABEL_15:
      HIDWORD(ReceivedLength) = v13;
      goto LABEL_16;
    }
    if( (unsigned int)v26 <= 0x1000 && !HIDWORD(v26) )
    {
      v13 |= 6u;
      goto LABEL_15;
    }
LABEL_16:
    CcMapAndRead(v11, v13, 1u, BaseAddress);
    Mdl = (INT64)IoAllocateMdl(BaseAddress, v11, 0, 0, 0i64);
    if( !Mdl )
      RtlRaiseStatus(-1073741670);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v15 = CurrentThread->DisablePageFaultClustering + 2;
    v24 = CurrentThread->DisablePageFaultClustering + 2;
    v36 = CurrentThread;
    CurrentThread->DisablePageFaultClustering = 1;
    MiProbeAndLockPages(Mdl, 0, 1i64);
    v37 = (_ETHREAD *)KeGetCurrentThread();
    v37->DisablePageFaultClustering = v15 - 2;
    v24 = 0;
    ExAcquireFastMutex(SharedCacheMap + 5);
    if( v12 > *(_QWORD *)&SharedCacheMap->OldIrql )
      *(_QWORD *)&SharedCacheMap->OldIrql = v12;
    KeReleaseGuardedMutex(SharedCacheMap + 5);
    v16 = Vacb->SharedCacheMap;
    if( !(unsigned __int16)_InterlockedDecrement((volatile signed __int32 *)&Vacb->Overlay) )
    {
      v18 = (_KEVENT *)*((_QWORD *)v16 + 23);
      if( v18 )
        KeSetEvent(v18, 0, 0);
      _InterlockedAdd((volatile signed __int32 *)v16 + 136, 0xFFFFFFFF);
    }
    Vacb = 0i64;
    v17 = *MdlChain;
    if( *MdlChain )
    {
      for( i = *MdlChain; ; i = Next )
      {
        Next = v17->Next;
        if( !v17->Next )
          break;
        v17 = v17->Next;
      }
      v17->Next = (_MDL *)Mdl;
    }
    else
    {
      *MdlChain = (_MDL *)Mdl;
    }
    Mdl = 0i64;
    QuadPart = v12;
    v29 = v12;
    v7 = ReceivedLength + v25;
    v25 += ReceivedLength;
    v5 = v38 - ReceivedLength;
    v38 -= ReceivedLength;
  }
  Partition = (unsigned __int64 *)CcGetPartition(SharedCacheMap);
  IoStatus->Status = 0;
  IoStatus->Information = v7;
  KeAcquireInStackQueuedSpinLock(Partition + 16, &LockHandle);
  ++*(&SharedCacheMap->Count + 1);
  ++*(_DWORD *)&SharedCacheMap[9].gap14[12];
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
}

Referenced by:

FsRtlPrepareMdlWriteDev