CcMdlRead

NTSTATUS __fastcall CcMdlRead(UINT64 a1, INT64 *a2, UINT64 a3, INT64 **a4, INT64 IoStatus){
  unsigned int v5; 
  __int64 v8; 
  _DWORD *v9; 
  _LARGE_INTEGER v10; 
  unsigned int v11; 
  VOID *VirtualAddress; 
  unsigned int v13; 
  _MDL *Mdl; 
  INT64 *v15; 
  INT64 *v16; 
  NTSTATUS result; 
  UINT64 RequestHighPriorityMapping; 
  UINT64 PerformingReadAhead; 
  UINT64 PagePriority; 
  unsigned int v21; 
  UINT64 ReceivedLength; 
  int v23; 
  _VACB *Vacb; 
  INT64 *v25; 
  _LARGE_INTEGER v26; 
  _LARGE_INTEGER FileOffset; 
  __int64 v28; 
  VOID *v29; 
  INT64 *i; 
  _DWORD *v31; 
  _DWORD *v32; 
  unsigned int TotalLength; 

  TotalLength = a3;
  v5 = a3;
  v25 = 0i64;
  v23 = a3;
  v21 = 0;
  Vacb = 0i64;
  HIDWORD(ReceivedLength) = 0;
  v8 = *(_QWORD *)(*(_QWORD *)(a1 + 40) + 8i64);
  v28 = v8;
  v9 = *(_DWORD **)(a1 + 48);
  v31 = v9;
  v32 = v9;
  if( (*v9 & 0x20000) != 0 )
    CcScheduleReadAheadEx((VOID *)a1, (_LARGE_INTEGER *)a2, a3, 0i64);
  __incgsdword(0x8124u);
  KeGetCurrentThread()[1].Timer.DueTime.HighPart = 0;
  FileOffset.QuadPart = *a2;
  v10 = FileOffset;
  v26 = FileOffset;
  v11 = TotalLength;
  while( v11 )
  {
    LODWORD(ReceivedLength) = 0;
    LODWORD(PerformingReadAhead) = 0;
    LODWORD(RequestHighPriorityMapping) = 0;
    VirtualAddress = CcGetVirtualAddress(
                       (_SHARED_CACHE_MAP *)v8,
                       v10,
                       &Vacb,
                       &ReceivedLength,
                       RequestHighPriorityMapping,
                       PerformingReadAhead);
    v29 = VirtualAddress;
    if( (*(_DWORD *)(v8 + 152) & 8) == 0 )
    {
      LODWORD(PagePriority) = (*v9 >> 18) & 7;
      CcFetchDataForRead(
        (_FILE_OBJECT *)a1,
        &FileOffset,
        v11,
        1u,
        (UINT64 *)((char *)&ReceivedLength + 4),
        Vacb,
        PagePriority,
        0i64);
      VirtualAddress = v29;
    }
    v13 = ReceivedLength;
    if( (unsigned int)ReceivedLength > v11 )
      v13 = v11;
    LODWORD(ReceivedLength) = v13;
    v10.QuadPart = v26.QuadPart + v13;
    v26 = v10;
    Mdl = IoAllocateMdl(VirtualAddress, v13, 0, 0, 0i64);
    v25 = (INT64 *)Mdl;
    if( !Mdl )
      RtlRaiseStatus(-1073741670);
    MmProbeAndLockPages(Mdl, 0, IoReadAccess);
    CcFreeVirtualAddress(Vacb);
    Vacb = 0i64;
    v15 = *a4;
    if( *a4 )
    {
      for( i = *a4; ; i = v16 )
      {
        v16 = (INT64 *)*v15;
        if( !*v15 )
          break;
        v15 = (INT64 *)*v15;
      }
      *v15 = (INT64)v25;
    }
    else
    {
      *a4 = v25;
    }
    v25 = 0i64;
    FileOffset = v10;
    v21 += v13;
    v11 -= v13;
    v9 = v31;
  }
  __addgsdword(0x8160u, KeGetCurrentThread()[1].Timer.DueTime.HighPart);
  if( (*v9 & 0x20000) == 0 && HIDWORD(ReceivedLength) )
    CcScheduleReadAheadEx((VOID *)a1, (_LARGE_INTEGER *)a2, v5, 0i64);
  CcUpdateReadHistory((_FILE_OBJECT *)a1, (_LARGE_INTEGER *)a2, v5);
  if( (*(_DWORD *)(v8 + 152) & 8) != 0 )
    CcUpdateSharedCacheMapFlag((_SHARED_CACHE_MAP *)v8, 8ui64, 0);
  *(_DWORD *)IoStatus = 0;
  result = v21;
  *(_QWORD *)(IoStatus + 8) = v21;
  return result;
}

Referenced by:

FsRtlMdlReadDev