PfSnPrefetchSections
NTSTATUS __stdcall PfSnPrefetchSections(
PFSN_PREFETCH_HEADER *PrefetchHeader,
PFSN_PREFETCH_TYPE PrefetchType,
UINT64 PrefetchPhaseMask,
_EPROCESS *Process){
int v4;
PFSN_PREFETCH_HEADER *v5;
__int64 v6;
PFSN_PREFETCH_TYPE v7;
__int64 v8;
unsigned int v9;
__int64 v10;
unsigned int v11;
unsigned int *v12;
int v13;
int v14;
unsigned int *v15;
_WORK_QUEUE_TYPE v16;
__int64 v17;
NTSTATUS v18;
int v19;
UINT64 v20;
__int64 v22;
char v23;
__int16 v24;
int v25;
__int16 v26;
int v27;
_WORK_QUEUE_TYPE QueueType;
unsigned int v29;
int v30;
PFSN_PREFETCH_TYPE v31;
int v32;
PFSN_PREFETCH_TYPE v33;
unsigned int v34;
_EPROCESS *Processa;
unsigned __int64 PushLock[2];
UINT64 NumberOfLists[2];
__int128 v38;
PFSN_PREFETCH_HEADER *v39;
_READ_LIST **ReadLists;
__int64 v41;
_EVENT_DATA_DESCRIPTOR UserData;
__int64 v43;
int v44;
int v45;
__int64 v46;
__int64 v47;
__int64 v48;
__int64 v49;
int *v50;
__int64 v51;
_WORK_QUEUE_TYPE *p_QueueType;
__int64 v53;
char *v54;
__int64 v55;
_EVENT_DATA_DESCRIPTOR v56;
__int64 v57;
int v58;
int v59;
__int64 v60;
__int64 v61;
__int64 v62;
__int64 v63;
int *v64;
__int64 v65;
int *v66;
__int64 v67;
__int16 *v68;
__int64 v69;
__int64 *v70;
__int64 v71;
int *v72;
__int64 v73;
_EPROCESS *v74;
v4 = 0;
v39 = PrefetchHeader;
v31 = PrefetchType;
v5 = PrefetchHeader;
v29 = 0;
v6 = -1i64;
v27 = PrefetchPhaseMask;
v7 = PrefetchType;
Processa = v74;
v8 = *(_QWORD *)PrefetchHeader;
v9 = 0;
v23 = 0;
v10 = v8;
QueueType = PrefetchType;
v30 = PrefetchPhaseMask;
*(_OWORD *)PushLock = 0i64;
*(_OWORD *)NumberOfLists = 0i64;
v38 = 0i64;
if( v8 && qword_140C50288 && EtwEventEnabled(qword_140C50288, &PfSnEvt_PrefetchSections_Start) )
{
v22 = -1i64;
do
++v22;
while( *(_WORD *)(v8 + 16 + 2 * v22) );
LOWORD(v25) = v22;
UserData.Ptr = (unsigned __int64)&v25;
v44 = 2 * (unsigned __int16)v22;
v43 = v8 + 16;
v46 = v8 + 76;
v48 = v8 + 80;
v50 = &v30;
p_QueueType = &QueueType;
v54 = &v23;
*(_QWORD *)&UserData.Size = 2i64;
v45 = 0;
v47 = 4i64;
v49 = 4i64;
v51 = 4i64;
v53 = 4i64;
v55 = 1i64;
EtwWrite(qword_140C50288, &PfSnEvt_PrefetchSections_Start, 0, 7u, &UserData);
v10 = *(_QWORD *)v5;
}
if( v27 >= 1 << *(_DWORD *)(v10 + 124) )
goto LABEL_33;
if( v7 == PfSnPrefetchDataPages )
goto LABEL_8;
if( v7 != PfSnPrefetchImagePages )
{
LABEL_33:
v18 = -1073741811;
goto LABEL_24;
}
v4 = 1;
LABEL_8:
v11 = *(_DWORD *)(v8 + 88);
ReadLists = (_READ_LIST **)*((_QWORD *)v5 + 8);
memset(ReadLists, 0i64, 8 * v11);
v12 = (unsigned int *)*((_QWORD *)v5 + 11);
memset(v12, 0i64, 0x600u);
ExInitializePushLock(PushLock);
NumberOfLists[0] = (UINT64)Processa;
PushLock[1] = (unsigned __int64)v5;
LODWORD(v38) = v11;
KeQueryPriorityThread((_ETHREAD *)KeGetCurrentThread());
QueueType = v13 + 32;
if( v11 > 0x20 )
v11 = 32;
PfSnLogGetReadListsStart(v8, v11);
if( v11 )
{
v14 = v27;
v15 = v12 + 11;
v16 = QueueType;
v17 = v11;
do
{
*(v15 - 1) = v14;
*(_QWORD *)(v15 - 3) = PushLock;
*v15 = v4 | *v15 & 0xFFFFFFFE;
*(_QWORD *)(v15 - 11) = 0i64;
*(_QWORD *)(v15 - 7) = PfSnPopulateReadList;
*(_QWORD *)(v15 - 5) = v15 - 11;
ExAcquireRundownProtection((_EX_RUNDOWN_REF *)PushLock);
ExQueueWorkItem((PWORK_QUEUE_ITEM)(v15 - 11), v16);
v15 += 12;
--v17;
}
while( v17 );
v7 = v31;
v6 = -1i64;
v5 = v39;
}
ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)PushLock);
PfSnLogGetReadListsStop(v8);
v9 = NumberOfLists[1];
v18 = DWORD2(v38);
if( (SDWORD2(v38) & 0x80000000) == 0 )
{
v29 = DWORD1(v38);
if( !LODWORD(NumberOfLists[1]) )
{
v18 = 0;
goto LABEL_24;
}
if( DWORD1(v38) )
{
MmPrefetchPagesEx(LODWORD(NumberOfLists[1]), ReadLists, (UINT64 *)v5 + 13);
v18 = v19;
if( v19 >= 0 && !*((_QWORD *)v5 + 13) )
v18 = -2147483622;
}
else
{
v18 = -1073741823;
}
}
if( v9 )
{
v20 = v9;
if( v9 > 0x20 )
v20 = 32i64;
PfSnPrefetchSectionsCleanup(v5, v9, v20, Processa);
}
LABEL_24:
v32 = v27;
v41 = v29;
v34 = v9;
LOBYTE(v24) = 0;
v33 = v7;
if( v8 && qword_140C50288 && EtwEventEnabled(qword_140C50288, &PfSnEvt_PrefetchSections_Stop) )
{
do
++v6;
while( *(_WORD *)(v8 + 16 + 2 * v6) );
v57 = v8 + 16;
v56.Ptr = (unsigned __int64)&v26;
v26 = v6;
v58 = 2 * (unsigned __int16)v6;
*(_QWORD *)&v56.Size = 2i64;
v60 = v8 + 76;
v62 = v8 + 80;
v64 = &v32;
v66 = (int *)&v33;
v68 = &v24;
v70 = &v41;
v72 = (int *)&v34;
v59 = 0;
v61 = 4i64;
v63 = 4i64;
v65 = 4i64;
v67 = 4i64;
v69 = 1i64;
v71 = 8i64;
v73 = 4i64;
EtwWrite(qword_140C50288, &PfSnEvt_PrefetchSections_Stop, 0, 9u, &v56);
}
return v18;
}Referenced by:
PfSnAsyncPrefetchStep