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