MiPfExecuteReadList
VOID __stdcall MiPfExecuteReadList(
_MI_READ_LIST *ReadList,
UINT64 ReadListFlags,
UINT64 SessionId,
VOID *AttributionContext){
_ETHREAD *CurrentThread;
_MI_READ_LIST *v5;
_MI_READ_LIST *v6;
int v7;
unsigned __int8 CacheManagerActive;
unsigned int v9;
int v10;
_MDL *v11;
_FILE_OBJECT *v12;
__int64 v13;
NTSTATUS v14;
UINT64 Flags;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = ReadList + 30;
v6 = (_MI_READ_LIST *)*((_QWORD *)ReadList + 15);
v7 = ReadListFlags & 2;
CacheManagerActive = 0;
v9 = SessionId;
if( v6 != ReadList + 30 )
{
v10 = ReadListFlags & 1;
do
{
v11 = (_MDL *)*((_QWORD *)v6 + 32);
v11->MdlFlags |= 0x42u;
v6[46] = v11->ByteCount;
v12 = MiReferenceInPageFile((_MMINPAGE_SUPPORT *)v6, v9);
if( v12 )
{
v13 = 0i64;
}
else
{
v13 = *((_QWORD *)v6 + 25);
v12 = *(_FILE_OBJECT **)(v13 + 56);
}
*((_QWORD *)v6 + 25) = v12;
*((_QWORD *)v6 + 21) = 0i64;
*((_QWORD *)v6 + 29) = *((_QWORD *)v6 + 30);
if( v10 )
{
CacheManagerActive = CurrentThread->CacheManagerActive;
CurrentThread->CacheManagerActive = 1;
}
if( v13 && (*(_WORD *)(v13 + 204) & 0x800) != 0 )
{
v14 = 0;
}
else if( (v6[48] & 0x100) != 0 )
{
v14 = SmPageRead(
(_MM_STORE_KEY *)v6 + 12,
(_MDL *)((unsigned __int64)(v6 + 68) | ((-(__int64)(v7 != 0) & 0xFFFFFFFFFFFFFFFEui64) + 3)),
(_KEVENT *)(v6 + 8),
(_IO_STATUS_BLOCK *)v6 + 5);
}
else
{
LODWORD(Flags) = 6;
MiPageRead(
*((_FILE_OBJECT **)v6 + 25),
v11,
(_LARGE_INTEGER *)v6 + 12,
(_KEVENT *)(v6 + 8),
(_IO_STATUS_BLOCK *)v6 + 5,
Flags,
AttributionContext);
}
if( v10 )
CurrentThread->CacheManagerActive = CacheManagerActive;
if( v14 < 0 )
{
*((_QWORD *)v6 + 11) = 0i64;
v6[20] = v14;
KeSetEvent((PRKEVENT)(v6 + 8), 0, 0);
}
v6 = *(_MI_READ_LIST **)v6;
}
while( v6 != v5 );
}
}Referenced by:
MiPrefetchControlArea
MmPrefetchForCacheManager
MmPrefetchPagesEx