MiPfExecuteReadList
INT64 __fastcall MiPfExecuteReadList(INT64 a1, CHAR a2, UINT64 a3, VOID *a4){
INT64 result;
_ETHREAD *CurrentThread;
INT64 v6;
__int64 v7;
int v8;
char v9;
unsigned int v10;
int v11;
_MDL *v12;
_FILE_OBJECT *v13;
__int64 v14;
UINT64 Flags;
void *retaddr;
result = (INT64)&retaddr;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = a1 + 120;
v7 = *(_QWORD *)(a1 + 120);
v8 = a2 & 2;
v9 = 0;
v10 = a3;
if( v7 != a1 + 120 )
{
v11 = a2 & 1;
do
{
v12 = *(_MDL **)(v7 + 256);
v12->MdlFlags |= 0x42u;
*(_DWORD *)(v7 + 184) = v12->ByteCount;
v13 = MiReferenceInPageFile(v7, v10);
if( v13 )
{
v14 = 0i64;
}
else
{
v14 = *(_QWORD *)(v7 + 200);
v13 = *(_FILE_OBJECT **)(v14 + 56);
}
*(_QWORD *)(v7 + 200) = v13;
*(_QWORD *)(v7 + 168) = 0i64;
*(_QWORD *)(v7 + 232) = *(_QWORD *)(v7 + 240);
if( v11 )
{
v9 = *((_BYTE *)CurrentThread + 1308);
*((_BYTE *)CurrentThread + 1308) = 1;
}
if( v14 && (*(_WORD *)(v14 + 204) & 0x800) != 0 )
{
result = 0i64;
}
else if( (*(_DWORD *)(v7 + 192) & 0x100) != 0 )
{
result = SmPageRead(
(union MM_STORE_KEY *)(v7 + 96),
(v7 + 272) | ((-(__int64)(v8 != 0) & 0xFFFFFFFFFFFFFFFEui64) + 3));
}
else
{
LODWORD(Flags) = 6;
MiPageRead(
*(_FILE_OBJECT **)(v7 + 200),
v12,
(_LARGE_INTEGER *)(v7 + 96),
(_KEVENT *)(v7 + 32),
(_IO_STATUS_BLOCK *)(v7 + 80),
Flags,
a4);
}
if( v11 )
*((_BYTE *)CurrentThread + 1308) = v9;
if( (int)result < 0 )
{
*(_QWORD *)(v7 + 88) = 0i64;
*(_DWORD *)(v7 + 80) = result;
LODWORD(result) = KeSetEvent((PRKEVENT)(v7 + 32), 0);
}
v7 = *(_QWORD *)v7;
}
while( v7 != v6 );
}
return result;
}Referenced by:
MiPrefetchControlArea
MmPrefetchForCacheManager
MmPrefetchPagesEx