MmPrefetchForCacheManager

VOID __fastcall MmPrefetchForCacheManager(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER SectionOffset,
        VOID *SystemCacheAddress,
        UINT64 NumberOfBytes){
  _MM_PAGE_ACCESS_INFO_HEADER *CcAccessLog; 
  _ETHREAD *CurrentThread; 
  int v8; 
  void *DataSectionObject; 
  __int64 v10; 
  PVOID *v11; 
  PVOID v12; 
  int v13; 
  unsigned int v14; 
  UINT64 v15; 
  int v16; 
  UINT64 v17; 
  PVOID P; 
  UINT64 v19; 
  VOID *a4; 
  PVOID *v21; 
  P = 0i64;
  CcAccessLog = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = v19;
  DataSectionObject = FileObject->SectionObjectPointer->DataSectionObject;
  if( (_DWORD)dword_140C4E568 && (unsigned int)v19 >= dword_140C4E56C )
    CcAccessLog = MiGetCcAccessLog(FileObject, NumberOfBytes >> 12);
  LODWORD(v17) = -1;
  LODWORD(v15) = v8;
  if( (int)MiPfPrepareSequentialReadList(
              (INT64)CcAccessLog,
              (INT64)DataSectionObject,
              SectionOffset.QuadPart,
              0i64,
              NumberOfBytes,
              v15,
              v17,
              (INT64 *)&P) >= 0
    && P )
  {
    v11 = v21;
    *((_DWORD *)P + 26) = 1;
    if( !*v11 )
      --*((_WORD *)CurrentThread + 243);
    MiPfPutPagesInTransition((INT64)P, 0i64, 1, v10, (const char *__ptr32)v14, v16);
    v12 = P;
    if( v13 >= 0 && *((PVOID *)P + 15) != (char *)P + 120 )
    {
      if( CcAccessLog )
      {
        MiReturnCcAccessLog((INT64)CcAccessLog, 1i64);
        v12 = P;
      }
      MiPfExecuteReadList((INT64)v12, 1, 0xFFFFFFFFui64, a4);
      *(_QWORD *)P = *v11;
      *v11 = P;
      return;
    }
    if( !*v11 )
    {
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      v12 = P;
    }
    MiReleaseReadListResources((INT64)v12);
    ExFreePoolWithTag(P, 0);
  }
  if( CcAccessLog )
    MiReturnCcAccessLog((INT64)CcAccessLog, 0i64);
}

Referenced by:

CcAsyncReadPrefetch
CcFetchDataForRead
CcPerformReadAhead